A documented REST API, signed webhooks and a free sandbox. Connect a website, a kitchen display, a CRM or an accounting tool to any restaurant on BookNDish, with the owner's permission.
The restaurant's owner or a manager opens Settings, then Developers, and creates a token with the scopes your integration needs, or a sandbox token to start on sample data. A token belongs to one restaurant and is shown once.
02
Call the API
Send the token as a bearer token. Every answer is JSON with data, meta and links.
03
Write safely
Give every POST an Idempotency-Key. A retry with the same key gets the first answer back, and nothing runs twice.
Base URL: https://restaurant-saas-19qm.onrender.com/api/v1
meta.now says what menus by time of day and happy hours make of the menu right now, on the default branch's clock: whether it and each category are open, and each dish or size a happy hour has cut, at the price charged now.
name and description are a string in the restaurant's default language, or a translation map. A dish is priced by price_minor, or per size by variants.
Only the fields sent change; variants and modifier groups are kept. A price change is recorded in the activity log. A dish priced per size refuses price_minor.
The order is priced from the menu (any price in the body is ignored), the owner's ordering rules apply (types offered, minimum order, delivery zones, opening hours; an order outside hours is held for the next opening), the kitchen gets its tickets and a connected POS gets the order. Dine-in orders need table_code.
placed to accepted or rejected, accepted to ready, ready to completed, and anything not finished to cancelled. Accepting fires the kitchen. A cancel with a reason (3 to 200 characters) also voids the kitchen tickets and keeps the reason.
Guest profiles, with contact details only for guests who agreed to share them.
GET/guests
Guest profiles, a page at a time
Guests who asked to be forgotten never appear. Phone and email are included only for guests who agreed to hear from the restaurant. Staff notes are never included.
Apps from the marketplace: a venue owner allows an app on the consent screen, and the app exchanges the code for an access token (used as the bearer token of every operation above) and a refresh token. Authorization code with PKCE (S256).
POST/oauth/token
Exchange a code, or refresh, for tokens
authorization_code: redeem the code the venue's consent sent to your redirect address, with the PKCE verifier. refresh_token: get a new access token and a new refresh token; the old pair stops working. Authenticate with your client id and secret, as HTTP Basic or as client_id and client_secret in the body. Answers are never cached.
Gives back a refresh token (with its access token) or an access token (RFC 7009). An unknown token is not an error. Authenticate with your client id and secret, as HTTP Basic or as client_id and client_secret in the body. To end the whole grant, the venue uninstalls the app.
Add an https address on Settings, then Developers, and choose its events. Each delivery is a signed POST: answer with any 2xx within 10 seconds. A failure is tried again after 1 minute, 5 minutes, 30 minutes, 2 hours and 6 hours, and the delivery log can replay it.
Events
order.created
An order is placed on any channel.
order.status_changed
An order moves to another status.
order.paid
Payments cover the order.
reservation.created
A booking is made, by the guest or the staff.
reservation.updated
A booking changes.
reservation.cancelled
A booking is cancelled.
menu.item_updated
A dish changes: price, name, sold out.
payment.refunded
A payment is refunded.
guest.created
A guest profile is created.
guest.updated
A guest's details or consent change, or the guest is erased.
giftcard.issued
A gift card is sold or issued.
giftcard.redeemed
A gift card pays for an order.
review.created
A guest submits a rating.
stock.below_par
An ingredient drops below its par level at a branch.
shift.published
A manager publishes a week of shifts.
experience.booked
Tickets to an experience are paid for.
Verify the signature
BookNDish-Signature carries t, a Unix time, and v1, the hex HMAC-SHA256 of t, a dot and the raw body, keyed with your signing secret. Compare in constant time and refuse a t older than five minutes.
A sandbox is a sample venue of its own, with a menu, tables, guests, a booking and an order, behind one token with every scope. It answers on the same address with a BookNDish-Sandbox header, never touches the live restaurant, and goes back to its sample data every night.
Create one on Settings, then Developers, then Sandbox. Its token starts with bnd_sbx_.
Limits and errors
Each token may make 60 requests a minute by default. Every answer carries X-RateLimit-Remaining, and a 429 carries Retry-After.
A failure answers with error.code, error.message and error.details. A token only ever sees its own restaurant: anything else is a 404.
v1 only grows: new endpoints, optional fields and events. A change that would break a client goes into v2, with v1 kept alongside it.