Event detail
GET
/v1/events/{slug}Everything that describes the event itself — name, dates, timezone, venue, stages and the organiser's brand settings.
Usually the first call a site makes.
No key is required today — send one anywayThe Grofomo mobile app still calls this endpoint without a credential, so it cannot be locked down yet. It will be. A key sent now is accepted and ignored, so an integration built this way keeps working on the day enforcement lands; one built without a key will start returning
401 unauthorized.Send ?surface=webOmit it and the request is treated as coming from the mobile app, which is gated on a different visibility setting — so a perfectly live event can return
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?surface=web'Path parameters
slugstringrequired- The event's URL slug. Globally unique. It can change if the organiser renames the event, but an old slug keeps reaching the same event, so a stored one never breaks. 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
200 OK
{
"apiVersion": 1,
"data": {
"id": "6f1c8e2a-4b3d-4c9e-9f21-8a7d5e0b1c34",
"slug": "summer-fest",
"name": "Summer Fest",
"description": "Three days of house, disco and breaks across two stages on the edge of Bristol, with camping from Friday morning.",
"summary": "Three days, two stages, Ashton Court.",
"ticketUrl": "https://grfm.to/e/summer-fest",
"capacity": 8000,
"familyFriendly": true,
"musicGenres": [
"House",
"Disco",
"Breaks"
],
"timezone": "Europe/London",
"dates": {
"startDate": "2026-07-17",
"endDate": "2026-07-19",
"doorsOpen": "12:00",
"doorsClose": "02:00",
"timezone": "Europe/London",
"singleDay": false
},
"venue": {
"name": "Ashton Court",
"address": "Ashton Court Estate",
"city": "Bristol",
"region": "England",
"postcode": "BS41 9JN",
"country": "GB",
"indoorOutdoor": "outdoor"
},
"stages": [
{
"id": "main-stage",
"name": "Main Stage",
"type": "outdoor",
"description": "The big one, in the meadow.",
"imageUrl": "https://cdn.grofomo.com/summer-fest/stages/main.jpg"
},
{
"id": "the-orchard",
"name": "The Orchard",
"type": "tent",
"description": null,
"imageUrl": null
}
],
"brand": {
"brandColors": [
"#FFEA00",
"#080808"
],
"logoUrl": "https://cdn.grofomo.com/summer-fest/brand/logo.png",
"logoVectorUrl": "https://cdn.grofomo.com/summer-fest/brand/logo.svg",
"artworkUrl": "https://cdn.grofomo.com/summer-fest/brand/poster.jpg",
"coverArtUrl": "https://cdn.grofomo.com/summer-fest/brand/cover.jpg",
"backgroundColor": "#080808",
"textColor": "#FAFAF7",
"accentColor": "#FFEA00",
"fontFamily": "Syne",
"socialLinks": {
"instagram": "https://instagram.com/summerfest",
"spotify": "https://open.spotify.com/playlist/summerfest"
},
"mapImageUrl": "https://cdn.grofomo.com/summer-fest/brand/site-map.png",
"themeMode": "brand",
"fonts": {
"headline": {
"family": "Syne",
"url": "https://fonts.gstatic.com/s/syne/v22/8vIS7w4qzmVxsWxjBZRjr0FKM_04uT6kR47NCV5Z.ttf",
"weight": 700
},
"body": null
}
},
"community": {
"chatUrl": "https://chat.whatsapp.com/summerfest",
"chatPlatform": "whatsapp",
"chatLabel": "Summer Fest group chat"
},
"schemaOrg": {
"@context": "https://schema.org",
"@type": "MusicEvent",
"name": "Summer Fest",
"description": "Three days of house, disco and breaks across two stages on the edge of Bristol, with camping from Friday morning.",
"startDate": "2026-07-17T11:00:00+01:00",
"endDate": "2026-07-20T01:00:00+01:00",
"image": [
"https://cdn.grofomo.com/summer-fest/brand/artwork.jpg"
],
"maximumAttendeeCapacity": 8000,
"location": {
"@type": "Place",
"name": "Ashton Court",
"address": {
"@type": "PostalAddress",
"streetAddress": "Ashton Court Estate",
"addressLocality": "Bristol",
"addressRegion": "England",
"postalCode": "BS41 9JN",
"addressCountry": "GB"
}
},
"organizer": {
"@type": "Organization",
"name": "Riot Promotions"
},
"offers": [
{
"@type": "Offer",
"name": "Weekend Camping: Tier 2",
"price": "89.50",
"priceCurrency": "GBP",
"availability": "https://schema.org/InStock",
"url": "https://grfm.to/e/summer-fest/tickets",
"validThrough": "2026-06-30T22:59:00.000Z"
}
]
},
"organiser": {
"id": "b2d4a6f8-1c3e-4a5b-8d7f-2e9c0a1b3d45",
"name": "Riot Promotions",
"slug": "riot-promotions",
"logoUrl": "https://cdn.grofomo.com/riot-promotions/logo.png"
}
}
}iduuidslugstring- The event's current URL slug. It changes if the organiser renames the event; a request using an old slug still reaches the event and answers with the current one here, so store this value rather than the one you asked with.
namestringdescriptionstring | null- Long-form event copy.
summarystring | null- One line, for a card or a meta description.
ticketUrlstring | null- Where to send someone to buy: the organiser's own link if they set one, otherwise their Grofomo checkout when the event sells through Grofomo. Null only when neither exists, which means no way to buy has been published yet. It is not a statement about whether a release is open right now, so read `soldOut` and `upcoming` on the tickets endpoint for that.
capacitynumber | nullfamilyFriendlyboolean | nullmusicGenresstring[]- Free-text genre tags for the event as a whole.
timezonestring- IANA zone, e.g. "Europe/London". Every local time in the API is in it.
datesobjectdates.startDatestring | null- First day, as `YYYY-MM-DD`.
dates.endDatestring | null- Last day, as `YYYY-MM-DD`. Equal to `startDate` for a one-day event.
dates.doorsOpenstring | null- Local opening time as `HH:MM`.
dates.doorsClosestring | null- Local closing time as `HH:MM`. May be after midnight.
dates.timezonestring | null- IANA zone, e.g. "Europe/London". Every `HH:MM` here is local to it.
dates.singleDayboolean | nullvenueobjectvenue.namestring | nullvenue.addressstring | null- Street address, without city or postcode.
venue.citystring | nullvenue.regionstring | null- State, province or county.
venue.postcodestring | nullvenue.countrystring | null- Raw ISO 3166-1 alpha-2 code, e.g. "GB".
venue.indoorOutdoorstring | null- Free text, e.g. "outdoor".
stagesobject[]- Every stage. A lineup slot names its stage by `name`, not by `id`.
stages[].idstring- Stable within the event. Matches `stage` on a lineup slot by name, not by id.
stages[].namestringstages[].typestring | null- Free text, e.g. "tent".
stages[].descriptionstring | nullstages[].imageUrlstring | nullbrandobject- The organiser's colours, logos and fonts, so your site can match the event's identity.
brand.brandColorsstring[]brand.logoUrlstring | nullbrand.logoVectorUrlstring | nullbrand.artworkUrlstring | nullbrand.coverArtUrlstring | nullbrand.backgroundColorstring | nullbrand.textColorstring | nullbrand.accentColorstring | nullbrand.fontFamilystring | nullbrand.socialLinksobjectbrand.mapImageUrlstring | nullbrand.themeMode"neutral" | "brand" | "brand-full"brand.fontsobjectbrand.fonts.headlineobject | nullbrand.fonts.headline.familystringbrand.fonts.headline.urlstringbrand.fonts.headline.weightnumberbrand.fonts.bodyobject | nullbrand.fonts.body.familystringbrand.fonts.body.urlstringbrand.fonts.body.weightnumberschemaOrgobject | null- A ready-made schema.org `MusicEvent` block with the venue address, organiser and one Offer per ticket tier (fee-inclusive prices, sale windows, availability). Serialise it into a `<script type="application/ld+json">` tag instead of hand-building your own. Null on the app surface. Empty fields on the event are dropped from the block rather than published blank.
communityobjectcommunity.chatUrlstring | null- Invite link to the attendee group chat, when the organiser runs one.
community.chatPlatform"whatsapp" | "telegram" | "discord" | "signal" | … | null- Which platform the chat is on, so you can show the right icon.
community.chatLabelstring | null- Call-to-action text, e.g. "Summer Fest group chat".
organiserobject | null- Present only when the organiser has opted into a public profile — i.e. only when there is a page to link to.
organiser.iduuidorganiser.namestringorganiser.slugstringorganiser.logoUrlstring | null
Generated from EventDetailResponse
Errors
not_foundHTTP 404- No event with that slug is published on this surface. Check the slug, and check you sent `?surface=web`.