parse-server is a free, open source data warehousing & processing project written in JavaScript and released under Apache-2.0. It has 21,397 GitHub stars, 4,813 forks and 561 open issues, and was last pushed 33 hours ago. On this registry it ranks #4 of 22 tracked projects in Data Warehousing & Processing, with 5 head-to-head comparisons available.

What is parse-server?

Parse Server is an open source backend, built for Node.js and the Express web application framework, that can be deployed to any infrastructure able to run Node.js and that serves applications written against the Parse Platform.

What it is

Parse Server is the server component of the Parse Platform. It is written in JavaScript and runs inside Node.js, and it is designed around the Express web application framework: it can be added to an existing Express application, or it can run by itself as a standalone service. The project describes itself as an open source backend that can be deployed to any infrastructure that can run Node.js, and its documentation spans a wiki, a guide, an API reference, and a Cloud Code guide.

The concrete problem it solves is the absence of a backend for applications that expect one to exist. Client applications that speak to the Parse Platform need a server that exposes a REST API and a GraphQL API, stores objects in a database, keeps files in file storage or object storage, and dispatches notifications. Parse Server supplies that layer, so a team does not have to write and maintain it by hand. It replaces the alternative of building a bespoke backend service for those needs, and it does so without tying the application to one hosting provider, because the deployment target is any Node.js environment.

Key capabilities

  • Runs as the npm package parse-server, either added to an existing Express application or started as a standalone server process.
  • Exposes a REST API and a GraphQL API, with GraphQL Relay support for client-side data fetching.
  • Supports MongoDB versions 7 and 8, and PostgreSQL versions 16, 17, and 18, as the data store.
  • Runs on Node.js versions 20, 22, and 24.
  • Offers a Docker Container deployment path in addition to local installation, documented in the README sections "Locally" and "Docker Container".
  • Implements file storage and object storage, notifications, and a Parse Server Health endpoint with defined Status Values.
  • Carries server-side logic through Cloud Code, documented separately in the Cloud Code guide.

Who uses it and how

  • Teams deploying to infrastructure that can run Node.js, including container hosts, since the README documents a Docker Container path.
  • Existing Express web applications that need Parse Platform endpoints added in-process instead of run as a separate service.
  • Client applications that connect through an SDK, as covered by the README section "Connect an SDK".
  • Projects starting from the sample application included in the README, used as a reference deployment.
  • Teams that need a backend they control, since the project is a community-run Parse Platform component with an Apache-2.0 licence.

Getting started

Install the parse-server npm package and run it, or deploy the Docker Container; the README's "Getting Started", "Running Parse Server", "Locally", and "Docker Container" sections cover both paths.

How it compares

No comparable paid products and no similar tools are named in the facts for this entry, so no product-to-product contrast is possible. It stands alone in this registry.

When to use it — and when not to

A self-hoster must operate the Node.js service together with a database — MongoDB 7 or 8, or PostgreSQL 16, 17, or 18 — and must configure file or object storage and notifications to use those features. Teams that want a managed backend with no database to run, or that are not on Node.js, should not pick it. The repository carries 561 open issues, and the README excerpt is largely a badge index rather than narrative documentation, so newcomers should expect to work from the external guide and wiki.

project readme (upstream, from github) — read inline

parse-repository-header-server


Build Status Build Status Snyk Badge Coverage auto-release

Node Version MongoDB Version Postgres Version

npm latest version npm alpha version

[Backers on Open Collective][open-collective-link] [Sponsors on Open Collective][open-collective-link] Forum Twitter Chat


Parse Server is an open source backend that can be deployed to any infrastructure that can run Node.js. Parse Server works with the Express web application framework. It can be added to existing web applications, or run by itself.

The full documentation for Parse Server is available in the wiki. The Parse Server guide is a good place to get started. An API reference and Cloud Code guide are also available. If you're interested in developing for Parse Server, the Development guide will help you get set up.


A big thank you 🙏 to our sponsors and backers who support the development of Parse Platform!

Bronze Sponsors

Bronze Sponsors


Flavors & Branches

Parse Server is available in different flavors on different branches:

  • The main branches are [release][log_release] and [alpha][log_alpha]. See the changelog overview for details.
  • The long-term-support (LTS) branches are named release-.x.x, for example release-5.x.x. LTS branches do not have pre-release branches.

Long Term Support

