These endpoints give you each show's ticket sales, and let a ticket seller or box
office system send its numbers straight into Confirmed. Sales you send show up in the
show listing and on the show card, and they count towards
tickets_available on the public
Shows endpoint.
How the numbers add up
A show's sales come in a breakdown, with one row per ticket type from each source. A
source can be a ticket import set up in Data & API, or a feed you name yourself
through this API. sold is the total across every row.
Each time a source sends its numbers, they replace that source's earlier rows and leave every other source's rows alone. You always send your full current totals, never the sales since your last call, so sending the same numbers twice doesn't count anything twice.
GET /tickets
This endpoint returns the sales for every show in a date range that has sold any tickets.
| Parameter | Type | Description |
|---|---|---|
ts_from |
timestamp | Earliest show start time. Defaults to ten days ago. |
ts_to |
timestamp | Latest show start time. Defaults to thirty days ahead. |
show_type |
string | Only returns shows of this type. |
curl "https://confirmed.show/api/v1/spectrum/tickets?ts_from=2026-07-01&ts_to=2026-07-31" \
-H "Authorization: Bearer <token>"
[
{
"show_id": "nan3",
"ts": "2026-07-21 21:00",
"sold": 64,
"updated_ts": "2026-07-19 14:05",
"breakdown": [
{ "type": "Standard", "price": 15, "sold": 48, "source_type": "api", "source": "eventbrite", "api_key": "a1b2" },
{ "type": "Concession", "price": 10, "sold": 12, "source_type": "api", "source": "eventbrite", "api_key": "a1b2" },
{ "type": "Door", "price": 18, "sold": 4, "source_type": "red61", "source": null, "api_key": null }
]
}
]
Sales fields
| Field | Type | Description |
|---|---|---|
show_id |
string | Show id |
ts |
timestamp | The show's start time |
sold |
integer | Tickets sold across every source |
updated_ts |
timestamp | When the numbers last changed, in UTC |
breakdown |
Sale[] | One row per ticket type from each source |
Sale fields
| Field | Type | Description |
|---|---|---|
type |
string | The ticket type, such as Standard or Concession |
price |
number | What one ticket costs |
sold |
integer | How many sold |
source_type |
string |
api for numbers sent through this API, or the kind of import
that sent them
|
source |
string | The source name you sent the numbers with. Only set for API sources. |
api_key |
string | The first four characters of the key that sent the numbers. Only set for API sources. |
GET /shows/{show_id}/tickets
This endpoint returns one show's sales, along with its history. If no show has that
id, you get a 404.
curl https://confirmed.show/api/v1/spectrum/shows/nan3/tickets \
-H "Authorization: Bearer <token>"
You get the sales fields above, plus history: the show's running total
each time it changed, oldest first.
{
"show_id": "nan3",
"ts": "2026-07-21 21:00",
"sold": 64,
"updated_ts": "2026-07-19 14:05",
"breakdown": [ ... ],
"history": [
{ "ts": "2026-07-12 09:00", "sold": 20 },
{ "ts": "2026-07-19 14:05", "sold": 64 }
]
}
PUT /shows/{show_id}/tickets
This endpoint sets one show's sales from one source. It needs a read-write key.
| Field | Type | Required | Description |
|---|---|---|---|
source |
string | No |
Names the feed. Letters, digits and underscores, starting with a letter.
Defaults to api.
|
sales |
Sale[] | Yes | Your current totals, one row per ticket type |
Each row in sales has type, sold, and optionally
price, which defaults to 0.
curl -X PUT https://confirmed.show/api/v1/spectrum/shows/nan3/tickets \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"source": "eventbrite",
"sales": [
{ "type": "Standard", "price": 15, "sold": 48 },
{ "type": "Concession", "price": 10, "sold": 12 }
]
}'
You get the show's sales back, with every source included.
Give each feed its own source name. If you sell through two platforms,
sending them as eventbrite and skiddle keeps both sets of
numbers, where sending both under the same name would leave only the last one. To take a
source's numbers off a show, send it with an empty sales list.
PUT /tickets
This endpoint sets sales for several shows in one call, which suits a nightly sync. We
check every show exists before writing anything, so if one id is wrong, nothing changes
and you get a 404 naming it.
curl -X PUT https://confirmed.show/api/v1/spectrum/tickets \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"updates": [
{ "show_id": "nan3", "source": "eventbrite", "sales": [ { "type": "Standard", "price": 15, "sold": 48 } ] },
{ "show_id": "p4rt", "source": "eventbrite", "sales": [ { "type": "Standard", "price": 15, "sold": 31 } ] }
]
}'
You get the sales for those shows back as an array.
Errors
| Status | What happened |
|---|---|
400 |
The request carried no API token. |
401 |
We don't recognise that token. |
403 |
The key is read-only, and this call writes. |
404 |
We don't have a show with that id. |
422 |
Something in the body doesn't fit. The response says what. |