Skip to content

Errors

What can come back, and what it usually means.

Status codes

StatusCauseWhat to do
400A malformed query option — an unknown column in $select/$filter/$orderby, a syntax error, or $top above 1000Read the message; it names the offending part. Never retry unchanged.
401Missing, expired or unvalidatable tokenRequest a new token, retry once
403Valid token without the ticketinghub-api scope, or a user token (one carrying a subject)See Authentication. Not retryable.
404A dataset that does not exist, or a by-key lookupBy-key is not supported; see Query options
500Unhandled server error, including a query that exceeded the 300 second timeoutRetry with backoff; if it persists, narrow with $select and $filter
502, 503, 504The instance is restarting, or the gateway cannot reach itRetry with backoff

Error shape

Errors come back in the standard OData envelope:

{
"error": {
"code": "",
"message": "Could not find a property named 'TicketPrice' on type 'ADITUS.TicketingHub.Common.Data.Entities.Ticket'."
}
}

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.