Artist shows
GET /v1/artists/{username}/shows returns published shows for a public artist username. It requires no authentication.
Request
The username path value is resolved case-insensitively. It must be between 3 and 64 characters and must not have leading or trailing whitespace.
Query parameters
| Parameter | Type | Description |
|---|---|---|
limit | integer | Number of rows to return, from 1 to 100. The default is 20. |
cursor | string | Opaque cursor from the previous response's pagination.next_cursor. |
Example request
curl --fail-with-body \
'https://api.b90hq.app/v1/artists/artist/shows?limit=20'
Response
The response contains data and a pagination object. This endpoint uses snake_case field names.
{
"data": [
{
"id": "00000000-0000-4000-8000-000000000001",
"short_code": "berlin-show",
"title": "HQ at the venue",
"event_date": "2026-10-10",
"start_time": "2026-10-10T22:00:00.000Z",
"end_time": "2026-10-11T04:00:00.000Z",
"is_playtime_tba": false,
"timezone": "Europe/Berlin",
"location_name": "The venue",
"location_city": "Berlin",
"location_country": "Germany",
"web_url": "https://joinhq.app/show/berlin-show",
"thumbnail_url": "https://cdn.example.com/show.jpg",
"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
}
],
"created_at": "2026-08-01T12:00:00.000Z",
"updated_at": null
}
],
"pagination": {
"limit": 20,
"has_next": true,
"next_cursor": "opaque-cursor"
}
}
Show fields
| Field | Type | Description |
|---|---|---|
id | string | Stable show ID. |
short_code | string | Public short code. |
title | string | Show title. |
event_date | string | Event date in YYYY-MM-DD format. |
start_time, end_time | string | ISO 8601 timestamps. |
is_playtime_tba | boolean | Aggregate flag: true only when all artist playtime rows are to be announced. Use the matching artists[].is_playtime_tba value for one artist. |
timezone | string | IANA timezone for the event. |
location_name, location_city, location_country | string | Public venue and location fields. |
web_url | string | null | Show URL, when available. |
thumbnail_url | string | null | Public show image URL, when available. |
artists | array | Public artist and timetable rows. |
created_at | string | null | ISO 8601 creation timestamp, when available. |
updated_at | string | null | ISO 8601 update timestamp, when available. |
Artist rows contain public profile, community, and timetable fields. Nullable values are returned as null.
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.
Results are ordered by start_time and then id in ascending order. When has_next is false, next_cursor is null.
The top-level is_playtime_tba 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
| Status | Error | Cause |
|---|---|---|
400 | invalid_username | The username is outside the accepted length or whitespace bounds. |
400 | invalid_limit | limit is not an integer from 1 to 100. |
400 | invalid_cursor | cursor is not a valid cursor returned by this endpoint. |
404 | artist_not_found | No public artist matches the username. |
409 | username_ambiguous | More than one public artist matches the username. |
The route is public and cacheable. It allows direct browser GET and OPTIONS requests from any
origin with Access-Control-Allow-Origin: *.