Event lineup
/v1/events/{slug}/lineupThe published lineup for an event — every set, with its stage, start and end time.
Slots arrive as one flat slots array rather than pre-grouped, so you can group by day, by stage, or by both, depending on how your page is laid out. A back-to-back set carries its full roster in artists, with the lead act repeated in artist; an unannounced slot has artist: null and a placeholderLabel to render instead.
This reads the organiser's published snapshot, never their working draft. A lineup being rearranged in the console will not appear here until it is published, which is what makes it safe to render straight onto a public page.
On the web surface the response also carries schemaOrg: a ready-made MusicEvent JSON-LD block you can drop into a <script type="application/ld+json"> tag for rich search results.
404 not_found for no visible reason.Request
curl -sS \
-H 'X-Grofomo-Key: pk_live_YOUR_PUBLISHABLE_KEY' \
'https://api.grofomo.com/v1/events/summer-fest/lineup?surface=web'Path parameters
slugstringrequired- The event's URL slug. Globally unique, and fixed once the event is created. Example: `summer-fest`.
Query parameters
surface'web'required- Must be `web` for a website. Omit it and you get the mobile-app surface, which is gated on a different visibility setting — so a perfectly live event can return 404. Example: `web`.
Response
{
"apiVersion": 1,
"data": {
"eventId": "6f1c8e2a-4b3d-4c9e-9f21-8a7d5e0b1c34",
"eventSlug": "summer-fest",
"surface": "web",
"slots": [
{
"id": "3e5a7c9b-0d2f-4e6a-9b8c-1d3f5a7e9c02",
"stage": "Main Stage",
"day": "2026-07-17",
"startTime": "21:30",
"endTime": "23:00",
"durationMinutes": 90,
"billingTier": "headliner",
"isPlaceholder": false,
"placeholderLabel": null,
"placeholderDescription": null,
"featured": true,
"createdAtIso": "2026-04-02T11:20:00.000Z",
"artist": {
"id": "9c7e5a3b-1f0d-4b2e-8a6c-4d2f0b8e6a13",
"name": "Nala Vex",
"imageUrl": "https://cdn.grofomo.com/summer-fest/artists/nala-vex.jpg",
"genres": [
"House",
"Breaks"
],
"hometown": "Manchester",
"region": "England",
"country": "GB",
"locationLabel": "Manchester, England, United Kingdom"
},
"artists": [
{
"id": "9c7e5a3b-1f0d-4b2e-8a6c-4d2f0b8e6a13",
"name": "Nala Vex",
"imageUrl": "https://cdn.grofomo.com/summer-fest/artists/nala-vex.jpg",
"genres": [
"House",
"Breaks"
],
"hometown": "Manchester",
"region": "England",
"country": "GB",
"locationLabel": "Manchester, England, United Kingdom"
}
]
},
{
"id": "47a9e1c3-5b8d-4f20-9c6e-3a1b7d5f9e02",
"stage": "The Orchard",
"day": "2026-07-18",
"startTime": "23:00",
"endTime": "01:00",
"durationMinutes": 120,
"billingTier": "special guest",
"isPlaceholder": false,
"placeholderLabel": null,
"placeholderDescription": null,
"featured": false,
"createdAtIso": "2026-04-02T11:22:00.000Z",
"artist": {
"id": "d1f3b5a7-9c2e-4d80-8b6f-5a3c1e7d9b04",
"name": "Sonny Delrey",
"imageUrl": "https://cdn.grofomo.com/summer-fest/artists/sonny-delrey.jpg",
"genres": [
"Disco",
"Italo"
],
"hometown": "Bristol",
"region": "England",
"country": "GB",
"locationLabel": "Bristol, England, United Kingdom"
},
"artists": [
{
"id": "d1f3b5a7-9c2e-4d80-8b6f-5a3c1e7d9b04",
"name": "Sonny Delrey",
"imageUrl": "https://cdn.grofomo.com/summer-fest/artists/sonny-delrey.jpg",
"genres": [
"Disco",
"Italo"
],
"hometown": "Bristol",
"region": "England",
"country": "GB",
"locationLabel": "Bristol, England, United Kingdom"
},
{
"id": "5b8d2f4a-6c0e-4a13-9d7b-8f2a6c4e0d15",
"name": "Kiruna",
"imageUrl": null,
"genres": [
"Ambient"
],
"hometown": "Gothenburg",
"region": null,
"country": "SE",
"locationLabel": "Gothenburg, Sweden"
}
]
},
{
"id": "a3c5e7d9-2b4f-4061-8e9a-7c5d3b1f9a26",
"stage": "Main Stage",
"day": "2026-07-19",
"startTime": "22:00",
"endTime": "23:30",
"durationMinutes": 90,
"billingTier": "headliner",
"isPlaceholder": true,
"placeholderLabel": "Sunday headliner",
"placeholderDescription": "Announced 1 June.",
"featured": true,
"createdAtIso": "2026-04-02T11:25:00.000Z",
"artist": null,
"artists": []
}
],
"schemaOrg": {
"@context": "https://schema.org",
"@type": "MusicEvent",
"name": "Summer Fest",
"startDate": "2026-07-17T12:00:00+01:00",
"endDate": "2026-07-19T23:59:00+01:00",
"location": {
"@type": "Place",
"name": "Ashton Court",
"address": "Ashton Court Estate, Bristol BS41 9JN, United Kingdom"
},
"performer": [
{
"@type": "MusicGroup",
"name": "Nala Vex"
},
{
"@type": "MusicGroup",
"name": "Sonny Delrey"
}
],
"dateModified": "2026-06-01T09:15:00.000Z"
},
"lastUpdatedAt": "2026-06-01T09:15:00.000Z"
}
}eventIduuideventSlugstringsurface"app" | "web"- Echo of the surface this response was built for.
slotsobject[]- Every published set, as one flat list. Group by `day` or `stage` yourself, depending on how your page is laid out.
slots[].iduuid- Stable id for this set. Use it as a render key.
slots[].stagestring | null- Stage name. Null before a stage is assigned.
slots[].daystring | null- Festival day this set belongs to, as `YYYY-MM-DD`. An after-midnight set is attributed to the day it started, so a 01:00 slot sits under the previous date.
slots[].startTimestring | null- Local start time as `HH:MM`, in the event timezone.
slots[].endTimestring | null- Local end time as `HH:MM`, in the event timezone.
slots[].durationMinutesnumber | null- Set length in minutes.
slots[].billingTierstring | null- Organiser's billing label, e.g. "headliner". Free text; do not switch on it.
slots[].isPlaceholderboolean- True for an unannounced set. Render `placeholderLabel` instead of an artist name.
slots[].placeholderLabelstring | null- What to show in place of a name, e.g. "Sunday headliner".
slots[].placeholderDescriptionstring | null- Longer copy for a placeholder, e.g. when it will be announced.
slots[].featuredboolean- The organiser has flagged this set as a highlight.
slots[].createdAtIsostring | null- When the slot was first created.
slots[].artistobject | null- The lead artist, and the first entry of `artists`. Null on a placeholder slot.
slots[].artist.iduuid- Pass this to the artist-detail endpoint for the full profile.
slots[].artist.namestring- Billed name, as the organiser wants it displayed.
slots[].artist.imageUrlstring | null- Press shot. Null when the artist has none.
slots[].artist.genresstring[]- Free-text genre tags. May be empty.
slots[].artist.hometownstring | null- City.
slots[].artist.regionstring | null- State or province.
slots[].artist.countrystring | null- Raw ISO 3166-1 alpha-2 code, e.g. "GB".
slots[].artist.locationLabelstring | null- Pre-formatted location for display, e.g. "Bristol, England, United Kingdom". Render this rather than joining the parts yourself.
slots[].artistsobject[]- Every artist on the slot, in billing order. A back-to-back set has two or more; a normal set has exactly one; a placeholder has none.
slots[].artists[].iduuid- Pass this to the artist-detail endpoint for the full profile.
slots[].artists[].namestring- Billed name, as the organiser wants it displayed.
slots[].artists[].imageUrlstring | null- Press shot. Null when the artist has none.
slots[].artists[].genresstring[]- Free-text genre tags. May be empty.
slots[].artists[].hometownstring | null- City.
slots[].artists[].regionstring | null- State or province.
slots[].artists[].countrystring | null- Raw ISO 3166-1 alpha-2 code, e.g. "GB".
slots[].artists[].locationLabelstring | null- Pre-formatted location for display, e.g. "Bristol, England, United Kingdom". Render this rather than joining the parts yourself.
schemaOrgobject | null- A ready-made schema.org `MusicEvent` block. Serialise it into a `<script type="application/ld+json">` tag. Null on the app surface.
lastUpdatedAtstring | null- Latest edit across the event and every set here. Good for a "last updated" line.
Structured data
The response carries a ready-made MusicEvent JSON-LD block in schemaOrg. Emitted on the web surface — paste straight into a JSON-LD script tag. Drop it into a <script type="application/ld+json"> tag and search engines can read your lineup without you modelling any of it yourself.
Errors
unauthorizedHTTP 401- No key was sent and the organiser requires one — or the key is invalid, revoked, belongs to another organisation, or is scoped to a different event.
origin_not_allowedHTTP 403- Your site's domain is not on the organiser's allowed list. Browser calls only: a server sends no Origin header and is unaffected.
not_foundHTTP 404- No event with that slug is published on this surface. Check the slug, and check you sent `?surface=web`.
Notes
- Rate limited to roughly 60 requests per minute per caller. Guidance, not a contract — see caching and rate limits.
- Cached for 60 seconds at the edge, so a publish can take up to a minute to appear.