Long-Term-Support (LTS) is provided for the previous Parse Server major version. For example, Parse Server 5.x will receive security updates until Parse Server 6.x is superseded by Parse Server 7.x and becomes the new LTS version. While the current major version is published on branch release, a LTS version is published on branch release-#.x.x, for example release-5.x.x for the Parse Server 5.x LTS branch.

⚠️ LTS versions are provided to help you transition as soon as possible to the current major version. While we aim to fix security vulnerabilities in the LTS version, our main focus is on developing the current major version and preparing the next major release. Therefore we may leave certain vulnerabilities up to the community to fix. Search for pull requests with the specific LTS base branch to see the current open vulnerabilities for that LTS branch.

Getting Started

The fastest and easiest way to get started is to run MongoDB and Parse Server locally.

Running Parse Server

Before you start make sure you have installed:

Compatibility

Node.js

Parse Server is continuously tested with the most recent releases of Node.js to ensure compatibility. We follow the Node.js Long Term Support plan and only test against versions that are officially supported and have not reached their end-of-life date.

Version Minimum Version End-of-Life Parse Server Support
Node.js 18 18.20.4 April 2025 (1)
-------------- ------------- ----------------------------- -----------
Internal r/w r/w r/w
Master -/- r/- r/w
ReadOnlyMaster -/- r/- r/-
Session -/- r/- r/w

(1) Parse.Object.createdAt, Parse.Object.updatedAt.

[!NOTE] In Cloud Code, both masterKey and readOnlyMasterKey set request.master to true. To distinguish between them, check request.isReadOnly. For example, use request.master && !request.isReadOnly to ensure full master key access.

Route Allow List

The routeAllowList option restricts which REST API routes are accessible to external clients. When set, all external REST API requests are denied by default unless the route matches one of the configured regex patterns. This is useful for apps where all logic runs in Cloud Code and clients should not access the REST API directly.

Internal calls from Cloud Code, Cloud Jobs, and triggers are not affected. Master key and maintenance key requests bypass the restriction.

const server = ParseServer({
  ...otherOptions,
  routeAllowList: [
    'classes/ChatMessage',
    'classes/Public.*',
    'users',
    'login',
    'functions/getMenu',
    'health',
  ],
});

Each entry is a regex pattern matched against the normalized route identifier. Patterns are auto-anchored with ^ and $ for full-match semantics. For example, classes/Chat matches only classes/Chat, not classes/ChatRoom. Use classes/Chat.* to match both.

Setting an empty array [] blocks all external non-master-key REST API requests (full lockdown of REST API routes). Not setting the option preserves current behavior (all routes accessible).

Covered Routes

The following table lists all route groups covered by routeAllowList with examples of how to allow them.

Route group Example route identifiers Allow pattern
Data
Classes classes/[className], classes/[className]/[objectId] classes/[className].*
Aggregate aggregate/[className] aggregate/.*
Batch batch batch
Purge purge/[className] purge/.*
System Classes
Users users, users/me, users/[objectId] users.*
Sessions sessions, sessions/me, sessions/[objectId] sessions.*
Installations installations, installations/[objectId] installations.*
Roles roles, roles/[objectId] roles.*
Auth
Login login, loginAs login.*
Logout logout logout
Upgrade session upgradeToRevocableSession upgradeToRevocableSession
Auth challenge challenge challenge
Email verification verificationEmailRequest verificationEmailRequest
Password verification verifyPassword verifyPassword
Password reset requestPasswordReset requestPasswordReset
Cloud Code
Cloud Functions functions/[functionName] functions/.*
Cloud Jobs (trigger) jobs, jobs/[jobName] jobs.*
Cloud Jobs (schedule) cloud_code/jobs, cloud_code/jobs/data, cloud_code/jobs/[objectId] cloud_code/.*
Hooks hooks/functions, hooks/triggers, hooks/functions/[functionName], hooks/triggers/[className]/[triggerName] hooks/.*
Push
Push push push
Push audiences push_audiences, push_audiences/[objectId] push_audiences.*
Schema
Schemas schemas, schemas/[className] schemas.*
Config
Config config config
GraphQL config graphql-config graphql-config
Analytics
Analytics events/AppOpened, events/[eventName] events/.*
Server
Health health health
Server info serverInfo serverInfo
Security security security
Logs scriptlog scriptlog
Legacy
Purchase validation validate_purchase validate_purchase

