opsdocsConsole

Ops platform / HTTP API

Translations

A project's own translation bundles, the shared ones it uses, its overrides and the composed locale its build pulls.

Updated 13 Oct 2026View as Markdown

A project's own translation bundles, the shared ones it uses, its overrides and the composed locale its build pulls.

GET /api/v1/projects/{slug}/translations

What this project translates: its own bundles, and the shared ones it composes.

ParameterInTypeAbout
slugpathstring
StatusMeansBody
200DoneProjectTranslationsResponse
403Not a member, or the role lacks translations.read

POST /api/v1/projects/{slug}/translations/attachments

Attach a package bundle at the version this project installs, or move an existing attachment to a new version.

ParameterInTypeAbout
slugpathstring

Body: AttachRequest

StatusMeansBody
200Attached at that version
404No such bundle, or that version is not registered
422Refused, and the error says why

DELETE /api/v1/projects/{slug}/translations/attachments/{bundle}

Stop composing a package bundle.

ParameterInTypeAbout
slugpathstring
bundlepathinteger
StatusMeansBody
204Done, with no body
404Not attached

POST /api/v1/projects/{slug}/translations/bundles

Create a translation bundle for one of the project's own namespaces, or for a package it publishes.

ParameterInTypeAbout
slugpathstring

Body: CreateBundleRequest

StatusMeansBody
201CreatedCreateBundleResponse
403Your role does not allow this
404No such project, or no such claim in it
409That bundle already exists
422Refused, and the error says why

POST /api/v1/projects/{slug}/translations/bundles/{bundle}/versions

Register the locale files a published version carries. Called by the publish that ships them, once per locale.

ParameterInTypeAbout
slugpathstring
bundlepathstring

Body: RegisterVersionRequest

StatusMeansBody
200DoneRegisterVersionResponse
404No such bundle here, or that version was never published
422Not a package bundle

GET /api/v1/projects/{slug}/translations/entries

One of the project's own bundles, key by key with every locale side by side.

ParameterInTypeAbout
slugpathstring
bundlequerystringThe bundle: its id, or the name of one of this project's own bundles.
namespace (optional)querystring or null
q (optional)querystring or nullSubstring match on the key and every locale's value (case insensitive).
missing_only (optional)querybooleanOnly keys missing a value in at least one of the bundle's locales.
StatusMeansBody
200Donearray of EntryResponse
404No such bundle in this project

PUT /api/v1/projects/{slug}/translations/entries

Create or edit one value in a bundle this project owns.

ParameterInTypeAbout
slugpathstring

Body: SetOwnEntryRequest

StatusMeansBody
200DoneSetEntryResponse
404No such bundle in this project
422Empty value / malformed namespace or key

DELETE /api/v1/projects/{slug}/translations/entries

Remove one key of an own bundle in every locale; the values land in history.

ParameterInTypeAbout
slugpathstring
bundlequerystring
namespacequerystring
keyquerystring
StatusMeansBody
204Done, with no body
404No such bundle, or no such key

GET /api/v1/projects/{slug}/translations/export/{locale}

One locale, composed: the project's own text, its overrides and the bundles it uses, at the versions it uses.

ParameterInTypeAbout
slugpathstring
localepathstring
bundle (optional)querystring or nullWhich of the project's own bundles the composition is built on. Defaults to the one named like the project, which is the shape a single bundle project has.
StatusMeansBody
200The composed locale tree
404No such bundle in this project

GET /api/v1/projects/{slug}/translations/shared/{bundle}

One shared bundle with this project's overrides applied on the side.

ParameterInTypeAbout
slugpathstring
bundlepathinteger
locale (optional)querystring or nullDefaults to the source locale.
StatusMeansBody
200DoneSharedBundleResponse
404The project does not share that bundle

PUT /api/v1/projects/{slug}/translations/shared/{bundle}/overrides

Override one shared key for this project.

ParameterInTypeAbout
slugpathstring
bundlepathinteger

Body: SetOverrideRequest

StatusMeansBody
200DoneOverrideResponse
404The project does not share that bundle
422Empty value / malformed namespace or key

DELETE /api/v1/projects/{slug}/translations/shared/{bundle}/overrides

Drop one override; the shared bundle's own value composes again.

ParameterInTypeAbout
slugpathstring
bundlepathinteger
localequerystring
namespacequerystring
keyquerystring
StatusMeansBody
204Done, with no body
404No such override

GET /api/v1/tms/bundles

Every translation bundle you can see: the shared ones, then the package ones, then the project ones.

StatusMeansBody
200Donearray of BundleSummary

Types

ProjectTranslationsResponse

FieldTypeAbout
ownarray of OwnBundleSummary
sharedarray of SharedBundleSummary

AttachRequest

FieldTypeAbout
bundleintegerThe package bundle's id (GET /tms/bundles).
versionstringThe installed version of the package. A bump is the same call again.

CreateBundleRequest

FieldTypeAbout
estate (optional)boolean
namestringSlug shaped for an own bundle; ignored when package is given, because a package bundle is named by its package.
package (optional)string or null<registry>:<name> of a package THIS project claimed, to create the package bundle other projects attach. Absent creates one of the project's own.

CreateBundleResponse

FieldTypeAbout
idinteger
namestring
ownerstring

RegisterVersionRequest

FieldTypeAbout
localestringThe locale the tree is in. The source locale's tree DEFINES the key set.
treeanyThe locale file's tree, exactly as it ships inside the package.
versionstring

RegisterVersionResponse

FieldTypeAbout
keysintegerKeys this version ships.
skippedintegerNon string or empty leaves, which are not translations.
writtenintegerValues written (a key whose translation was already there is not rewritten).

EntryResponse

FieldTypeAbout
keystring
namespacestring
updated_atstring
valuesmap of stringlocale → value; a locale the key has no value in is absent.
versionintegerHighest version across the locales (the editor's staleness hint).

SetOwnEntryRequest

Also: SetEntryRequest.

FieldTypeAbout
bundlestringThe bundle: its id, or the name of one of this project's own bundles.

SetEntryResponse

FieldTypeAbout
versioninteger

SharedBundleResponse

FieldTypeAbout
idinteger
localestring
namestring
ownerstring
projectstringThe home project, the one place the source copy is edited.
rowsarray of SharedKeyRow
version (optional)string or null

SetOverrideRequest

FieldTypeAbout
keystring
localestring
namespacestring
valuestring

OverrideResponse

FieldTypeAbout
versioninteger

BundleSummary

FieldTypeAbout
idinteger
languagesinteger
latest_version (optional)string or nullThe newest registered version of a package bundle, absent for the other two.
namestring'common'; a project's own namespace bundle; a package name verbatim.
ownerstring
package (optional)string or nullThe package a package bundle follows, <registry>:<name>, else absent.
projectstringThe HOME project: whose translations.write members may edit it.
stringsinteger

OwnBundleSummary

FieldTypeAbout
idinteger
languagesinteger
namestring
namespacesinteger
stringsinteger

SharedBundleSummary

FieldTypeAbout
idinteger
keysinteger
namestring
overridesinteger
ownerstring
projectstringThe home project: who edits the source copy.
removedintegerOverridden keys the bundle no longer ships.
version (optional)string or null

SetEntryRequest

FieldTypeAbout
keystring
localestring
namespacestring
status (optional)string or nulltranslated (default) | review, pre-translated strings await approval.
valuestring

SharedKeyRow

FieldTypeAbout
keystring
namespacestring
override_value (optional)string or nullThis project's override for the picked locale, if it set one.
removedbooleanFlagged, never dropped.
valuesmap of stringThe bundle's own values, locale by locale. Read only for this project.