GET /schemas/:version/translations
Summary
Returns one entry per locale in the version's manifest.locales (including the source locale) and the flags translators and reviewers raised. Supports locale filtering and a flag-status filter.
Translation status is review metadata, not taxonomy content. It is not covered by content_hash: resolving a flag does not change the hash, and the status of a stable version can still change.
Request
GET https://api.dtpr.io/api/v2/schemas/:version/translations
| Param | In | Description |
|---|---|---|
version | path | Canonical version. |
locales | query | Comma-separated locale codes. Filters both locales and flags. Aliases resolve (tl → fil, zh-TW → zh-Hant). Omit for every locale. |
flag_status | query | open (default), resolved, wontfix, or all. Filters flags only. |
Response
HTTP/1.1 200 OK
Content-Type: application/json
DTPR-Content-Hash: sha256-…
Cache-Control: no-store
{
"ok": true,
"version": "dtpr@2026-09-01-beta",
"source_locale": "en",
"locales": [
{
"locale": "en",
"status": "source",
"updated_at": null,
"summary": "",
"flag_counts": { "open": 5, "resolved": 1, "wontfix": 0 }
},
{
"locale": "es",
"status": "machine_reviewed",
"register": "Neutral Latin American Spanish, usted",
"translated_by": "claude-opus-5-5",
"reviewed_by": "claude-opus-5-5 (independent pass, 24 corrections)",
"updated_at": "2026-10-05",
"summary": "Reviewer judged it publishable. …",
"flag_counts": { "open": 8, "resolved": 0, "wontfix": 0 }
}
],
"flags": [
{
"id": "en-duration-placeholder",
"locale": "en",
"kind": "layout",
"status": "open",
"raised_by": "translator",
"keys": ["elements/data_retained.yaml#title", "elements/data_retained.yaml#description"],
"note": "Every translation assumes {{duration}} is filled with a bare span …",
"targets": [
{ "type": "element", "id": "data_retained", "field": "title" },
{ "type": "element", "id": "data_retained", "field": "description" }
]
}
]
}
Locale entries
| Field | Description |
|---|---|
status | source for the canonical locale; otherwise unverified, machine_draft, machine_reviewed or human_reviewed. |
register, translated_by, reviewed_by | Present only when recorded. |
updated_at | Date the entry was last updated, or null when nothing is recorded for the locale. |
summary | Reviewer's one-paragraph verdict. Empty when nothing is recorded. |
flag_counts | Counts every flag for the locale by status, whatever flag_status selects. |
A locale that is in the manifest but has no recorded status is unverified. A version that records no translation status at all returns 200 with every non-source locale unverified and flags: [].
Flags
| Field | Description |
|---|---|
kind | term_choice (a defensible term with a live alternative), native_review (needs a fluent speaker), divergence (says something different from the English), source_issue (the English is the problem), layout (length or placeholder behaviour on a sign). |
status | open, resolved or wontfix. |
raised_by | translator, reviewer or human. |
targets | What the flag points at. type is element, category or datachain_type; id is that entity's id; field is the path of the localized field, e.g. title or element_context.values[1].name. |
keys | The same addresses in authoring form (<file>#<path>). Prefer targets. |
alternatives | Optional. Other renderings the translator or reviewer proposed. |
Flags raised on the source locale are included: a source_issue usually explains why several translations share a problem.
Caching
Beta versions are served with Cache-Control: no-store. Stable versions are served with Cache-Control: public, max-age=300 rather than immutable, because the status can change after a version is promoted.
Errors
| Code | HTTP | Meaning |
|---|---|---|
bad_request | 400 | Malformed :version, or flag_status is not one of the four values. |
not_found | 404 | Version is not registered. |
Example
curl -s 'https://api.dtpr.io/api/v2/schemas/dtpr@2026-09-01-beta/translations?locales=km'
GET /api/v2/schemas/dtpr@2026-09-01-beta/translations?locales=km HTTP/1.1
Host: api.dtpr.io
See also
- MCP
get_translation_status— same payload. GET /schemas/:version/manifest— the locale list this endpoint follows.- Pagination + fields + locales