Skip to content

Error Handling

When an API request fails, HookBridge returns a structured error response. Understanding the format and common error codes helps you build robust integrations that handle failures gracefully.

All error responses follow the same structure:

{
"error": {
"code": "ERROR_CODE",
"message": "Human-readable description of the problem.",
"details": {}
},
"meta": {
"request_id": "req_abc123"
}
}
  • error.code — a machine-readable string you can match on.
  • error.message — a human-readable explanation.
  • error.details — optional object with additional context (varies by error).
  • meta.request_id — unique identifier for the request, useful for support inquiries.
StatusMeaning
400Bad request — invalid input, missing required fields, or validation failure.
401Unauthorized — missing, invalid, or inactive API key.
403Forbidden — access denied or plan restriction.
404Not found — the requested resource does not exist.
409Conflict — duplicate resource, idempotency mismatch, or state conflict.
410Gone — payload retention expired or export link expired.
429Too many requests — rate limit or usage quota exceeded.
500Internal server error — unexpected failure.
CodeStatusDescription
UNAUTHORIZED401Missing or invalid API key, or expired session.
RATE_LIMITED429Too many failed authentication attempts.
FORBIDDEN403Access denied to the requested project.
CodeStatusDescription
INVALID_REQUEST400Invalid JSON, missing required fields, or general validation error.
INVALID_ENDPOINT400Endpoint URL is invalid — not HTTPS, too short/long, or targets a blocked address.
PAYLOAD_TOO_LARGE400Payload exceeds the 1 MB size limit.
CodeStatusDescription
DUPLICATE_URL409An endpoint with this URL already exists in the project.
ENDPOINT_BLOCKED400Endpoint URL targets a private or internal address.
ENDPOINT_UNREACHABLE400Endpoint domain could not be resolved.
CodeStatusDescription
IDEMPOTENCY_MISMATCH409Same idempotency key sent with a different payload.
IDEMPOTENCY_CONFLICT409Duplicate idempotency key with conflicting request.
CodeStatusDescription
MAX_SIGNING_KEYS_REACHED409Endpoint already has the maximum number of signing keys.
CANNOT_DELETE_LAST_SIGNING_KEY409Cannot delete the only remaining signing key.
CodeStatusDescription
RETENTION_EXPIRED410Message payload retention period has expired and the payload is no longer available.
PAYLOAD_UNAVAILABLE410Message payload has been cleaned up and cannot be replayed.
CodeStatusDescription
BURST_LIMIT_EXCEEDED429Project-level request rate exceeded. Includes retry_after_ms in details.
USAGE_LIMIT_EXCEEDED429Monthly message limit exceeded. Includes plan, usage, limit, and resets in details.
ENDPOINT_LIMIT_REACHED429Maximum endpoints for your plan reached.
PROJECT_LIMIT_REACHED429Maximum projects for your plan reached.
KEY_LIMIT_EXCEEDED429Maximum API keys per project reached.
EXPORT_LIMIT_EXCEEDED429Export rate limit or concurrency limit reached.
REPLAY_LIMIT_EXCEEDED429Replay batch size or frequency limit exceeded.
CodeStatusDescription
NO_SUBSCRIPTION404No active subscription found.
ALREADY_SUBSCRIBED409Tenant already has an active paid subscription.
SUBSCRIPTION_INACTIVE403Subscription is past due, canceled, or unpaid.
PLAN_REQUIRED403Feature requires a higher-tier plan.
CodeStatusDescription
EXPORT_ACTIVE409Cannot delete an export that is still in progress.
EXPORT_NOT_READY400Export is not yet ready for download.
EXPORT_EXPIRED410Export download link has expired.
  • Match on error.code for programmatic handling, not error.message (messages may change).
  • For 429 responses, check error.details.retry_after_ms and wait before retrying.
  • Include the meta.request_id when contacting support about a specific failure.
  • 5xx errors are transient — retry with backoff.
  • 4xx errors require fixing the request before retrying (except 429, which is a temporary rate limit).
Personalize Examples

Enter your credentials to populate code examples throughout the docs.