Use a pass on a booking
On a new bookingโ
Add pass_code to the line the pass is for on POST /bookings.
Every person (or rental unit) on that line comes to zero, one visit each. A pass with fewer
visits left covers what it can and the rest is charged. If the code does not work, the
booking is not created and the error names the reason.
{
"customer_id": 208,
"booking_type": "experience",
"status": "confirmed",
"start_date": "2026-07-15T10:00:00+00:00",
"end_date": "2026-07-15T10:00:00+00:00",
"experiences": [
{ "experience_id": 12, "schedule_id": 5531, "rate_category_id": 2, "quantity": 2, "pass_code": "PASS-7QKM-B4RT" }
]
}
The booking's pass_visits lists each pass on it:
"pass_visits": [
{ "id": 88, "code": "PASS-7QKM-B4RT", "pass_name": "Season pass", "line_type": "experience", "line_id": 9021, "amount": 80.0, "visits_used": 2, "status": "used" }
]
On a booking that existsโ
POST /v1/bookings/{id}/passes
Scope bookings:write. Use this at check-in.
| Field | Type | Required | Description |
|---|---|---|---|
code | string | yes | The pass code |
line_type | string | no | experience or product, with line_id |
line_id | integer | no | The line to use it on. Without it, the first line the pass covers |
{
"data": {
"visit_id": 88,
"amount": 80.0,
"visits_used": 2,
"message": "Season pass: 2 free. 7 visits left after this.",
"booking_total": 40.0,
"pass": { "id": 31, "code": "PASS-7QKM-B4RT", "visits_left": 7 }
}
}
A code that does not work returns 422 with error.code set to pass_ plus the
reason, for example pass_no_visits_left.
A program booking is priced as a whole, so a pass does not go on one: the call returns
pass_not_covered and the visit stays on the pass.
Take a pass offโ
DELETE /v1/bookings/{id}/passes/{visit_id}
Scope bookings:write. The line goes back to its full price and its visits go back on the
pass. Returns 204.