# Manifest

### GET /api/v1/manifest

Departures and passengers for one day.

Every departure the key's operators (or the one in `partner_id`) run on a day, with passengers from every channel, their check-in state and their `partner`. Operators sharing one booking system account show each booking once. Read from your booking system's mirror, which refreshes every two hours for near-term departures.

Scope: `manifest:read`.

Query parameters:

- `date` (string, YYYY-MM-DD): Departure day (YYYY-MM-DD), local time.
- `partner_id` (string, optional): Only this operator: one of the key's operators (see GET /api/v1/me). Any other id answers 404. Omit for every operator on the key.

Response fields (200):

- `date` (string, YYYY-MM-DD)
- `timezone` (string): IANA timezone, e.g. Europe/Oslo.
- `synced_at` (string, ISO 8601 date-time, nullable): When the booking-system mirror last refreshed this day.
- `totals` (object)
  - `departures` (integer)
  - `bookings` (integer)
  - `passengers` (integer)
  - `checked_in` (integer)
  - `no_show` (integer)
- `departures` (array)
  - each item:
    - `start_time` (string, nullable): Local wall-clock time (HH:MM) in `timezone`.
    - `timezone` (string): IANA timezone, e.g. Europe/Oslo.
    - `product_title` (string, nullable)
    - `rate_title` (string, nullable)
    - `passengers` (integer)
    - `checked_in` (integer)
    - `no_show` (integer)
    - `bookings` (array)
      - each item:
        - `id` (string): Manifest row id (stable for this booking line).
        - `reference` (string, nullable)
        - `confirmation_code` (string, nullable)
        - `status` (string)
        - `partner` (object): The operator a row belongs to: one of the key's operators (the tour's operator for a booking).
        - `channel` (object)
        - `participants` (integer)
        - `pax_breakdown` (array, nullable)
        - `guest` (object)
        - `pickup` (object, nullable)
        - `payment_status` (string, nullable)
        - `check_in` (object)
- `cancelled` (array)
  - each item:
    - `id` (string): Manifest row id (stable for this booking line).
    - `reference` (string, nullable)
    - `confirmation_code` (string, nullable)
    - `status` (string)
    - `partner` (object): The operator a row belongs to: one of the key's operators (the tour's operator for a booking).
      - `id` (string)
      - `name` (string)
    - `channel` (object)
      - `class` (string, nullable)
      - `source` (string, nullable)
      - `title` (string, nullable)
    - `participants` (integer)
    - `pax_breakdown` (array, nullable)
      - each item:
        - `title` (string)
        - `quantity` (integer)
    - `guest` (object)
      - `name` (string, nullable)
      - `email` (string, nullable, optional): Only with the guests.contact:read scope.
      - `phone` (string, nullable, optional): Only with the guests.contact:read scope.
    - `pickup` (object, nullable)
      - `place` (string, nullable)
      - `time` (string, nullable)
    - `payment_status` (string, nullable)
    - `check_in` (object)
      - `status` (one of `checked_in`, `no_show`, nullable)
      - `present` (integer, nullable)

Example: One departure

```sh
curl "https://www.panion.travel/api/v1/manifest?date=2026-11-14" \
  -H "Authorization: Bearer $PANION_API_KEY"
```

```json
{
  "date": "2026-11-14",
  "timezone": "Europe/Oslo",
  "synced_at": "2026-11-14T10:00:00Z",
  "totals": {
    "departures": 1,
    "bookings": 1,
    "passengers": 2,
    "checked_in": 0,
    "no_show": 0
  },
  "departures": [
    {
      "start_time": "19:00",
      "timezone": "Europe/Oslo",
      "product_title": "Northern Lights Chase",
      "rate_title": "Standard",
      "passengers": 2,
      "checked_in": 0,
      "no_show": 0,
      "bookings": [
        {
          "id": "5c4b3a29-1807-4f6e-9d5c-4b3a29180716",
          "reference": "ARC-123456",
          "confirmation_code": "PNN-7K2Q9X",
          "status": "CONFIRMED",
          "partner": {
            "id": "2b7e1516-28ae-4d2a-9f15-88094f3c4f3c",
            "name": "Arctic Tours"
          },
          "channel": {
            "class": "panion",
            "source": "Panion",
            "title": "Panion"
          },
          "participants": 2,
          "pax_breakdown": [
            {
              "title": "Adult",
              "quantity": 2
            }
          ],
          "guest": {
            "name": "Ingrid Hansen"
          },
          "pickup": {
            "place": "Radisson Blu Hotel",
            "time": "18:45"
          },
          "payment_status": "PAID",
          "check_in": {
            "status": null,
            "present": null
          }
        }
      ]
    }
  ],
  "cancelled": []
}
```

Responses:

- 200: OK
- 400: Invalid request
- 401: Missing, invalid, expired or revoked key
- 403: The key lacks the scope
- 429: Rate limited (300 requests per minute per key)
