Skip to main content
tickts · developers

Build ticketing
into anything.

A complete REST API, real-time signed webhooks, scoped keys and an MCP server. Everything the tickts dashboard does, your code can do too — with zero per-ticket API fees.

your first request
# Introspect your key: who am I, which scopes, what rate limit?
curl https://tickts.co.uk/api/v1/me \
  -H "X-Api-Key: sk_live_your_key"

# → { "organiser": "Bar Sport Cannock",
#     "scopes": ["events:read","orders:read"],
#     "rate_limit": "600/min" }
OpenAPI 3.0.3 Scoped API keys HMAC-signed webhooks MCP server 32 endpoints No API fees
Quick start

Live in three steps

No sales call, no waiting list. Generate a key from your dashboard and make your first call in under a minute.

1

Generate a key

In your dashboard go to Developers and create a key. Pick exactly the scopes it needs — keys are least-privilege by default and fail closed.

2

Authenticate

Send it as X-Api-Key or a Bearer token on every request to /api/v1. All traffic is HTTPS only.

3

Build

List events, issue tickets, pull attendees, subscribe to webhooks. Full interactive docs in the API reference.

What you can build

The whole platform, programmable

32 endpoints across events, orders, attendees, payouts and more — the same engine that powers tickts.co.uk.

Events & ticket types

Create, update, publish, cancel events and manage ticket types, tiers, prices and capacity.

GET · POST · PUT /events

Orders & refunds

List and inspect orders, issue full or partial refunds, resend or cancel individual tickets.

GET /orders · POST /orders/{id}/refund

Attendees & check-in

Pull the live attendee roster, validate and scan tickets at the door from your own app.

GET /events/{id}/attendees · POST /tickets/scan

Comps & guest lists

Issue complimentary tickets programmatically — perfect for guest lists and integrations.

POST /events/{id}/tickets

Season passes

Read season passes and multi-day memberships attached to an event.

GET /events/{id}/season-passes

Payouts & analytics

List Stripe settlements and your balance, and pull sales analytics — data most platforms never expose.

GET /payouts · GET /analytics/summary

Venues & seating

Manage venues, seating layouts, live availability and seat holds for reserved events.

GET /venues · POST /seating/hold

Promos & discounts

Create and manage discount codes and promotions from your own tooling.

GET · POST /promos

Fixtures in bulk

Bulk-create a whole season of fixtures in one call — built for clubs.

POST /fixtures/bulk

Public events feed

No key needed. Every upcoming date on tickts, paginated, with venue, coordinates, genres, artists, prices and delta sync for listing sites and aggregators.

GET /feed/events · GET /events
Public events feed

Syndicate what's on, no key required

Listing sites, aggregators and "what's on" apps can pull every public event on tickts straight from GET /api/v1/feed/events. One row per upcoming date, soonest first, wrapped in a { data, meta } envelope with meta.next for the following page. Poll with since= to receive only what changed, including cancellations as status: "cancelled" tombstones, so your copy never goes stale.

Unlisted events and draft events never appear. Private-location events expose the area only. Online events carry no physical location. All times are Europe/London ISO 8601; prices are in the organiser's currency (currency on each row: GBP or EUR). Rate-limited to 60 requests a minute; poll with since= rather than re-pulling everything.

page, per_pagePagination. per_page 1 to 500 (default 100).
sinceISO 8601 or Y-m-d. Only dates whose event or date changed at/after this instant, plus cancellation tombstones.
include_cancelled1 to include cancelled dates as tombstones on a full pull.
genreGenre slug or name, e.g. music, comedy, theatre, sport (matches the genre or its parent).
countryISO 3166-1 alpha-2 venue country, e.g. GB, IE.
from, toY-m-d date bounds.
organiserOnly one organiser's events (their tickts organiser id).
artist, qFree-text match on title, organiser and artist name.
online1 = online events only, 0 = in-person only.
Optional partner key

The feed needs no key and never will. If you are syndicating tickts events on a schedule, ask us for a partner key anyway and send it as X-TK-Feed-Key (or Authorization: Bearer). It raises your rate limit above the anonymous 60 a minute, names you in our logs so we can warn you before anything changes, and registers your importer's address with our bot protection automatically, so a scheduled overnight pull from a datacentre never meets a challenge page. Email [email protected].

Example

Pull the next page of music events

