For AI agents
Using Decosa from an agent
Decosa has 86 tools on open-weight models (73 live, 13 in preview). Every hosted model call gets a signed receipt, and every tool can be self-hosted (on request while it's in early access). This page is for coding agents, browser harnesses and scripts that read or drive the site. The same facts are in plain text at /llms.txt and /llms-full.txt.
Machine-readable endpoints
Prefer these to scraping. They are built from the same data as the pages.
- /api/catalog.json
- Every tool, industry, product and building block, with status, verification and links.
- /use-cases/<id>.json
- One tool: stack, tiers, verification, buyer facts, where its data goes (
data_handling, explained at /data), console samples and prompt URLs. Example: /use-cases/privilege-log.json - /api/metrics.json
- Per tool:
eval_summary(headline metrics with split, n, dataset, held out or not, caveats, date), QA-sweep verification, cost per run, rehearsal bundle and models. The page is /metrics; live nightly results come fromGET /verify/statuson the API. - /api/hardware.json
- The hardware catalog (memory, bandwidth, FP8/FP4, price, datasheet links) and, per tool, the memory each tier needs (component by component, with its basis: measured, stack or estimate) and the verdict on common boxes. The interactive version is /self-host/hardware.
- /prompts/<id>-selfhost.md
- The self-host prompt, raw markdown. Also
-hosted.mdand-assemble.md(the Stack tab's assembly prompt). - /api/contract.json
- The decosa-api routes, indexed from the contract. The contract itself: /api/contract.md, rendered at /docs/api.
curl -s https://decosa.ai/api/catalog.json \
| jq '.use_cases[] | select(.industries | index("legal")) | {id, name, status}'Driving the pages
- Landmarks: one
header,navlabelled “Main”,mainandfooter. One h1 per page, headings in order. Every button, link and field has an accessible name, so role-and-name locators work. - Links are real
hrefs. Search results, catalog cards and menus all navigate by URL. - Tool pages have tabs addressable by hash:
/apps/<id>#stack,#live,#watch,#build,#self-host. Arrow keys move between tabs. - Catalog filters live in the query string: /tools?industry=legal. Params: industry, job, input, deploy, status, verify, collection, q, sort, view.
- Console deep links:
/console/<id>?sample=<n>&autorun=0preselects sample n (1-based, or a sample id).autorun=1also starts it: a live run, or on slow tools the recorded real run first; add&mode=liveor&mode=replayto choose. Example: /console/privilege-log?sample=1&autorun=0. - Add
?reduce-motion=1to any URL to turn animations off for the rest of the tab session (?reduce-motion=0turns them back on).prefers-reduced-motionis respected too. - Every copy button has its text visible next to it, so you never need clipboard access. The same text is at the /prompts URLs.
- Nothing is shown only on hover.
Stable test hooks
These data-testid values are kept stable across redesigns. Tab panels that are not shown stay in the DOM (hidden), so scope locators to the visible panel, e.g. #panel-build.
| data-testid | What it is |
|---|---|
| use-case-card, use-case-row | A card (or list row) in the /tools catalog. Carries data-use-case-id and data-status. |
| catalog-search, catalog-filter | The catalog's search field and filter chips (data-facet, data-value, aria-pressed). |
| search-open | The header Search button (also ⌘K or Ctrl+K anywhere). |
| search-input | The search combobox. Results are links with data-testid search-result and data-href. |
| tab-stack, tab-live, tab-watch, tab-build, tab-self-host | The tabs on /apps/<id>. The URL hash selects them too. |
| copy-prompt-selfhost, copy-prompt-hosted, copy-prompt-assemble | Copy buttons for the prompts. The text is in the <pre> beside each (data-testid copy-text), and at /prompts/<id>-<kind>.md. |
| rehearsal, rehearsal-download, rehearsal-expected, rehearsal-command | The "rehearse on mock data first" section on /self-host and each Self-host tab (data-use-case-id): the bundle zip, its expected.json and the rehearsal command. Also in /use-cases/<id>.json under rehearsal. |
| copy-snippet, copy-text | Copy buttons for code snippets and keys, and the visible text beside any copy button. |
| get-api-key | Opens the key form. Then key-name, key-create, and key-value for the new key (shown once). |
| console, console-picker, console-picker-option | The console root (data-use-case-id) and the use-case switcher; options are links. |
| console-sample | The sample picker in a console. |
| console-run, console-stop, console-record | Start and stop a console run; console-record starts the microphone on live audio tools. |
| console-output | The result area on consoles that stream a result. aria-busy is true while a run streams. |
| watch-sample, watch-play, watch-seek, watch-speed, watch-output | The Watch replay: pick a recorded run, play, seek, speed, and the replayed result. |
| data-badge, data-badge-hosted | Where the data goes, on use-case headers and catalog cards (data-self-host: nothing, identifiers or content; data-hosted: operator, operator-plus-third-party or demo-only). Both link to /data#<id>. |
| metrics-table, metrics-row, metrics-search, metrics-filter-industry, metrics-filter-status, metrics-filter-nightly, metrics-filter-cost, metrics-filter-heldout, metrics-sort, metrics-count | On /metrics: the table, one row per tool (data-use-case-id, data-status, data-nightly: pass, fail, partial or none, data-nightly-source: nightly or qa, data-held-out, data-cost) and its controls. Filters and sort are in the query string (industry, status, nightly, cost, held_out=1, sort, q). |
| metrics-detail, metrics-eval, metrics-eval-metric, metrics-caveats, metrics-nightly, metrics-history, metrics-selfhost, metrics-bundle, metrics-models, use-case-metrics-link | On /metrics/<id>: the eval (data-held-out; each metric has data-split), the nightly check (data-source, data-result) with its run history, self-host verification and rehearsal bundle, models. use-case-metrics-link is the link from /apps/<id>. |
| data-level, data-flow-row | On /data: the three levels (data-level: self-host, hosted, sealed) and one row per tool (data-use-case-id). |
| hardware-check, hardware-check-row, hardware-summary, hardware-summary-row | The hardware check on each Self-host tab (data-use-case-id; each row has data-device, data-verdict: runs, smaller, no or unknown, and data-tier) and the per-box summary on /self-host. |
| hardware-fit, hardware-use-case, hardware-mode-catalog, hardware-mode-custom, hardware-device, hardware-count, hardware-custom-arch, hardware-custom-vram, hardware-custom-count, hardware-custom-ram | "Help me customise for my hardware" on each Self-host tab and on /self-host/hardware (root has data-use-case-id and data-verdict). The standalone page keeps its choice in the query string: ?use=<id>&hw=<device>&n=<count>, or ?use=<id>&vram=<GB per GPU>&gpus=<n>&arch=<blackwell|hopper|ada|ampere|cdna3|rdna3|apple|cpu>&ram=<GB>. |
| hardware-recommendation, hardware-tier-row, hardware-tier-pick, hardware-substitutions, hardware-substitution, hardware-speed, copy-prompt-hardware | Its output: the recommended tier (data-tier, data-verdict), one row per tier (data-tier, data-fit: runs, changes, no or unknown) with a radio to pick it, the model swaps, measured speed (data-measured: yes or no) and the setup prompt with the hardware plan. |
| hardware-catalog, hardware-device-row | The device table on /self-host/hardware (data-device-id), with memory, bandwidth, FP8/FP4, price and source links. |
| guide-open, guide-open-menu, search-ask-guide, guide-nudge | Open Ask Decosa, the site guide: the bottom-right button, the item in the mobile menu, the last option in the ⌘K palette (it asks what you typed), and a one-time hint on the home page. window event "decosa:open-guide" with {q} or {profession} opens it too. |
| guide-panel, guide-opener, guide-profession, guide-input, guide-send, guide-stop, guide-close, guide-starter | The guide panel (not modal: it stays open while pages change; html[data-guide=open] while open; Escape closes), the "What do you do?" opener and its profession chips (data-id), the message box, send and stop, close, and suggested questions. |
| guide-job, guide-nav, guide-undo, guide-strip, guide-expand, guide-collapse | Job chips after a profession (data-id = tool id), the "Taking you to …" line when the guide opens a page, Undo, and on phones the one-line strip the panel folds to after a navigation, with Chat to reopen. |
| guide-request, guide-request-send, guide-request-done, guide-request-status, guide-feasibility | The request card the guide drafts when no tool fits (the visitor reads it and presses Send), its preliminary feasibility read, the sent confirmation and the link to /requests/<token>. |
| guide-turn, guide-answer, guide-source, guide-link, guide-notice | A message and answer (guide-answer has aria-busy while it streams), the source chips under it, links inside it, and the notice when identifiers were removed. The same answers come from POST /api/guide (NDJSON, with nav and request events); an agent can read the pages it cites directly instead. |
Common tasks
- Find a tool: read
/api/catalog.json, or open /tools and pick ause-case-card, or press ⌘K and type. - Route a creative request (music, music video, animatic, audio drama, characters, UGC ad, dubbing): start at Decosa Studio (one app with packs: Story, Music, Film, Voice, Characters & Worlds, Brand & Ads, plus Studio checks). In
/api/catalog.json, thestudioproduct lists its packs as branches and their tools, and each tool carriespart_of(e.g.studio-music). Every tool runs through the consent ledger and adds C2PA credentials; the shared project (cast, world, look) is live for Story at/studio/projects. - Get the self-host prompt: fetch
/prompts/<id>-selfhost.md, or open/apps/<id>#self-host. - Get a hosted API key: /account/keys, then
get-api-key(if shown),key-name,key-create, and readkey-value. Keys are shown once; three a day per browser. - Run a sample: open
/console/<id>?sample=1&autorun=1and wait forconsole-outputto losearia-busy. - Call the API:
Authorization: Bearer dk_…against the base URL in/api/contract.json. Every model call returns a receipt id you can check at/receipts/<id>.
Please use synthetic or public data in the hosted demo. For real client or patient data, self-host.