Skip to main content

Base URL and versions

All endpoints live on their own domain, with the version in the path:
A change that breaks existing code only comes in a new version (/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-Language header (nl or en, default nl).

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)

A 409 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:
  1. Request the first page, optionally with limit (1 to 1000, default 500).
  2. As long as meta.nextCursor is not null, request the next page with cursor=<meta.nextCursor> and the same filters.
Never build a cursor yourself. A cursor Tolk cannot read returns a 422 on the cursor field.

Limits