Reading a manual
On this page
One request returns the whole manual: every published section in the order of the page, every block inside it, and the anchor each one carries so a link built from the answer lands where the page lands.
Request
GET https://stylehub.cloud/api/v1/manuals/{slug}.jsonThe slug
On a brand's own host or a custom domain the same path answers, and the host names the brand. The dashboard prints the exact address of every manual under API (opens in a new tab). A slug that names no published manual answers 404; a manual past its end date answers 410. See Errors.
Headers
Bearer and a token, for a private or password protected manual. See Tokens and authentication.ETag of the answer you already have. An unchanged manual answers 304 with no body. See Caching.Example
curl -sS https://stylehub.cloud/api/v1/manuals/acme.json \
-H "Accept: application/json" | jq '.title, .sections[].title'Response
{
"id": "cm2...",
"slug": "acme",
"title": "Acme brand manual",
"description": "",
"url": "https://acme.stylehub.cloud",
"visibility": "public",
"updatedAt": "2026-09-03T10:12:00.000Z",
"expiresAt": null,
"sections": [
{
"id": "cm2...",
"anchor": "colors",
"url": "https://acme.stylehub.cloud#colors",
"title": "Colors",
"content": {},
"blocks": [
{
"id": "b1",
"anchor": "color",
"url": "https://acme.stylehub.cloud#color",
"type": "COLORS",
"label": "Color",
"content": { "colors": [{ "name": "Forest", "hex": "#0f5132" }] }
}
]
}
]
}The manual
| Field | Type | Meaning |
|---|---|---|
id | string | The manual's id. Stable for its whole life. |
slug | string | The manual's own slug, as saved in its settings. |
title | string | The title. |
description | string | The meta description from the SEO settings, or an empty string. |
url | string | The public address of the manual. |
visibility | string | public, unlisted, private or password. |
updatedAt | string | When the manual last changed, as an ISO 8601 date in UTC. |
expiresAt | string or null | The end date, if the manual has one. After it the address answers 410. |
sections | array | The published sections, in the order of the page. |
A section
| Field | Type | Meaning |
|---|---|---|
id | string | The section's id. |
anchor | string | The anchor the page gives it. Made once and kept when the title changes. |
url | string | The manual's address with the anchor, so it opens at this section. |
title | string | The heading. |
content | object | What the section holds beside its blocks, such as an intro. Often empty. |
blocks | array | The blocks, in order. |
A block
| Field | Type | Meaning |
|---|---|---|
id | string | The block's id. |
anchor | string | Its anchor on the page. |
url | string | The manual's address with the anchor. |
type | string | The kind of block, as a constant such as COLORS, LOGO or TEXT. |
label | string | The kind's name as the product shows it, such as Color. |
content | object | What the block stores. Its shape depends on the kind. |
Rich text is HTML. What each kind of block stores is described, kind by kind, in Every block, and what it holds; the JSON carries the same fields the editor offers. A section saved before blocks existed is served as one block of the section's kind, at the section's own anchor.
What is not in the answer
- Sections kept off the page.
- Blocks marked internal, and blocks with nothing in them.
- Changes still waiting for review. A manual that reviews changes before publishing is served as its approved version, the same one the page shows.
- Comments, history, and anything else that is not on the published page.
Anchors are for linking
Headers on the answer
Something the API does that this page does not say? Write to hello@stylehub.cloud with the request and the answer you got.