Skip to content
anyseats.B2Bv1

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. 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_KEY below).

  2. 2. Find an event. Search the catalogue; every event carries an id and its cheapest trade price.

    curl "https://anyseats.net/api/b2b/v1/events?q=arsenal&limit=5" \
      -H "Authorization: Bearer $ANYSEATS_KEY"
  3. 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. 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.
  • Per ticket, all-in. retail and trade are prices per ticket in the listing’s currency, 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 _minor are 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 × quantity by 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.

Response · 409
{
  "error": {
    "code": "hold_failed",
    "message": "These tickets couldn’t be held."
  }
}
StatusCodeMeaning
400invalid_bookingThe booking body is missing a field or a value is out of range. The message names the field.
400idempotency_key_requiredPOST /bookings was sent without a valid Idempotency-Key (8–100 characters: letters, digits, . _ : -).
401api_key_requiredNo Authorization header, or it isn’t a Bearer as_trade_ key.
401invalid_api_keyThe key is unknown, revoked, or its owner has left the agency.
402insufficient_balanceYour balance doesn’t cover the booking. Top up in the dashboard and retry with a new Idempotency-Key.
402balance_frozenYour balance is on hold. Contact us.
403api_access_requiredYour account doesn’t have approved API access. Apply under Settings → API.
403agency_inactiveThe agency is pending approval or suspended.
404event_not_foundThe event id doesn’t exist, or the event is no longer on sale.
404not_foundUnknown endpoint.
409hold_failedThe listing or quantity is no longer available. Fetch the event again and choose another listing.
409holds_unavailableThe tickets were taken while the booking was being placed. Nothing was charged.
409booking_in_progressA request with this Idempotency-Key is still being processed. Retry the same request in a few seconds.
409booking_interruptedAn earlier request with this key stopped before anything was booked. Send the booking again with a new key.
415json_requiredPOST bodies must be sent as application/json.
429rate_limitedMore than 120 requests in a minute on this key. Back off and retry.
503temporarily_unavailableSomething on our side failed. Retry with exponential backoff; for bookings, reuse the same Idempotency-Key.
  1. The listing is held for your quantity and your client is recorded as the ticket holder.
  2. The trade price is debited from your balance and the order is placed with the seller.
  3. The booking is returned with status confirmed, or pending when the seller confirms a little later. A pending booking is paid and needs no action from you; it moves on by itself.
  4. 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.

Your agency, your current level and trade rate, progress to the next level, and your balance.

GET/api/b2b/v1/me
curl "https://anyseats.net/api/b2b/v1/me" \
  -H "Authorization: Bearer $ANYSEATS_KEY"
Response · 200
{
  "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.

GET/api/b2b/v1/events

Query parameters

q string
Free-text search across event, venue, city, country and competition.
category string
Competition or category slug, exactly as returned in category, e.g. premier-league.
country · city · venue string
Exact values as returned on events, e.g. United Kingdom, London, Emirates Stadium.
month YYYY-MM
Events in one month.
date_from · date_to YYYY-MM-DD
Inclusive date range.
min_tickets integer
Only events with at least this many tickets available.
max_price number
Only events whose cheapest trade price is at or below this.
offset · limit integer
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"
Response · 200
{
  "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.

GET/api/b2b/v1/events/{id}

Path parameters

id string
The event id from List events.
curl "https://anyseats.net/api/b2b/v1/events/L3ByZW1pZXItbGVhZ3VlL2Fyc2VuYWwtdnMtbGVlZHMtdW5pdGVkLzEwLW9jdC0yMDI2" \
  -H "Authorization: Bearer $ANYSEATS_KEY"
Response · 200
{
  "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"
    }
  ]
}

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.

POST/api/b2b/v1/bookings

Body

listing_id string · required
The listing id from Get an event.
quantity integer · required
One of the listing’s allowed_quantities.
client.name string · required
The ticket holder’s first and last name.
client.phone string · required
International format, e.g. +447700900123.
client.email string
Optional. Kept on the booking for your records.
client.reference string
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"
    }
  }'
Response · 201 Created
{
  "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.

GET/api/b2b/v1/bookings

Query parameters

status string
Filter by booking status, e.g. approved, pending, fulfilled, cancelled.
client string
Case-insensitive match on the client’s name, your reference, or the ticket holder’s surname.
sort string
event_asc or event_desc to order by event date instead of booking date.
page integer
Page number, from 1.
curl "https://anyseats.net/api/b2b/v1/bookings?page=1" \
  -H "Authorization: Bearer $ANYSEATS_KEY"
Response · 200
{
  "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
}
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.

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.