MultiLocale API reference

Every endpoint of the MultiLocale REST API, generated from the API itself.

The MultiLocale REST API lets your integration read and manage localization projects, phrase keys, and per-locale translation values. Import existing dictionaries, download current translation files for a build, machine-translate missing values, and keep every application reading one shared workspace.

All endpoints are relative to https://api.multilocale.com. Create an API key in your MultiLocale dashboard, then authenticate every request with it. Keys are read-only by default, can be limited to a single project, and every response carries RateLimit headers so clients can pace themselves.

apiKey HTTP Basic auth carrying only the API key secret: Authorization: Basic base64(<key secret>).

accessToken Operator session token issued by the MultiLocale dashboard: Authorization: Token <access token>.

oauth2 Authrice authorization-code flow with PKCE for delegated access.

You can evaluate the API without an account: the keyless sandbox at /api/v1/sandbox/phrases returns demonstration phrases in the authenticated response shape, and the sandbox translation job demonstrates the asynchronous 202-and-poll pattern end to end.

Example requests

Read the keyless sandbox, no account or key needed:

curl https://api.multilocale.com/api/v1/sandbox/phrases

List the French phrases of one project with a scoped API key:

curl "https://api.multilocale.com/api/v1/phrases?project=my-app&language=fr&limit=10" \
  -H "Authorization: Basic $(printf %s "$MULTILOCALE_API_KEY" | base64)"

Create a phrase with a write-scoped key, safely retryable with an idempotency key:

curl -X POST https://api.multilocale.com/api/v1/phrases \
  -H "Authorization: Basic $(printf %s "$MULTILOCALE_API_KEY" | base64)" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 1f0e5a1e-add-welcome" \
  -d '{"key":"Welcome","value":"Welcome","language":"en","projects":["my-app"]}'

The guides, the CLI and the React and Next.js integration are documented on the developer documentation site.

Phrases

GET/api/v1/phrases

List phrases

Lists the phrases of your organization. A phrase is one {key, value, language} triple belonging to one or more projects. Filter with project, key and language. Requires the phrases:read scope. A key scoped to a project only ever sees that project's phrases. For stable traversal, set pagination=cursor; the response becomes {items, nextCursor} and is ordered by _id. Pass nextCursor back as cursor until it is null. Existing array responses and offset pagination remain available when cursor pagination is not requested.

phrases:readapiKeyaccessTokenoauth2
Parameters
NameInTypeDescription
projectquerystringProject name
keyquerystringPhrase key (URL-encoded)
languagequerystring
fieldsquerystringComma-separated projection of fields to return
paginationquerystring (cursor)Set to cursor for a stable page envelope
cursorquerystringOpaque nextCursor from the preceding cursor page
limitqueryintegerOptional bounded page size (maximum 2001; defaults to 100 in cursor mode)
skipqueryintegerOptional page offset (maximum 10000)
sortFieldquerystring (_id | key | language)
sortDirectionquerystring (ASC | DESC)
Responses
StatusMeaning
200Array of phrases, or {items, nextCursor} in cursor mode
401Missing or invalid credentials
403API key is missing the phrases:read scope
429API key rate limit exceeded
POST/api/v1/phrases

Create or update phrases

Upserts one phrase or an array of phrases. Emits phrase.created for rows that did not exist and phrase.updated for rows that did — one event per row, not per request. Requires the phrases:write scope. Send Idempotency-Key to make retries safe for 24 hours.

phrases:writeapiKeyaccessTokenoauth2
Parameters
NameInTypeDescription
Idempotency-KeyheaderstringUnique retry key retained for 24 hours (maximum 255 characters)
Responses
StatusMeaning
200The upserted phrase, or the array of upserted phrases
401Missing or invalid credentials
403API key is missing the phrases:write scope
409Idempotency key is in flight or was reused with different input
429API key rate limit exceeded
DELETE/api/v1/phrases

Delete phrases

Deletes every translation of one key in one project — all languages at once — and emits one phrase.deleted per deleted row. Requires the phrases:write scope. Send Idempotency-Key to make retries safe for 24 hours.

phrases:writeapiKeyaccessTokenoauth2
Parameters
NameInTypeDescription
keyrequiredquerystringPhrase key (URL-encoded)
Idempotency-KeyheaderstringUnique retry key retained for 24 hours (maximum 255 characters)
projectrequiredquerystringProject name
Responses
StatusMeaning
200The deleted phrases
401Missing or invalid credentials
403API key is missing the phrases:write scope
404Nothing matched
409Idempotency key is in flight or was reused with different input
429API key rate limit exceeded
POST/api/v1/phrases/batch

Create or update a batch of phrases

Upserts an array of phrases in one authenticated request and returns the resulting array in input order. Each row emits its own created or updated webhook event. Requires the phrases:write scope. Send Idempotency-Key to make retries safe for 24 hours.

