Grofomo API
Browse the docs

Examples use a fictional festival, summer-fest. Sign in at events.grofomo.com and they switch to your own events.

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"
    }
  }
}
iduuid
slugstring
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.
namestring
descriptionstring | 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 | null
familyFriendlyboolean | null
musicGenresstring[]
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.
datesobject
dates.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 | null
venueobject
venue.namestring | null
venue.addressstring | null
Street address, without city or postcode.
venue.citystring | null
venue.regionstring | null
State, province or county.
venue.postcodestring | null
venue.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[].namestring
stages[].typestring | null
Free text, e.g. "tent".
stages[].descriptionstring | null
stages[].imageUrlstring | null
brandobject
The organiser's colours, logos and fonts, so your site can match the event's identity.
brand.brandColorsstring[]
brand.logoUrlstring | null
brand.logoVectorUrlstring | null
brand.artworkUrlstring | null
brand.coverArtUrlstring | null
brand.backgroundColorstring | null
brand.textColorstring | null
brand.accentColorstring | null
brand.fontFamilystring | null
brand.socialLinksobject
brand.mapImageUrlstring | null
brand.themeMode"neutral" | "brand" | "brand-full"
brand.fontsobject
brand.fonts.headlineobject | null
brand.fonts.headline.familystring
brand.fonts.headline.urlstring
brand.fonts.headline.weightnumber
brand.fonts.bodyobject | null
brand.fonts.body.familystring
brand.fonts.body.urlstring
brand.fonts.body.weightnumber
schemaOrgobject | 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.
communityobject
community.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.iduuid
organiser.namestring
organiser.slugstring
organiser.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`.