Skip to content

Errors

When a request fails, the body is an error envelope:

{
"error": {
"code": "NOT_FOUND",
"message": "Purchase order not found",
"retryable": false,
"requestId": "0f8c…"
}
}

Retryable errors also include retryAfterMs and a Retry-After response header (in seconds).

codeHTTPMeaningRetry-After
UNAUTHORIZED401Missing, invalid, or revoked token
PLAN_REQUIRED403The shop isn’t on the Elevate plan (the REST API is Elevate-only)
FORBIDDEN_SCOPE403The token’s scope can’t access this resource
INVALID_INPUT400A bad query parameter (the message names the field)
NOT_FOUND404Unknown path, or the id doesn’t exist
RATE_LIMITED429Per-shop rate limit reached
DO_OVERLOADED503The shop’s data store is busy
DO_UNAVAILABLE503The data store is temporarily unavailable
UPSTREAM_SHOPIFY502A Shopify-facing dependency failedif present
TIMEOUT504The request timed outif present
OUTPUT_TOO_LARGE413The response exceeded the size cap
INTERNAL500An unexpected error

A non-GET method returns 405 (METHOD_NOT_ALLOWED).

On 429 / 503, wait Retry-After seconds (or retryAfterMs) and retry the same request. Don’t fan out parallel requests against one shop — the data store is single-threaded per shop, so concurrency doesn’t go faster and can trip the rate limit.