How to use the Eat App Concierge API to sync restaurant and group data
This guide will help you understand how to check restaurant availability and post reservations using the concierge API.
Overview
The Eat Concierge API allows restaurants, restaurant vendors, and groups to manage booking and access data across Eat App’s table management system.
The system can only be accessed by Concierge Users using a provided API key (Bearer token).
For the full reference, see the Concierge API docs (Postman):
https://documenter.getpostman.com/view/6372626/SWLcc85D#39df6cae-4370-42ee-b948-33ef95fd1548:~:text=POST-,Availability,-Reservations
Happy integrating!
What are the steps in this guide?
- Configure
host+api_token(note: host is usually https://api.eat-sandbox.co for sandbox and https://api.eatapp.co for production) GET /resources(cache)GET /groups→ choosegroup_idGET /restaurantswithX-Group-ID→ chooserestaurant_idPOST /availability/range→ show slotsPOST /reservationswithidempotency_tokenPATCH /reservations/:id_or_keyfor changes/cancel- Enable webhooks for real-time updates
Eat Concierge API: Simple Integration Guide
Purpose: Help restaurant groups get availability, read/write reservations, and manage guests. Webhooks are supported using the same JSON structure as API responses.
1) What you need from Eat App
- API token (for a Concierge user)
- API host (base URL), set as
host - Access to one or more Groups and their Restaurants (
group_id,restaurant_id)
2) Base URL + Authentication (every request)
Base URL:
[host]/concierge/v2/...
Required headers:
| Header | Value | Notes |
|---|---|---|
| Authorization | Bearer [api_token] |
Required |
| Content-Type | application/json |
Required for POST/PATCH |
| Accept-Encoding | gzip |
Optional |
Tip: Use an idempotency_token when creating reservations so retries don’t create duplicates.
3) Scoping: Group vs Restaurant
Many endpoints require scope. Use one of these headers:
| Scope | Header | When to use |
|---|---|---|
| Group | X-Group-ID: [group_id] |
Listing restaurants within a group |
| Restaurant | X-Restaurant-ID: [restaurant_id] |
Availability, reservations, guests, tables, rooms, payments, etc. |
If you can’t set headers, you can usually pass group_id / restaurant_id as query params instead.
4) Bootstrap sequence (do this first)
Step 4.1 — Load reference data
GET [host]/concierge/v2/resources
Use this to populate dropdowns and validate statuses/tags.
Step 4.2 — List groups you can access
GET [host]/concierge/v2/groups
Select the group_id you want to operate on.
Step 4.3 — List restaurants in the group
GET [host]/concierge/v2/restaurants
Headers: X-Group-ID: [group_id]
Pick a restaurant_id to scope availability/reservations/guests.
5) Availability: get bookable times
POST [host]/concierge/v2/availability/range
Request example:
{
"restaurant_id": "[restaurant_id]",
"first_seating": "2026-03-01T00:00",
"last_seating": "2026-03-01T23:59",
"only_available": true
}
What you get back: a list of “slots”. Use the slot time as start_time when creating a reservation.
6) Create a reservation
POST [host]/concierge/v2/reservations
Headers: X-Restaurant-ID: [restaurant_id]
Minimal request example:
{
"first_name": "John",
"last_name": "Doe",
"phone": "+971555555551",
"email": "john@doe.co",
"covers": 3,
"start_time": "2026-03-01T19:30:00",
"idempotency_token": "UUID-GUID-HERE"
}
Optional fields you may support:
notescustom_fields(key/value)tags,custom_tags,concierge_tags- payment/deposit info (if required by restaurant)
7) Read reservations
List reservations
GET [host]/concierge/v2/reservations?start_time_on=YYYY-MM-DD
Headers: X-Restaurant-ID: [restaurant_id]
Example:
GET [host]/concierge/v2/reservations?start_time_on=2026-03-01
Common filters: start_time_on, status, created_at_gte/created_at_lte, updated_at_gte/updated_at_lte, guest_id, concierge_tags.
Get a single reservation
GET [host]/concierge/v2/reservations/:id_or_key
8) Update or cancel a reservation
PATCH [host]/concierge/v2/reservations/:id_or_key
Headers: X-Restaurant-ID: [restaurant_id]
Example:
{
"status": "canceled",
"notes": "Guest requested cancellation",
"concierge_tags": ["vip", "call-center"]
}
Note: Some completion states may lock edits. Some restaurants may enforce a “change window”.
9) Guests: search and view profiles
Search guests
GET [host]/concierge/v2/guests?q=John
Headers: X-Restaurant-ID: [restaurant_id]
Get a guest
GET [host]/concierge/v2/guests/:guest_id
10) Webhooks: event-driven sync
Webhooks send the same JSON structure as the API. Recommended handling:
- Verify authenticity (signature/secret if provided).
- Store the raw payload (for debugging/replay).
- Route by
data.type+data.id(e.g., reservation, guest). - Make processing idempotent (store event IDs or use
type + id + updated_at). - If needed, refresh source-of-truth using:
GET /reservations/:id_or_keyGET /guests/:guest_id