QuavernQuavsit

Section 09 of 12

Errors

Every error is {"error": {"code", "reason", "message", "details"?}} with the real HTTP status. reason is the stable slug to branch on; code (QVST1-3404 style) is the support reference to quote; message is English text for humans and may change. Errors cost no units, except that 429 and 402 answers are counted in the per-key error figures on the account page.

Quavsit errors#

StatusreasoncodeWhen
400invalid_locationQVST1-1400malformed near, bbox or radius
400transit_query_invalidQVST1-2400invalid parameter value or combination; details.reason = "cross_network" on journeys
404place_not_foundQVST1-4404from or to could not be resolved
404network_not_foundQVST1-1404unknown network slug
404line_not_foundQVST1-2404unknown line id
404stop_not_foundQVST1-3404unknown stop or area id
404capability_unsupportedQVST1-5404the network has no such data (vehicles, native planner)
409key_limit_reachedQVST1-1409plan's maximum number of keys reached (account API)
429stream_limit_reachedQVST1-1429too many concurrent streams
429spend_cap_reachedQVST1-2429monthly spend cap hit while in overage; details {spend_cap_cents, spent_cents, period}
502transit_upstream_errorQVST9-1502operator feed failed and no cached copy is usable
503transit_upstream_budgetQVST9-3503daily upstream quota exhausted and no cached copy
503network_data_unavailableQVST9-4503static data not ingested yet for that network
503quavsit_unconfiguredQVST2-1503service misconfiguration on our side
504transit_upstream_timeoutQVST9-2504operator feed did not answer in time

place_not_found is a 404: the requested place could not be resolved; the reason is what to branch on.

Platform errors#

The identity and metering layer answers with its own prefixes; these are the ones an API client meets.

StatusreasoncodeWhen
401authentication_requiredSCTY3-1401no bearer key
401invalid_tokenSCTY3-2401unknown, revoked or non-API token
402plan_requiredMARL1-1402streams on a plan without them, or overage on a plan without it
403insufficient_scopeSCTY3-2403wrong audience or scope, or not a personal key
403email_verification_requiredMAIL3-1403account email not verified
404not_foundAPIE1-0404unknown route
429rate_limitedAPIE1-0429per-minute burst exceeded; retry after the Retry-After header
429quota_exhaustedAPIE1-1429monthly units exhausted; details {plan, period, limit, used, remaining, resets_at, overage_available, upgrade_url}
500internal_errorAPIE2-1500unexpected failure on our side

Handling advice#

  • Branch on reason, never on message.
  • On rate_limited, wait for Retry-After seconds; on quota_exhausted, read details.resets_at and, if details.overage_available is true, consider enabling overage on the account page.
  • On transit_upstream_*, retry once after a few seconds; the answer may come back stale (see freshness) rather than fail.
  • Keep the code in your logs; it is what support asks for.
json
{"error": {"code": "APIE1-1429", "reason": "quota_exhausted", "message": "Monthly units exhausted.",
  "details": {"plan": "free", "period": "2026-09", "limit": 5000, "used": 5000, "remaining": 0,
    "resets_at": "2026-10-01T00:00:00Z", "overage_available": false, "upgrade_url": "https://my.quavern.com/account/quavsit"}}}