read_tokens
The product's design tokens as extracted, and the source files that define them. The source files are authoritative.
Ask for it in plain words#
Inputs#
| Name | Type | Required | What it does |
|---|---|---|---|
identifier | string | yes | sotto or sotto/tokens for all of a product's tokens, or one token: sotto/token/--sotto-blush. |
release | string | no | Optional pin: the version you saw in an earlier result. |
theme | string | no | A theme id or label, when the product has themes. |
category | string | no | Only one category: color, font, space… |
name | string | no | Part of the token's name, for example blush. |
include_sources | boolean | no | Also return the source files that define the tokens. Default true. |
limit | integer | no | How many tokens per page: 1 to 500, default 200. |
cursor | string | no | From the previous result's nextCursor, for the next page. |
Example#
The example ran over Orvio's synthetic test catalog (a product called Fixture Studio), so its names and values differ from the products you will see. The shape is exactly what the server returns.
Request
{ "identifier": "fixture-studio", "category": "color", "limit": 2 }
Result (shortened)
{ "tokens": [ { "identifier": "fixture-studio/token/--brand-500", "nativeName": "--brand-500", "label": null, "category": "color", "value": { "kind": "literal", "raw": "#2F6FDE", "normalized": { "type": "color", "srgbHex": "#2f6fde" } }, "themeId": null, "sourceRef": { "path": "css/site.css", "line": 2 }, "provenance": { "method": "extracted" } }, { "identifier": "fixture-studio/token/--color-primary", "nativeName": "--color-primary", "label": null, "category": "color", "value": { "kind": "alias", "raw": "var(--brand-500)", "normalized": null, "target": "fixture-studio/token/--brand-500" }, "themeId": null, "sourceRef": { "path": "css/site.css", "line": 3 }, "provenance": { "method": "extracted" } } ], "sources": [ { "path": "source/css/site.css", "sourcePath": "css/site.css", "encoding": "utf-8", "content": ":root {\n --brand-500: #2F6FDE;\n --color-primary: var(--bra…", "bytes": 398, "sha256": "f90faae01d0d…" } ], "total": 2, "nextCursor": null, "release": { "product": "fixture-studio", "version": "1.1.0", "releaseId": "f1000000-0000-4000-8000-000000000002", "publishedAt": "2026-10-05T00:00:00Z" } }
Left out of the example: themes, notes, limitations, licence.
What comes back#
| Field | What it holds |
|---|---|
themes | The product's themes (id, label, scope). Empty when it has none. |
tokens | The tokens on this page: identifier, native name, category, value (raw and normalised), theme, and the file and line that define it. |
sources | The source files that define those tokens, with their contents when include_sources is true. |
warnings | Heads-ups that do not stop the call, such as a membership payment problem. Usually empty. |
Every result also carries what the request needs to be checked: the release (product, version, published date), the licence and notes, when they apply.
Paging#
When nextCursor is not null, call again with cursor set to it. A cursor belongs to your account, to that call's inputs and to that release, and it expires after 60 minutes. After a new release it answers release_replaced. See Limits and pagination.
Errors#
| Code | Means | What to do |
|---|---|---|
product_unavailable | No listed product has that identifier. | Search the catalog with search_products. |
release_withdrawn | The whole product was taken down for now. | Search the catalog for something similar with search_products. |
release_replaced | A newer release was published since the version you named or the cursor you used. | Call the tool again without a release to use 0.1.3. |
path_not_found | The release has no such file, page, component or token. | Use get_product or list_release_files to see what's included. |
ambiguous_identifier | The name matches more than one page, component or token. | Use one of: sotto/component/pricing@css-pricing, sotto/component/pricing@js-pricing. |
invalid_input | The arguments do not match the tool's schema, or the cursor is not valid. | Fix the input and call the tool again. |
HTTP 401, 403 or 429 | Before the tool runs: the sign-in is not valid, the membership does not allow access, or there were too many requests. | See Errors and fixes. |
Every tool can also answer service_unavailable and integrity_error: try again in a few minutes.