Base URL and versions
All endpoints live on their own domain, with the version in the path:/v2). Within /v1, only fields and endpoints are added. So ignore fields you do not know.
JSON
- Every response is JSON, including an error and an unknown URL. The only exception is the file from
GET /exports/{profileKey}. - A single object is wrapped in
{"data": {…}}. A list is{"data": […], "meta": {"nextCursor": "…", "limit": 500}}. - Fields are camelCase. Dates are ISO 8601 in UTC:
2026-10-07T12:00:00Z. - Messages follow the
Accept-Languageheader (nloren, defaultnl).
Errors
An error is{"message": "…"}. A validation error (422) also has errors per field. For a list, the index of the item is in the field name:
Conflicts (409)
A409 means the project is busy for a moment. You can repeat the request:
Wait a few seconds and try again, with an increasing delay.
Pagination
GET /keys and GET /translations/{locale} use a cursor and are sorted by key:
- Request the first page, optionally with
limit(1 to 1000, default 500). - As long as
meta.nextCursoris notnull, request the next page withcursor=<meta.nextCursor>and the same filters.
422 on the cursor field.