Error codes
JSON and NDC/XML share the same ERR-* catalog. JSON returns them in the response envelope
(error.code); XML returns IATA Error elements with the same code text.
Endpoint pages list the codes that endpoint can return. This page is the cross-cutting reference plus the failures partners hit most often when integrating.
Common create / pay failures
| Symptom | Likely code | Fix |
|---|---|---|
| Missing or bad booking contact | ERR-1005 (JSON) / ERR-7004 (XML) | Send contact with at least an email address (JSON) or an unreferenced ContactInfo (XML). See contacts. |
Unsupported ContactPurposeText | ERR-1004 | Only the primary booking contact can be set — leave it untagged, or tag it Primary. |
| Phone rejected | ERR-1004 | Send a number that normalizes to E.164 (+1…, 00…, or 10-digit US/Canada). |
| Malformed email | ERR-1004 | Fix the address format. |
gender: "F" or "female" on JSON create | ERR-1005 | Use Male / Female, spelled exactly. See passengers. |
| Duplicate passenger IDs or infants > adults | ERR-1005 / ERR-7003 | Unique IDs; at most one infant per adult. |
| Unsupported currency | ERR-1004 | USD only. See payments. |
| Offer not found / expired | ERR-3000 / ERR-3001 | Re-shop and re-price; offer IDs are short-lived. |
| Same passenger name already on that flight (sandbox) | ERR-4001 | Change the test passenger name or travel date. |
| Payment amount ≠ live balance (XML) | ERR-3006 | Set PaymentProcessingDetails > Amount to the current amount due. |
| Unsupported card brand | ERR-6001 | Use VI, CA, AX, or DS. |
| Payment declined / rejected | ERR-6002 | Check card details; in test use 4111111111111111. |
| Token expired | ERR-8000 / 401 | Fetch a new bearer token (≈30-minute lifetime). |
| Read-only API key on book | ERR-8001 | Need full transaction (book) permissions. |
Catalog
| Code | Typical HTTP | Meaning |
|---|---|---|
ERR-1000 | 400 | Malformed XML. |
ERR-1002 | 404 | Unsupported version segment in the path. |
ERR-1003 | 400 | Missing required XML element. |
ERR-1004 | 400 | Invalid field value (currency, contact type, phone, email, cabin, ancillary ID, …). |
ERR-1005 | 422 | Request validation failed (schema / business rules on the body). |
ERR-1006 | 422 | Origin or destination is not a valid market. |
ERR-1009 | 400 | Request body larger than 1 MiB (XML). |
ERR-1010 | 400 | Wrong Content-Type for NDC/XML (use application/xml or text/xml). |
ERR-2002 | 500 | Availability could not be processed upstream. |
ERR-3000 | 404 | Referenced offer could not be found. |
ERR-3001 | 404 | Referenced offer has expired. |
ERR-3002 | 400 | One or more offer items not found on the offer. |
ERR-3003 | 400 | Invalid / partial selection (including package reshop item selection). |
ERR-3004 | 400 | Reshop offer sent to OfferPrice / price offer — use quote instead. |
ERR-3005 | 400 | Shop offer sent to OrderQuote / quote order — use price / OfferPrice instead. |
ERR-3006 | 409 | Stated payment amount does not match the live amount due. |
ERR-4000 | 404 | Order not found. |
ERR-4001 | 400 | Order could not be created from the selected offer. |
ERR-4002 | 400 | Requested change could not be applied or quoted. |
ERR-4006 | 400 | Referenced journey not found on the order. |
ERR-5000 | 501 | Operation not currently supported (e.g. standalone OrderCancel). |
ERR-6000 | 422 | Payment method not supported. |
ERR-6001 | 422 | Card brand not supported. |
ERR-6002 | 400 | Payment rejected. |
ERR-6005 | 503 | Payment processing timed out. |
ERR-7003 | 422 | Infants exceed adults. |
ERR-7004 | 422 | Missing order contact information (XML). |
ERR-7007 | 400 | Passenger update rejected. |
ERR-7008 | 422 | Loyalty number unrecognized or does not match the passenger name. |
ERR-8000 | 401 | Missing or invalid API key or bearer token. |
ERR-8001 | 403 | API key not authorized for this request (permissions / agency mismatch). |
ERR-8002 | 503 | Authentication store unavailable. |
ERR-9000 | 503 | A required service is unavailable. |
ERR-9001 | 500 | Unexpected upstream response. |
ERR-9002 | 503 | Offer cache unavailable. |
ERR-9003 | 500 | Upstream booking / change / lookup failure. |
JSON error bodies may also include error.fields naming the invalid property — check that map before retrying.