The canonical OpenWOP error envelope is { code, message, details? } returned with the appropriate HTTP status. This page lists every code in the v2 error registry with its HTTP status, a one-line meaning, and the spec section that carries the normative definition.
Generated from spec/v2/errors.json at build time, so it cannot drift from the corpus. Envelope shape: core/errors.md.
Envelope shape
{
"code": "validation_error",
"message": "Request body fails schema",
"details": {
"field": "workflowId",
"reason": "missing"
}
}
code — machine-readable identifier. Stable within a major; new codes land additively.
message — human-readable explanation. MUST NOT include the offending input verbatim when that input could echo a prompt-injection payload or a credential.
details — optional structured context. Documented per code below.
The HTTP status code carries the primary classification; the code field disambiguates within the status class.
Codes by HTTP status
HTTP 400 — 26 codes
| Code | Retriable | Since | Defined in |
connection_provider_unresolved | no | 1.0 | spec/v1/connection-packs.md |
connector_action_unresolved | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
credential_scope_unsupported | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
delegation_chain_cyclic | no | 2.0 | RFC 0170 §B.1 |
delegation_chain_too_long | no | 2.0 | RFC 0170 §B.1 |
idempotency_key_invalid | no | 2.0 | RFC 0170 §D.3 |
interop_version_unsupported | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
oauth_provider_unsupported | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
oauth_scope_unsupported | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
pack_dependency_cycle | no | 1.0 | spec/v1/node-packs.md |
pack_engine_unsupported | no | 2.0 | RFC 0177 §A.1 |
pack_integrity_failure | no | 1.0 | spec/v1/node-packs.md |
pack_kind_invalid | no | 1.0 | spec/v1/node-packs.md |
pack_lockfile_incomplete | no | 1.0 | spec/v1/node-packs.md |
pack_peer_dependency_missing | no | 1.0 | spec/v1/node-packs.md |
pack_peer_dependency_undefined | no | 1.0 | spec/v1/node-packs.md |
pack_signature_invalid | no | 1.0 | spec/v1/node-packs.md |
pack_validation_failed | no | 1.0 | spec/v1/node-packs.md |
protocol_version_mismatch | no | 2.0 | RFC 0172 §A.3 |
schedule_horizon_exceeded | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
sub_chain_cycle | no | 2.0 | RFC 0133 §Unresolved 3 (resolved: maxSubChainDepth 8, fail closed); carried into v2 by RFC 0177 §E |
sub_chain_depth_exceeded | no | 2.0 | RFC 0133 §Unresolved 3 — the depth ceiling breach (distinct from a cycle) |
unsupported_stream_mode | no | 1.0 | api/openapi.yaml UnsupportedStreamMode (RFC 0171 §B.1 folds the one-member enum) |
until_in_past | no | 2.0 | RFC 0169 §A.3 (validation_error details.reason in v1; a code in v2) |
validation_error | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
webhook_url_rejected | no | 2.0 | spec/v2/core/webhooks.md §Egress |
HTTP 401 — 10 codes
| Code | Retriable | Since | Defined in |
audience_mismatch | no | 2.0 | RFC 0170 §B.1 |
connector_auth_expired | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
credential_revoked | no | 2.0 | RFC 0170 §B.3 |
delegation_expired | no | 2.0 | RFC 0170 §B.1 |
identity_unresolvable | no | 2.0 | RFC 0170 §B.1 |
identity_unverified | no | 2.0 | RFC 0170 §B.1 / RFC 0154 |
interrupt_token_invalid | no | 2.0 | RFC 0170 §E.1 |
key_revoked | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
sender_constraint_missing | no | 2.0 | RFC 0170 §B.4 |
unauthenticated | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
HTTP 403 — 11 codes
| Code | Retriable | Since | Defined in |
credential_forbidden | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
delegation_scope_amplified | no | 2.0 | RFC 0170 §B.1 |
forbidden | no | 1.0 | spec/v1/auth.md (v1 MUST) |
force_engine_version_forbidden | no | 1.0 | spec/v1/run-options.md / version-negotiation.md (OpenWOP-Force-Engine-Version outside test keys) |
id_tenant_mismatch | no | 2.0 | RFC 0170 §D.1 (an id whose tenant segment is not the caller's) |
mock_provider_forbidden | no | 1.0 | spec/v1/run-options.md (mockProvider outside test keys) |
pack_namespace_unauthorized | no | 1.0 | spec/v1/node-packs.md |
run_forbidden | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
sandbox_capability_denied | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
sandbox_escape_attempt | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
workspace_membership_required | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
HTTP 404 — 6 codes
| Code | Retriable | Since | Defined in |
credential_not_found | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
interrupt_not_found | no | 1.0 | spec/v1/interrupt.md |
not_found | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
pack_version_not_found | no | 1.0 | spec/v1/node-packs.md |
replay_source_missing | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
signature_not_available | no | 1.0 | api/openapi.yaml |
HTTP 406 — 1 code
| Code | Retriable | Since | Defined in |
protocol_version_unsupported | no | 2.0 | RFC 0172 §A.3 |
HTTP 409 — 14 codes
| Code | Retriable | Since | Defined in |
connection_provider_conflict | no | 1.0 | spec/v1/connection-packs.md; RFC 0177 §D.1 fail-closed |
envelope_correlation_conflict | no | 1.0 | spec/v1/ai-envelope.md E2 (correlationId type conflict) |
idempotency_in_flight | no | 1.0 | spec/v1/idempotency.md §Concurrent duplicates (v1 MUST; RFC 0171 §B.2 keeps one mismatch code, this is the in-flight state) |
idempotency_key_mismatch | no | 1.0 | spec/v1/idempotency.md (the only spelling; RFC 0171 §B.2) |
interrupt_already_resolved | no | 1.0 | spec/v1/interrupt.md (409/410 overlap: RFC 0171 row C4.6 — one code per state) |
pack_dependency_conflict | no | 1.0 | spec/v1/node-packs.md |
pack_integrity_mismatch | no | 1.0 | spec/v1/node-packs.md |
replay_diverged_at_refusal | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
replay_memory_snapshot_unavailable | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
run_already_active | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
run_state_conflict | no | 2.0 | spec/v2/core/runs.md §Pause and resume |
run_terminal | no | 1.0 | spec/v1/rest-endpoints.md (a mutation on a terminal run) |
version_conflict | no | 1.0 | api/openapi.yaml |
workspace_conflict | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
HTTP 410 — 2 codes
| Code | Retriable | Since | Defined in |
interrupt_cancelled | no | 1.0 | spec/v1/interrupt.md (the run was cancelled while suspended) |
interrupt_expired | no | 1.0 | spec/v1/interrupt.md |
HTTP 413 — 2 codes
| Code | Retriable | Since | Defined in |
payload_too_large | no | 2.0 | spec/v2/core/errors.md §The envelope — a request body a host refuses on size before parsing it (RFC 9110 §15.5.14); registered 2026-09-05 because both production hosts had to invent it |
workspace_too_large | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
HTTP 415 — 1 code
| Code | Retriable | Since | Defined in |
unsupported_media_type | no | 2.0 | spec/v2/core/errors.md §The envelope — a request body whose Content-Type the host does not accept (RFC 9110 §15.5.16); registered 2026-09-05 because both production hosts had to invent it |
HTTP 422 — 16 codes
| Code | Retriable | Since | Defined in |
capability_not_provided | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
capability_required | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
credential_required | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
envelope_invalid | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
envelope_refusal | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
envelope_truncation_unrecoverable | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
fork_point_invalid | no | 2.0 | spec/v2/core/runs.md §Fork |
loop_limit_exceeded | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
mcp_mrtr_rounds_exceeded | no | 2.0 | RFC 0175 §E.1 |
pack_runtime_requirement_unmet | no | 1.0 | spec/v1/node-packs.md |
recursion_limit_exceeded | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
residency_unavailable | yes | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
run_timeout | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
sandbox_memory_exceeded | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
sandbox_timeout | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
token_budget_exceeded | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
HTTP 426 — 1 code
| Code | Retriable | Since | Defined in |
client_version_unsupported | no | 2.0 | RFC 0172 row C5.8 |
HTTP 429 — 1 code
| Code | Retriable | Since | Defined in |
rate_limited | yes | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
HTTP 500 — 3 codes
| Code | Retriable | Since | Defined in |
event_type_unmapped | no | 2.0 | RFC 0176 §A.3 (a run whose log the host cannot translate is not readable) |
internal_error | yes | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
pack_load_failure | no | 1.0 | spec/v1/node-packs.md |
HTTP 501 — 1 code
| Code | Retriable | Since | Defined in |
credential_unavailable | no | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
HTTP 503 — 2 codes
| Code | Retriable | Since | Defined in |
pack_registry_unreachable | yes | 1.0 | spec/v1/node-packs.md |
runner_unavailable | yes | 1.0 | spec/v1/rest-endpoints.md §Error response shape |
_97 codes, generated from spec/v2/errors.json at build time._
Stability guarantees
Per Versioning & compatibility:
- New codes land additively within a major. Clients that match an unknown
code against a known set MUST treat it as the parent HTTP status family.
- Existing codes never change their HTTP status mapping or their semantic meaning within a major. A code's
details shape may gain new optional fields.
- Removed codes never happen within a major. A code that turns out to be redundant is documented as superseded; the old code keeps working.
What this page is not
This is not the normative source. The error envelope shape is defined in core/errors.md; each code's preconditions, the events it pairs with (envelope.retry.exhausted, cap.breached, etc.), and any SR-1 redaction rules are documented in the spec section linked above. When this page disagrees with the spec, the spec wins.
This page exists as a reference card for client implementers — one place to grep when wiring error handling.