qrmenu.ro
Restaurante Pentru restaurante API pentru integrări Intră în cont

API v1

Integrează qrmenu cu restaurantul tău

REST + JSON. Comenzile intră automat în POS, stocul se sincronizează cu meniul, iar evenimentele vin în timp real prin webhooks semnate.

1. Cheie API

Proprietarul generează o cheie din Panou → Integrări API, cu permisiunile dorite.

2. Autentificare

Authorization: Bearer qrm_xxx la fiecare request. Limită: 240 req/min.

3. Webhooks

Primești order.created, waiter.called etc. la URL-ul tău HTTPS.

Endpoint-uri

Bază: https://qrmenu.ro/api/v1

Meniu

GET
/manage/{slug}/menu

Tot meniul: meniuri, categorii, produse, variante, cu toate traducerile.

menu:read
POST
/manage/{slug}/items

Creează un produs. Body: category_id, name{ro,en}, price, description, allergens[], tags[], options[].

menu:write
PATCH
/manage/{slug}/items/{id}

Actualizează parțial un produs (ex: doar price).

menu:write
POST
/manage/{slug}/items/{id}/availability

Marchează disponibil / epuizat: {"is_available": false}.

menu:write
POST
/manage/{slug}/items/{id}/image

Încarcă poza (multipart, câmp image).

menu:write
DELETE
/manage/{slug}/items/{id}

Șterge produsul.

menu:write
POST
/manage/{slug}/categories

Creează categorie: menu_id, name{}, emoji.

menu:write
POST
/manage/{slug}/reorder

Reordonează: {"type": "items", "ids": [5, 2, 9]}.

menu:write

Comenzi

GET
/manage/{slug}/orders?status=new,accepted&since=ISO8601

Comenzi, filtrabile după status și dată de modificare (pentru polling).

orders:read
PATCH
/manage/{slug}/orders/{id}

Schimbă statusul: new, accepted, preparing, ready, served, cancelled. Opțional external_ref (id-ul din POS).

orders:write
GET
/manage/{slug}/waiter-calls

Chemările deschise (ospătar, notă de plată).

orders:read
POST
/manage/{slug}/waiter-calls/{id}/resolve

Marchează chemarea rezolvată.

orders:write

Altele

GET
/manage/{slug}

Datele restaurantului și setările.

menu:read
GET
/manage/{slug}/tables

Mesele, codurile și link-urile QR.

menu:read
GET
/manage/{slug}/stats?days=30

Scanări, vizitatori unici, ore de vârf, top produse, comenzi.

stats:read

Webhooks

Evenimente: order.created, order.updated, waiter.called, review.created, menu.updated. Reîncercăm de 5 ori (10 s, 1 min, 5 min, 30 min) dacă nu răspunzi cu 2xx.

POST https://pos.restaurant.ro/hook
X-QRMenu-Event: order.created
X-QRMenu-Timestamp: 1762790400
X-QRMenu-Signature: sha256=5f2c...

{
  "event": "order.created",
  "restaurant": "trattoria-nonna",
  "data": {
    "id": 812, "number": "#014", "status": "new",
    "table": { "name": "Masa 7", "code": "k3x9a2pq" },
    "total": 120, "currency": "RON",
    "lines": [
      { "item_id": 55, "name": "Pizza Diavola",
        "quantity": 2, "unit_price": 42, "options": [] }
    ]
  }
}

Verificarea semnăturii

Calculează HMAC-SHA256 peste timestamp + "." + body cu secretul webhook-ului și compară cu headerul. Respinge request-urile mai vechi de 5 minute.

$ts   = $_SERVER['HTTP_X_QRMENU_TIMESTAMP'];
$body = file_get_contents('php://input');
$sig  = 'sha256=' . hash_hmac('sha256', "$ts.$body", $secret);

if (!hash_equals($sig, $_SERVER['HTTP_X_QRMENU_SIGNATURE'])
    || abs(time() - (int) $ts) > 300) {
    http_response_code(401); exit;
}

API public (aplicații mobile)

Pentru aplicații client: POST /auth/register, POST /auth/login (token Sanctum), POST /scan cu conținutul codului QR, GET /restaurants/{slug}?lang=en, GET /me/history, POST /restaurants/{slug}/orders, POST /restaurants/{slug}/waiter.

Ai nevoie de ajutor cu o integrare? Scrie-ne la api@qrmenu.ro.