Core conceptsErrors

Errors

Branch your logic on error.code, never on error.message — messages are human-readable and may change. Always log requestId; it is what support needs to trace a call.

HTTP status meanings

StatusMeaningRetry?
400Malformed request, failed validation, or missing required headerNo — fix the request
401Credentials or signature missing, invalid or expiredNo — fix authentication
403Authenticated, but lacks access or the required scopeNo
404Does not exist, or is not visible to this sellerNo
409Conflicts with current state, or an idempotency key is in flightYes, after Retry-After
413Body exceeds 1 MBNo — split the payload
422Well-formed but not processable in the resource's current stateNo
429Rate limit exceededYes, with backoff
500Unexpected platform errorYes, with backoff. Report the requestId
502 / 504Upstream commerce service failed or timed outYes, with backoff
503A platform dependency is temporarily unavailableYes, after Retry-After

Commonly encountered codes

CodeHTTPWhen you'll see itResolution
VALIDATION_ERROR400Body or query failed schema validationRead error.message; check for unknown fields — schemas are strict
INVALID_JSON400Body is not parseable JSONCheck serialisation and Content-Type
CATEGORY_NOT_FOUND400The category you sent is not a known category IDSend an ID from GET /categories, not the name returned by product reads
NOT_FOUND404Missing, or belongs to another sellerVerify the seller token matches the resource's owner
CONCURRENT_MODIFICATION409The resource changed between your read and writeRe-read and reapply your change
INVALID_TRANSITION422The state change is not legal from the current stateRe-read the resource; another actor may have advanced it
ORDER_NOT_CANCELLABLE422The order has progressed past a cancellable stateHandle as a return instead
SHIPMENT_NOT_ARRANGED422Tracking requested before a shipment existsArrange a shipment first via POST /orders/{id}/shipment
SHIPPING_LABEL_UNAVAILABLE422Label requested before a shipment existsAs above
SHIPMENT_ALREADY_ARRANGED422The order already has a bookingRead the existing booking via GET /orders/{id}/tracking
INVALID_PICKUP_DATE422Date rejected by cutoff, holiday or ship-by rulesPick from GET /orders/{id}/shipment/eligible-dates
SANDBOX_ONLY403A sandbox route was called with live credentialsUse sandbox credentials and the sandbox host
VALIDATION_ERROR400A webhook callback URL resolved to a private, loopback or metadata address (SSRF safety check)Use a publicly resolvable HTTPS URL — see Webhooks
UPSTREAM_ERROR502 / 503The commerce service was briefly unavailable for a proxied shipment callRetry with backoff — this is transient, not a blocked operation

The complete machine-readable catalog — every code the platform can emit, with HTTP status and resolution — is the ErrorResponse.error.code enum in the OpenAPI spec and the interactive reference. Both are generated from the same source, so a code you receive at runtime is always present in both.