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.