Skip to main content
Non-successful requests use the canonical error envelope:
Every JSON error from the versioned API includes data.requestId. It is an opaque correlation ID that links the response to server logs; include it when contacting support, but do not use it for application branching. Other safe fields in data, such as retryAfter, are error-specific and optional. Branch on error.code; do not parse the human-readable message.

Common errors

Rate-limit responses

HTTP 429 covers more than one limit. Use error.code and, when present, data.reason to choose the correct recovery behavior.

Per-minute administrator-issued key limit

Wait for retryAfter seconds or until resetAt before retrying.

Monthly administrator-issued key quota

Do not repeatedly retry a monthly quota failure. Wait until resetAt, or contact support to review the quota.

Browser or upstream throttling

Public browser traffic can be limited per IP address, and an upstream provider can also throttle a request. Those RATE_LIMITED responses may contain only data.retryAfter and data.requestId, or only data.requestId. The API-key-only fields reason, limit, remaining, and resetAt are therefore optional.

First-party client transport failures

The Pirehub web client can also classify failures that happen before an HTTP response exists. These codes are local transport outcomes, not server responses: The client does not queue authenticated or browser-verification mutations while offline. Tokens and business state may expire, and an automatic replay could duplicate a side effect.

Retry strategy

For 429, 503, and 504 responses, honor Retry-After when present. Otherwise, use exponential backoff with jitter and a finite retry limit. A monthly quota failure is not a transient retry candidate before its reset. Do not automatically retry 400, 401, or 403 responses until you have corrected the request or credentials. The first-party transport does not display notifications itself. Components decide whether an error is user-facing, which keeps background polling and prefetch failures from producing unrelated popups.
An unregistered domain is not an error. A completed lookup returns HTTP 200 with success: true and data.registered: false.

Self-service API plans

Subscription-backed API keys also return API_PLAN_REQUIRED or API_CAPABILITY_DENIED (403), API_CREDITS_EXCEEDED or USAGE_CONCURRENCY_EXCEEDED (429), and USAGE_RESERVATION_CONFLICT or USAGE_RESERVATION_EXPIRED (409). Rate limits and concurrency failures do not consume credits. Every error retains the same envelope and data.requestId. When admission returns USAGE_CONCURRENCY_EXCEEDED, it retains no new credit reservation; wait for capacity and retry with the same identifier and payload. See API plans, credits and idempotency for the full retry contract and header meanings.