Skip to main content

Errors

Every error has the same JSON body:

{
"code": "QUOTE_EXPIRED",
"message": "The quote has expired.",
"detail": { "reason": "geography_changed" },
"request_id": "req_01JC9W6Q4V5Y8Z2M3N4P5R6S7T"
}
  • code is stable. Write your logic against it.
  • message is for your developers and logs. Do not show it to customers; map the code to your own words, or use the customer wording in the error code reference.
  • detail is optional and adds a field, a reason or other facts named in the reference.
  • request_id is also in the X-Request-Id header. Give it to support and they can find exactly what happened.

A 500 INTERNAL_ERROR carries only the request ID. IDM never puts internal details in an error.

What to do, by kind​

KindCodes (examples)What your code does
Fix the requestVALIDATION_FAILED, SERVER_CONTROLLED_FIELD, IDEMPOTENCY_KEY_REQUIREDDo not retry. Fix the request.
Fix the credentialINVALID_API_CREDENTIAL, SIGNATURE_INVALID, SCOPE_MISSINGDo not retry. Check the key, the clock, the signature or the scopes.
Not yours, or not thereTENANT_ACCESS_DENIED, NOT_FOUNDDo not retry. Check the reference.
The world changedQUOTE_EXPIRED, INVALID_DELIVERY_STATE, BULK_QUOTE_CHANGED, DELIVERY_ALREADY_ASSIGNEDRead the resource again, then decide. A new quote is usually the answer.
DuplicateIDEMPOTENCY_KEY_REUSED, EXTERNAL_REFERENCE_IN_USE, DUPLICATE_JOB_INTENTYou sent a different request under an old key or reference. Look up the original.
Not possible hereLOCATION_NOT_SUPPORTED, VEHICLE_UNAVAILABLE, NO_ELIGIBLE_PARTNER, PARTNER_BLOCKED, MODULE_DISABLEDTell the customer, offer another option.
Wait and retryREQUEST_IN_FLIGHT, RATE_LIMIT_EXCEEDED, RETRYABLE, ROUTING_UNAVAILABLE, PRICING_UNAVAILABLE, REQUEST_TIMEOUT, any 5xxRetry with backoff and the same idempotency key. Honour Retry-After.

The error code reference lists every code with its HTTP status, what it means and what to do. It is generated from the server's own error catalogue.

HTTP status codes​

StatusMeaning
200 / 201 / 202Success (202: accepted, carried out shortly)
400The request is malformed or invalid
401Authentication failed
403Not allowed, or not your resource
404No such route
409Conflict with current state, or an idempotency conflict
410A link has expired
413The body is too large
422The request contains a field only the server may set
429Too many requests
500Something went wrong at IDM; the request ID tells support what
503Temporarily unavailable; retry