Error Codes & Rate Limits

HTTP status codes, RFC 7807 problem-detail format, rate limits, and the anonymous-tier fallback gotcha.

Updated May 2026

Error Codes & Rate Limits Documentation

WhisperGraph error responses follow RFC 7807 problem-detail format. Every error response is a JSON object with at least type, title, status, and detail.

{
  "type": "https://whisper.security/errors/query-depth-exceeded",
  "title": "Query Depth Exceeded",
  "status": 400,
  "detail": "Query depth 3 exceeds maximum allowed depth of 2. Reduce traversal hops or upgrade your plan for deeper queries.",
  "actualDepth": 3,
  "maxAllowedDepth": 2
}

HTTP status codes

CodeConditionWhat to do
400Invalid Cypher syntaxCheck your query for typos or unsupported syntax. See the Cypher Syntax reference.
400Query depth exceeds plan limitReduce traversal hops or upgrade your plan. Anonymous requests are capped at 2 hops; higher tiers allow deeper traversals — see the pricing page.
401The request was rejected for an authentication reasonCheck your X-API-Key header. Note that an unknown or malformed key normally degrades to anonymous access rather than returning 401 — if results look thin, see the anonymous-access note in the API reference.
408Query timeoutAdd LIMIT, narrow the pattern, or anchor with {name: "..."}. The default and maximum per-request timeouts are plan-specific — check them with CALL whisper.quota() (defaultTimeoutMs / maxTimeoutMs).
429Hourly or daily quota exceeded, or too many concurrent queriesWait for the reset time in the response headers, or upgrade your plan.
500Server errorRetry once. If it persists, contact support with the request ID.
502Upstream service errorA downstream graph backend returned an error. Usually transient — retry with exponential backoff.
503External service unavailableAn infrastructure data source (BGP, WHOIS, threat-intel) is temporarily unreachable. Affected fields may return null, and procedures like explain() may return available: false with a retryAfter value.
504Gateway timeoutThe request timed out at the gateway. Same as 408: anchor the query better, add LIMIT, simplify the traversal.

Rate limits

Quota is enforced on an hourly and a daily window. When you hit a 429, the response includes the rate-limit headers:

  • X-RateLimit-Limit / X-RateLimit-Remaining / X-RateLimit-Reset — your hourly quota, queries left this hour, and when the hourly window resets.
  • X-DailyLimit-Limit / X-DailyLimit-Remaining / X-DailyLimit-Reset — the matching values for the daily window.

Authenticated responses include these headers on every request, not just 429s — so you can watch your remaining quota without a separate call. Wait until the relevant reset time and retry, or run CALL whisper.quota() to see your current usage. For per-plan limits and quotas see the pricing page.


Reporting issues

When opening a support ticket, include:

  1. The full request URL and request body
  2. The full response (headers + body)
  3. The request_id from the response (if present)
  4. The time the request was made (UTC)

Open a ticket at console.whisper.security/support or email support@whisper.security.