Skip to main content

Diagnose by status and stable code

Preserve X-Request-Id, operation ID and status. Never log the API key, recipient URL, contact, proof image or raw webhook body. Some endpoints return a structured code, others return validation errors or an empty 401/403/404. Do not assume every error has the same JSON shape, and never branch on translated message text.

Code or statusLikely causeRetry and corrective action
401Missing, malformed, revoked or expired credentialCorrect the credential; do not retry unchanged
403Missing scope or account permissionCheck operation scope and environment; refresh credentials after configuration changes
404Wrong ID/environment or expired/invalid capabilityCheck the authenticated canonical read and environment
429Rate limit/quotaRespect Retry-After; exponential backoff with jitter
5xx / transport failureTemporary service/network failureReuse exact IDs and payload, use bounded retries, and inspect canonical state after an uncertain outcome
returns_pausedReturn writes are temporarily unavailableRetry later with the same IDs; reads remain available
idempotency_key_invalidMissing/oversized creation keyProvide a stable nonempty key, maximum 160 characters
idempotency_conflictReused key for a different operationRecover the original request or use a key for a genuinely new operation
event_id_invalidMissing/empty UUIDGenerate and persist one UUID per event
occurred_at_invalidFuture event timeCorrect clock/timestamp; preserve actual occurrence time
return_not_eligibleOutbound state does not allow this return typeCustomer return needs Delivered; failed-delivery RTS needs DeliveryAttempted
return_state_conflictInvalid transition, proof dependency or conflicting eventRead canonical state and proof requirements; correct before retry
return_conflictConcurrent return/identifier constraintRead current return; do not create duplicate physical work
return_origin_invalid, return_destination_invalidMissing/invalid snapshotSupply valid confirmed address fields and coordinates
return_event_invalidInvalid event inputCorrect input using API reference
return_pickup_confirmation_not_allowedPickup access not allowed in current stateInspect authorization/handover state before issuing a new link
return_proof_asset_missingReference does not point to uploaded return assetUpload PNG first with matching return/proof/kind; use returned reference
return_proof_invalid, proof_image_invalidInvalid image or proof fieldsCorrect method, purpose, dimensions, size and timestamp
return_proof_conflictProof UUID reused with different contentRetry identical proof; never overwrite immutable evidence
return_destination_requiredRTS policy needs a destinationProvide the agreed sender/merchant destination

Common integration issues​

Copied key starts with [object Object]: recopy the credential from the console. A key contains no icon, markup or trailing display text. Configure the full raw value.

Delivery status has not advanced after proof submission: inspect proof synchronization. The delivery:proof scope is separate from delivery:events. A failed proof blocks the dependent completion event. Fix the configuration and retry the original operation with the same identifiers.

My email matches but the recipient link fails: verify that the canonical shipment contact is correct and the account contact is verified. A contact used only for address confirmation does not change shipment ownership. Public tracking proves progress, not recipient authorization.

No return option is available: the delivery must be linked and canonically Delivered before a customer return can begin.

Return proof URL rejected: upload a real PNG through the return asset API. A text signature or arbitrary merchant URL does not satisfy this contract.

Webhook signature fails: preserve raw bytes, verify the correct subscription secret, check timestamp freshness and avoid JSON reserialization. See the webhook cookbook.