Skip to main content
Faithful to the live Deck API v2.0.0 (captured 2026-06-09). The object shapes, event names, error envelope, IDs and formats below are exactly what real Deck returns — this page is the vocabulary to assert against, not a tutorial on Deck. If you know the API, the only new surface is the control layer at the bottom.
Deck ships no SDK and no sandbox, so your app already points a plain HTTP client at https://api.deck.co/v2 — repointing it is a one-line base-URL change (Interception).

Objects

Events

object.action. data is a frozen subset snapshot, and it differs from the REST view: empty fields serialize as "" (not null) and some fields are dropped — workflow_id is the canonical divergence (null over REST, "" in the event).
task_run.**canceling** is spelled with one L in the event name, while the run status is cancelling (two L). /event-types is the only unpaginated list. Deliveries are signed with the Standard Webhooks scheme (webhook-id / webhook-timestamp / webhook-signature).

Errors

The { type, code, message, field? } element is the same everywhere, but it surfaces in two places — which one you get depends on whether the call failed or the run failed. 1 · A call fails → HTTP error response. Status 401/403/404/409/422/429/500, body is the envelope:
400 validation errors are the one exception — a different, RFC-9110-style shape (not the envelope):
Quirks: an unknown route returns 404 with an empty body (no envelope); a bad filter value or over-range Limit is lenient → 200, never 400. 2 · A run fails → the call succeeds (HTTP 200), the error lives inside the run. result: "failure", output: null, and errors[] holds the same element:
type taxonomy (full set): api · auth · idempotency · interaction · organization · rate_limit · request · session · source · storage · task. Note api_key_invalid is type request, not authauth is only for credential-vs-source failures.

Pinnable values

The fields that originate outside Deck’s logic — the only ones you supply. Everything else (status, result, runtime_ms, ids, timestamps) is engine-derived and unfakeable.

Formats & conventions

Control (prod-break)

The only surface that isn’t real Deck. Everything above is the vendor’s; this is how you make a given outcome happen on demand.
  • Event names and behavior are pack-declared — the engine is generic; the Deck vocabulary above lives in this pack.
  • Control calls hit /__admin__/*. Their errors (e.g. a task_run_id that doesn’t exist → 409) go to your test, not the app under test, and are not Deck’s error envelope. sandbox.world.next() lists the world events whose preconditions currently hold.
  • No magic test inputs — Deck has none; force outcomes through this surface, never reserved input values.
  • Concepts: exogenous values · force a branch · world events · the clock · HTTP API.
Pinned against Deck API v2.0.0 (2026-06-09), guarded by contract tests that diff the pack against captured live responses.