These endpoints read the acts in your production, add new ones, and update what you keep on them.

Each act record merges two records: what the production keeps about the act, and what the act keeps on their own Confirmed profile. When both have a value for a field, the act's own value wins, unless the production has chosen to keep its own.

GET /acts

This endpoint returns every act in the production, or the ones that match your filters.

Parameter Type Description
name string Only returns the acts whose name contains this text. Case doesn't matter.
tags string Comma-separated tags. Only returns the acts that have all of them.
curl "https://confirmed.show/api/v1/spectrum/acts?tags=headliner,mc" \
  -H "Authorization: Bearer <token>"

You get back an array of acts.

[
  {
    "id": "b9b4",
    "name": "John Smith",
    "email": "john@example.com",
    "bio": "Touring headliner.",
    "images": ["https://st.confirmed.show/uploads/acts/b9b4/A1B2C3.webp"],
    "website": "https://johnsmith.example",
    "instagram": "johnsmith",
    "tags": ["headliner"],
    "deltas": {
      "prod": {"name": "John Smith", "tags": ["headliner"]},
      "act": {"bio": "Touring headliner.", "instagram": "johnsmith"}
    }
  }
]

Fields

A record only includes the fields an act has filled in. When a field is there, it always has the name listed below.

Field Type Description
id string Act id, which you can pass as actID on the Shows API
name string Their name, or their email address when they haven't given one
email string Email address
bio string Short bio
bio_extended string Longer bio
credits string Credits
images string[] Headshot URLs. Confirmed shows the first one.
video_link string A link to their video
website string Their website
twitter string Twitter handle or URL
instagram string Instagram
facebook string Facebook
tiktok string TikTok
plug string What they're plugging at the moment
tags string[] The tags the production keeps on them
notes string The production's own notes
legal_name string Legal name, when settlements need one
phone string Phone number
use_prod string[] The fields where the production keeps its own value over the act's. See below.
created_by_api_key object Set when the act was added through the API. See POST /acts.
deltas object The two records the act was merged from. See below.

You can add -thumb to an image URL to get a small version of it.

This endpoint shows each act the way your production sees them inside Confirmed, including their contact details and the payment details they've given for settlements. A key that can read it needs the same care as those details.

Where a value came from

deltas splits the record back into the two it was merged from, so you can tell where each value came from. prod has what the production keeps, and act has what the act keeps on their own profile. A field can appear in both, and the merged record above is the one to read.

use_prod lists the fields where the production keeps its own value. For those, the merged record shows the production's value even when the act has one of their own.


GET /acts/{act_id}

This endpoint returns one act, in the same shape as the list. If no act has that id, you get a 404.

curl https://confirmed.show/api/v1/spectrum/acts/b9b4 \
  -H "Authorization: Bearer <token>"

POST /acts

This endpoint adds an act to the production, the way Add new contact does in Confirmed. It needs a read-write key, and name is the only field you have to send.

curl -X POST https://confirmed.show/api/v1/spectrum/acts \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Jane Doe",
    "email": "jane@example.com",
    "tags": ["mc", "new"],
    "instagram": "janedoe"
  }'

You get the new act back with a 201. Every act you add this way has created_by_api_key, so you and your team can tell it apart from the ones added in Confirmed:

{
  "id": "k2m8",
  "name": "Jane Doe",
  "email": "jane@example.com",
  "tags": ["mc", "new"],
  "instagram": "janedoe",
  "created": "2026-10-27 09:14",
  "created_by_api_key": { "key": "a1b2", "description": "Website sign-up form" }
}

key is the first four characters of the key that made the call, and description is what the key was called at the time.

An email address can only belong to one act. If another act already has it, you get a 409 with that act's id, so you can update it instead.

When an act with that email address signs in to Confirmed, their account links up with the record you added, and from then on they look after their own profile.

Fields you can write

Field Type Description
name string Their name. It can't be empty.
email string Email address. We store it in lower case.
phone string Phone number
legal_name string Legal name, for settlements
notes string The production's own notes
tags string[] Tags. Sending them replaces the act's tags outright.
bio string Short bio
bio_extended string Longer bio
credits string Credits
plug string What they're plugging at the moment
website string Their website
instagram string Instagram
twitter string Twitter handle or URL
tiktok string TikTok
facebook string Facebook
video_link string A link to their video

A field name we don't recognise comes back as a 422 rather than being ignored.


PUT /acts/{act_id}

This endpoint updates an act. It needs a read-write key, and takes the same fields as POST /acts. We only change the fields you send, and null clears one.

curl -X PUT https://confirmed.show/api/v1/spectrum/acts/k2m8 \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{ "tags": ["mc", "regular"], "notes": "Great with a rowdy room" }'

You get the updated act back. If no act has that id, you get a 404.

Acts with a Confirmed account

Once an act has linked their Confirmed account, they keep their own profile, and your production follows it. Writing one of their profile fields, such as bio or instagram, keeps your value over theirs and adds the field to use_prod, the same as choosing your own value in Confirmed. Sending null for that field drops your value, and the act's own shows through again.

Fields that are only the production's, like notes and tags, work the same for every act.

A linked act looks after their own email address, so changing email on one comes back as a 422.


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 an act with that id.
409 Another act already has that email address.
422 Something in the body doesn't fit. The response says what.