Files

3.3 KiB

Artist concerts

Any metadata extension can include an optional concerts list in getArtist or the artist object returned by handleUrl. The native metadata bridge preserves it as artist_info.concerts or artist.concerts, respectively. Older extensions may omit it; no concert button is shown for an empty list.

{
  "concerts": [{
    "id": "event-123",
    "location": "Example City, Region",
    "venue": "Example Hall",
    "start_at": "2026-10-07T01:00:00Z",
    "time_zone": "America/New_York",
    "detail_id": "event-123",
    "url": "https://example.com/events/123"
  }]
}
  • location and a valid ISO 8601 start_at are required. Date-only values (2026-10-06) are supported when a time has not been announced.
  • For UTC timestamps, supply the venue's IANA time_zone; the example above displays October 6 at 21:00, regardless of the listener's device time zone. Explicit offsets are also supported. Without a recognized time zone, the app preserves the wall-clock fields supplied in start_at.
  • id, venue, and url are optional. The app deduplicates by event ID (or date/location/venue), orders events by date, and accepts at most 500 entries.
  • Tapping an event opens its internal detail page. Only explicit ticket and map actions open external HTTP(S) links; the event URL is used for sharing.
  • Providers should return upcoming events only. Failure to fetch this optional information must not fail the artist's albums or top tracks.

The badge opens a native schedule with artist identity, venue-local date tiles, and event details. Labels are provider-neutral in both application themes. Concert metadata is supplied with the artist response, so the schedule opens immediately without a second loading state or network request.

The schedule follows the application's light/dark theme. The detail page uses the artist portrait's palette and light text in either theme, including its loading placeholders. Any metadata extension can implement getConcert(id) and supply detail_id on its events. The app requests it only when opening an event through getProviderMetadata(provider, "concert", detail_id), receiving the generic concert envelope. Older providers without detail_id still open a detail page with the schedule's date and venue.

{
  "id": "event-123",
  "artist_name": "Example Artist",
  "title": "Example Tour",
  "cover_url": "https://example.com/artist.jpg",
  "start_at": "2026-10-07T01:00:00Z",
  "end_at": "2026-10-07T04:00:00Z",
  "time_zone": "America/New_York",
  "venue": "Example Hall",
  "address": "123 Example Street",
  "ticket_url": "https://example.com/tickets/123",
  "map_url": "https://example.com/maps/123",
  "url": "https://example.com/events/123",
  "attribution": "Powered by Example Events",
  "set_list": {
    "id": "playlist-123",
    "name": "Example Tour Set List",
    "cover_url": "https://example.com/set-list.jpg"
  }
}

All detail fields are optional. Omit unavailable actions instead of fabricating links. Set lists open the existing internal playlist screen using the same metadata provider. Calendar actions present a system editor for the user to review and save; no event is added automatically. iOS 17+ needs no calendar read permission; iOS 16 requests legacy permission. Android uses an insert intent. Failed detail requests leave the date and venue visible with Retry.