Anyseats B2B
API reference
Connect your booking system to Anyseats: search live events, read your trade prices and book tickets for your clients, paid from your agency balance. It is the same stock, prices and confirmation as the B2B dashboard.
Base URL
anyseats.net/api/b2b/v1
Format
JSON over HTTPS
Auth
Bearer API key
Getting started
Quickstart
1. Apply, then create a key. API access is by application: the account owner applies in the dashboard under Settings → API, telling us what they'll build. We review every request and email you when it's decided. Once approved, create a key in the same place. The key is shown once; store it as a secret (we use
ANYSEATS_KEYbelow).2. Find an event. Search the catalogue; every event carries an
idand its cheapest trade price.curl "https://anyseats.net/api/b2b/v1/events?q=arsenal&limit=5" \ -H "Authorization: Bearer $ANYSEATS_KEY"3. Choose a listing. Fetch the event to see every listing with its trade price and the quantities it can be sold in.
curl "https://anyseats.net/api/b2b/v1/events/L3ByZW1pZXItbGVhZ3VlL2Fyc2VuYWwtdnMtbGVlZHMtdW5pdGVkLzEwLW9jdC0yMDI2" \ -H "Authorization: Bearer $ANYSEATS_KEY"4. Book it. One call holds the tickets, records your client and pays from your balance. See Create a booking.
Getting started
Authentication
Authenticate every request with your API key as a Bearer token. Keys start with as_trade_.
Authorization: Bearer as_trade_…- A key acts as the team member who created it: bookings made with it are theirs, and confirmations go to their email.
- Revoking the key, or removing that member from the team, switches the key off immediately.
- Keep keys on your server. Never put one in a browser, an app or a public repository.
Concepts
Prices and money
- Per ticket, all-in.
retailandtradeare prices per ticket in the listing’scurrency, including all fees. There is nothing added at checkout. - Your trade price is retail less your level’s discount, which rises with your agency’s spend in the calendar year: Starter 9%, Rising 11% (£25,000+), Pro 13% (£100,000+), Elite 15% (£250,000+), Legend 18% (£500,000+). Levels reset on 1 January. A booking keeps the rate it was paid at.
- Minor units. Amounts ending
_minorare integers in the currency’s minor unit (pence for GBP). Your balance is held in GBP. - The discount is applied to the booking total, so a booking can differ from
trade × quantityby a penny of rounding. The booking response carries the exact amount charged.
Concepts
Idempotency
POST /bookings requires an Idempotency-Key header: 8–100 characters of letters, digits and . _ : -. Use one key per intended booking (your own booking reference, or a UUID).
- Sending the same key again returns the original result, with the original status code, and never books twice. Retrying after a timeout is always safe.
- While the first request is still running, a repeat returns
409 booking_in_progress. Wait a few seconds and retry with the same key. - Keys are remembered for 7 days.
Concepts
Rate limits
Each key may make 120 requests per minute. Beyond that, requests return 429 rate_limited. Back off and retry; for catalogue syncs, a full pass every few minutes is plenty, since prices and stock change through the day rather than by the second.
Concepts
Errors
Errors use standard HTTP status codes and a consistent body. code is stable and safe to branch on; message is written for people and may change.
{
"error": {
"code": "hold_failed",
"message": "These tickets couldn’t be held."
}
}| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_booking | The booking body is missing a field or a value is out of range. The message names the field. |
| 400 | idempotency_key_required | POST /bookings was sent without a valid Idempotency-Key (8–100 characters: letters, digits, . _ : -). |
| 401 | api_key_required | No Authorization header, or it isn’t a Bearer as_trade_ key. |
| 401 | invalid_api_key | The key is unknown, revoked, or its owner has left the agency. |
| 402 | insufficient_balance | Your balance doesn’t cover the booking. Top up in the dashboard and retry with a new Idempotency-Key. |
| 402 | balance_frozen | Your balance is on hold. Contact us. |
| 403 | api_access_required | Your account doesn’t have approved API access. Apply under Settings → API. |
| 403 | agency_inactive | The agency is pending approval or suspended. |
| 404 | event_not_found | The event id doesn’t exist, or the event is no longer on sale. |
| 404 | not_found | Unknown endpoint. |
| 409 | hold_failed | The listing or quantity is no longer available. Fetch the event again and choose another listing. |
| 409 | holds_unavailable | The tickets were taken while the booking was being placed. Nothing was charged. |
| 409 | booking_in_progress | A request with this Idempotency-Key is still being processed. Retry the same request in a few seconds. |
| 409 | booking_interrupted | An earlier request with this key stopped before anything was booked. Send the booking again with a new key. |
| 415 | json_required | POST bodies must be sent as application/json. |
| 429 | rate_limited | More than 120 requests in a minute on this key. Back off and retry. |
| 503 | temporarily_unavailable | Something on our side failed. Retry with exponential backoff; for bookings, reuse the same Idempotency-Key. |
Concepts
Booking lifecycle
- The listing is held for your quantity and your client is recorded as the ticket holder.
- The trade price is debited from your balance and the order is placed with the seller.
- The booking is returned with
statusconfirmed, orpendingwhen the seller confirms a little later. A pending booking is paid and needs no action from you; it moves on by itself. - If the order can’t be placed, the hold is released and the amount goes back to your balance. You never pay for tickets you don’t get.
Confirmation and tickets go to the email of the key’s owner. Every booking appears in the dashboard under Bookings with its invoice.
Endpoints
Get your account
Your agency, your current level and trade rate, progress to the next level, and your balance.
curl "https://anyseats.net/api/b2b/v1/me" \
-H "Authorization: Bearer $ANYSEATS_KEY"{
"agency": { "id": "621a970f-…", "name": "Sunway Travel", "country": "GB" },
"member": { "email": "[email protected]", "role": "owner" },
"level": {
"name": "Starter",
"rate_bps": 900,
"year": 2026,
"next": { "name": "Rising", "rate_bps": 1100, "threshold_minor": 2500000 },
"remaining_minor": 2500000
},
"balance": { "currency": "GBP", "amount_minor": 150000, "frozen": false }
}Endpoints
List events
Upcoming events with tickets on sale, in date order. Each carries its cheapest trade price and how many tickets and listings it has.
Query parameters
qstring- Free-text search across event, venue, city, country and competition.
categorystring- Competition or category slug, exactly as returned in category, e.g. premier-league.
country · city · venuestring- Exact values as returned on events, e.g. United Kingdom, London, Emirates Stadium.
monthYYYY-MM- Events in one month.
date_from · date_toYYYY-MM-DD- Inclusive date range.
min_ticketsinteger- Only events with at least this many tickets available.
max_pricenumber- Only events whose cheapest trade price is at or below this.
offset · limitinteger- Paging. limit defaults to 50, maximum 100; total gives the full count.
curl "https://anyseats.net/api/b2b/v1/events?category=premier-league&month=2026-10&limit=25" \
-H "Authorization: Bearer $ANYSEATS_KEY"{
"rate_bps": 900,
"events": [
{
"id": "L3ByZW1pZXItbGVhZ3VlL2Fyc2VuYWwtdnMtbGVlZHMtdW5pdGVkLzEwLW9jdC0yMDI2",
"name": "Arsenal vs Leeds United",
"kind": "football",
"category": "premier-league",
"category_name": "Premier League",
"date": "2026-10-10",
"kickoff": "15:00",
"datetime_utc": "2026-10-10T14:00:00.000Z",
"venue": "Emirates Stadium",
"city": "London",
"country": "United Kingdom",
"currency": "GBP",
"from_retail": 254.41,
"from_trade": 231.51,
"tickets": 3210,
"listings": 1455,
"path": "/premier-league/arsenal-vs-leeds-united/10-oct-2026"
}
],
"total": 38,
"offset": 0,
"limit": 25
}Endpoints
Get an event
Every live listing on one event, cheapest first, with retail and trade price per ticket. Sell only the quantities in allowed_quantities; sellers often require seats to be sold in pairs or together.
Path parameters
idstring- The event id from List events.
curl "https://anyseats.net/api/b2b/v1/events/L3ByZW1pZXItbGVhZ3VlL2Fyc2VuYWwtdnMtbGVlZHMtdW5pdGVkLzEwLW9jdC0yMDI2" \
-H "Authorization: Bearer $ANYSEATS_KEY"{
"rate_bps": 900,
"event": {
"id": "L3ByZW1pZXItbGVhZ3VlL2Fyc2VuYWwtdnMtbGVlZHMtdW5pdGVkLzEwLW9jdC0yMDI2",
"name": "Arsenal vs Leeds United",
"date": "2026-10-10",
"kickoff": "15:00",
"datetime_utc": "2026-10-10T14:00:00.000Z",
"venue": "Emirates Stadium",
"city": "London",
"path": "/premier-league/arsenal-vs-leeds-united/10-oct-2026"
},
"listings": [
{
"id": "tixstock:01kvt8yec6krca5kf0nzz6b2cc",
"currency": "GBP",
"retail": 333.41,
"trade": 303.4,
"quantity_available": 4,
"allowed_quantities": [2, 4],
"seat_label": "Shortside Upper Tier",
"area": "Shortside Upper Tier",
"section": "Shortside Upper Tier",
"block": null,
"row": null,
"delivery_type": "mobile",
"benefits": [],
"restrictions": [],
"description": null,
"ready_by": "2026-10-08"
}
]
}Endpoints
Create a booking
Hold a listing, record your client as the ticket holder and pay the trade price from your balance, in one call. Requires an Idempotency-Key.
Body
listing_idstring · required- The listing id from Get an event.
quantityinteger · required- One of the listing’s allowed_quantities.
client.namestring · required- The ticket holder’s first and last name.
client.phonestring · required- International format, e.g. +447700900123.
client.emailstring- Optional. Kept on the booking for your records.
client.referencestring- Optional, up to 60 characters: your own booking or trip reference.
curl -X POST "https://anyseats.net/api/b2b/v1/bookings" \
-H "Authorization: Bearer $ANYSEATS_KEY" \
-H "Idempotency-Key: TRIP-2041-ARS" \
-H "Content-Type: application/json" \
-d '{
"listing_id": "tixstock:01kvt8yec6krca5kf0nzz6b2cc",
"quantity": 2,
"client": {
"name": "Dana Levi",
"phone": "+447700900123",
"email": "[email protected]",
"reference": "TRIP-2041"
}
}'{
"booking": {
"id": "bnd_6f2c1a…",
"order_ids": ["6ab8…"],
"amount_minor": 60680,
"currency": "GBP",
"status": "confirmed"
}
}Endpoints
List bookings
Your agency’s bookings, newest first, 25 per page, with what you paid, what you saved and the invoice.
Query parameters
statusstring- Filter by booking status, e.g. approved, pending, fulfilled, cancelled.
clientstring- Case-insensitive match on the client’s name, your reference, or the ticket holder’s surname.
sortstring- event_asc or event_desc to order by event date instead of booking date.
pageinteger- Page number, from 1.
curl "https://anyseats.net/api/b2b/v1/bookings?page=1" \
-H "Authorization: Bearer $ANYSEATS_KEY"{
"bookings": [
{
"id": "6ab8…",
"created_at": "2026-10-01T12:04:19.000Z",
"status": "approved",
"mode": "live",
"event_name": "Arsenal vs Leeds United",
"event_date": "2026-10-10",
"event_url": "/premier-league/arsenal-vs-leeds-united/10-oct-2026",
"tickets": 2,
"paid": { "currency": "GBP", "amount": "606.80" },
"saved": { "amount_minor": 6002, "currency": "GBP" },
"rate_bps": 900,
"payment": "balance",
"client": { "name": "Dana Levi", "phone": "+447700900123", "reference": "TRIP-2041" },
"member_email": "[email protected]",
"invoice_url": "https://invoice.stripe.com/…",
"invoice_pdf": "https://pay.stripe.com/invoice/…/pdf",
"order_url": "/orders/6ab8…"
}
],
"total": 1,
"page": 1,
"pages": 1
}More
Changelog
- 2026-10-01
- Reference rewritten: full endpoint, parameter and error documentation.
- 2026-09-29
- v1 released: account, events, event listings, bookings.
v1 is stable. We add fields without notice, so ignore fields you don’t recognise; anything that removes or changes a field will come as a new version.
More
Support
Building an integration, or something not behaving as documented? Email [email protected] with the request time and the error code, and we’ll get back to you.