Developer docs

Developer docsShow catalog

Show catalog

GET /v1/public/shows returns the current public show catalog. It requires no authentication.

This unauthenticated, read-only endpoint supports direct browser requests from any origin. GET and OPTIONS responses use Access-Control-Allow-Origin: *.

Request

Query parameters

All parameters are optional. The default response contains up to 24 upcoming shows.

ParameterTypeDescription
whenstringTime window: upcoming (default), weekend, or past.
citystringCase-insensitive city filter.
countrystringCase-insensitive country filter.
continentstringContinent filter.
artiststringPublic artist username. The API also accepts the artist ID as a fallback.
limitintegerNumber of rows to return, from 1 to 48. The default is 24.
cursorstringOpaque cursor from the previous response's pagination.next_cursor.

Location and artist filters can be combined. The API applies all supplied filters before it orders and paginates the result.

Example request

curl --fail-with-body \
  'https://api.b90hq.app/v1/public/shows?when=upcoming&city=Berlin&limit=10'

Response

The response contains data and a pagination object. Top-level show fields use camelCase. Artist objects use the public artist field names shown in the example.

{
  "data": [
    {
      "id": "00000000-0000-4000-8000-000000000001",
      "shortCode": "berlin-show",
      "title": "HQ at the venue",
      "eventDate": "2026-10-10",
      "startTime": "2026-10-10T22:00:00.000Z",
      "endTime": "2026-10-11T04:00:00.000Z",
      "isPlaytimeTBA": false,
      "timezone": "Europe/Berlin",
      "locationName": "The venue",
      "locationCity": "Berlin",
      "locationCountry": "Germany",
      "continent": "Europe",
      "coordinates": {
        "latitude": 52.52,
        "longitude": 13.405
      },
      "venuePlaceId": "place-id",
      "webUrl": "https://joinhq.app/show/berlin-show",
      "thumbnailUrl": "https://cdn.example.com/show.jpg",
      "totalRsvps": 42,
      "artists": [
        {
          "artist_id": "00000000-0000-4000-8000-000000000002",
          "display_name": "Artist name",
          "username": "artist",
          "avatar_url": "https://cdn.example.com/avatar.jpg",
          "avatar_thumb_url": "https://cdn.example.com/avatar-thumb.jpg",
          "community_id": "00000000-0000-4000-8000-000000000003",
          "community_name": "Artist community",
          "start_time": "2026-10-10T22:00:00.000Z",
          "end_time": "2026-10-11T00:00:00.000Z",
          "is_playtime_tba": false
        }
      ]
    }
  ],
  "pagination": {
    "limit": 10,
    "has_next": true,
    "next_cursor": "opaque-cursor"
  }
}

Show fields

FieldTypeDescription
idstringStable show ID.
shortCodestringPublic short code.
titlestringShow title.
eventDatestringEvent date in YYYY-MM-DD format.
startTime, endTimestringISO 8601 timestamps.
isPlaytimeTBAbooleanAggregate flag: true only when all artist playtime rows are to be announced. Use the matching artists[].is_playtime_tba value for one artist.
timezonestringIANA timezone for the event.
locationName, locationCity, locationCountrystringPublic venue and location fields.
continentstring | nullNormalized continent, when available.
coordinatesobject | nullPublic { latitude, longitude } coordinates, when available.
venuePlaceIdstring | nullPublic venue provider place ID, when available.
webUrlstring | nullShow URL, when available.
thumbnailUrlstring | nullPublic show image URL, when available.
totalRsvpsintegerCurrent total RSVP count.
artistsarrayPublic artist and timetable rows.

Nullable fields are returned as null. The artists array can be empty.

Pagination and ordering

Use pagination.next_cursor as the next request's cursor value. Treat it as opaque: do not decode or construct it yourself.

The API uses stable keyset pagination. upcoming and weekend results are ordered by startTime and then id in ascending order. past results use the same fields in descending order. When has_next is false, next_cursor is null.

The top-level isPlaytimeTBA value is an all-artists aggregate. For an individual artist, use the matching artists[].is_playtime_tba value. Any row marked with is_playtime_tba: true still contains fallback start_time and end_time values for scheduling; display the TBA state instead of presenting those fallback times as confirmed playtimes.

Errors

Malformed query parameters return a JSON error with status 400. The current error values are:

ErrorCause
invalid_whenwhen is not upcoming, weekend, or past.
invalid_limitlimit is not an integer from 1 to 48.
invalid_cursorcursor is not a valid cursor returned by this endpoint.
invalid_continentcontinent is not a supported continent value.