Authentication and Errors
The API key
Retail sends one header on every request:- Fail closed. If no key is configured on your side, reject every request. An unset key must never mean “allow everyone”:
POST /ordersspends real money. - Compare in constant time, so a key cannot be guessed one character at a time.
- Accept more than one key. During a rotation both the old and the new key are live for a while. A second key also lets you give a tester access without sharing Retail’s own.
- Answer
401for a missing or wrong key, with the error body below.
Node.js
Error format
Answer every failure with a JSON body in this shape:message is for humans and goes into Retail’s logs. Never put a buyer’s email, address or a barcode in it.
404 has a meaning
Retail treats404 as an answer, not a failure:
- Listings: a listing that was bought disappears. It does not report quantity 0.
- Fulfilment, credentials: you do not know this order yet.
- Venue map: treated as “no map”.
429 pauses Retail’s calls to you
When you answer429, Retail pauses its page-render and background calls to you, from every instance, until the time you give. Checkout calls still go through, so a buyer who is paying is not stranded by a catalog sync.
Give the time in either of these forms. Retail reads them in this order:
- A
Retry-Afterheader, in seconds or as an HTTP date. error.retryAfterin the body, as an ISO 8601 timestamp.
429
Do not retry inside a call
Your integration must not retry internally on any endpoint. Retries belong to Retail, because only Retail knows whether an operation is safe to repeat:- On listings, a slow success is worse than a fast failure. The buyer’s page has already given up and rendered the event as unavailable.
- On place order, a retry can buy the ticket twice. See Place order.
Time budgets
Retail aborts a call after these limits. A reply after the limit is discarded.
A timed-out
POST /orders is not a failure to Retail. It is an unknown outcome, resolved by searching for the reference.