phrases:writeapiKeyaccessTokenoauth2
Parameters
NameInTypeDescription
Idempotency-KeyheaderstringUnique retry key retained for 24 hours (maximum 255 characters)
Responses
StatusMeaning
200The upserted phrases in input order
401Missing or invalid credentials
403API key is missing the phrases:write scope
409Idempotency key is in flight or was reused with different input
429API key rate limit exceeded
PUT/api/v1/phrases/{phraseId}

Update a phrase

Replaces a phrase you own and emits phrase.updated. Answers 404 — not 403 — for a phrase belonging to another organization, so ids cannot be probed. Requires the phrases:write scope. Send Idempotency-Key to make retries safe for 24 hours.

phrases:writeapiKeyaccessTokenoauth2
Parameters
NameInTypeDescription
phraseIdrequiredpathstring
Idempotency-KeyheaderstringUnique retry key retained for 24 hours (maximum 255 characters)
Responses
StatusMeaning
200The updated phrase
401Missing or invalid credentials
403API key is missing the phrases:write scope
404No such phrase in your organization
409Idempotency key is in flight or was reused with different input
429API key rate limit exceeded

Projects

GET/api/v1/projects

List projects

Lists the projects of your organization. Requires the projects:read scope. A key scoped to a project sees only that project.

projects:readapiKeyaccessTokenoauth2
Responses
StatusMeaning
200Array of projects
401Missing or invalid credentials
403API key is missing the projects:read scope
429API key rate limit exceeded
POST/api/v1/projects

Create a project

Creates a project in your organization and emits project.created. Requires the projects:write scope. Send Idempotency-Key to make retries safe for 24 hours.

projects:writeapiKeyaccessTokenoauth2
Parameters
NameInTypeDescription
Idempotency-KeyheaderstringUnique retry key retained for 24 hours (maximum 255 characters)
Responses
StatusMeaning
200The created project
401Missing or invalid credentials
403API key is missing the projects:write scope
409Idempotency key is in flight or was reused with different input
429API key rate limit exceeded
GET/api/v1/projects/{projectId}

Get a project by id

Answers 404 — not 403 — for a project belonging to another organization, so ids cannot be probed. Requires the projects:read scope.

projects:readapiKeyaccessTokenoauth2
Parameters
NameInTypeDescription
projectIdrequiredpathstring
Responses
StatusMeaning
200The project
401Missing or invalid credentials
403API key is missing the projects:read scope
404No such project in your organization
429API key rate limit exceeded
PUT/api/v1/projects/{projectId}

Update a project

Updates a project you own and emits project.updated. Answers 404 — not 403 — for a project belonging to another organization. Requires the projects:write scope. Send Idempotency-Key to make retries safe for 24 hours.

projects:writeapiKeyaccessTokenoauth2
Parameters
NameInTypeDescription
projectIdrequiredpathstring
Idempotency-KeyheaderstringUnique retry key retained for 24 hours (maximum 255 characters)
Responses
StatusMeaning
200The updated project
401Missing or invalid credentials
403API key is missing the projects:write scope
404No such project in your organization
409Idempotency key is in flight or was reused with different input
429API key rate limit exceeded
GET/api/v1/projects/{projectName}

Get a project by name

Project names are unique per organization, not globally, so the lookup is always scoped to your organization. Requires the projects:read scope.

projects:readapiKeyaccessTokenoauth2
Parameters
NameInTypeDescription
projectNamerequiredpathstring
Responses
StatusMeaning
200The project
401Missing or invalid credentials
403API key is missing the projects:read scope
404No such project in your organization
429API key rate limit exceeded

Sandbox

GET/api/v1/sandbox/phrases

Read sandbox phrases without authentication

Returns a fixed set of demonstration phrases in the same {key, value, language} shape as authenticated phrase reads. No account, credential, or key is required, so agents can evaluate the API before onboarding. Responses carry the standard RateLimit response headers and the anonymous pacing limit applies.

Responses
StatusMeaning
200Demonstration phrases.
429Anonymous rate limit exceeded; retry after Retry-After seconds.
POST/api/v1/sandbox/translationjobs

Start a demonstration asynchronous translation job

Demonstrates the API's asynchronous-job pattern without authentication. The response is 202 Accepted with a Location header pointing at the job resource and a body carrying the job _id and status. Poll the Location URL until the status is succeeded, then read the translations from the job body. The job is deterministic fixture work that completes about two seconds after creation.

Responses
StatusMeaning
202Job accepted; poll the Location URL for the result.
429Anonymous rate limit exceeded; retry after Retry-After seconds.
GET/api/v1/sandbox/translationjobs/{jobId}

Poll a demonstration translation job

Reads the status of a demonstration job started at POST /api/v1/sandbox/translationjobs. While the job runs the status is running; afterwards it is succeeded and the body carries the translated phrases. No authentication is required.

Parameters
NameInTypeDescription
jobIdrequiredpathstring
Responses
StatusMeaning
200Current job state.
404Unknown job id.