Check a booking and price it, without making it
- Credentials
- OAuth access token
- Scopes
bookings:write- Idempotency
- Send an
Idempotency-Keyheader. A retry with the same key does the work once.
Validates the booking as bookAppointment would and says what it costs, so waiving the price can be put to the merchant first. Creates nothing.
Access: OAuth scope bookings:write; not write-gated.
merchantOAuth bookings:writeAuthorizationBearer <token>OAuth 2.1 (authorization code + PKCE S256, public clients, dynamic registration) for connected AI apps. Effective power is scopes granted AND the person's role today AND the plan. orders:refund, billing:write and team:write are opt-in on the consent screen. Write implies read for marketing:read and messages:read, so a grant holding marketing:write passes a marketing:read check, and messages:send passes messages:read.
Scope: bookings:write
storeId*stringA store the person can reach. Any other id answers 404, never 403.
Idempotency-Key*stringRequired on every write. Minted on the device when the person taps, reused on every retry. A write without one, or with one that does not match the pattern, is refused with 422 validation_error. Scoped to the token's subject, remembered 24 hours. A replay returns the first 2xx response with Idempotent-Replay: true; a request still running answers 409 in_flight; the same key with a different method, path or body answers 409 idempotency_key_reused; non-2xx results are not remembered. If the key store cannot be read nothing is processed and the answer is 503 idempotency_unavailable: retry with the same key.
^[A-Za-z0-9_-]{8,128}$application/json- body
listingId*stringat*integerEpoch millis of the slot or departure start, from getAvailability.
customer*seats?integer1 <= value <= 501pay?string"now""later""free"fare?stringTour price band by name or id.
meetingPoint?stringTour pickup point by name or id.
travellers?array<>note?stringOK
application/json- response
data*curl -X POST 'https://api.shopeazy.co/v1/merchant/stores/<storeId>/bookings/quote' \ -H 'Authorization: Bearer <access_token>' \ -H 'Idempotency-Key: <unique_key>' \ -H 'Content-Type: application/json' \ -d '{ "listingId": "string", "at": 1, "customer": { "name": "string" }}'{ "data": { "listing": "string", "when": "string", "seats": 0, "unitPrice": { "amount": 0, "currency": "ZAR" }, "total": { "amount": 0, "currency": "ZAR" }, "waives": "string" }}Book a service time or tour seats for a customer POST
Makes an order that holds the place (the capacity pool is shared with the storefront). `pay`: `now` returns a pay link, `later` pays on the day, `free` charges nothing (ask the merchant first). `at` must be a start from `getAvailability`. Access: OAuth scope `bookings:write`; write-gated by the subscription.
Booking requests waiting for the merchant (or all) GET
Access: OAuth scope `orders:read`; not write-gated. Paged: `{ items, nextCursor }`, `limit` (default 50, at most 200) and an opaque `cursor`.