[!NOTE] File routes are not covered by routeAllowList. File upload access is controlled via the fileUpload option. File download and metadata access is controlled via the fileDownload option.

[!NOTE] The GraphQL API is not covered by routeAllowList. routeAllowList gates the REST API per route, while every GraphQL operation is transported over a single endpoint with the operation, target class, and field set encoded in the request body — so per-route allow-list semantics do not compose with it.

[!NOTE] The Pages API is not covered by routeAllowList. Its routes (default endpoint apps, configurable via pages.pagesEndpoint) serve the browser pages for email verification and password reset that Parse Server links to in the emails it sends to end users, so they must remain reachable without any Parse credentials and are not part of the client REST API. Their behavior is controlled by the email verification and password reset options (verifyUserEmails, emailAdapter) and the pages option.

Email Verification and Password Reset

Verifying user email addresses and enabling password reset via email requires an email adapter. There are many email adapters provided and maintained by the community. The following is an example configuration with an example email adapter. See the [Parse Server Options][server-options] for more details and a full list of available options.

const server = ParseServer({
  ...otherOptions,

  // Enable email verification
  verifyUserEmails: true,

  // Set email verification token validity to 2 hours
  emailVerifyTokenValidityDuration: 2 * 60 * 60,

  // Set email adapter
  emailAdapter: {
    module: 'example-mail-adapter',
    options: {
      // Additional adapter options
      ...mailAdapterOptions,
    },
  },
});

Offical email adapters maintained by Parse Platform:

Email adapters contributed by the community:

Password and Account Policy

Set a password and account policy that meets your security requirements. The following is an example configuration. See the [Parse Server Options][server-options] for more details and a full list of available options.

const server = ParseServer({
  ...otherOptions,

  // The account lock policy
  accountLockout: {
    // Lock the account for 5 minutes.
    duration: 5,
    // Lock an account after 3 failed log-in attempts
    threshold: 3,
    // Unlock the account after a successful password reset
    unlockOnPasswordReset: true,
  },

  // The password policy
  passwordPolicy: {
    // Enforce a password of at least 8 characters which contain at least 1 lower case, 1 upper case and 1 digit
    validatorPattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.{8,})/,
    // Do not allow the username as part of the password
    doNotAllowUsername: true,
    // Do not allow to re-use the last 5 passwords when setting a new password
    maxPasswordHistory: 5,
  },
});

Custom Routes

Custom routes allow to build user flows with webpages, similar to the existing password reset and email verification features. Custom routes are defined with the pages option in the Parse Server configuration:

Example

