curl --request GET \
--url https://studio.weaverse.io/api/v1/content/projects/{projectId}/theme-settings \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://studio.weaverse.io/api/v1/content/projects/{projectId}/theme-settings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://studio.weaverse.io/api/v1/content/projects/{projectId}/theme-settings"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"object": "theme_settings",
"projectId": "clz1k8m2n0000abcd1234efgh",
"theme": {
"colorBackground": "#ffffff",
"colorText": "#1a1a1a",
"colorPrimary": "#246aff",
"headingFont": "Inter",
"bodyFont": "Inter",
"pageWidth": 1280
},
"staticTranslations": {
"cart": {
"title": "Panier",
"empty": {
"message": "Votre panier est vide"
}
},
"product": {
"addToCart": "Ajouter au panier",
"soldOut": "Rupture de stock"
}
},
"revision": "2026-10-12T09:41:27.000Z"
}{
"object": "error",
"code": "UNAUTHORIZED",
"message": "<string>",
"status": 123,
"details": "<unknown>"
}{
"object": "error",
"code": "UNAUTHORIZED",
"message": "<string>",
"status": 123,
"details": "<unknown>"
}{
"object": "error",
"code": "UNAUTHORIZED",
"message": "<string>",
"status": 123,
"details": "<unknown>"
}{
"object": "error",
"code": "UNAUTHORIZED",
"message": "<string>",
"status": 123,
"details": "<unknown>"
}Get theme settings
Returns the project’s theme settings: the global design tokens, colors, typography and other settings configured in Studio. The shape of theme depends on the theme’s schema; it is an empty object when nothing is configured.
locale(for examplefr-fr) addsstaticTranslations: the theme’s static text (cart labels, button text and so on) resolved for that locale. Each key uses the translated value when available and falls back to the default. An exact locale match is tried first, then the language prefix. An emptylocalereturns400. Discover locales withGET /projects/{projectId}/languages.format=portable-text(orAccept: application/portable-text+json) replaces every HTML string insidethemeorstaticTranslationswith a Portable Text block array; everything else is unchanged.view=own(default) returns this project’s own theme plus itsrevision, the baseline forPATCH.view=effectivereturns the parent theme merged under this project’s overrides with inheritance metadata; it is read-only and carries no revision.
Required scope: content:read
curl --request GET \
--url https://studio.weaverse.io/api/v1/content/projects/{projectId}/theme-settings \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://studio.weaverse.io/api/v1/content/projects/{projectId}/theme-settings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://studio.weaverse.io/api/v1/content/projects/{projectId}/theme-settings"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"object": "theme_settings",
"projectId": "clz1k8m2n0000abcd1234efgh",
"theme": {
"colorBackground": "#ffffff",
"colorText": "#1a1a1a",
"colorPrimary": "#246aff",
"headingFont": "Inter",
"bodyFont": "Inter",
"pageWidth": 1280
},
"staticTranslations": {
"cart": {
"title": "Panier",
"empty": {
"message": "Votre panier est vide"
}
},
"product": {
"addToCart": "Ajouter au panier",
"soldOut": "Rupture de stock"
}
},
"revision": "2026-10-12T09:41:27.000Z"
}{
"object": "error",
"code": "UNAUTHORIZED",
"message": "<string>",
"status": 123,
"details": "<unknown>"
}{
"object": "error",
"code": "UNAUTHORIZED",
"message": "<string>",
"status": 123,
"details": "<unknown>"
}{
"object": "error",
"code": "UNAUTHORIZED",
"message": "<string>",
"status": 123,
"details": "<unknown>"
}{
"object": "error",
"code": "UNAUTHORIZED",
"message": "<string>",
"status": 123,
"details": "<unknown>"
}Authorizations
Bearer authentication: a shop API key (WEAVERSE_API_KEY), a scoped API key, a delegated MCP OAuth token, or (translation-unit routes only) a project-bound translation agent token. Scopes: content:read — Read projects, pages, theme settings, versions, drafts and translation units. content:write — Save drafts and make non-destructive edits (page items, metadata, SEO, assignments, languages, glossary). Never publishes or deletes. content:publish — Publish drafts, schedule/reschedule/cancel publications, restore versions, publish global sections. content:delete — Delete pages, global sections, languages, static keys, override reverts; required with project:manage for project deletion. project:manage — Create/copy/delete projects, settings, variants, hierarchy, backups, restore-as-new, previews, hostname policy. translations:read — Read translation units only (no general content access). translations:write — Apply translation units only; never mutates page content. A legacy unscoped API key keeps read/write/translation baseline access and every pre-scope endpoint, but never gains publish/delete/project-manage implicitly.
Path Parameters
Query Parameters
Locale code (e.g. "fr-fr"). When provided, the response includes a
staticTranslations field with resolved translation values.
Tries exact locale match first, then falls back to language prefix.
Output format for rich-text fields.
weaverse(default): rich text returned as HTML strings — original behavior, no migration needed.portable-text: rich text returned as structured Portable Text blocks for multi-channel rendering and AI consumption.
Equivalent to setting Accept: application/portable-text+json on the request. The query parameter takes precedence over the header when both are provided. An invalid value returns 400 INVALID_PARAMS.
weaverse, portable-text own: this project's theme bucket plus its revision (the PATCH baseline). effective: the parent theme merged under this project's overrides plus inheritance metadata; read-only, carries no revision.
own, effective Response
Theme settings with optional static translations
theme_settings for view=own; theme_settings_effective for view=effective
theme_settings, theme_settings_effective Theme configuration JSON. Empty object if not configured.
Nested translation keys with resolved values for the requested locale.
Only present when locale query parameter is provided.
Uses translated value when available, falls back to default value.
Project revision captured together with the theme in this response (they are cached as one snapshot). Pass back as expectedRevision on PATCH: if the settings changed since this snapshot — including when the snapshot itself was served from cache — the PATCH is rejected with 409 STALE_PROJECT; re-read and reapply.
Only for view=effective (which carries no revision).
Show child attributes
Show child attributes
Was this page helpful?