Skip to content

Customers and reservations

Customers are the merchant’s own records — loyalty members, account customers, delivery addresses. Reservations sit on top of them: every booking belongs to a customer.

MethodPathScope
GET/v1/customerscustomers.read
GET/v1/customers/:idcustomers.read
POST/v1/customerscustomers.write
PATCH/v1/customers/:idcustomers.write
GET/v1/reservationsreservations.read
POST/v1/reservationsreservations.write
PATCH/v1/reservations/:idreservations.write
Terminal window
curl -s "$API_BASE_URL/customers" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Priya Nair",
"mobile": "+919845012345",
"email": "priya@example.com",
"loyaltyNo": "LP-004182",
"address": "42 Church Street",
"ZIP": "560001",
"StoreId": 1
}'
FieldTypeRequiredNotes
namestringyesUp to 150 characters
mobilestringnoUp to 40 characters. The de-facto identity key — see below
emailstringnoValidated as an email address
loyaltyNostringnoLoyalty card or membership number, up to 20 characters
loyaltyPointnumbernoOpening points balance
address, landmarkstringnoDelivery address lines
ZIPstringnoPostal code
countryId, stateId, statenumber / stringnoLocation, for tax and reporting
latitude, longitudenumbernoUsed for delivery routing
trnstringnoTax registration number for B2B invoices
TaxExemptnumberno1 suppresses tax on this customer’s sales
creditCustnumberno1 allows sales on account
creditLimitnumbernoMaximum outstanding balance
openingnumbernoOpening balance carried in from another system
birthDate, anniversarystringnoYYYY-MM-DD, used for campaigns
StoreIdnumbernoHome store. 0 means the record is shared across stores
statusnumberno1 active (default), 0 inactive
201 Created
{
"data": {
"id": 5521,
"name": "Priya Nair",
"mobile": "+919845012345",
"loyaltyNo": "LP-004182",
"status": 1
}
}
Terminal window
curl -s "$API_BASE_URL/customers?mobile=%2B919845012345" \
-H "Authorization: Bearer $ACCESS_TOKEN"

search matches name, mobile and email; mobile and email filter exactly.

Terminal window
curl -s "$API_BASE_URL/reservations" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"customerId": 5521,
"storeId": 1,
"reservationDate": "2026-08-14",
"reservationTime": "19:30",
"partySize": 4,
"durationMinutes": 120,
"occasion": "Anniversary",
"phone": "+919845012345",
"note": "Window table if possible"
}'
FieldTypeRequiredNotes
customerIdnumberyesCreate the customer first
reservationDatestringyesYYYY-MM-DD
reservationTimestringyesHH:mm or HH:mm:ss, store-local
partySizenumberyesNumber of covers
durationMinutesnumberno15–600, default 120
statusstringnopending (default), confirmed, seated, completed, cancelled
storeIdnumbernoRequired for multi-store merchants
occasionstringnoShown to the host — birthday, anniversary
phone, email, addressstringnoContact for this booking
customerPreferencesstringnoAllergies, seating preferences
preOrderedFoodsarrayno{ name, quantity, price, notes } per pre-ordered dish
notestringnoFree-text note for staff
Terminal window
curl -s -X PATCH "$API_BASE_URL/reservations/318" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "status": "confirmed" }'

pending → confirmed → seated → completed is the normal path; cancelled is terminal from any state. Patch only the fields that change — a status update should not resend the whole booking.

Terminal window
curl -s "$API_BASE_URL/reservations?storeId=1&fromDate=2026-08-14&toDate=2026-08-14" \
-H "Authorization: Bearer $ACCESS_TOKEN"

Filter by storeId, status, customerId and a date window. Reservations return the customer’s name and phone inline so a host screen needs one call, not two.