Partner API

MODR Open API (v1)

Publik REST API för partners: meny, ö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://vbkvldzmjycapdlkoawr.supabase.co/functions/v1/open-api/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

Samma Supabase-projekt för live och test. Använd modr_test_-nycklar mot en test-outlet under utveckling. Separat sandbox-projekt kommer senare.

  • 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

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.

GET/versionpublik

API-version (ingen nyckel)

curl -sS "https://vbkvldzmjycapdlkoawr.supabase.co/functions/v1/open-api/v1/version"
GET/environment

Nyckelns miljö och outlet-bindning

curl -sS "https://vbkvldzmjycapdlkoawr.supabase.co/functions/v1/open-api/v1/environment" \
  -H "Authorization: Bearer modr_test_…"
GET/products

Publicerad meny / katalog

curl -sS "https://vbkvldzmjycapdlkoawr.supabase.co/functions/v1/open-api/v1/products" \
  -H "Authorization: Bearer modr_test_…"
GET/checks

Lista öppna notor

curl -sS "https://vbkvldzmjycapdlkoawr.supabase.co/functions/v1/open-api/v1/checks?limit=50" \
  -H "Authorization: Bearer modr_test_…"
POST/checks

Skapa öppen nota (ingen betalning)

curl -sS -X POST "https://vbkvldzmjycapdlkoawr.supabase.co/functions/v1/open-api/v1/checks" \
  -H "Authorization: Bearer modr_test_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"Online 1","lines":[{"productId":"<id>","qty":1}]}'
GET/checks/{id}

Hämta en öppen nota

curl -sS "https://vbkvldzmjycapdlkoawr.supabase.co/functions/v1/open-api/v1/checks/<checkId>" \
  -H "Authorization: Bearer modr_test_…"
GET/sales

Stängd försäljning (closed_checks)

curl -sS "https://vbkvldzmjycapdlkoawr.supabase.co/functions/v1/open-api/v1/sales?limit=50" \
  -H "Authorization: Bearer modr_test_…"

Webhooks

Konfigurera HTTPS-URL och events i Backoffice. Leveranser loggas; v1 gör ett synkront försök och sparar rad för retry.

  • check.created
  • check.updated
  • 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.