request
curl "https://tickts.co.uk/api/v1/feed/events?genre=music&per_page=200"
response (abridged)
{
  "data": [{
    "id": "SE-kb759-20260912-2000",
    "event_id": 1041,
    "status": "scheduled",
    "title": "Hidden Jazz Club: Late Session",
    "description": "An intimate late-night set...",
    "url": "https://tickts.co.uk/events/hidden-jazz-club",
    "date_url": "https://tickts.co.uk/events/hidden-jazz-club?sub_event_id=SE-kb759-20260912-2000",
    "image": "https://tickts.co.uk/storage/events/card.jpg",
    "start_at": "2026-09-12T20:00:00+01:00",
    "doors_at": "2026-09-12T19:00:00+01:00",
    "timezone": "Europe/London",
    "venue": { "id": 812, "name": "The Bell Inn", "address": "12 High St", "city": "Bath",
               "postcode": "BA1 5AQ", "country": "GB", "lat": 51.38, "lng": -2.36 },
    "artists": [{ "name": "Ada Quartet", "headliner": true, "slug": "ada-quartet" }],
    "genres": [{ "name": "Jazz", "slug": "jazz", "parent": "Music" }],
    "category": "Music",
    "organiser": { "id": 812, "name": "Hidden Jazz Club" },
    "tickets": { "currency": "GBP", "sold_out": false, "cheapest": 12.5,
                 "types": [{ "name": "General Admission", "price": 12.5, "available": true }] },
    "sales_state": "on_sale",
    "updated_at": "2026-08-20T09:14:02+01:00"
  }],
  "meta": { "page": 1, "per_page": 200, "total": 1893, "total_pages": 10,
            "next": "https://tickts.co.uk/api/v1/feed/events?genre=music&per_page=200&page=2" }
}
Authentication

Scoped keys, least privilege

Every key carries an explicit whitelist of scopes and grants nothing beyond them (a key with no scopes can do nothing — it fails closed). Send it as X-Api-Key or an Authorization: Bearer header.

events:readRead events
events:writeCreate & update events
orders:readRead orders
orders:writeRefund orders
scanValidate & scan tickets (legacy umbrella)
tickets:readValidate ticket codes (read-only)
tickets:scanScan tickets (records entry)
venues:readRead venues
venues:writeCreate venues
fans:readRead fan / customer data
analytics:readRead analytics
promos:readRead promo codes
promos:writeCreate promo codes
webhooks:readList webhook subscriptions
webhooks:writeCreate & delete webhook subscriptions
payouts:readRead payout / settlement history & balance
Webhooks

Real-time, signed, retried

Subscribe an endpoint through the API and tickts pushes events to you the moment they happen — no polling. Every payload is signed with X-Tickts-Signature (HMAC-SHA256) so you can verify it's genuinely from us, and deliveries are queued and retried.

order.created order.refunded ticket.checked_in event.published
subscribe to a webhook
curl -X POST https://tickts.co.uk/api/v1/webhooks \
  -H "X-Api-Key: sk_live_your_key" \
  -d '{ "url": "https://you.com/hook",
       "events": ["order.created"] }'
Examples

Copy, paste, ship

Issue a complimentary ticket to a guest list — in whatever you build with.

curl -X POST https://tickts.co.uk/api/v1/events/759/tickets \
  -H "X-Api-Key: sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{ "ticket_type": "GA", "quantity": 2,
       "name": "Guest List", "email": "[email protected]" }'
$res = Http::withHeaders(['X-Api-Key' => 'sk_live_your_key'])
    ->post('https://tickts.co.uk/api/v1/events/759/tickets', [
        'ticket_type' => 'GA',
        'quantity'    => 2,
        'email'       => '[email protected]',
    ]);
import requests
requests.post(
    "https://tickts.co.uk/api/v1/events/759/tickets",
    headers={"X-Api-Key": "sk_live_your_key"},
    json={"ticket_type": "GA", "quantity": 2,
          "email": "[email protected]"},
)
await fetch("https://tickts.co.uk/api/v1/events/759/tickets", {
  method: "POST",
  headers: { "X-Api-Key": "sk_live_your_key",
             "Content-Type": "application/json" },
  body: JSON.stringify({ ticket_type: "GA", quantity: 2,
                         email: "[email protected]" }),
});
AI-native

Connect an AI assistant with MCP

tickts ships a Model Context Protocol server, so assistants like Claude and Cursor can operate your box office directly — check sales, issue comps, answer "how did Friday do?" — using your own scoped key. Your API is ready for the agentic web out of the box.

Endpoint: https://tickts.co.uk/api/mcp

Built right

Details that matter

Versioned (/api/v1), HTTPS-only, rate-limited with clear headers, consistent JSON errors, cursor pagination, and a machine-readable OpenAPI 3.0.3 spec you can generate a client from. Designed with developers (like us) in mind.

Ready when you are.

Generate a scoped key and make your first call in the next minute. No fees, no gatekeeping.