---
title: "Read a page's translations for one locale"
method: GET
path: "/projects/{projectId}/page-translations/{pageId}"
tags: ["Translations"]
---

# Read a page's translations for one locale

`GET /projects/{projectId}/page-translations/{pageId}`

## Request

- Base URL: `https://studio.weaverse.io/api/v1/content`
- URL: `https://studio.weaverse.io/api/v1/content/projects/{projectId}/page-translations/{pageId}`
- Auth: HTTP bearer

Returns every translatable text key of an owned page for one configured target locale: the source text the runtime translates from, the current target text, and the `targetGeneration` a writeback must replay.

- Sources are resolved server-side from the item value, its component-schema default, or the project default language overlay (whichever the runtime actually translates from). Client-supplied schemas or bare item ids are never trusted.
- `translation: null` means no row exists, or the stored one answers a source the merchant has since changed. `""` is a deliberate clear.
- `targetGeneration` is the raw stored target value at read time (`null` = no row, `""` = cleared). Replay it verbatim on `POST`.
- `language.isDefault` is `true` when the locale is the project default language; `POST` refuses to write it.
- Not cached: a cached generation would guarantee a stale write.
- Text only. Image translations are not exposed here; use `GET /projects/{projectId}/translation-units?kind=image`.

Workflow: `GET` this page and locale, change `translation` on the entries you want to write, `POST` them back unchanged otherwise, then `GET` again to confirm.

Required scope: `content:read`

## Path parameters

- `projectId` string, required
- `pageId` string, required

## Query parameters

- `locale` string, required

## Response `200`

Translatable keys with current targets and their generations

- PageTranslationsResponse
  - `object` 'page_translations'
  - `projectId` string
  - `pageId` string
  - `language` object: The resolved target language row, not the requested string.
    - `id` string
    - `code` string
    - `name` string
    - `isDefault` boolean: True when this locale is the project default — the source other locales translate from, which POST refuses to write. Derived from the project configuration, the same authority the write path rejects on.
  - `data` PageTranslationEntry[]
    - `itemId` string, required: The item the key belongs to.
    - `key` string, required: The extraction path of the translatable field, rooted at the item data column (e.g. `data.title`). Use it verbatim; it is the stored translation key.
    - `source` string, required: The text the translation answers for, resolved server-side from the item value, its component-schema default, or the project default language overlay — whichever the runtime actually translates FROM.
    - `translation` string, nullable, required: The current target text. `""` is a deliberate clear; `null` means no row exists, or the stored one answers a source the merchant has since changed.
    - `targetGeneration` string, nullable, required: The raw stored target value at read time, independent of freshness: `null` = no row, `""` = cleared. Replay it verbatim on write; it is the compare-and-set token that stops a delayed agent overwriting a newer translation.

## Other responses

- `400`: Missing `locale`, or a locale this project has not configured
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Project not found, or the page is not owned by this project
- `500`: Unexpected server error

---

[API](https://skmtc.dev/weaverse/apis/weaverse-content-api.md) - [All operations](https://skmtc.dev/weaverse/apis/weaverse-content-api/llms.txt) - [OpenAPI document](https://skmtc.dev/weaverse/apis/weaverse-content-api/revisions/d189794169bb?raw)
