Experiences
- Availability lists experiences (prix fixe, tastings, ticketed seatings) where the location offers them, alongside standard slots in start order. Each
booking_slothas anexperience(id,name,description,prepayment_required),nullfor a standard reservation.experience_idnarrows a search to one experience. Offered at OpenTable locations;booking_profile.capabilities.experiencessays whether a location offers them. - An experience slot books through the usual hold and booking flow, and the
Bookingresource (and its webhook payloads) carriesexperience(id,name),nullfor a standard reservation. A change keeps the experience: a slot for a different experience, or between an experience and a standard table, answers422 capability_unsupported. - Holding a slot whose experience asks for payment up front answers
422 payment_instrument_required: Maple can’t take payment yet. See Experiences.
Seated reservations at OpenTable locations
- At OpenTable-managed locations, changing or cancelling a reservation the party is already seated at, or one that is over, now answers
409 not_changeableor409 not_cancellable(reasonin_serviceorterminal_state) before Maple calls OpenTable, as it already did at Maple-native locations.
Venues control guest texts
- Restaurant managers can now turn Maple’s guest texts off for their location. Where they have,
POST /v1/waitlist_entries/{entryId}/notifyanswers422 guest_messaging_unavailable, as it already did where guest texts aren’t rolled out. Seat or remove the party instead. See Run the waitlist. - Managers can also turn Maple bookings on themselves once a configuration is published, so
booking_profile.enabledcan change without Maple’s involvement. Keep checking it before offering availability.
Configuration revisions
- The booking configuration carries a
revision. Publish withexpected_revisionto get409 stale_configurationinstead of overwriting a configuration a restaurant manager edited in the Maple dashboard since your read;nullexpects no configuration yet. Publishing without it still replaces the configuration unconditionally. See Publish without overwriting the venue.
Every seating area is bookable
- Maple-native availability now seats parties in every configured area, not only the first: it tries the first area, then the others in
poolIdorder, and books the first with a free table or combination that fits. A party only another area can seat (a large table on the patio) is now offered. Party-size bounds span all areas. See Publication rules.
Find bookings by phone or confirmation code
GET /v1/bookingstakesphoneandconfirmation_codeto find the booking a guest is asking about. Both requirelocation_id; the phone is normalized first. Without a window a lookup matches bookings at any time, at native and provider-managed locations alike. A lookup withoutlocation_idanswers400 location_required. See Find a guest’s booking.
Booking blackout dates
GET /v1/locations/{locationId}/booking_profilereturns the location’sblackout_dates: windows when it takes no reservations.PUT /v1/locations/{locationId}/booking_blackoutsreplaces the list underbookings:configure, at native and provider-managed locations. Send the profile’sblackout_dates_revisionasexpected_revisionto get409 stale_blackout_datesinstead of overwriting the venue’s newer edits. Invalid ranges answer400 invalid_blackout_dates. See Blackout dates.
Validation errors and the feedback hint
- A request whose path parameters, query, headers or body fail validation now answers
400with aDeveloperApiBadRequestbody (code: "invalid_request") naming the field, where it used to answer with an empty body. - Every error body carries a
feedbackline pointing toPOST /v1/feedback. See Errors.
Feedback
POST /v1/feedbackreports a bug, a missing capability, wrong docs, or an unclear error, citing the ids of the requests involved. Onlykindandsummaryare required. An id Maple cannot match to your recent requests is kept as sent rather than refused. Any credential may send it; no scope is required. Its contract will not break: fields may be added, never removed or made required. See Feedback.
Walk-ins and venue-side cancellation
POST /v1/locations/{locationId}/walk_insseats an arriving party at the earliest table that fits now and returns the seated booking, retry-safe under an app-scopedidempotency_key. See Seat a walk-in.POST /v1/bookings/{id}/venue_cancelcancels on the venue’s behalf (cancelled_by_venue), outside the guest’s cancellation window. See Cancel as the venue.- Both require
bookings:manageand are available at Maple-native locations. The API reference now lists the waitlist under its own section.
Waitlist
- Read a native location’s walk-in queue and quote waits under
bookings:read. - Add parties with an app-scoped
idempotency_key, and cancel them for the guest, underbookings:write. - Notify, seat, and remove parties, and open or close the waitlist, under
bookings:manage. Maple sends every guest text; seating creates a walk-in booking. See Run the waitlist. - Five waitlist webhook types (
waitlist_entry.created,.notified,.seated,.removed,.expired) carrying the entry’s latest state. See Waitlist events.
Delivery zones
- Delivery zone CRUD for connected locations — list, create, get, update, and delete zones under
delivery_zones:read/delivery_zones:write, scoped to your app’s active connection. POST /v1/locations/{locationId}/delivery_zones/checkreports whether a coordinate is deliverable and returns the matching zone and fee. See Manage delivery zones.
Bookings — per-location rollout
- Booking profile, bounded availability search, holds, and booking list/get/create/change/cancel.
- Venue actions under
bookings:manage, with version checks and app-attributed audit records. - Native configuration publish/read under
bookings:configure, preserving existing menus. - On-demand live floor, eight booking webhook types, and optional booking sandbox provisioning.
- App-owned native/provider holds, atomic ten-hold quotas per app/location, and separate booking request/search throttles with
Retry-After. - Durable provider-write claims, version reservations, stable request identities, and reconciliation after uncertain writes or mirror failures. See Take bookings for retry rules.
Delivery addresses, order catch-up, and denser webhook retries
- Delivery addresses — the order resource and the
order.notificationpayload now carrydelivery_address(street, unit, city, state, ZIP, and the customer’s delivery instructions innotes). It isnullfor pickup orders and for delivery orders with no stored address. See Receiving orders. - Order catch-up —
GET /v1/ordersacceptssince,starting_after, andlimit. Withsince, results drain oldest first from an exclusive checkpoint so you can page through a backlog after downtime. See Lists. - Order resend —
POST /v1/orders/{orderId}/resendpublishes a freshorder.notificationfor one live order that missed its webhook, without changing order state. Requireswebhooks:write; terminal orders can’t be resent. - Denser webhook retries — a failed delivery is now retried up to 9 times (was 6), with the early attempts inside the six-minute POS decision window. See Retries and auto-disable.
Developer API launch
The Maple Developer API is available for POS and platform partners.
- Authentication — API keys (
mpk_test_…for the sandbox,mpk_live_…for production) with scoped access. - Locations and connections — list granted locations and connect as a location’s order receiver.
- Orders — receive
order.notification, read the full order, and decide it with accept / deny / ready / complete / cancel / status. Optional pre-validation. - Menu — publish a location’s full menu as one JSON document keyed by your own external IDs, and read it back.
- Webhooks — subscribe to event types, verify HMAC-signed deliveries, and replay from the event ledger.