PulsePigeonemail infrastructure

Status handling

StatusMeaningClient action
200Read succeededContinue.
201Resource createdStore the returned id and any one-time secret immediately.
202Message acceptedPoll message logs or subscribe to status webhooks.
401Missing auth contextAttach tenant, user, and role headers or valid API credentials.
403Role or MFA requiredAsk an owner/operator to perform the privileged action.
404Tenant-scoped resource missingTreat as not found; do not retry without new input.
409State conflictFor idempotency conflicts, fix the request body or use a new key.
422Validation failedFix the request shape before retrying.
423Sending haltedStop sends; review suspension status and appeal/export paths.
429Rate or sending limitBack off and retry after capacity resets.
500Unexpected server errorRetry with jitter; escalate if repeated.

Typed errors

CodeStatusMeaning
auth_context_required401No authenticated tenant/user scope was provided.
owner_required403Privileged owner/admin/operator action attempted by member.
operator_required403Global/platform action attempted outside operator role.
project_not_found404Project does not exist in the authenticated tenant.
api_key_not_found404API key does not exist in the authenticated tenant.
idempotency_key_reused409Same Idempotency-Key was reused with a different body.
sending_halted423Workspace sending status or a safety restriction blocks new sends.
tenant_rate_limited429Tenant token bucket is empty.
provider_rate_limited429Provider token bucket is empty.
daily_recipient_limit_exceeded429Warmup daily recipient cap would be exceeded.
outbox_item_not_found404Dead-letter or scheduled item is not in this tenant.
outbox_item_not_dead_letter409Only dead-letter items can be replayed.
message_not_cancellable409Only future pending sends can be cancelled.

Retry and idempotency

RuleGuidance
Safe to retry401 after token refresh, 429, transient 5xx, provider timeout
Do not blind retry403, 404, 409, 422, 423
Use jitterStart at 1-2s, double to 30s, cap retries by workflow criticality
Use idempotencySend Idempotency-Key on POST /v1/messages and setup writes