Departure Fill Report
How full each experience departure was, or is, over a date range: people (or groups) booked against capacity, with totals per experience, per start time and per guide.
Endpoint
GET /v1/reports/departure-fill
Authentication
Requires an API key with the reports:read scope.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
period | string | - | today, yesterday, this_week, last_week, next_week, this_weekend, next_weekend, this_month, last_month or next_month, in the business's timezone. last_month is the previous calendar month. this_weekend is the coming Saturday and Sunday, or the current one on a Saturday. |
start_date | string | today | Start date YYYY-MM-DD. Ignored when period is set. |
end_date | string | 7 days after start_date | End date YYYY-MM-DD. A range covers at most 93 days. |
experience_id | integer | - | One experience only. |
product_id | integer | - | One shared item (a boat, a vehicle, a room): every departure of every experience that runs on it, with ends on each departure, plus an item block naming it, its experience_ids, and booked_on_its_own (bookings of the item outside any departure). 404 when no experience runs on it. |
fill_below_percent | integer | - | Only departures booked under this percent of capacity, e.g. 50 for under half full. |
sort | string | date | Order of departures: date, emptiest or fullest. Defaults to emptiest when fill_below_percent is set. |
limit | integer | 20 | How many departures to list (max 50). summary, by_experience and by_guide always cover the whole range. |
Response
Success (200 OK)
{
"data": {
"start_date": "2026-09-01",
"end_date": "2026-09-30",
"truncated_range": false,
"summary": {
"departures": 90,
"already_ran": 90,
"still_to_run": 0,
"ran_with_no_bookings": 41,
"people_booked": 111,
"people_capacity": 1560,
"fill_percent": 7,
"fill_below_percent": 50,
"matching": 88
},
"by_experience": [
{
"experience": "Full-Day Outing",
"departures": 30,
"booked": 38,
"capacity": 480,
"counts": "people",
"fill_percent": 8,
"matching": 30
}
],
"by_guide": [
{
"staff_id": 66,
"guide": "Sam Rivers",
"departures_led": 11,
"departures_with_people_booked": 6,
"people_booked": 43,
"people_booked_already_ran": 31
}
],
"sort": "emptiest",
"departures": [
{
"schedule_id": 1234,
"experience": "Full-Day Outing",
"experience_id": 12,
"date": "Sep 5, 2026",
"time": "6:00 AM",
"booked": 0,
"capacity": 16,
"counts": "people",
"fill_percent": 0,
"status": "already ran"
}
]
}
}
Reading the numbers
bookedis who actually booked.countssays whether it ispeopleorgroups(a private experience is sold by the group). People and groups are never added together:summaryreports them separately (groups_booked,groups_capacity,groups_fill_percent).capacityis"no limit"when the departure has none, andfill_percentis thennull.fill_percentis booked against capacity in the unit the departure sells, from 0 to 100: a private departure of one group with 12 people on it is100, never1200. An overbooked departure reads100, and the totals count it as full rather than as extra places.- A departure that has started reads
"status": "already ran".summary.ran_with_no_bookingscounts those nobody booked;upcoming_with_no_bookings_yetcounts the ones still to run with nobody booked so far. - An upcoming departure carries
open_spots.statusisopen,full(booked up to capacity), ornot selling, withnot_selling_becausenaming why empty places cannot be sold (no guide free, the equipment or shared places in use, a closure, places held in carts). Anot sellingdeparture is not full. - A departure that needs a guide carries
led_by: the names of who leads it, or"nobody yet". When people are booked and nobody leads it, the row also has"booked_with_nobody_leading": true. booked_with_nobody_leadingat the top lists every booked departure still to run in the range with nobody leading it, as"October 11th 2026 9:00 AM Whale-Watching Cruise (5 booked)", even when it is pastlimit.- When no guide is free,
not_selling_becausenames who is busy and where, for example"No guide free - Marcus is on the 9:00 AM Whale-Watching Cruise, Lena is off". by_guidelists every guide on a departure in the range, most people first.people_bookedcounts the people booked on that guide's departures the same way the run sheet does, leaving out cancelled bookings.people_booked_already_rancounts only departures that have started. A departure with two guides counts its people for each guide, so the guides' figures can add up to more thansummary.people_booked. Departures with nobody booked count towarddepartures_ledonly.by_experiencelists the emptiest experience first, withby_start_timewhen an experience runs at more than one time.summary.fullest_experiencenames the activity with the highest aggregatefill_percentover the whole range, withbooked,capacityandcounts(people or groups). It also includesfullest_start_timewhen the activity has several start times. It is omitted when no activity has a capacity to compare; ties use the first activity inby_experience. This fact remains available when an AI response shortens the detailed lists.
Errors
| Status | When |
|---|---|
| 404 | experience_id is not one of this business's experiences, or product_id is not an item any of its experiences runs on. |
| 422 | A parameter is not one of the values above. |