> ## Documentation Index
> Fetch the complete documentation index at: https://docs.gomry.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Catalog Event

> Retrieve one catalog event with its buyable ticket types and registration questions

# Get Catalog Event

Returns a single catalog event, resolved with everything needed to sell it.

<Note>
  Requires `catalog: read`. This is the **only** endpoint that populates `ticket_types` and `registration_questions` — both are `null` on the [list endpoint](/api-reference/catalog/list-catalog-events).
</Note>

Resolving ticket types costs one availability read per event, and for externally supplied inventory one upstream call per event. Doing that for a whole page would multiply the cost of a list by its size, for data a list view does not use. The intended pattern is: page the list, then read the detail for what you intend to sell.

## Path Parameters

<ParamField path="event_id" type="string" required>
  The event identifier, from `data[].id` on the list endpoint. Always a string.
</ParamField>

## Response

Every field from the [list response](/api-reference/catalog/list-catalog-events#response), plus the two resolved arrays below.

<ResponseField name="ticket_types" type="array">
  The buyable ticket types.

  <Expandable title="Ticket type object">
    <ResponseField name="id" type="string">
      **Pass this as `items[].id` when creating a checkout session.** This is the ticket type id, not the event id.
    </ResponseField>

    <ResponseField name="name" type="string">Tier name, e.g. "General Admission".</ResponseField>
    <ResponseField name="description" type="string | null">Tier description.</ResponseField>

    <ResponseField name="price" type="number | null">
      Price per ticket in major units. **`null` means unknown or variable, never free** — check `free` and `pricing`.
    </ResponseField>

    <ResponseField name="currency" type="string | null">ISO 4217 code.</ResponseField>
    <ResponseField name="free" type="boolean">The only statement that a ticket costs nothing.</ResponseField>

    <ResponseField name="pricing" type="string">
      `fixed` — `price` is the amount. `donation` — the buyer chooses any amount. `flexible` — the buyer chooses, at or above `minimum_price`.
    </ResponseField>

    <ResponseField name="minimum_price" type="number | null">Floor for `flexible` pricing; `null` otherwise.</ResponseField>

    <ResponseField name="fee" type="number | null">
      Buyer-paid service fee per ticket. `null` when the organizer absorbs fees — a real answer meaning the fee exists but the buyer is not charged it, and different from `0`.
    </ResponseField>

    <ResponseField name="available" type="boolean">
      Whether this type can be bought right now. Composed from stock, the sales window, and the tier's status.
    </ResponseField>

    <ResponseField name="min_per_order" type="integer">Smallest orderable quantity. Always at least 1.</ResponseField>
    <ResponseField name="max_per_order" type="integer | null">Largest quantity in one order, or `null` for no limit. A per-order cap, not per-person.</ResponseField>
    <ResponseField name="sales_start" type="object | null">When this tier goes on sale.</ResponseField>
    <ResponseField name="sales_end" type="object | null">When it stops.</ResponseField>

    <ResponseField name="requires_approval" type="boolean">
      When `true`, a completed checkout yields a **pending request, not admission**. Tell your buyer.
    </ResponseField>

    <ResponseField name="checkout_url" type="string">
      A link that opens Gomry checkout with this tier preselected. See [Buying without a payment token](#buying-without-a-payment-token).
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="registration_questions" type="array">
  Questions the organizer asks every attendee.

  <Expandable title="Question object">
    <ResponseField name="id" type="string">Echo back as `attendee_answers[].question_id`.</ResponseField>
    <ResponseField name="title" type="string">The question label.</ResponseField>
    <ResponseField name="subtitle" type="string | null">Helper text, when the organizer wrote one.</ResponseField>

    <ResponseField name="type" type="string">
      `text`, `email`, `phoneNumber`, `date`, `linkedin`, `organization` are free text. `dropdown` and `multipleChoice` are a closed list in `options`. `file` cannot be answered through this API.
    </ResponseField>

    <ResponseField name="options" type="array">Allowed values for `dropdown` and `multipleChoice`; empty otherwise.</ResponseField>
    <ResponseField name="required" type="boolean">The organizer's own flag, not a suggestion.</ResponseField>

    <ResponseField name="answerable" type="boolean">
      `false` for `file` questions — an upload has no representation in a JSON checkout body. Surfaced rather than hidden so you can tell the buyer the organizer will follow up.
    </ResponseField>
  </Expandable>
</ResponseField>

<Warning>
  **An empty array and `null` mean different things.** `[]` means we asked and there is nothing — no ticket types on sale, or no registration questions. `null` means not loaded on this endpoint. An agent that reads `[]` as "sold out" on a list response would skip every event in the catalog.
</Warning>

## Availability is a boolean, not a count

`available` is deliberately a boolean, and no remaining-stock number is published anywhere on this surface.

This feed crosses organizations. A remaining count sampled twice reconstructs both an organizer's inventory and their sell-through, and publishes it to every approved integrator — including their competitors. Your only question is "can I sell this right now", which the boolean answers.

## Buying without a payment token

Most agents cannot complete an [ACP checkout session](/api-reference/checkout-sessions/create-checkout-session). Completing one needs a delegated payment token, and minting a Stripe Shared Payment Token requires a browser-based Payment Element plus a registered agent account with Stripe — which a personal assistant, a CLI, or an MCP client structurally does not have.

`checkout_url` is the path for everyone else, and it is the pattern the industry settled on: **the agent does discovery and cart-building, then hands the buyer a link.** The card never leaves the browser.

```
GET /catalog/events            → find the event
GET /catalog/events/{id}       → pick a tier, read the questions
ticket_types[].checkout_url    → hand this to your user
```

The link opens Gomry's normal checkout with that tier preselected. It carries `utm_campaign=catalogApi`, so a sale that started in your agent is attributed to the catalog rather than to Gomry's own discovery.

It is always present — including on a tier that is sold out or not yet on sale, because the page is still worth linking and `available` already says whether it will sell.

<Note>
  Use ACP checkout when you are an agent **platform** that can hold a delegated payment token. Use `checkout_url` for everything else. They are complementary, not alternatives — nothing needs to be onboarded to use the link.
</Note>

## Why you must read the questions

Roughly 30% of events ask something at registration, and most of those mark at least one answer required. An agent that ignores them sells a ticket the organizer considers incomplete.

Collect the answers from your buyer and send them on `POST /checkout_sessions` as `attendee_answers`. A session with unanswered required questions stays `not_ready_for_payment` and reports them as blocking `messages[]`.

<RequestExample>
  ```bash cURL theme={null}
  curl -H "X-API-KEY: your_api_key" \
    "https://www.gomry.com/api/v1/catalog/events/AbCdEfGhIjKlMnOpQrSt"
  ```

  ```javascript JavaScript theme={null}
  const res = await fetch(
    `https://www.gomry.com/api/v1/catalog/events/${eventId}`,
    { headers: { "X-API-KEY": "your_api_key" } }
  );
  const event = await res.json();

  const sellable = event.ticket_types.filter((t) => t.available);
  const mustAsk = event.registration_questions.filter(
    (q) => q.required && q.answerable
  );
  ```

  ```python Python theme={null}
  import requests

  res = requests.get(
      f"https://www.gomry.com/api/v1/catalog/events/{event_id}",
      headers={"X-API-KEY": "your_api_key"},
  )
  event = res.json()
  sellable = [t for t in event["ticket_types"] if t["available"]]
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "id": "AbCdEfGhIjKlMnOpQrSt",
    "name": "Summer Tech Conference 2026",
    "description": "A two-day conference covering the latest in tech.",
    "url": "https://www.gomry.com/event/summer-tech-conference-2026-AbCdEfGhIjKlMnOpQrSt",
    "start": { "utc": "2026-07-15T14:00:00.000Z", "timezone": "America/New_York" },
    "end": { "utc": "2026-07-16T22:00:00.000Z", "timezone": "America/New_York" },
    "venue": {
      "name": "Convention Center",
      "address": "123 Main St",
      "city": "New York",
      "state": "NY",
      "country": "US",
      "latitude": 40.7128,
      "longitude": -74.006
    },
    "location_type": "physical",
    "cover_image": "https://storage.googleapis.com/...",
    "price": { "min": 79.0, "max": 249.0, "currency": "USD", "is_free": false },
    "availability": "on_sale",
    "sales_start": null,
    "categories": ["Technology"],
    "organization": { "id": "OrgAbCdEfGhIjKlMnOpQ", "name": "Tech Events Co" },
    "ticket_types": [
      {
        "id": "TktAbCdEfGhIjKlMnOpQ",
        "name": "General Admission",
        "description": "Access to all talks.",
        "price": 79.0,
        "currency": "USD",
        "free": false,
        "pricing": "fixed",
        "minimum_price": null,
        "fee": 4.95,
        "available": true,
        "min_per_order": 1,
        "max_per_order": 10,
        "sales_start": { "utc": "2026-04-01T00:00:00.000Z", "timezone": "America/New_York" },
        "sales_end": { "utc": "2026-07-15T14:00:00.000Z", "timezone": "America/New_York" },
        "requires_approval": false,
        "checkout_url": "https://www.gomry.com/event/summer-tech-conference-2026-AbCdEfGhIjKlMnOpQrSt/getTickets?utm_medium=web&utm_campaign=catalogApi&ticket_type=TktAbCdEfGhIjKlMnOpQ"
      }
    ],
    "registration_questions": [
      {
        "id": "QstAbCdEfGhIjKlMnOpQ",
        "title": "Dietary requirements",
        "subtitle": "Let us know if you have any.",
        "type": "dropdown",
        "options": ["None", "Vegetarian", "Vegan", "Gluten-free"],
        "required": true,
        "answerable": true
      }
    ]
  }
  ```
</ResponseExample>
