# Disney

Walt Disney World and Disneyland Resort tickets. You read the catalog by brand, ask for the price of one product by date, book with the passenger list, and download the voucher.

This guide explains the flow. Field-by-field detail is in the [Disney reference](/developers/reference/v1/disney).

| Step | Endpoint | Gives you |
|---|---|---|
| 1 | `POST /api/v1/disney/getTickets` | Products, each with a `product_id` |
| 2 | `POST /api/v1/disney/getTicketPrice` | The price of one product for each date |
| 3 | `POST /api/v1/disney/ticketConfirm` | `id_order` and the voucher link |
| 4 | `GET /api/v1/disney/pdf` | The voucher PDF again, at any time |
| 5 | `POST /api/v1/disney/ticketCancelation` | Cancels the order |

All calls need your Bearer credential in the `Authorization` header. The Disney API does not accept `id_company`. Without the header you get `401`. See [Authentication](/developers/guides/authentication).

## 1. List the catalog

```bash
curl -X POST "https://highstartravel.com/api/v1/disney/getTickets" \
  -H "Authorization: Bearer YOUR_CREDENTIAL" \
  -H "Content-Type: application/json" \
  -d '{ "brand": "WDW", "product_type": "ThemePark" }'
```

- `brand` is `WDW` (the default) or `DLR`. Product codes belong to one brand. A code from `DLR` does not exist in `WDW`. A brand with no catalog returns `[]`.
- `product_type` is optional: `ThemePark` or `SpecialEvent`. Without it you get both.

The response is a JSON array with one object per product code, with no prices:

```json
[
  {
    "product_id": "T0001907",
    "age_type": "adult",
    "family": "4-Day Theme Park Base Ticket",
    "name": "4-Day Theme Park Base Ticket - Adult",
    "product_type": "ThemePark",
    "brand": "WDW",
    "days": 4,
    "usage_buffer_days": 3,
    "description": "Admission to one theme park per day, for each day of the ticket.",
    "parks": ["Magic Kingdom Park", "EPCOT"],
    "policy": "Receive admission to one Theme Park per day, for each day of ticket.",
    "currency": "USD",
    "valid_from": "2026-09-22",
    "valid_to": "2027-08-31"
  },
  {
    "product_id": "T0001908",
    "age_type": "child",
    "family": "4-Day Theme Park Base Ticket",
    "name": "4-Day Theme Park Base Ticket - Child",
    "product_type": "ThemePark",
    "brand": "WDW",
    "days": 4,
    "usage_buffer_days": 3,
    "currency": "USD",
    "valid_from": "2026-09-22",
    "valid_to": "2027-08-31"
  }
]
```

The values here are examples. Read the real ones from the catalog.

- The adult and the child ticket of the same product are two entries. They share `family`. The `age_type` says which is which.
- A `family` with no `child` entry has no child fare. It can only be booked for adults.
- `days` is the number of park days. `usage_buffer_days` adds extra days to the window. A 4-day ticket with a buffer of 3 can be used over 7 calendar days, counted from the first visit.
- `ThemePark` products have `valid_from` and `valid_to`, the period in which they are sold. `valid_to` can be `null`.
- `SpecialEvent` products have `event_date` and are sold only for that day.
- Ages: adult is 10 and older, child is 3 to 9. Children under 3 do not need a ticket.

## 2. Read the price by date

Ask for one product at a time. To price an adult and a child, make two calls.

```bash
curl -X POST "https://highstartravel.com/api/v1/disney/getTicketPrice" \
  -H "Authorization: Bearer YOUR_CREDENTIAL" \
  -H "Content-Type: application/json" \
  -d '{
    "product_id": "T0001908",
    "from_date": "2026-10-01",
    "to_date": "2026-10-05"
  }'
```

