Rate Limits & Errors

The credit system, and every status code and error you will see.

Rate limits

The Catalog API follows JOOR's standard rate limiting, documented in full here:

JOOR API rate limiting


Errors

Errors arrive in the envelope's errors array. Each entry has a machine readable status, a human readable message, and optional details.

{
  "data": [],
  "errors": [
    {
      "status": "NOT_FOUND",
      "message": "Collection not found",
      "details": { "collection_id": "1146216" }
    }
  ]
}

HTTP status codes

CodeMeaningWhat to do
200Success
201Created. Returned by subscription createStore the secret_key now
204No content. Returned by unsubscribeNothing
400Your request was malformedFix it. Do not retry unchanged
401Missing, invalid or expired tokenRefresh the token, then retry
403The account is not yours to act for, or is not a retailer accountCheck account. Do not retry
404The resource does not exist, or is not visible to this accountTreat as "not yours". Do not retry, with one exception — see Bulk Export (Seeding) for a 404 that means "re request this page"
405Method not allowed on this routeFix the verb
409Conflict. A live subscription already uses this callbackReuse the existing subscription
429Rate limitedWait X-Throttling-Resets-In seconds
5xxSomething failed on our sideRetry with exponential backoff

Retry or not. 401, 429, 5xx, and the one 404 case noted above are worth retrying. Every other status means fix your request or your data, not retry it as is.

Error statuses you will actually see

statusTypical cause
MISSING_REQUIRED_HTTP_QUERY_PARAMETERSaccount was not sent
VALIDATION_ERRORlimit out of range, malformed cursor, callback_url not HTTPS, unknown key in a request body, an empty events array
INVALID_CHOICEdetail was not summary or full; status filter outside the allowed set
FORBIDDENWrong account type, or a subscription that belongs to another account
NOT_FOUNDUnknown or invisible collection, product or subscription, or a product that dropped out of a bulk export page mid seed
TOO_MANY_REQUESTSOut of credits

A 404 is deliberate, not a leak. A collection you cannot reach returns 404 rather than an empty page, because an empty page would read as "this collection has no products". The same applies to products and subscriptions.

Unknown keys in a request body are rejected. Subscription create and update reject any field they do not recognise with a 400, rather than ignoring it. A typo in callback_url fails loudly instead of silently creating something you did not intend.