Error Reference
All errors from the Ticket Buyback Partner API follow a standard response envelope. This page lists every error code, its HTTP status, and how to handle it.
Error Response Formatβ
Every error response returns "success": false with an error object:
{
"success": false,
"error": {
"code": "QUOTE_EXPIRED",
"message": "The requested quote has expired. Please create a new quote.",
"details": {
"quote_id": "qt_abc123",
"expired_at": "2026-02-26T09:00:00Z"
}
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-02-26T10:30:00Z"
}
}
| Field | Description |
|---|---|
error.code | Machine-readable error code β use this in your error handling logic |
error.message | Human-readable description of the error |
error.details | Optional object with additional context β fields vary by error type |
meta.request_id | Include this in any support requests to Ticket Buyback |
Authentication Errorsβ
| Code | HTTP Status | Description | How to Handle |
|---|---|---|---|
INVALID_CREDENTIALS | 401 | client_id or client_secret is incorrect | Verify your credentials β contact support if correct credentials fail |
UNAUTHORIZED | 401 | Missing or invalid Bearer token on a protected endpoint | Include a valid Authorization: Bearer <token> header |
TOKEN_EXPIRED | 401 | Access token has expired | Re-authenticate via POST /v1/auth/token to get a new token |
ACCOUNT_SUSPENDED | 403 | Partner account has been deactivated | Contact Ticket Buyback support |
UNSUPPORTED_GRANT_TYPE | 400 | grant_type value is not client_credentials | Set grant_type to client_credentials |
Authorization Errorsβ
| Code | HTTP Status | Description | How to Handle |
|---|---|---|---|
FORBIDDEN | 403 | Token is valid but you do not have permission to access this resource | Verify the resource belongs to your partner account |
PAYMENT_NOT_CONFIGURED | 403 | Partner has not configured Routable payment methods | Complete Routable Setup before creating quotes or orders |
Validation Errorsβ
| Code | HTTP Status | Description | How to Handle |
|---|---|---|---|
VALIDATION_ERROR | 400 | Request body fails schema validation | Check error.details for the specific field that failed validation |
Example β Validation Error Responseβ
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Request body validation failed.",
"details": {
"field": "delivery_type",
"issue": "Value 'email' is not a valid delivery_type. Accepted values: mobile_transfer, mobile_qr, pdf"
}
},
"meta": {
"request_id": "abc123",
"timestamp": "2026-02-26T10:30:00Z"
}
}
Event Errorsβ
| Code | HTTP Status | Description | How to Handle |
|---|---|---|---|
EVENT_NOT_FOUND | 404 | Event ID does not exist in the TBB catalog | Verify the event_id from the Discovery API |
EVENT_EXPIRED | 422 | Event date has already passed | Do not allow quotes or orders for past events |
Inventory Errorsβ
| Code | HTTP Status | Description | How to Handle |
|---|---|---|---|
SECTION_NOT_FOUND | 404 | Section not found for this event | Verify section_name from the Sections API |
NO_INVENTORY_AVAILABLE | 422 | No tickets available for the requested seat configuration | Try a different section, row, or quantity |
INSUFFICIENT_QUANTITY | 422 | Requested quantity exceeds available inventory | Reduce quantity or try a different section/row |
Quote Errorsβ
| Code | HTTP Status | Description | How to Handle |
|---|---|---|---|
QUOTE_NOT_FOUND | 404 | Quote ID does not exist | Verify the quote_id from the Create Quote response |
QUOTE_EXPIRED | 422 | Quote TTL has elapsed | Request a new quote via POST /v1/quotes |
QUOTE_ALREADY_CONSUMED | 422 | Quote was already used to create an order | Each quote can only be used once β create a new quote if needed |
Example β Quote Expired Responseβ
{
"success": false,
"error": {
"code": "QUOTE_EXPIRED",
"message": "The requested quote has expired. Please create a new quote.",
"details": {
"quote_id": "qt_abc123",
"expired_at": "2026-02-26T09:00:00Z"
}
},
"meta": {
"request_id": "abc123",
"timestamp": "2026-02-26T10:30:00Z"
}
}
Order Errorsβ
| Code | HTTP Status | Description | How to Handle |
|---|---|---|---|
INVALID_DELIVERY_DEADLINE | 422 | delivery_deadline is after or too close to the event start time | Set delivery_deadline to a datetime before the event starts |
Rate Limit Errorsβ
| Code | HTTP Status | Description | How to Handle |
|---|---|---|---|
RATE_LIMIT_EXCEEDED | 429 | Too many requests in a short period | Wait for the duration in the Retry-After response header before retrying |
Handling Rate Limits in Codeβ
JavaScript β Retry with backoff
async function fetchWithRetry(url, options, retries = 3) {
const response = await fetch(url, options);
if (response.status === 429 && retries > 0) {
const retryAfter = response.headers.get("Retry-After") || 5;
await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000));
return fetchWithRetry(url, options, retries - 1);
}
return response;
}
Server Errorsβ
| Code | HTTP Status | Description | How to Handle |
|---|---|---|---|
INTERNAL_ERROR | 500 | Unexpected server-side error | Retry the request. If it persists, contact support with the meta.request_id |
Global Error Handling Patternβ
JavaScript β Global error handler
async function apiRequest(url, options = {}) {
const response = await fetch(url, {
...options,
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
Accept: "application/json",
...options.headers,
},
});
const body = await response.json();
if (!body.success) {
const { code, message } = body.error;
switch (code) {
case "TOKEN_EXPIRED":
await refreshToken();
return apiRequest(url, options);
case "RATE_LIMIT_EXCEEDED":
const retryAfter = response.headers.get("Retry-After") || 5;
await new Promise((r) => setTimeout(r, retryAfter * 1000));
return apiRequest(url, options);
case "QUOTE_EXPIRED":
throw new Error("Quote expired β please request a new quote.");
case "PAYMENT_NOT_CONFIGURED":
throw new Error("Routable payment not configured on your TBB account.");
default:
throw new Error(`API error [${code}]: ${message}`);
}
}
return body.data;
}
Quick Reference β All Error Codesβ
| Code | HTTP Status |
|---|---|
INVALID_CREDENTIALS | 401 |
UNAUTHORIZED | 401 |
TOKEN_EXPIRED | 401 |
UNSUPPORTED_GRANT_TYPE | 400 |
ACCOUNT_SUSPENDED | 403 |
FORBIDDEN | 403 |
PAYMENT_NOT_CONFIGURED | 403 |
VALIDATION_ERROR | 400 |
EVENT_NOT_FOUND | 404 |
EVENT_EXPIRED | 422 |
SECTION_NOT_FOUND | 404 |
NO_INVENTORY_AVAILABLE | 422 |
INSUFFICIENT_QUANTITY | 422 |
QUOTE_NOT_FOUND | 404 |
QUOTE_EXPIRED | 422 |
QUOTE_ALREADY_CONSUMED | 422 |
INVALID_DELIVERY_DEADLINE | 422 |
RATE_LIMIT_EXCEEDED | 429 |
INTERNAL_ERROR | 500 |
Always Log the request_id
Every response β success or error β includes a meta.request_id. Always log this value. It is the fastest way for Ticket Buyback support to locate and debug any issue.