Skip to content
WhatIsUp.dev
Esta página está disponible solo en inglés por ahora.

Errors

Every 4xx and 5xx response body uses the same envelope:

{
  "error": {
    "code": "channel_unavailable",
    "message": "Channel is not connected. Re-pair to continue.",
    "details": { "channel_id": "..." }
  },
  "request_id": "req_01J..."
}

Match on code — it's the stable contract. message is human-readable and may change between releases. details is optional and code-specific.

The full code set ships in the Zod contract ERROR_CODES. The table below is canonical.

Auth / identity

CodeWhen you'll see it
auth_missingNo Authorization header sent.
auth_invalidBearer token doesn't match any active key.
auth_malformedHeader present but not Bearer …, or token format wrong.
auth_expiredKey has been revoked or expired.
auth_no_emailDashboard session token has no verified email.

Channel lifecycle

CodeWhen you'll see it
channel_not_foundChannel UUID doesn't exist (or belongs to another customer).
channel_access_deniedChannel-scoped API key being used against a different channel.
channel_unavailableChannel is in a terminal state (logged_out, stopped_by_user, disabled_by_admin, error, failed).
channel_scoped_keyKey is scoped to a single channel but a multi-channel route was called.
invalid_lifecycle_transitionTried to connect an already-connected channel, etc.
pair_code_unavailableChannel state doesn't allow generating a pair code right now.
pair_code_failedUpstream rejected the pair code request.
no_qrQR not yet ready (channel hasn't booted), or no QR for this state.
not_disabledTried to re-enable a channel that wasn't admin-disabled.
concurrent_modificationTwo writes collided on the same row; retry your read-modify-write.

Plan / quota

CodeWhen you'll see it
plan_channel_limitPlan's channel cap reached. Upgrade or delete an existing channel.
rate_limitedPer-key rate limit exhausted. Honor Retry-After.
worker_at_capacityNo worker has free slots right now — extremely rare; retry.

Webhook + media

CodeWhen you'll see it
webhook_endpoint_not_foundEndpoint UUID doesn't exist.
media_goneSigned media token is valid but the bytes have aged out of cache. Re-fetch the source.

Generic

CodeWhen you'll see it
invalid_requestBody or query failed Zod validation. details contains the issue list.
not_foundGeneric 404.
bad_requestGeneric 400 where no narrower code fits.
no_opThe mutation was a no-op (already in the target state).
otherCatch-all for upstream-provider errors.
internal_errorUnhandled server-side exception. We're alerted; request_id is the trace key.

Best practices

  • Always log request_id. Customer support uses it to find the exact request in our traces.
  • Match on code, never on message. The messages are tuned for human readability and shift over time.
  • Treat unknown codes as transient. New codes get added; assume retryable until the docs are updated.
  • For 429, honor Retry-After instead of guessing backoff.