Base URL https://api.cascadedynamics.ai/v1. Send Authorization: Bearer $CASCADE_API_KEY, Content-Type: application/json and your own User-Agent. Full guide: SKILL.md. Machine-readable: openapi.json. Recipes: recipes.html.
Ask for a cell before acting. Body: {"cell": "tickets/4812", "agent": "worker-a", "ttl_ms": 30000}. Or "cells": [...] (up to 16, all or nothing). Optional "wait_ms" (up to 10000) waits for the cell to free; waiting is free.
Grant (HTTP 200): {"ok": true, "cell", "entry", "fence", "entry_hash", "signed": true, "tokens_used": 0}. Hold (also HTTP 200): {"ok": false, "hold": true, "cell", "behind", "entry": null, "entry_hash", "signed": true}. Claiming again with the same agent renews the grant. A held agent's repeat claim is replayed free ("deduped": true).
Hand the cell back: {"cell", "agent"}, optionally "outcome": {"status": "done", "digest": "<sha256 hex>"} to sign the result into the record. Returns {"released": true, "entry_hash", "signed": true}. Never charged.
The meter: used, quota, remaining, credits, verified, and trial while the key is unverified. Usage is the count of grants and holds in your signed chain.
The signed chain and the public key it verifies against. Check it at verify.html or with npx cascade-verify bundle.json. Also: GET /v1/runs, GET /v1/runs/current, GET /v1/runs/{run_id}/bundle.
400: missing cell or agent, or a bad outcome.401: the key is missing, wrong or revoked.402 quota_exceeded: the free allowance is used up. Nothing is charged.403 email_verification_required: an unverified key used its 1,000-decision trial. Verify the email to unlock the rest.429 and 503: back off briefly and retry.POST /v1/signup {"email"} or sign up. Free: 1,000,000 decisions, no card. Builder: $49 a month for 2,000,000 a month. Top-ups: $10 per 250,000, never expire.