hosting
GET /v1/sites/{site_id}/translation
Whether this site is translated, and how far along it is.
Authentication
Send an API key as a bearer token. The key must carry the sites.view permission; a key without it is refused with 403, not 404.
This endpoint takes no organisation id. Your key already identifies the organisation it belongs to, and the response is scoped to it.
Try it
Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.
curl -X GET https://api.zinndigital.com/v1/sites/{site_id}/translation \
-H "Authorization: Bearer zdk_live_…"Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console
Details
The state of Site Translation for one site: whether it is bought, which tier, how many words and documents we measured, when we last read the site, and per-locale progress. **A site with no subscription is a `200`, not a `404`.** The screen needs to render the offer, and "not bought" is an answer about a site that exists — returning `404` would make a site the customer owns look missing. `locales[]` reports every language with its own counts, and `served` says whether the customer has switched that language on for visitors. ⛔ `translated` and `served` are separate numbers on purpose: every tier translates every language, so a locale can be 100% translated and reach nobody because its owner has not enabled it. Merging them would report either a coverage figure nobody is served by, or a delivery figure that understates what is ready — the two mistakes `docs/28` was rewritten to stop making. Readable whether or not the account is in good standing: a customer behind on an invoice may still see what they have already paid for. Requires `sites.view`.
Parameters
| Name | Type | Required | What it is |
|---|---|---|---|
site_id (path) | Uuid | Yes | — |
Response
| Name | Type | Required | What it is |
|---|---|---|---|
site_id | Uuid | Yes | UUIDv7 identifier — sortable by creation time (docs/02 §8). |
state | string<disabled, active, paused_standing, over_allowance> | Yes | ⛔ `paused_standing` is its own state, not a flavour of `disabled` — the remedies differ and only one of them is the customer's to act on. |
tier | SiteTranslationTier | Yes | — |
available_tiers | SiteTranslationTier[] | Yes | The ladder, so the screen never hardcodes a price. |
word_count | integer | Yes | Translatable words measured at the last read. |
document_count | integer | Yes | — |
last_extracted_at | string | No | When we last successfully read the site. ⛔ Distinct from the attempt cursor the sweep keeps: a failed pass advances that and must not move this, or the screen would report a sit… |
last_error | string | No | Why the last pass did nothing, in words the customer can act on. |
locales | SiteTranslationLocale[] | Yes | — |
Errors this endpoint can return
401 · 403 · 404