Partner API

MODR Open API (v1)

Publik REST API för partners: meny, Orderhanterare, öppna notor och stängd försäljning per outlet. Autentisering med outlet-nycklar — inte device-JWT eller personal-PIN.

Ladda ner OpenAPI-specifikation:Download

E-mail: hello@modr.se

Base URL: https://api.modr.se/v1

Kom igång

  1. Skapa en test-nyckel i Backoffice → Integrationer → Open API (visa plaintext en gång).
  2. Anropa GET /version utan nyckel för att verifiera bas-URL.
  3. Anropa GET /products med Authorization: Bearer modr_test_…

Läs mer om integrationer →

API-nyckel

Alla skyddade anrop kräver en giltig outlet-nyckel. Skicka antingen:

Authorization: Bearer modr_live_…

eller

Authorization: Bearer modr_test_…

Alternativ header:X-Api-Key: modr_test_…

Ogiltig eller återkallad nyckel ger 401. Nycklar lagras hashade; prefix och last4 visas i Backoffice.

Miljöer

Anropa alltid MODR Open API på api.modr.se. Live och test delar samma host — miljön styrs av nyckelns prefix. Använd modr_test_-nycklar mot en test-outlet under utveckling.

  • https://api.modr.se/v1 — kanonisk bas-URL
  • https://modr.se/api/v1 — samma API via modr.se
  • modr_test_ — sandbox / lägre rate limit
  • modr_live_ — produktion

Rate limits

Fast fönster per minut per nyckel. Överskridning ger 429 med Retry-After.

  • modr_test_ — 60 req/min (default)
  • modr_live_ — 120 req/min (default)

Response headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

Idempotency-Key

POST och PUT tar valfritt Idempotency-Key (8–128 tecken). Samma nyckel och samma body ger tillbaka originalsvaret. Samma nyckel med annan body ger 409.

Idempotency-Key: 8f3c2a91-partner-order-14

Correlation-Id

Skicka valfritt X-Correlation-Id. Samma värde returneras i svaret och ingår i felpayload — använd det vid support.

Endpoints

Alla paths är relativa till base URL ovan. POST /orders lägger en väntande order i Orderhanterare. POST /checks skapar en öppen POS-nota. GET /sales pagineras med cursor — skicka nextCursor som cursor.

GET/versionpublik

API-version (ingen nyckel)

curl -sS "https://api.modr.se/v1/version"
GET/environment

Nyckelns miljö och outlet-bindning

curl -sS "https://api.modr.se/v1/environment" \
  -H "Authorization: Bearer modr_test_…"
GET/products

Publicerad meny / katalog med modifierare

curl -sS "https://api.modr.se/v1/products" \
  -H "Authorization: Bearer modr_test_…"
GET/tables

Bord och eventuell öppen nota

curl -sS "https://api.modr.se/v1/tables" \
  -H "Authorization: Bearer modr_test_…"
GET/checks

Lista öppna POS-notor

curl -sS "https://api.modr.se/v1/checks?limit=50" \
  -H "Authorization: Bearer modr_test_…"
POST/checks

Skapa öppen POS-nota (ingen betalning)

curl -sS -X POST "https://api.modr.se/v1/checks" \
  -H "Authorization: Bearer modr_test_…" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"name":"Online 1","tableId":"<tableId>","lines":[{"productId":"<id>","qty":1}]}'
GET/checks/{id}

Hämta en öppen nota

curl -sS "https://api.modr.se/v1/checks/<checkId>" \
  -H "Authorization: Bearer modr_test_…"
POST/checks/{id}/items

Lägg rader på en öppen nota

curl -sS -X POST "https://api.modr.se/v1/checks/<checkId>/items" \
  -H "Authorization: Bearer modr_test_…" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"lines":[{"productId":"<id>","qty":1}]}'
PUT/checks/{id}/table

Koppla nota till bord

curl -sS -X PUT "https://api.modr.se/v1/checks/<checkId>/table" \
  -H "Authorization: Bearer modr_test_…" \
  -H "Content-Type: application/json" \
  -d '{"tableId":"<tableId>"}'
POST/orders

Skapa order i Orderhanterare (väntande kö)

curl -sS -X POST "https://api.modr.se/v1/orders" \
  -H "Authorization: Bearer modr_test_…" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"name":"Wolt 14","orderType":"Takeaway","lines":[{"productId":"<id>","qty":1}]}'
GET/orders

Lista ordrar i Orderhanterare

curl -sS "https://api.modr.se/v1/orders?queue=waiting" \
  -H "Authorization: Bearer modr_test_…"
GET/sales

Stängd försäljning med rader, moms och betalsätt

curl -sS "https://api.modr.se/v1/sales?limit=50" \
  -H "Authorization: Bearer modr_test_…"
GET/sales/{id}

Hämta en stängd försäljning

curl -sS "https://api.modr.se/v1/sales/<saleId>" \
  -H "Authorization: Bearer modr_test_…"

Webhooks

Konfigurera publik HTTPS-URL och events i Backoffice. Första försöket sker synkront. Misslyckade leveranser retrys med backoff, upp till 8 försök. sale.created innehåller rader, moms och betalsätt.

  • check.created
  • check.updated
  • order.created
  • sale.created

Signatur

Headers: X-Modr-Timestamp, X-Modr-Signature, X-Modr-Event

HMAC-SHA256 hex av{timestamp}.{rawBody} med webhook-secret.

# verify (pseudo)
expected = hmac_sha256(secret, timestamp + "." + rawBody)
assert expected == X-Modr-Signature

Fel

JSON-fel har konsekvent form:

{
  "code": "unauthorized",
  "message": "Missing API key …",
  "correlationId": "…"
}

Utanför v1

Betala/terminal, refund, kontant, Z/X/fiskal, personal-PIN, device link och manager override ingår inte i Open API v1.