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

# Ticket types

# Ticket types

## Overview

Ticket types define purchasable or free tickets for **organizing** events. These endpoints are nested under `/event/{organizingEvent}` — the event must be one your company organizes.

**Subscription:** Pro plan required. Upgrade at [https://app.animo.co/admin/settings/billing](https://app.animo.co/admin/settings/billing).

## Public ticket page URL

Each ticket type has a public signup page on the Animo app. Construct the URL from slugs returned by the API:

```
https://app.animo.co/{company-slug}/event/{event-slug}/{ticket-type-slug}
```

| Segment              | API source                           |
| -------------------- | ------------------------------------ |
| `{company-slug}`     | `slug` from `GET /api/v1/companies`  |
| `{event-slug}`       | `id` from the event resource         |
| `{ticket-type-slug}` | `slug` from the ticket type resource |

Append `?qty={n}` to pre-select the ticket quantity (e.g. `?qty=1`).

**Example:**

```
https://app.animo.co/aidemodays/event/ai-demo-days-hr-edition/general-admission?qty=1
```

See [Conventions — Public URLs](../conventions.md#public-urls) for full details.

Unlike events, the `slug` you supply on ticket type **create** is honored and can be changed later via `PATCH`.

## Paid tickets and Mollie

Paid ticket types (`price` > 0) require a **connected Mollie account** on the company before the public ticket page works.

| State                | Public page behavior                                                                   |
| -------------------- | -------------------------------------------------------------------------------------- |
| Mollie connected     | Ticket signup page loads normally                                                      |
| Mollie not connected | Public page returns **404** — the ticket type exists in the API but is not purchasable |

Connect Mollie in the Animo admin before sharing paid ticket URLs. Free tickets (`price: 0`) are not affected.

## Endpoints

### List ticket types

* **Method:** `GET`
* **Path:** `/api/v1/{company}/event/{organizingEvent}/ticket-types`
* **Scope:** `ticket-types:read` (route group also requires `events:read`)
* **Subscription:** Pro plan (`USE_API`)

#### Path parameters

| Name              | Type   | Description           |
| ----------------- | ------ | --------------------- |
| `company`         | string | Company sqid          |
| `organizingEvent` | string | Organizing event slug |

#### Query parameters

| Name           | Type    | Description                                      |
| -------------- | ------- | ------------------------------------------------ |
| `include_form` | boolean | When present, embeds the related form and fields |

#### Response `200`

```json theme={null}
{
  "data": [
    {
      "slug": "general-admission",
      "name": "General Admission",
      "description": "Standard entry ticket",
      "price": "25.00",
      "currency": "EUR",
      "vat_percentage": "21",
      "availability": 100,
      "approval_required": false,
      "sold_out": false,
      "active": true,
      "hidden_from_shop": false,
      "form_id": "f2Kd8",
      "position": 0,
      "min_quantity": 1,
      "max_quantity": 5
    }
  ]
}
```

#### Response fields

| Field               | Type         | Description                            |
| ------------------- | ------------ | -------------------------------------- |
| `slug`              | string       | Ticket type slug (use in URLs)         |
| `name`              | string       | Display name                           |
| `description`       | string\|null | Description                            |
| `price`             | string       | Price as decimal string (`0` for free) |
| `currency`          | string       | Currency code                          |
| `vat_percentage`    | string       | VAT rate percentage                    |
| `availability`      | integer      | Max tickets (`-1` = unlimited)         |
| `approval_required` | boolean      | Requires organizer approval            |
| `sold_out`          | boolean      | Marked as sold out                     |
| `active`            | boolean      | Available for purchase                 |
| `hidden_from_shop`  | boolean      | Hidden from public shop                |
| `form_id`           | string\|null | Related form sqid                      |
| `form`              | object       | Present when `include_form` is set     |
| `position`          | integer      | Sort order                             |
| `min_quantity`      | integer      | Minimum per order                      |
| `max_quantity`      | integer      | Maximum per order                      |

***

### Create ticket type

* **Method:** `POST`
* **Path:** `/api/v1/{company}/event/{organizingEvent}/ticket-types/create`
* **Scope:** `ticket-types:create`
* **Subscription:** Pro plan (`USE_API`)

#### Request body

See the request body table below for field requirements.

```json theme={null}
{
  "name": "General Admission",
  "slug": "general-admission",
  "description": "Standard entry ticket",
  "form_id": "f2Kd8",
  "price": 25.00,
  "vat_percentage": 21,
  "availability": 100,
  "active": true,
  "hidden_from_shop": false,
  "approval_required": false,
  "sold_out": false,
  "position": 0,
  "min_quantity": 1,
  "max_quantity": 5
}
```

| Field               | Required | Description                                        |
| ------------------- | -------- | -------------------------------------------------- |
| `name`              | Yes      | Display name                                       |
| `price`             | Yes      | Numeric; `0` for free, minimum paid price enforced |
| `vat_percentage`    | Yes      | Must be a valid rate for the event's tax country   |
| `slug`              | No       | URL slug                                           |
| `description`       | No       | Text description                                   |
| `form_id`           | No       | Form sqid belonging to the company                 |
| `availability`      | No       | `0` or positive integer; `-1` for unlimited        |
| `active`            | No       | Boolean                                            |
| `hidden_from_shop`  | No       | Boolean                                            |
| `approval_required` | No       | Boolean                                            |
| `sold_out`          | No       | Boolean                                            |
| `position`          | No       | Sort order (>= 0)                                  |
| `min_quantity`      | No       | Min per order (>= 1)                               |
| `max_quantity`      | No       | Max per order (>= min\_quantity)                   |

#### Response `201`

Returns a single `TicketTypeResource`.

***

### Show ticket type

* **Method:** `GET`
* **Path:** `/api/v1/{company}/event/{organizingEvent}/ticket-types/{ticketType}`
* **Scope:** `ticket-types:read`
* **Subscription:** Pro plan (`USE_API`)

#### Query parameters

| Name           | Type    | Description            |
| -------------- | ------- | ---------------------- |
| `include_form` | boolean | Embeds form and fields |

#### Response `200`

Single `TicketTypeResource` in `data` envelope.

***

### Update ticket type

* **Method:** `PATCH`
* **Path:** `/api/v1/{company}/event/{organizingEvent}/ticket-types/{ticketType}`
* **Scope:** `ticket-types:update`
* **Subscription:** Pro plan (`USE_API`)

#### Request body

Same fields as create; all optional on update. See the request body table below for field requirements..

#### Response `200`

Returns the updated `TicketTypeResource`.

## Not implemented

* `DELETE /api/v1/{company}/event/{organizingEvent}/ticket-types/{ticketType}` — route is commented out

## Related

* [Authentication](../authentication.md)
* [Conventions](../conventions.md)
* [Events](events.md)
* [Orders](orders.md)
