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
/manage/{slug}/menuTot meniul: meniuri, categorii, produse, variante, cu toate traducerile.
menu:read
/manage/{slug}/itemsCreează un produs. Body: category_id, name{ro,en}, price, description, allergens[], tags[], options[].
menu:write
/manage/{slug}/items/{id}Actualizează parțial un produs (ex: doar price).
menu:write
/manage/{slug}/items/{id}/availabilityMarchează disponibil / epuizat: {"is_available": false}.
menu:write
/manage/{slug}/items/{id}/imageÎncarcă poza (multipart, câmp image).
menu:write
/manage/{slug}/items/{id}Șterge produsul.
menu:write
/manage/{slug}/categoriesCreează categorie: menu_id, name{}, emoji.
menu:write
/manage/{slug}/reorderReordonează: {"type": "items", "ids": [5, 2, 9]}.
menu:write
Comenzi
/manage/{slug}/orders?status=new,accepted&since=ISO8601Comenzi, filtrabile după status și dată de modificare (pentru polling).
orders:read
/manage/{slug}/orders/{id}Schimbă statusul: new, accepted, preparing, ready, served, cancelled. Opțional external_ref (id-ul din POS).
orders:write
/manage/{slug}/waiter-callsChemările deschise (ospătar, notă de plată).
orders:read
/manage/{slug}/waiter-calls/{id}/resolveMarchează chemarea rezolvată.
orders:write
Altele
/manage/{slug}Datele restaurantului și setările.
menu:read
/manage/{slug}/tablesMesele, codurile și link-urile QR.
menu:read
/manage/{slug}/stats?days=30Scană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.