Quickstart
The complete tool surface, end to end.
Thirteen tools behind one stateless MCP endpoint: eight creative/verification capabilities, four durable job controls, and the free style catalog. Everything below is copy-paste against production. Paid calls return HTTP 402 first — that is the payment challenge, and the payments page shows the ~30 lines that answer it. Verification never costs anything.
The endpoint
| field | type | notes |
|---|---|---|
| endpoint | POST only | https://api.occestra.xyz/mcp — MCP streamable HTTP, stateless: a fresh server per request, no session to manage. |
| manifest | GET | https://api.occestra.xyz/.well-known/occestra.json — tools, prices, payment standard, House Styles, provenance constants. |
| rate limit | 60/min/IP | 429 beyond that. Paid settlement is your throughput ceiling in practice. |
Prices, from the same table the gate enforces:
| field | type | notes |
|---|---|---|
| oce_plan_occasion | 0.30 USDT | A grounded plan: real venues, real forecast, schedule, budget, contingencies |
| oce_design_invite | 0.75 USDT | An invitation suite in a curated House Style |
| oce_make_keepsake | 0.75 USDT | Keepsake artwork + a story page from a moment that already happened |
| oce_write_toast | 0.10 USDT | A toast written for the room, not for the internet |
| oce_moodboard | 0.30 USDT | A directed moodboard on a versioned style system |
| oce_launch_kit | 1.50 USDT | Hero visual, brand genome, launch thread, demo beat sheet, OG image |
| oce_critique | 0.01 USDT | Your artifact, graded against the published OQS — repair brief included |
| oce_verify_keepsake | free | Verify any seal against X Layer. Free forever |
| oce_create_pack_job | at cost | Run any of the above as a background job — costs exactly what that tool costs |
| oce_job_status | free | Where your job has got to, with the real event feed. Free |
| oce_job_result | free | Collect the finished pack. Free — you already paid |
| oce_cancel_job | free | Stop a job. Free. Queued cancels refund in full |
| oce_style_catalog | free | Every House Style, its real palette, and a real passing example. Free — call it first |
What every paid tool returns
One shape, everywhere. The pack is the product; the report and the seal are the proof:
response — the result content, parsed
{
"keepsakeId": "oce_01kxbz33bb4grnd1xh0gev", // stable id, /^oce_[0-9a-z]{22}$/
"studio": "celebrate",
"quality": {
"oqsVersion": "1.2.0", // the rubric version that graded this
"passRate": 1, // artifacts passing / artifacts graded
"repairedCount": 0 // Tribunal repair passes that ran
},
"coverageGaps": [], // honest list of what degraded, if anything
"artifacts": [{
"id": "plan", "kind": "plan", "title": "…", "format": "json",
"content": "…", // inline for text; images get:
"url": "https://api.occestra.xyz/a/…?exp=…&tok=…", // signed, expiring
"sources": [{ "source": "openstreetmap", "retrievedAt": "…", "url": "…" }],
"tribunal": { "pass": true, "repairs": 0, "axes": { "composition": 85, … },
"deterministic": [ … ], "issues": [], "coverageGaps": [] }
}],
"seal": { // present when the sealer key is live
"keepsakeId": "…", "manifestHash": "0x…", "packKind": 0, "createdAt": 1783886884,
"signature": "0x…", "signer": "0x0d63f9EeB86813230B72017444cea16Cd4A453F2",
"chainId": 196, "verifyingContract": "0x1653509df702b45d67b3eb12ca37de9f5fc21f08",
"leaf": "0x…", "anchored": true, "anchorTx": "0x…"
},
"publicPage": "https://occestra.xyz/k/oce_01kxbz33bb4grnd1xh0gev"
}curl https://api.occestra.xyz/k/oce_01kxbz33bb4grnd1xh0gev — or see it rendered at /k/oce_01kxbz33bb4grnd1xh0gev.oce_plan_occasion — 0.30 USDT
The full CELEBRATE studio: a plan grounded in real venues (OpenStreetMap, ranked and chain-demoted) and a real forecast (Open-Meteo), plus schedule, budget, contingency branches and a shareable guest guide. Every grounded claim carries its source and retrieval timestamp. No venue is ever claimed as booked.
| field | type | notes |
|---|---|---|
| occasion * | string | What is being celebrated, in your words. |
| city * | string | Where. Geocoded against real places. |
| date * | string | ISO date. Forecasts only exist ~10 days out; beyond that the plan says so instead of guessing. |
| headcount * | number | 1–500. |
| vibe * | string | The register: 'warm, candlelit, unhurried'. |
| budgetUsd | number | Optional. Budget artifact must sum to it (BUDGET_SUM_MISMATCH is a hard check). |
| styleId | HouseStyleId | amethyst_editorial · gilded_noir · sunprint · atlas_ink. Default: atlas_ink. |
| deliverables | CelebrateKind[] | Subset of plan · schedule · budget · contingency · guest_guide. Default: all five. |
request
curl -s -X POST https://api.occestra.xyz/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": { "name": "oce_plan_occasion", "arguments": {
"occasion": "A farewell dinner for a friend moving abroad",
"city": "Lisbon", "date": "2026-07-19", "headcount": 8,
"vibe": "warm, unhurried, a long table, good wine"
} }
}'oce_design_invite — 0.75 USDT
An invitation suite rendered in a versioned House Style, contrast-checked and dimension-checked by the Tribunal.
| field | type | notes |
|---|---|---|
| occasion * | string | What the invite is for. |
| date * | string | Printed on the invite; DATE_INVALID is a hard check. |
| city | string | Optional location line. |
| styleId | HouseStyleId | Visual system for the render. |
| detail | string | Anything the design should honor. |
request
curl -s -X POST https://api.occestra.xyz/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": { "name": "oce_design_invite", "arguments": {
"occasion": "Amara's graduation dinner", "date": "2026-08-02",
"city": "Lagos", "styleId": "gilded_noir"
} }
}'oce_make_keepsake — 0.75 USDT
The REMEMBER studio: keepsake artwork in a curated style plus a story page that strictly separates what your photographs establish from what is written as prose. People in your photos are counted, never identified. Uploads (optional) go to POST /uploads first — EXIF and GPS are stripped on arrival, the original bytes are never written to disk, and DELETE /projects/:id removes pack, artifacts and photographs, verified.
| field | type | notes |
|---|---|---|
| title * | string | What you call this memory. |
| description | string | What happened, in your words. Names you use are treated as your facts about your own life. |
| momentDate | string | When it happened. |
| tone | string | 'nostalgic, quiet'. |
| mediaRefs | string[] | Private upload keys from POST /uploads (max 8). |
| confirmGraph | StoryGraph | Your corrected story graph — used exactly as given, no re-inference. |
| styleId | HouseStyleId | Default sunprint — cyanotype is the right register for memory. |
request
curl -s -X POST https://api.occestra.xyz/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": { "name": "oce_make_keepsake", "arguments": {
"title": "Our first summer in Porto",
"description": "We walked the bridge at dusk and ate too many pastries.",
"tone": "nostalgic, quiet"
} }
}'oce_write_toast — 0.10 USDT
A toast written for the room, not for the internet — the anti-slop filters hit copy hardest.
| field | type | notes |
|---|---|---|
| subject * | string | Who or what the toast is to. |
| relationship | string | Your relationship to the subject. |
| tone | string | 'funny but ends sincere'. |
| details | string | The specific memories only you could supply — this is what makes it yours. |
| lengthSeconds | number | Spoken length target. |
request
curl -s -X POST https://api.occestra.xyz/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": { "name": "oce_write_toast", "arguments": {
"subject": "Mara", "relationship": "my older sister",
"tone": "funny, ends sincere",
"details": "she taught me to drive, badly, in a borrowed Corolla"
} }
}'oce_moodboard — 0.30 USDT
| field | type | notes |
|---|---|---|
| subject * | string | What the board is for. |
| styleId | HouseStyleId | The versioned style system to direct it. |
| notes | string | Constraints and references. |
request
curl -s -X POST https://api.occestra.xyz/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": { "name": "oce_moodboard", "arguments": {
"subject": "a rooftop birthday dinner at dusk", "styleId": "amethyst_editorial"
} }
}'oce_launch_kit — 1.50 USDT
The LAUNCH studio: give it a URL and it reads your actual site in a headless browser — the colours a browser rendered, not a guess — extracts an honest brand genome, then produces a hero visual, announcement cards, a launch thread, a 90-second demo beat sheet and OG images. Fabricated prices, invented user counts, and placeholder copy are caught deterministically and rejected or repaired — never shipped as fill-in-the-blank text.
| field | type | notes |
|---|---|---|
| productName * | string | The product. |
| url | string | Live URL. Without it the genome is description-only and the pack discloses that gap. |
| description | string | One honest paragraph. |
| audience | string | Who this is for. |
| styleId | HouseStyleId | Visual system for the renders. |
| deliverables | LaunchKind[] | Subset of the kit. |
request
curl -s -X POST https://api.occestra.xyz/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": { "name": "oce_launch_kit", "arguments": {
"productName": "YourProject", "url": "https://yourproject.xyz",
"audience": "builders shipping this week"
} }
}'oce_critique — 0.01 USDT · the wedge
Run your own artifact — text or image, ours or yours — through the Occestra Tribunal and get back the graded OQS report plus a concrete repair brief. One cent. This is the cheapest way any builder in the ecosystem can find out whether their output clears a published standard before their users do.
| field | type | notes |
|---|---|---|
| kind * | string | What the artifact is: 'launch_thread', 'invitation', 'plan'… — selects which deterministic checks apply. |
| brief * | string | What the artifact was supposed to achieve. Grading is always against intent. |
| text | string | The artifact, if it is copy. |
| imageBase64 | string | The artifact, if it is an image. |
| styleId | HouseStyleId | Style to grade fidelity against, for images. |
| size | string | Declared dimensions, for the DIM_ASPECT_MISMATCH check. |
request
curl -s -X POST https://api.occestra.xyz/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": { "name": "oce_critique", "arguments": {
"kind": "launch_thread",
"brief": "announce a CLI tool to senior engineers without hype",
"text": "Post 1: We are thrilled to announce our revolutionary…"
} }
}'Response: the full TribunalReport — axes, deterministic results, issues, and repairBrief when it fails. That example fails; the report will tell you exactly why.
oce_verify_keepsake — free, forever
Verification is deliberately outside the paywall: trust that costs money is not trust.
| field | type | notes |
|---|---|---|
| keepsakeId * | string | Any Occestra keepsake id. |
request
curl -s -X POST https://api.occestra.xyz/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": { "name": "oce_verify_keepsake", "arguments": { "keepsakeId": "oce_01kxbz33bb4grnd1xh0gev" } }
}'response
{
"found": true,
"keepsakeId": "oce_01kxbz33bb4grnd1xh0gev",
"studio": "celebrate",
"quality": { "oqsVersion": "1.2.0", "passRate": 1, "repairedCount": 0 },
"seal": {
"…": "the full seal fields, plus:",
"leaf": "0xc814215758135400b364fbb5d4614b7e9ab50a114158a1c91e36064ab23a4adc",
"signatureValid": true
},
"anchored": true,
"anchorTx": "0xb97ec200c619fca5f589b07d65bb7aa1a31a404e50e8fe010e19abf0c4058801",
"explorer": "https://www.oklink.com/x-layer/tx/0xb97ec2…",
"publicPage": "https://api.occestra.xyz/k/oce_01kxbz33bb4grnd1xh0gev"
}Or skip our servers entirely — the provenance page has a standalone script that performs both checks against the chain directly.
The SDK, and the drop-in quality gate
@occestra/client wraps all of the above with types and automatic x402 payment (your key signs locally; it is never sent):
five lines, whole integration
import { Occestra } from "@occestra/client";
const studio = new Occestra({ endpoint: "https://api.occestra.xyz",
payment: { privateKey: process.env.AGENT_KEY } });
const toast = await studio.writeToast({ subject: "Mara", details: "she taught me to drive, badly" });
console.log(toast.publicPage); // graded, sealed, verifiableAnd for any agent built on the Vercel AI SDK, examples/quality-gate.mjs in the repo is a drop-in middleware that runs every generation through oce_critique before your agent ships it — one repair round on failure, exactly like our own pipelines, for one cent a check:
quality-gate for any AI SDK model
import { wrapLanguageModel } from "ai";
import { occestraQualityGate } from "./quality-gate.mjs";
const model = wrapLanguageModel({
model: yourModel, // any provider
middleware: occestraQualityGate({
endpoint: "https://api.occestra.xyz",
payment: { privateKey: process.env.AGENT_KEY },
kind: "launch_thread",
}),
});
// generations that fail the published standard are repaired once with the
// Tribunal's brief; persistent failures ship WITH the report attached.