POST /v1/locations/{locationId}/booking_configuration; read it with GET on the same path.
Prerequisites
- Your app is granted the location.
- Publishing requires
bookings:configure; reading requiresbookings:read. - Maple has enabled the location’s
bookings-public-apirollout flag. - The location has a Maple-native connection, or no booking connection yet. Provider-managed locations answer
422 capability_unsupported.
booking_profile.enabled before offering availability.
Publish a configuration
Configuration bodies use camelCase, like menu documents.poolId and unitId are your stable identifiers. Unit IDs must be unique across the document.
object: "booking_configuration", revision, location_id, version_id, published_at, and livemode. Reads materialize policy defaults; they need not reproduce omitted fields byte for byte.
Publish without overwriting the venue
Restaurant managers can edit the same configuration in the Maple dashboard. To avoid replacing their edits, read the configuration, change it, and publish it with therevision you read as expected_revision:
409 stale_configuration and nothing is replaced: read it again, reapply your change, and publish with the new revision. Send "expected_revision": null for a first configuration. Omitting expected_revision replaces the configuration unconditionally. The revision changes only when the configuration does; menu publishes move version_id but not revision.
Publication rules
- The document replaces the store’s authored booking configuration, not its menu or unrelated catalog resources and policies. Subsequent provider/menu publishes preserve that booking configuration too.
- Re-publishing an identical configuration does not create another version. There is no
idempotency_keyfield for configuration. - Changed turn times or policies take effect for new availability quotes. Existing bookings retain their pinned terms.
- The currency must match an existing catalog’s currency. A first configuration establishes the currency when no catalog exists.
- Times are venue-local
HH:MM; a shift’s end must be after its start. Split overnight opening hours across days. - Turn bands must be ordered and non-overlapping. Combinations must name distinct units from their own area.
- Every area is bookable. Availability tries the first area in
areas, then the others inpoolIdorder (the order a read returns them), and seats the party in the first one with a free table or combination that fits; a booking stays in the area it was seated in. Shifts and closed dates apply to the whole location. - Unknown fields, invalid zones/dates, and invalid bounds are rejected.
400validation responses identify the invalid input.422 configuration_rejectedmeans the document cannot be applied to the catalog. - A read before configuration exists answers
404.
Card-on-file/deposit booking flows and charging cancellation fees are separate capabilities; declaring a policy is not a payment integration.
Blackout dates
Blackout dates are days or part-days when a location is open but takes no reservations: a private event, a holiday, a walk-ins-only night. They differ from the configuration’sclosedDates:
Read the current list from
blackout_dates on GET /v1/locations/{locationId}/booking_profile (bookings:read). Replace it with bookings:configure:
null for a range’s missing times or note, and its new revision: { "object": "booking_blackouts", "location_id": "…", "blackout_dates": [...], "revision": "…" }.
- The body is the whole list: ranges you leave out are removed, and
[]clears them all. The venue edits the same list in its dashboard, so readblackout_datesandblackout_dates_revisionfrom the profile, edit, and send that revision asexpected_revision. If the list changed since you read it, the write answers409 stale_blackout_datesand nothing changes: read it again and reapply your edit. Withoutexpected_revisionthe write replaces whatever is there. - Dates are venue-local and inclusive. A range without times blocks whole days;
start_timeapplies to the first day andend_timeto the last. At most 100 ranges, with notes of up to 200 characters. - Invalid ranges (a date that doesn’t exist, an end before the start, a malformed time) answer
400 invalid_blackout_datesand change nothing. - Availability omits slots inside a blackout; native locations also withhold seatings that would run into one. A quote taken before a blackout was added is refused when held or booked:
409 slot_unavailableat native locations,422 date_blockedat provider-managed ones. Existing bookings inside a new blackout are not cancelled, and neither is a provider-managed booking already in flight when the blackout is saved. - A blackout stops reservations, not the host stand: walk-ins (
POST /v1/locations/{locationId}/walk_ins) and seating waitlist parties still work inside one, on normal table availability. - At a provider-managed location, the provider’s own channels (such as OpenTable’s website) don’t see Maple’s list; the venue blocks the dates there too.
Provision a booking sandbox
In Maple’s admin portal, select Native bookings + sample floor when provisioning the partner sandbox. The option defaults off. It creates an enabled Maple booking connection and, if configuration is absent, seeds four tables, 90-minute turns, and daily opening hours. Re-running it preserves an existing configuration and refuses to replace an OpenTable connection. The staging provisioning CLI exposes the same option as--booking-connection. For a booking-only partner, you can skip the POS connection; a location grant is sufficient for bookings. Existing keys that lack booking scopes need a newly minted key.
The provisioning result’s bookings_configured confirms that the step ran, not that rollout is enabled. Maple must target the sandbox location in the staging PostHog project for bookings-public-api. Then run search → hold → create → cancel using the sandbox credential.