```json
{
  "success": true,
  "product_id": "T0001908",
  "age_type": "child",
  "results": [
    { "date": "2026-10-01", "price": 622.60, "currency": "USD" },
    { "date": "2026-10-03", "price": 641.30, "currency": "USD" }
  ],
  "request_id": "3f8a9b7c1d2e4f5a6b7c8d9e0f1a2b3c"
}
```

- Disney has a price for each day of the visit.
- `price` is per ticket, with your pricing applied.
- The range can be up to 366 days. Past dates are ignored.
- `results` has only the days on which the product can be sold. It is empty if there are none in the range.
- The price has no guaranteed lifetime. The confirmation checks it again.

## 3. Book

```bash
curl -X POST "https://highstartravel.com/api/v1/disney/ticketConfirm" \
  -H "Authorization: Bearer YOUR_CREDENTIAL" \
  -H "Content-Type: application/json" \
  -d '{
    "product_id_adult": "T0001907",
    "product_id_child": "T0001908",
    "adults": 2,
    "children": 1,
    "date": "2026-10-15",
    "total_amount": 1903.08,
    "external_reference": "MY-ORDER-9999",
    "pax": [
      { "name": "John", "surname": "Doe", "type": "adult", "birthdate": "1985-06-15", "nationality": "AR", "phone": "+5491144445555" },
      { "name": "Jane", "surname": "Doe", "type": "adult", "birthdate": "1987-09-22", "nationality": "AR" },
      { "name": "Kid", "surname": "Doe", "type": "child", "birthdate": "2018-04-10", "nationality": "AR" }
    ]
  }'
```

