Bass Space API
A read-only HTTP API for fetching an event's published set times. Built for festival stage displays, now-playing screens, and other integrations that need live schedule data without any manual updates.
Overview
The set-times API exposes the same published schedule that powers the Bass Space app. Each key is scoped to a single promoter and can read any event that promoter is on. Start with GET /events to list those events and their slugs, then pass a slug to /schedule or /now. Responses include both the event-local wall-clock time and the resolved UTC timestamp for every set, so your display never has to do timezone math.
Only published, non-canceled sets are returned. Sets that a promoter has kept private or marked time-to-be-announced are never exposed through the API.
Authentication
Every request must include a per-promoter API key as a bearer token:
Authorization: Bearer bsk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxKeys are managed inside the Bass Space app. As an owner or manager of a promoter, open Manage promoter, tap API access → API keys, and create a key. The full key (starting with bsk_live_) is shown only once at creation, so copy it right away. You can revoke a key at any time from the same screen, which immediately stops any display using it.
Base URL
All endpoints are served from a single base URL. Append the endpoint path and query string to it.
https://api.bassspace.app/v1List events
Returns every event your key's promoter is on, most recent first. Use it to discover the event slugs and ids you pass to the schedule and now endpoints. Takes no parameters.
Example request
curl -H "Authorization: Bearer bsk_live_..." \
"https://api.bassspace.app/v1/events"Example response
{
"generated_at": "2026-07-10T23:15:04.000Z",
"events": [
{
"id": "b2c3d4e5-...",
"slug": "trichroma-2026",
"name": "Trichroma Music Festival",
"start_date": "2026-07-10",
"end_date": "2026-07-11",
"timezone": "America/Chicago",
"event_type": "festival",
"is_canceled": false
}
]
}Event fields
| id | string | Event id. |
| slug | string | Pass this as the event parameter to /schedule and /now. |
| name | string | Event name. |
| start_date / end_date | string | null | Event date range (YYYY-MM-DD). |
| timezone | string | null | IANA timezone, e.g. America/Chicago. |
| event_type | string | Either show or festival. |
| is_canceled | boolean | Whether the event has been canceled. |
Full schedule
Returns the event, its stages, and every published set. Use this to render a full schedule board or to compute now-playing yourself.
| Parameter | Type | Description |
|---|---|---|
| event | string, required | The event slug, e.g. trichroma-2026. |
Example request
curl -H "Authorization: Bearer bsk_live_..." \
"https://api.bassspace.app/v1/schedule?event=trichroma-2026"Example response
{
"event": {
"slug": "trichroma-2026",
"name": "Trichroma Music Festival",
"timezone": "America/Chicago",
"day_rollover_hour": 6
},
"generated_at": "2026-07-10T23:15:04.000Z",
"stages": [
{ "id": "a1b2c3d4-...", "name": "Main Stage", "order_index": 0 },
{ "id": "e5f6a7b8-...", "name": "Forest Stage", "order_index": 1 }
],
"sets": [
{
"id": "9c8d7e6f-...",
"stage_id": "a1b2c3d4-...",
"name": null,
"kind": "performance",
"is_headliner": true,
"meetup_type": null,
"workshop_type": null,
"is_open_deck": false,
"is_renegade": false,
"is_silent_disco": false,
"silent_disco_channel": null,
"silent_disco_channel_label": null,
"location_description": null,
"set_date": "2026-07-10",
"start_time": "22:00",
"end_time": "23:30",
"start_local": "2026-07-10 22:00",
"end_local": "2026-07-10 23:30",
"start_utc": "2026-07-11T03:00:00.000Z",
"end_utc": "2026-07-11T04:30:00.000Z",
"artists": [
{ "id": "1a2b3c4d-...", "name": "Honeycomb", "role": "artist", "label": null },
{ "id": "7e8f9a0b-...", "name": "Nima", "role": "vj", "label": null }
]
}
]
}Now and next
Returns the currently playing set and the next set for each stage, computed in the event's timezone. Ideal for a per-stage "now playing" display. Either current or next may be null (before doors, during a gap, or after the last set). Each is the full set object documented under /schedule.
All kinds are included, so a workshop or meetup with a stage and time can be the current or next entry. Check kind if your display should show only music (kind === "performance").
| Parameter | Type | Description |
|---|---|---|
| event | string, required | The event slug, e.g. trichroma-2026. |
Example request
curl -H "Authorization: Bearer bsk_live_..." \
"https://api.bassspace.app/v1/now?event=trichroma-2026"Example response
{
"event": {
"slug": "trichroma-2026",
"name": "Trichroma Music Festival",
"timezone": "America/Chicago",
"day_rollover_hour": 6
},
"generated_at": "2026-07-11T04:05:00.000Z",
"stages": [
{
"stage": { "id": "a1b2c3d4-...", "name": "Main Stage", "order_index": 0 },
"current": {
"id": "9c8d7e6f-...",
"stage_id": "a1b2c3d4-...",
"name": null,
"kind": "performance",
"is_headliner": true,
"start_local": "2026-07-10 22:00",
"end_local": "2026-07-10 23:30",
"start_utc": "2026-07-11T03:00:00.000Z",
"end_utc": "2026-07-11T04:30:00.000Z",
"artists": [
{ "id": "1a2b3c4d-...", "name": "Honeycomb", "role": "artist", "label": null },
{ "id": "7e8f9a0b-...", "name": "Nima", "role": "vj", "label": null }
]
},
"next": {
"id": "3f4e5d6c-...",
"stage_id": "a1b2c3d4-...",
"name": null,
"kind": "performance",
"is_headliner": false,
"start_local": "2026-07-10 23:30",
"end_local": "2026-07-11 01:00",
"start_utc": "2026-07-11T04:30:00.000Z",
"end_utc": "2026-07-11T06:00:00.000Z",
"artists": [
{ "id": "5b6c7d8e-...", "name": "Riptide", "role": "artist", "label": null }
]
}
}
]
}Response objects
Set
| id | string | Unique set identifier. |
| stage_id | string | null | The stage this set is on. |
| name | string | null | Optional set label (e.g. a B2B or takeover name). |
| kind | string | performance, workshop, or meetup. |
| is_headliner | boolean | Whether this is a headlining set. |
| meetup_type | string | null | For meetups: flow, merch, artist, fan, or other. Null otherwise. |
| workshop_type | string | null | For workshops: yoga, movement, meditation, flow_arts, art, music, talk, ceremony, healing, and more. Null otherwise. |
| is_open_deck | boolean | Open-deck / open-format slot. |
| is_renegade | boolean | Renegade (unofficial) set. |
| is_silent_disco | boolean | Silent-disco set. |
| silent_disco_channel | string | null | Channel for a silent-disco set (e.g. red, blue, green, 1, 2, 3). |
| silent_disco_channel_label | string | null | Optional custom channel label. |
| location_description | string | null | Free-text location note (e.g. for a stageless meetup). |
| set_date | string | Calendar date the set was scheduled under (YYYY-MM-DD). |
| start_time / end_time | string | null | Wall-clock time in the event timezone (HH:MM). |
| start_local / end_local | string | null | Event-local date and time (YYYY-MM-DD HH:MM). |
| start_utc / end_utc | string | null | Resolved UTC instant (ISO 8601). Null if the event has no timezone. |
| artists | array | Ordered participants; see Artist below. |
Artist
| id | string | Artist identifier. |
| name | string | Artist name. |
| role | string | artist (performer, incl. DJs), vj (visuals), or mc. |
| label | string | null | Optional per-participant label (e.g. a B2B tag). |
Stage
| id | string | Unique stage identifier. |
| name | string | Stage name. |
| order_index | number | Display order (ascending). |
Event
| slug | string | The event slug used in requests. |
| name | string | Event name. |
| timezone | string | null | IANA timezone, e.g. America/Chicago. |
| day_rollover_hour | number | Hour (0-23) at which the festival day rolls over. See Dates and times. |
Dates and times
Set times are stored in the event's local timezone. Each set includes both the local wall-clock time (start_local) and the absolute UTC instant (start_utc), so you can display local time directly or compare against the current UTC time without any conversion.
Late-night sets follow the event's day_rollover_hour (default 6). A set whose start hour is before the rollover is treated as a continuation of the previous festival day, so a 1:00 AM Saturday set is grouped with the Friday night programming. The resolved start_utc already accounts for this, so an after-midnight set maps to the correct absolute time.
Errors
Errors return the appropriate HTTP status and a JSON body:
{
"error": {
"code": "NOT_FOUND",
"message": "No accessible event for this key"
}
}| 400 MISSING_EVENT | The event query parameter was not provided. | |
| 401 UNAUTHORIZED | Missing, invalid, or revoked API key. | |
| 404 NOT_FOUND | No event with that slug is accessible to this key's promoter. Returned for both unknown events and events your key does not cover. | |
| 422 TIMEZONE_REQUIRED | The /now endpoint was called on an event that has no timezone set. | |
| 405 METHOD_NOT_ALLOWED | Use GET. | |
Caching and polling
Both endpoints set Cache-Control and return an ETag. Send the ETag back on the next request as If-None-Match; if nothing changed you get a 304 Not Modified with no body, which keeps polling cheap.
| /schedule | max-age=30 | Strong ETag over the schedule content. |
| /now | max-age=15 | Weak, minute-bucketed ETag (the answer changes with wall-clock time). |
Polling every 30 to 60 seconds is plenty for a live display. Please do not poll more frequently than once every 10 seconds.