Skip to main content

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.

FieldTypeRequiredDescription
codestringyesThe pass code
line_typestringnoexperience or product, with line_id
line_idintegernoThe 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.