> ## 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.

# Orders

# Orders

## Overview

Orders represent ticket registrations for organizing events. Use these endpoints to list orders, create orders on behalf of attendees, and approve or reject pending orders.

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

## Order fields vs attached form

`orders/create` has two layers of attendee data:

| Layer                     | Fields                                                             | Purpose                                         |
| ------------------------- | ------------------------------------------------------------------ | ----------------------------------------------- |
| **Order body**            | `first_name`, `last_name`, `email`, `country`, `is_business`, etc. | Core registration and billing — always required |
| **Form payload** (`form`) | Answers for fields on the ticket type's attached form              | Additional custom questions only                |

Do **not** duplicate `first_name`, `last_name`, or `email` as form fields — those come from the order body. The attached form is for extra questions (job title, dietary requirements, etc.).

## Paid orders and checkout

For paid ticket types, `orders/create` creates the order but does **not** charge the attendee. `OrderResource` does not currently include a payment URL field.

Send the attendee to the Mollie checkout page:

```
https://app.animo.co/{company-slug}/event/{event-slug}/o/{order-id}/checkout
```

| Lifecycle step                          | API signal          |
| --------------------------------------- | ------------------- |
| Order created                           | `paid_at` is `null` |
| Mollie payment succeeds (async webhook) | `paid_at` is set    |

Requires a connected Mollie account on the company — see [Ticket types — Paid tickets and Mollie](ticket-types.md#paid-tickets-and-mollie).

## Endpoints

### List orders

* **Method:** `GET`
* **Path:** `/api/v1/{company}/event/{organizingEvent}/orders`
* **Scope:** `orders: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_submission` | boolean | Embeds submission (with answers) and lead |
| `page`               | integer | Page number                               |

#### Response `200`

```json theme={null}
{
  "data": [
    {
      "id": "o7Xm3",
      "first_name": "Jordan",
      "last_name": "Lee",
      "email": "jordan@example.com",
      "unit_amount": 2500,
      "currency": "EUR",
      "vat_percentage": "21",
      "exemption_status": "none",
      "created_at": "2026-04-10T14:30:00.4040+00:00",
      "paid_at": "2026-04-10T14:31:00.011+00:00",
      "authorized_at": null,
      "approved_at": null,
      "rejected_at": null,
      "cancelled_at": null,
      "country": {
        "name": "Netherlands",
        "alpha2Code": "NL",
        "alpha3Code": "NLD"
      }
    }
  ],
  "links": { "...": "..." },
  "meta": { "...": "..." }
}
```

#### Response fields

| Field              | Type         | Description                         |
| ------------------ | ------------ | ----------------------------------- |
| `id`               | string       | Order sqid                          |
| `first_name`       | string       | Attendee first name                 |
| `last_name`        | string       | Attendee last name                  |
| `email`            | string       | Attendee email                      |
| `unit_amount`      | integer      | Total amount in minor units (cents) |
| `currency`         | string       | Currency code                       |
| `vat_percentage`   | string       | Applied VAT rate                    |
| `exemption_status` | string       | VAT exemption status                |
| `created_at`       | string       | Order creation timestamp            |
| `paid_at`          | string\|null | Payment timestamp                   |
| `authorized_at`    | string\|null | Authorization timestamp             |
| `approved_at`      | string\|null | Approval timestamp                  |
| `rejected_at`      | string\|null | Rejection timestamp                 |
| `cancelled_at`     | string\|null | Cancellation timestamp              |
| `submission`       | object       | Present with `include_submission`   |
| `lead`             | object       | Present with `include_submission`   |
| `country`          | object       | Buyer country                       |

***

### Show order

* **Method:** `GET`
* **Path:** `/api/v1/{company}/event/{organizingEvent}/orders/{order}`
* **Scope:** `orders:read`
* **Subscription:** Pro plan (`USE_API`)

#### Query parameters

| Name                 | Type    | Description                |
| -------------------- | ------- | -------------------------- |
| `include_submission` | boolean | Embeds submission and lead |

#### Response `200`

Single `OrderResource` in `data` envelope.

***

### Create order

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

Registers tickets on behalf of an attendee.

#### Path parameters

| Name         | Type   | Description      |
| ------------ | ------ | ---------------- |
| `ticketType` | string | Ticket type slug |

#### Request body

See the request body table below for field requirements.

```json theme={null}
{
  "first_name": "Jordan",
  "last_name": "Lee",
  "email": "jordan@example.com",
  "country": "NL",
  "company_name": "Acme BV",
  "vat_number": "NL123456789B01",
  "city": "Amsterdam",
  "address": "Keizersgracht 1",
  "post_code": "1015",
  "is_business": false,
  "quantity": 1
}
```

| Field          | Required | Description                                                     |
| -------------- | -------- | --------------------------------------------------------------- |
| `first_name`   | Yes      | Attendee first name                                             |
| `last_name`    | Yes      | Attendee last name                                              |
| `email`        | Yes      | Valid email address                                             |
| `country`      | Yes      | ISO 3166-1 alpha-2 country code                                 |
| `is_business`  | Yes      | Boolean                                                         |
| `quantity`     | Yes      | Integer within ticket type min/max and availability             |
| `company_name` | No       | Company name for business orders                                |
| `vat_number`   | No       | VAT number                                                      |
| `city`         | No       | City                                                            |
| `address`      | No       | Street address                                                  |
| `post_code`    | No       | Postal code                                                     |
| `form`         | No       | Additional form answers — **not fully implemented** (see below) |

#### Form answers (`form` field)

> **Not yet fully implemented.** The `form` array is accepted by validation but order creation does not yet persist form submissions server-side. Shape is expected to be field sqid → value:

```json theme={null}
{
  "form": {
    "ff1Ab": "Senior Engineer",
    "ff2Cd": "Vegetarian"
  }
}
```

Keys are form field sqids from the attached ticket type form. Do not include order-level fields (`first_name`, `last_name`, `email`) here.

#### Response `200`

Returns the created `OrderResource`. For paid tickets, redirect the attendee to the [checkout URL](#paid-orders-and-checkout). `paid_at` remains `null` until payment completes.

***

### Approve order

* **Method:** `PATCH`
* **Path:** `/api/v1/{company}/event/{organizingEvent}/orders/{order}/approve`
* **Scope:** `orders:curate`
* **Subscription:** Pro plan (`USE_API`)

Approves a pending order that requires curator approval.

#### Response `200`

Returns the updated `OrderResource` with `approved_at` set.

***

### Reject order

* **Method:** `PATCH`
* **Path:** `/api/v1/{company}/event/{organizingEvent}/orders/{order}/reject`
* **Scope:** `orders:curate`
* **Subscription:** Pro plan (`USE_API`)

Rejects a pending order.

#### Response `200`

Returns the updated `OrderResource` with `rejected_at` set.

## Not implemented

* `DELETE /api/v1/{company}/event/{organizingEvent}/orders/{order}/cancel` — route is commented out

## Related

* [Authentication](../authentication.md)
* [Conventions](../conventions.md)
* [Ticket types](ticket-types.md)
