Developers

Restaurant POS API and webhooks

Build on EvronDesk with a clean REST API and real-time webhooks. Read the menu, create orders safely, sync customers and stock, and pull sales into your own tools, with keys limited to exactly what each integration needs.

No card needed · Works on the hardware you already have

Short answer

EvronDesk has a REST API at https://pos.evrondesk.com/api/v1 with endpoints for the restaurant profile, menu, orders, customers, stock and sales reports. Keys are scoped (for example orders:write or reports:read), order creation is idempotent, and webhooks deliver signed events in real time with automatic retries.

Endpoints

MethodPathScopeWhat it does
GET/meanyRestaurant name, currency, time zone, tax settings, and the key's scopes
GET/menumenu:readCategories, items and modifier groups
GET / POST/menu/itemsmenu:read / menu:writeList or create items
PATCH/menu/items/{id or sku:CODE}menu:writeChange price, availability (86) and other fields
GET / POST/ordersorders:read / orders:writeList with filters and cursor paging, or create an order
GET/orders/{id or ref:REF}orders:readOne order with items and payments
GET / POST/customerscustomers:read / customers:writeSearch, or create (deduplicated by phone)
GET/stockstock:readIngredients with stock and par levels
POST/stock/adjuststock:writeAdd or remove stock with a reason
GET/reports/salesreports:readSales, tax, tips, refunds and breakdowns for a period

Full request and response schemas are in the developer docs and the OpenAPI file.

Creating an order

curl -X POST https://pos.evrondesk.com/api/v1/orders \
  -H "Authorization: Bearer evd_live_..." \
  -H "Content-Type: application/json" \
  -d '{"external_ref":"web-10045","order_type":"takeaway",
       "customer_name":"Sara","customer_phone":"+971500000000",
       "items":[{"sku":"201","qty":2},{"sku":"DRK-LIME","qty":1}]}'

Items are matched by SKU, then ID, then name. Prices always come from your EvronDesk menu, never from the request, so a buggy or malicious client can't change what you charge. Unknown items are listed in unmatched_items and noted on the order rather than silently dropped.

Webhooks

Add an endpoint URL in Settings → Integrations → Webhooks, pick events, and copy the signing secret. Events include:

  • order.created, order.updated, order.paid, order.ready, order.completed, order.voided, order.refunded
  • menu.item.created, menu.item.updated, customer.created, reservation.created
  • test.ping from the Send test button

Each delivery is a JSON body with id, type, created_at, restaurant_id, attempt and data. Failed deliveries are retried with backoff for up to eight attempts, and the last deliveries for each endpoint are listed with their response codes so you can debug without guessing.

Good to know

  • Errors are always {"error":{"code","message"}} with standard HTTP status codes.
  • Time is ISO 8601. Report dates as YYYY-MM-DD use the restaurant's own time zone.
  • Paging uses next_cursor from the previous response.
  • CORS is enabled, but keep keys on your server, never in a browser or app.

Frequently asked questions

Is the EvronDesk API free?

The API and webhooks are included in the Pro plan, or available on Starter and Growth as the API & webhooks add-on for US$20 a month. There's no per-call fee.

How do I authenticate?

Create a key in Settings → Integrations → API keys, choose its scopes, and send it as Authorization: Bearer <key>. Keys start with evd_live_, are shown once, and can be revoked at any time.

How do I avoid duplicate orders when a request is retried?

Send an external_ref in the body or an Idempotency-Key header. If the same reference arrives again, the API returns the existing order with duplicate: true instead of creating a second one.

How do I verify a webhook?

Each webhook has an X-EvronDesk-Signature header in the form t=<timestamp>,v1=<hmac>. Compute HMAC-SHA256 of <timestamp>.<raw body> with your endpoint secret and compare. Reject anything older than a few minutes.

Is there an OpenAPI spec?

Yes, at https://pos.evrondesk.com/api/v1/openapi.json (OpenAPI 3.1). Import it into Postman, Insomnia or a code generator.