const api = new ParseServer({
  ...otherOptions,

  pages: {
    customRoutes: [{
      method: 'GET',
      path: 'custom_route',
      handler: async request => {
        // custom logic
        // ...
        // then, depending on the outcome, return a HTML file as response
        return { file: 'custom_page.html' };
      }
    }]
  }
}

The above route can be invoked by sending a GET request to: https://[parseServerPublicUrl]/[parseMount]/[pagesEndpoint]/[appId]/[customRoute]

The handler receives the request and returns a custom_page.html webpage from the pages.pagesPath directory as response. The advantage of building a custom route this way is that it automatically makes use of Parse Server's built-in capabilities, such as page localization and dynamic placeholders.

Reserved Paths

The following paths are already used by Parse Server's built-in features and are therefore not available for custom routes. Custom routes with an identical combination of path and method are ignored.

Path HTTP Method Feature
verify_email GET email verification
resend_verification_email POST email verification
choose_password GET password reset
request_password_reset GET password reset
request_password_reset POST password reset

Parameters

Parameter Optional Type Default value Example values Environment variable Description
pages yes Object undefined - PARSE_SERVER_PAGES The options for pages such as password reset and email verification.
pages.customRoutes yes Array [] - PARSE_SERVER_PAGES_CUSTOM_ROUTES The custom routes. The routes are added in the order they are defined here, which has to be considered since requests traverse routes in an ordered manner. Custom routes are traversed after build-in routes such as password reset and email verification.
pages.customRoutes.method String - GET, POST - The HTTP method of the custom route.
pages.customRoutes.path String - custom_page - The path of the custom route. Note that the same path can used if the method is different, for example a path custom_page can have two routes, a GET and POST route, which will be invoked depending on the HTTP request method.
pages.customRoutes.handler AsyncFunction - async () => { ... } - The route handler that is invoked when the route matches the HTTP request. If the handler does not return a page, the request is answered with a 404 Not found. response.

Custom Pages

It’s possible to change the default pages of the app and redirect the user to another path or domain.

const server = ParseServer({
  ...otherOptions,

  customPages: {
    passwordResetSuccess: 'http://yourapp.com/passwordResetSuccess',
    verifyEmailSuccess: 'http://yourapp.com/verifyEmailSuccess',
    parseFrameURL: 'http://yourapp.com/parseFrameURL',
    linkSendSuccess: 'http://yourapp.com/linkSendSuccess',
    linkSendFail: 'http://yourapp.com/linkSendFail',
    invalidLink: 'http://yourapp.com/invalidLink',
    invalidVerificationLink: 'http://yourapp.com/invalidVerificationLink',
    choosePassword: 'http://yourapp.com/choosePassword',
  },
});

Using Environment Variables

You may configure the Parse Server using environment variables:

PORT
PARSE_SERVER_APPLICATION_ID
PARSE_SERVER_MASTER_KEY
PARSE_SERVER_DATABASE_URI
PARSE_SERVER_URL
PARSE_SERVER_CLOUD

The default port is 1337, to use a different port set the PORT environment variable:

$ PORT=8080 parse-server --appId APPLICATION_ID --masterKey MASTER_KEY

For the full list of configurable environment variables, run parse-server --help or take a look at Parse Server Configuration.

Available Adapters

All official adapters are distributed as scoped packages on npm (@parse).

Some well maintained adapters are also available on the Parse Server Modules organization.

You can also find more adapters maintained by the community by searching on npm.

Configuring File Adapters

Parse Server allows developers to choose from several options when hosting files:

  • GridFSBucketAdapter - which is backed by MongoDB
  • S3Adapter - which is backed by Amazon S3
  • GCSAdapter - which is backed by Google Cloud Storage
  • FSAdapter - local file storage

GridFSBucketAdapter is used by default and requires no setup, but if you're interested in using Amazon S3, Google Cloud Storage, or local file storage, additional configuration information is available in the Parse Server guide.

Restricting File URL Domains

Parse objects can reference files by URL. To prevent SSRF attacks via crafted file URLs, you can restrict the allowed URL domains using the fileUpload.allowedFileUrlDomains option.

This protects against scenarios where an attacker provides a Parse.File with an arbitrary URL, for example as a Cloud Function parameter or in a field of type Object or Array. If Cloud Code or a client calls getData() on such a file, the Parse SDK makes an HTTP request to that URL, potentially leaking the server or client IP address and accessing internal services.

[!NOTE] Fields of type Parse.File in the Parse schema are not affected by this attack, because Parse Server discards the URL on write and dynamically generates it on read based on the file adapter configuration.

const parseServer = new ParseServer({
  ...otherOptions,
  fileUpload: {
    allowedFileUrlDomains: ['cdn.example.com', '*.example.com'],
  },
});
Parameter Optional Type Default Environment Variable
fileUpload.allowedFileUrlDomains yes String[] ['*'] PARSE_SERVER_FILE_UPLOAD_ALLOWED_FILE_URL_DOMAINS
  • ['*'] (default) allows file URLs with any domain.
  • ['cdn.example.com'] allows only exact hostname matches.
  • ['*.example.com'] allows any subdomain of example.com.
  • [] blocks all file URLs; only files referenced by name are allowed.

Idempotency Enforcement

Caution, this is an experimental feature that may not be appropriate for production.

This feature deduplicates identical requests that are received by Parse Server multiple times, typically due to network issues or network adapter access restrictions on mobile operating systems.

Identical requests are identified by their request header X-Parse-Request-Id. Therefore a client request has to include this header for deduplication to be applied. Requests that do not contain this header cannot be deduplicated and are processed normally by Parse Server. This means rolling out this feature to clients is seamless as Parse Server still processes requests without this header when this feature is enabled.

This feature needs to be enabled on the client side to send the header and on the server to process the header. Refer to the specific Parse SDK docs to see whether the feature is supported yet.

Deduplication is only done for object creation and update (POST and PUT requests). Deduplication is not done for object finding and deletion (GET and DELETE requests), as these operations are already idempotent by definition.

Configuration example

let api = new ParseServer({
    idempotencyOptions: {
        paths: [".*"],       // enforce for all requests
        ttl: 120             // keep request IDs for 120s
    }
}

Parameters

Parameter Optional Type Default value Example values Environment variable Description
idempotencyOptions yes Object undefined PARSE_SERVER_EXPERIMENTAL_IDEMPOTENCY_OPTIONS Setting this enables idempotency enforcement for the specified paths.
idempotencyOptions.paths yes Array [] .* (all paths, includes the examples below),
functions/.* (all functions),
jobs/.* (all jobs),
classes/.* (all classes),
functions/.* (all functions),
users (user creation / update),
installations (installation creation / update)
PARSE_SERVER_EXPERIMENTAL_IDEMPOTENCY_PATHS An array of path patterns that have to match the request path for request deduplication to be enabled. The mount path must not be included, for example to match the request path /parse/functions/myFunction specify the path pattern functions/myFunction. A trailing slash of the request path is ignored, for example the path pattern functions/myFunction matches both /parse/functions/myFunction and /parse/functions/myFunction/.
idempotencyOptions.ttl yes Integer 300 60 (60 seconds) PARSE_SERVER_EXPERIMENTAL_IDEMPOTENCY_TTL The duration in seconds after which a request record is discarded from the database. Duplicate requests due to network issues can be expected to arrive within milliseconds up to several seconds. This value must be greater than 0.

Postgres

To use this feature in Postgres, you will need to create a cron job using pgAdmin or similar to call the Postgres function idempotency_delete_expired_records() that deletes expired idempotency records. You can find an example script below. Make sure the script has the same privileges to log into Postgres as Parse Server.

#!/bin/bash

set -e
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    SELECT idempotency_delete_expired_records();
EOSQL

exec "$@"

Assuming the script above is named, parse_idempotency_delete_expired_records.sh, a cron job that runs the script every 2 minutes may look like:

2 * * * * /root/parse_idempotency_delete_expired_records.sh >/dev/null 2>&1

Installations

Parse Server deduplicates _Installation records when a new install collides with an existing row's deviceToken. The installation option block configures the dedup behavior.

Options

Parameter Optional Type Default Environment Variable
installation.duplicateDeviceTokenActionEnforceAuth yes Boolean false PARSE_SERVER_INSTALLATION_DUPLICATE_DEVICE_TOKEN_ACTION_ENFORCE_AUTH
installation.duplicateDeviceTokenAction yes String 'delete' PARSE_SERVER_INSTALLATION_DUPLICATE_DEVICE_TOKEN_ACTION
installation.duplicateDeviceTokenMergePriority yes String 'deviceToken' PARSE_SERVER_INSTALLATION_DUPLICATE_DEVICE_TOKEN_MERGE_PRIORITY
duplicateDeviceTokenActionEnforceAuth

When true, the dedup operation runs with the caller's auth context so ACL and CLP are honored. When false, the dedup runs as master and bypasses both. Master and maintenance keys always bypass regardless of this flag.

Because what this option enforces is the ACL and the class-level permissions, it has no effect on its own for a record that carries no ACL under permissive class-level permissions. To scope the deduplication, combine this option with either an ACL on _Installation records or class-level permissions that withhold the delete operation from the caller.

duplicateDeviceTokenAction

What Parse Server does to the conflicting _Installation row(s) when a new install's deviceToken collides with an existing row.

  • 'delete': destroys the conflicting row.
  • 'update': clears the now-conflicting ID field on the conflicting row, preserving custom fields, channels, and history.
duplicateDeviceTokenMergePriority

When an existing row holds the new deviceToken but has no installationId of its own, Parse Server merges the two rows. This option controls which side wins.

  • 'deviceToken': the deviceToken-only row survives; the request's installationId-matched row is the loser.
  • 'installationId': the request's installationId-matched row survives; the deviceToken-only orphan is the loser.

Configuration example

const parseServer = new ParseServer({
  ...otherOptions,
  installation: {
    duplicateDeviceTokenActionEnforceAuth: true,
    duplicateDeviceTokenAction: 'update',
    duplicateDeviceTokenMergePriority: 'installationId',
  },
});

Localization

Pages

Custom pages as well as feature pages (e.g. password reset, email verification) can be localized with the pages option in the Parse Server configuration:

const api = new ParseServer({
  ...otherOptions,

  pages: {
    enableLocalization: true,
  }
}

Localization is achieved by matching a request-supplied locale parameter with localized page content. The locale can be supplied in either the request query, body or header with the following keys:

  • query: locale
  • body: locale
  • header: x-parse-page-param-locale

For example, a password reset link with the locale parameter in the query could look like this:

http://example.com/parse/apps/[appId]/request_password_reset?token=[token]&username=[username]&locale=de-AT
  • Localization is only available for pages in the pages directory as set with pages.pagesPath.
  • Localization for feature pages (e.g. password reset, email verification) is disabled if pages.customUrls are set, even if the custom URLs point to the pages within the pages path.
  • Only .html files are considered for localization when localizing custom pages.

Pages can be localized in two ways:

Localization with Directory Structure

Pages are localized by using the corresponding file in the directory structure where the files are placed in subdirectories named after the locale or language. The file in the base directory is the default file.

Example Directory Structure:

root/
├── public/                  // pages base path
│   ├── example.html         // default file
│   └── de/                  // de language folder
│   │   └── example.html     // de localized file
│   └── de-AT/               // de-AT locale folder
│   │   └── example.html     // de-AT localized file

Files are matched with the locale in the following order:

  1. Locale match, e.g. locale de-AT matches file in folder de-AT.
  2. Language match, e.g. locale de-CH matches file in folder de.
  3. Default; file in base folder is returned.

Configuration Example:

const api = new ParseServer({
  ...otherOptions,

  pages: {
    enableLocalization: true,
    customUrls: {
      passwordReset: 'https://example.com/page.html'
    }
  }
}

Pros:

  • All files are complete in their content and can be easily opened and previewed by viewing the file in a browser.

Cons:

  • In most cases, a localized page differs only slightly from the default page, which could cause a lot of duplicate code that is difficult to maintain.
Localization with JSON Resource

Pages are localized by adding placeholders in the HTML files and providing a JSON resource that contains the translations to fill into the placeholders.

Example Directory Structure:

root/
├── public/                  // pages base path
│   ├── example.html         // the page containing placeholders
├── private/                 // folder outside of public scope
│   └── translations.json    // JSON resource file

The JSON resource file loosely follows the i18next syntax, which is a syntax that is often supported by translation platforms, making it easy to manage translations, exporting them for use in Parse Server, and even to automate this workflow.

Example JSON Content:

{
  "en": {               // resource for language `en` (English)
    "translation": {
      "greeting": "Hello!"
    }
  },
  "de": {               // resource for language `de` (German)
    "translation": {
      "greeting": "Hallo!"
    }
  }
  "de-AT": {            // resource for locale `de-AT` (Austrian German)
    "translation": {
      "greeting": "Servus!"
    }
  }
}

Configuration Example:

const api = new ParseServer({
  ...otherOptions,

  pages: {
    enableLocalization: true,
    localizationJsonPath: './private/localization.json',
    localizationFallbackLocale: 'en'
  }
}

Pros:

  • There is only one HTML file to maintain that contains the placeholders that are filled with the translations according to the locale.

Cons:

  • Files cannot be easily previewed by viewing the file in a browser because the content contains only placeholders and even HTML or CSS changes may be dynamically applied, e.g. when a localization requires a Right-To-Left layout direction.
  • Style and other fundamental layout changes may be more difficult to apply.
Dynamic placeholders

In addition to feature related default parameters such as appId and the translations provided via JSON resource, it is possible to define custom dynamic placeholders as part of the router configuration. This works independently of localization and, also if enableLocalization is disabled.

Configuration Example:

const api = new ParseServer({
  ...otherOptions,

  pages: {
    placeholders: {
      exampleKey: 'exampleValue'
    }
  }
}

The placeholders can also be provided as function or as async function, with the locale and other feature related parameters passed through, to allow for dynamic placeholder values:

const api = new ParseServer({
  ...otherOptions,

  pages: {
    placeholders: async (params) => {
      const value = await doSomething(params.locale);
      return {
        exampleKey: value
      };
    }
  }
}
Reserved Keys

The following parameter and placeholder keys are reserved because they are used related to features such as password reset or email verification. They should not be used as translation keys in the JSON resource or as manually defined placeholder keys in the configuration: appId, appName, email, error, locale, publicServerUrl, token, username.

Parameters
Parameter Optional Type Default value Example values Environment variable Description
pages yes Object undefined - PARSE_SERVER_PAGES The options for pages such as password reset and email verification.
pages.enableLocalization yes Boolean false - PARSE_SERVER_PAGES_ENABLE_LOCALIZATION Is true if pages should be localized; this has no effect on custom page redirects.
pages.localizationJsonPath yes String undefined ./private/translations.json PARSE_SERVER_PAGES_LOCALIZATION_JSON_PATH The path to the JSON file for localization; the translations will be used to fill template placeholders according to the locale.
pages.localizationFallbackLocale yes String en en, en-GB, default PARSE_SERVER_PAGES_LOCALIZATION_FALLBACK_LOCALE The fallback locale for localization if no matching translation is provided for the given locale. This is only relevant when providing translation resources via JSON file.
pages.placeholders yes Object, Function, AsyncFunction undefined { exampleKey: 'exampleValue' } PARSE_SERVER_PAGES_PLACEHOLDERS The placeholder keys and values which will be filled in pages; this can be a simple object or a callback function.
pages.forceRedirect yes Boolean false - PARSE_SERVER_PAGES_FORCE_REDIRECT Is true if responses should always be redirects and never content, false if the response type should depend on the request type (GET request -> content response; POST request -> redirect response).
pages.pagesPath yes String ./public ./files/pages, ../../pages PARSE_SERVER_PAGES_PAGES_PATH The path to the pages directory; this also defines where the static endpoint /apps points to.
pages.pagesEndpoint yes String apps - PARSE_SERVER_PAGES_PAGES_ENDPOINT The API endpoint for the pages.
pages.customUrls yes Object {} { passwordReset: 'https://example.com/page.html' } PARSE_SERVER_PAGES_CUSTOM_URLS The URLs to the custom pages
pages.customUrls.passwordReset yes String password_reset.html - PARSE_SERVER_PAGES_CUSTOM_URL_PASSWORD_RESET The URL to the custom page for password reset.
pages.customUrls.passwordResetSuccess yes String password_reset_success.html - PARSE_SERVER_PAGES_CUSTOM_URL_PASSWORD_RESET_SUCCESS The URL to the custom page for password reset -> success.
pages.customUrls.passwordResetLinkInvalid yes String password_reset_link_invalid.html - PARSE_SERVER_PAGES_CUSTOM_URL_PASSWORD_RESET_LINK_INVALID The URL to the custom page for password reset -> link invalid.
pages.customUrls.emailVerificationSuccess yes String email_verification_success.html - PARSE_SERVER_PAGES_CUSTOM_URL_EMAIL_VERIFICATION_SUCCESS The URL to the custom page for email verification -> success.
pages.customUrls.emailVerificationSendFail yes String email_verification_send_fail.html - PARSE_SERVER_PAGES_CUSTOM_URL_EMAIL_VERIFICATION_SEND_FAIL The URL to the custom page for email verification -> link send fail.
pages.customUrls.emailVerificationSendSuccess yes String email_verification_send_success.html - PARSE_SERVER_PAGES_CUSTOM_URL_EMAIL_VERIFICATION_SEND_SUCCESS The URL to the custom page for email verification -> resend link -> success.
pages.customUrls.emailVerificationLinkInvalid yes String email_verification_link_invalid.html - PARSE_SERVER_PAGES_CUSTOM_URL_EMAIL_VERIFICATION_LINK_INVALID The URL to the custom page for email verification -> link invalid.
pages.customUrls.emailVerificationLinkExpired yes String email_verification_link_expired.html - PARSE_SERVER_PAGES_CUSTOM_URL_EMAIL_VERIFICATION_LINK_EXPIRED The URL to the custom page for email verification -> link expired.

Notes

  • In combination with the Parse Server API Mail Adapter Parse Server provides a fully localized flow (emails -> pages) for the user. The email adapter sends a localized email and adds a locale parameter to the password reset or email verification link, which is then used to respond with localized pages.

Multi-Tenancy

Parse Server does not support multi-tenancy. Only one Parse Server instance may be mounted per Express app. Among other considerations, there is no isolation between apps in the same process. For example,

Frequently asked questions

Is parse-server free to use?

parse-server is open source under the Apache-2.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does parse-server do?

Parse Server for Node.js / Express

What is parse-server written in?

parse-server is primarily written in JavaScript. Its source is publicly available at https://github.com/parse-community/parse-server, and it has 21,397 GitHub stars.