Skip to main content
All errors use one envelope:
code is the stable contract — branch on it, not on message wording. details is optional context (offending field, retry_after seconds, required_scope, …). Over MCP, errors arrive as tool errors whose text is CODE: message, so agents get the same signal and can branch on the same codes.

General codes

Confirm-token codes

Returned by the three execute operations. See Write actions and confirmation.

Write rule codes

Rejections that come from the rules of the action itself.

Real examples

401 — no key (captured live):
401 responses carry a WWW-Authenticate: Bearer realm="seesaw-open-api" header. Depending on the network path it may arrive under the name x-amzn-remapped-www-authenticate — match either when debugging.
403 — read-only key on a write endpoint (captured live):
Scopes are fixed at creation — create a new key with the write scope rather than looking for an upgrade endpoint. See Authentication. 409 — reusing a spent token (captured live):
400 — tampered token (captured live):
429 — rate limited: see Rate limits for the full shape and headers.

404 semantics worth knowing

A 404 does not distinguish between “never existed”, “hidden by the owner’s privacy settings”, and “removed by moderation” — deliberately. Don’t retry 404s; surface them as “not available”.

Preview reasons are not errors

When a preview returns can_place / can_publish / can_back as false, the call succeeded (HTTP 200). The blocking condition is in reason and the summary still carries real numbers, so you can explain the situation to the user instead of reporting a failure. No confirm_token is issued.