Errors
What can come back, and what it usually means.
Status codes
| Status | Cause | What to do |
|---|---|---|
400 | A malformed query option — an unknown column in $select/$filter/$orderby, a syntax error, or $top above 1000 | Read the message; it names the offending part. Never retry unchanged. |
401 | Missing, expired or unvalidatable token | Request a new token, retry once |
403 | Valid token without the ticketinghub-api scope, or a user token (one carrying a subject) | See Authentication. Not retryable. |
404 | A dataset that does not exist, or a by-key lookup | By-key is not supported; see Query options |
500 | Unhandled server error, including a query that exceeded the 300 second timeout | Retry with backoff; if it persists, narrow with $select and $filter |
502, 503, 504 | The instance is restarting, or the gateway cannot reach it | Retry with backoff |
Error shape
Errors come back in the standard OData envelope:
The message is the useful part and generally names the exact column or token that failed.
The three you will actually hit
A misspelled column in $select or $filter. By far the most common. Column names are validated strictly, though case-insensitively, and anything unresolved is a 400. Check the name against $metadata.
A user token. A 403 on a request whose token demonstrably carries the right scope almost always means the token has a subject — it was issued for a person rather than for a service. See Authentication.
A timeout on an unprojected query. A 500 on a wide dataset usually means the query passed 300 seconds. Add $select, and split by event if it is still slow.
The one that is not an error
A $filter on a status column that returns zero rows is usually a misspelt token, not an empty dataset. Token values are case-sensitive and uppercase: eq 'paid' matches nothing, eq 'PAID' works. Check Datasets → Column values.
Retrying
Next links are stable, so retry the failed page rather than restarting the walk. Building the extract has a worked retry implementation with the right backoff and the right list of what not to retry.
There is no rate limit today, so there is no 429 to handle — but do not read that as an invitation to run many parallel extracts against a live production system.