← Back to Bass Space

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_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Keys 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.

Treat an API key like a password. It grants read access to your event schedules. If a key is exposed, revoke it and create a new one.

Base URL

All endpoints are served from a single base URL. Append the endpoint path and query string to it.

https://api.bassspace.app/v1

List events

GET/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

idstringEvent id.
slugstringPass this as the event parameter to /schedule and /now.
namestringEvent name.
start_date / end_datestring | nullEvent date range (YYYY-MM-DD).
timezonestring | nullIANA timezone, e.g. America/Chicago.
event_typestringEither show or festival.
is_canceledbooleanWhether the event has been canceled.

Full schedule

GET/schedule?event={slug}

Returns the event, its stages, and every published set. Use this to render a full schedule board or to compute now-playing yourself.

ParameterTypeDescription
eventstring, requiredThe 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

GET/now?event={slug}

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").

ParameterTypeDescription
eventstring, requiredThe 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

idstringUnique set identifier.
stage_idstring | nullThe stage this set is on.
namestring | nullOptional set label (e.g. a B2B or takeover name).
kindstringperformance, workshop, or meetup.
is_headlinerbooleanWhether this is a headlining set.
meetup_typestring | nullFor meetups: flow, merch, artist, fan, or other. Null otherwise.
workshop_typestring | nullFor workshops: yoga, movement, meditation, flow_arts, art, music, talk, ceremony, healing, and more. Null otherwise.
is_open_deckbooleanOpen-deck / open-format slot.
is_renegadebooleanRenegade (unofficial) set.
is_silent_discobooleanSilent-disco set.
silent_disco_channelstring | nullChannel for a silent-disco set (e.g. red, blue, green, 1, 2, 3).
silent_disco_channel_labelstring | nullOptional custom channel label.
location_descriptionstring | nullFree-text location note (e.g. for a stageless meetup).
set_datestringCalendar date the set was scheduled under (YYYY-MM-DD).
start_time / end_timestring | nullWall-clock time in the event timezone (HH:MM).
start_local / end_localstring | nullEvent-local date and time (YYYY-MM-DD HH:MM).
start_utc / end_utcstring | nullResolved UTC instant (ISO 8601). Null if the event has no timezone.
artistsarrayOrdered participants; see Artist below.

Artist

idstringArtist identifier.
namestringArtist name.
rolestringartist (performer, incl. DJs), vj (visuals), or mc.
labelstring | nullOptional per-participant label (e.g. a B2B tag).

Stage

idstringUnique stage identifier.
namestringStage name.
order_indexnumberDisplay order (ascending).

Event

slugstringThe event slug used in requests.
namestringEvent name.
timezonestring | nullIANA timezone, e.g. America/Chicago.
day_rollover_hournumberHour (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_EVENTThe event query parameter was not provided.
401 UNAUTHORIZEDMissing, invalid, or revoked API key.
404 NOT_FOUNDNo 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_REQUIREDThe /now endpoint was called on an event that has no timezone set.
405 METHOD_NOT_ALLOWEDUse 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.

/schedulemax-age=30Strong ETag over the schedule content.
/nowmax-age=15Weak, 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.