Docs · Guides
Errors and retries
Errors are RFC 9457 problem details. Each one has a type that says what went wrong and a retryable flag that says whether to try again.
Problem details
Error responses use application/problem+json. Decide what to do from type and retryable, not from title or detail, which are for people.
{
"type": "https://developers.novo.co/problems/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This client does not have the cards:freeze scope.",
"request_id": "req_example_01",
"retryable": false
}typerequiredIdentifies the error. Use it, not the title, to decide what to do
titlerequiredShort human-readable summary
statusrequiredThe HTTP status code
detailExplanation of this occurrence
instanceIdentifies this occurrence
request_idrequiredSame as the Novo-Request-Id header. Quote it to support
retryablerequiredWhether the same request may be retried, after Retry-After when present
type is an absolute URI that points to the page for that error (see Problem types). The docs host isn’t final yet , and the short names below are proposed. The token endpoint is the exception: it answers with OAuth 2.0 errors (see Authentication).
Error types
invalid-token401NoThe token is missing, malformed or unknowntoken-expired401NoThe token expired. Get a new one and send the request againclient-disabled401NoThe client was revoked, suspended or switched offinsufficient-scope403NoThe client doesn't have the scope this call needsowner-standing-lost403NoThe owner this client is bound to no longer holds the owner role, or their profile no longer allows accessfeature-not-enabled403NoThe API isn't enabled for this businessinvalid-parameter400NoA parameter is invalid, for example a card_id that isn't a UUID, or the body isn't valid JSONnot-found404NoNothing with that id in the bound businessidempotency-key-reused409NoThe Idempotency-Key was used before with a different requestidempotency-in-progress409After Retry-AfterThe first request with this key is still runningcard-state-conflict409NoThe card is in a state that can't be frozenpayload-too-large413NoThe request body is too large. The size limit will be stated in these docs once it is setunsupported-media-type415NoThe operation doesn't accept the request body's content type or charsetrate-limited429After Retry-AfterToo many requests for this client or businessinternal-error500NoSomething failed unexpectedly on Novo's side. The body carries no internal detaildependency-unavailable503After Retry-AfterPart of the answer can't be loaded right nowWhen to retry
Rate limits
Limits apply per client and per business. When you go over, the API returns 429 with Retry-After, plus RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset headers. The numbers are . The token endpoint has a limit of its own, so cache your access token for its whole lifetime.
Idempotency
Freezing a card accepts an Idempotency-Key header: a value you choose, up to 255 characters, such as a UUID. It’s recommended, not required. Freezing is safe to repeat anyway: freezing a frozen card returns 200.