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 FAQs

GET/v1/events/{slug}/faq

The event's FAQs, in the organiser's own categories and order.

Answers arrive as pre-rendered, sanitised HTML in answerHtml, so you can inject them directly without running a rich-text renderer of your own.

On the web surface the response carries an FAQPage JSON-LD block.

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/faq?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

200 OK
{
  "apiVersion": 1,
  "data": {
    "eventId": "6f1c8e2a-4b3d-4c9e-9f21-8a7d5e0b1c34",
    "surface": "web",
    "categories": [
      {
        "id": "getting-there",
        "name": "Getting there",
        "faqs": [
          {
            "id": "72e4c6a8-3d5f-4b90-9a1c-6e8d0f2b4a37",
            "question": "Is there parking on site?",
            "answerDoc": {
              "type": "doc",
              "content": [
                {
                  "type": "paragraph",
                  "content": [
                    {
                      "type": "text",
                      "text": "Yes, but it must be booked in advance through the "
                    },
                    {
                      "type": "text",
                      "text": "ticket store",
                      "marks": [
                        {
                          "type": "link",
                          "attrs": {
                            "href": "https://grfm.to/e/summer-fest"
                          }
                        }
                      ]
                    },
                    {
                      "type": "text",
                      "text": ". Gates open at 10:00 each day."
                    }
                  ]
                }
              ]
            },
            "answerPlain": "Yes, but it must be booked in advance through the ticket store. Gates open at 10:00 each day.",
            "answerHtml": "<p>Yes, but it must be booked in advance through the <a href=\"https://grfm.to/e/summer-fest\">ticket store</a>. Gates open at 10:00 each day.</p>",
            "updatedAt": "2026-05-14T16:02:00.000Z"
          }
        ]
      },
      {
        "id": null,
        "name": "On the day",
        "faqs": [
          {
            "id": "e8a0c2d4-7f9b-4d51-8c3e-9b7f5d1a3c48",
            "question": "Can I bring my own drinks?",
            "answerDoc": {
              "type": "doc",
              "content": [
                {
                  "type": "paragraph",
                  "content": [
                    {
                      "type": "text",
                      "text": "Sealed water only, up to 500ml. Everything else is available on site."
                    }
                  ]
                }
              ]
            },
            "answerPlain": "Sealed water only, up to 500ml. Everything else is available on site.",
            "answerHtml": "<p>Sealed water only, up to 500ml. Everything else is available on site.</p>",
            "updatedAt": "2026-05-14T16:04:00.000Z"
          }
        ]
      }
    ],
    "schemaOrg": {
      "@context": "https://schema.org",
      "@type": "FAQPage",
      "mainEntity": [
        {
          "@type": "Question",
          "name": "Is there parking on site?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Yes, but it must be booked in advance through the ticket store."
          }
        }
      ]
    },
    "lastUpdatedAt": "2026-05-14T16:04:00.000Z",
    "generatedAt": "2026-06-01T09:15:00.000Z"
  }
}
groups[]arraymay be absent
FAQ categories, in the organiser's order.
groups[].namestringmay be absent
Category heading, e.g. "Getting there".
groups[].items[]arraymay be absent
The questions in that category.
groups[].items[].questionstringmay be absent
The question text.
groups[].items[].answerHtmlstringmay be absent
Sanitised HTML — safe to inject directly.
Generated from EventFaqsResponse

Structured data

The response carries a ready-made FAQPage JSON-LD block in schemaOrg. Emitted on the web surface. 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.