| Field | Rule |
|---|---|
| `product_id_adult` | Required when `adults` is above 0. The adult code. |
| `product_id_child` | Required when `children` is above 0. The child code. Both codes must belong to the same `family`. |
| `adults`, `children` | Integers from 0 to 50. Together they must be at least 1 and at most 40. |
| `date` | The first day of the visit, `YYYY-MM-DD`, not in the past. For a special event it is the `event_date`. |
| `total_amount` | The total you expect. See below. |
| `brand` | Optional, `WDW` or `DLR`. The default is `WDW`. |
| `pax` | One object per passenger. The count must be exactly `adults + children`. |
| `external_reference` | Your reference. Always send it. See [Conventions](/developers/guides/conventions#idempotency). |

### Passengers

Disney issues each ticket in the name of a person and checks the age, so every passenger needs:

| Field | Rule |
|---|---|
| `name`, `surname` | Required. |
| `type` | Required. `adult` or `child`. The number of each must match `adults` and `children`. |
| `birthdate` | Required, `YYYY-MM-DD`. The age on the visit date must fit the `type`: adult 10 or older, child 3 to 9. If not, you get `400 Age mismatch`. |
| `nationality` | Required. An ISO 3166-1 alpha-2 code such as `AR`. The alpha-3 code or the country name is converted. An unknown country returns `400`. |
| `phone` | Optional. Include the country prefix. If you send it, it travels with the booking. |

Do not send an email for the passengers. It is not used. The booking notices go to Highstar Travel, and you get the voucher from `pdf_voucher`.

### Total amount

The API checks live availability and price before it books, then compares the result with your `total_amount`. If it differs by 0.01 or more you get `400 Price changed.`, and the `message` has the current total. If there is no availability you get `400 No availability for the selected date.`. Both come before anything is created.

```text
total_amount = adults × adult price on that date + children × child price on that date
```

Take each price from `getTicketPrice` right before you confirm.

### Other checks

- A ticket with no child fare does not accept children: `400 No child fare`.
- A special event can only be booked for its `event_date`, and a theme park ticket only within its validity: `400 Date not available`.
- A booking can hold at most 40 tickets: `400 Too many tickets`. Split the purchase.

### The response

```json
{
  "success": true,
  "code": 200,
  "id_order": 168001,
  "pdf_voucher": "https://highstartravel.com/api/v1/disney/pdf?order_id=168001",
  "request_id": "3f8a9b7c1d2e4f5a6b7c8d9e0f1a2b3c"
}
```

- Keep `id_order`. You need it to cancel and to download the voucher.
- `pdf_voucher` is the `GET /disney/pdf` endpoint and needs your Bearer credential. It is not a public link.
- For Walt Disney World the voucher is for pickup at the park with an ID (will call). For Disneyland Resort the tickets are e-tickets.
- If the supplier does not confirm the booking, you get `400` with `Error generating the order with provider. Please try again.`. The order is voided on our side and you can repeat it.

### If the request times out

Repeat the request with the same `external_reference`. You get the same order with `"idempotent_replay": true`, or `409 ORDER_CONFIRMATION_IN_PROGRESS` if the first one is still running. Do not use a new reference. See [Conventions](/developers/guides/conventions#idempotency).

## 4. Download the voucher

```bash
curl "https://highstartravel.com/api/v1/disney/pdf?order_id=168001" \
  -H "Authorization: Bearer YOUR_CREDENTIAL" \
  -o voucher.pdf
```

| Status | `error` | Meaning |
|---|---|---|
| 404 | `ORDER_NOT_FOUND` | The order does not exist or is not yours. The answer is the same in both cases. |
| 409 | `VOUCHER_NOT_GENERATED` | The voucher is not published yet. Try again in a few minutes. |
| 410 | `ORDER_CANCELLED` | The order was cancelled. The voucher is not valid. |

## 5. Cancel

```bash
curl -X POST "https://highstartravel.com/api/v1/disney/ticketCancelation" \
  -H "Authorization: Bearer YOUR_CREDENTIAL" \
  -H "Content-Type: application/json" \
  -d '{ "id_order": 168001 }'
```

A successful cancellation returns `{"success": true}` and cancels every ticket of the order.

Cancelling again an order of yours that is already fully cancelled is safe. You get `200` with `{"success": true, "already_cancelled": true}`.

The tickets of an order are cancelled one by one, and each one is marked cancelled as soon as the supplier confirms it. If one of them cannot be cancelled, the ones already cancelled stay cancelled, and the answer is `400 Can't cancel order`. Repeat the call: it only tries the tickets that are still active. If it keeps failing, contact support with your `request_id`.

| Status | `error` or `message` | Meaning |
|---|---|---|
| 400 | `Can't cancel this ticket.` | The order is not yours or does not exist. This answer has only a `message` field. |
| 400 | `Ticket not found.` | The order has no Disney ticket that can be cancelled. |
| 400 | `Can't cancel order` | The supplier refused, or only some tickets were cancelled. |
| 503 | `Cancellation unavailable` | The cancellation service is not available. Retry later. |

## Errors to handle

| Status | `error` | Action |
|---|---|---|
| 400 | `Price changed.` | Ask for the prices again and confirm with the new total. |
| 400 | `No availability for the selected date.` | Choose another date or product. |
| 400 | `Age mismatch` | Check `birthdate` and `type` against the visit date. |
| 400 | `Ticket not found.` | The codes do not match a product for sale, or they are not from the same `family`. |
| 400 | `Date not available` | The product is not sold on that date. |
| 400 | `Too many tickets` | Split the booking into parts of up to 40 tickets. |
| 401 | `Authentication required` | Send the credential as `Authorization: Bearer`. |
| 502 | `External API error` | A supplier did not answer. Retry with backoff. |
| 503 | `Pricing unavailable` | Pricing for this product is not available for your account. Contact support with the `request_id`. |
| 503 | `Provider unavailable` | Selling Disney is paused. Nothing was created. Retry later. |

## What not to do

- Do not book with an adult code and a child code from different families.
- Do not omit `birthdate` or `nationality` for any passenger.
- Do not reuse a price from an earlier query. Prices depend on the visit date and are checked again at confirmation.
- Do not retry a timed-out confirmation with a new `external_reference`.

## Next

- [Disney reference](/developers/reference/v1/disney) has every field and response.
- [Sandbox](/developers/guides/sandbox) explains how to test a booking.
