bookings:* scopes. It is available at Maple-native locations only; a provider-managed location answers 422 capability_unsupported.
Maple sends every guest text. Notifying a party sends Maple’s table-ready SMS and starts the venue’s response window. You never message waitlist guests yourself.
A guest-facing app usually needs
bookings:read and bookings:write. A host-stand or POS app also needs bookings:manage.
Set MAPLE_BASE and MAPLE_KEY as in Take bookings.
1. Read the queue
waitlist lists active entries first in line first, and open says whether remote parties may join. Each waitlist_entry carries its position, the quoted_wait it was given, and the guest’s contact details.
To quote a wait before a party joins:
parties_ahead counts the parties that compete for the same tables, and wait_minutes gives a min–max range. Parties above 50 answer 422 party_size_out_of_bounds.
2. Add a party
Remote parties can only join an open waitlist. A venue opens it withPOST /v1/locations/{locationId}/waitlist/open (bookings:manage).
phoneis required: it is the only way Maple can tell the guest their table is ready. Maple stores it normalized to E.164 (US numbers may omit+1). A number Maple cannot text, such as one with an extension, answers400.- A closed waitlist answers
409 waitlist_closed. idempotency_keyworks like booking writes: retry a lost response with the same key and body to get the same entry back, even if the waitlist has closed since. The key is scoped to your app across all its locations: the same key with a different body, or sent to another location, answers409 idempotency_key_reused. See Idempotency.
3. Notify and seat
When a table is about to free up, notify the party:notified. If the guest does not respond within the venue’s response window, it expires as expired_no_response. Notifying an entry that is no longer waiting returns it unchanged. A location where Maple is not texting guests answers 422 guest_messaging_unavailable: guest texts aren’t rolled out there yet, or the venue turned them off. Seat or remove the party instead.
When the party arrives, seat it:
seated with a booking_id. That walk-in booking (channel: walk_in) reads with GET /v1/bookings/{bookingId} and appears in booking lists like any other booking.
- No table free now answers
409 slot_unavailable; notify or wait, then try again. - An entry that already left the queue answers
409 illegal_transition.
4. Take a party out of line
Both return the entry. An entry that already left the queue, whether seated, removed, or expired, is returned unchanged.
POST /v1/locations/{locationId}/waitlist/close stops remote parties from joining. Parties already waiting stay in line.
Entry statuses
position is set while an entry is active (waiting, notified, on_my_way) and null afterwards.
Staying current
Subscribe to the waitlist events (waitlist_entry.created, .notified, .seated, .removed, .expired) to learn about changes the venue or other apps make. Each event embeds the entry’s latest state. To reconcile after a gap, read GET /v1/locations/{locationId}/waitlist; avoid polling it more often than every 15 seconds. Waitlist calls share the bookings budget of 300 requests per minute per app and environment; see Rate limits.