/versionpublicAPI version (no key)
curl -sS "https://vbkvldzmjycapdlkoawr.supabase.co/functions/v1/open-api/v1/version"Partner API
Public REST API for partners: menu, open checks and closed sales per outlet. Authenticate with outlet API keys — not device JWTs or staff PINs.
All protected calls require a valid outlet key. Send either:
Authorization: Bearer modr_live_…or
Authorization: Bearer modr_test_…Alternative header:X-Api-Key: modr_test_…
Invalid or revoked keys return 401. Keys are stored hashed; prefix and last4 are shown in Backoffice.
Same Supabase project for live and test. Use modr_test_ keys against a test outlet while developing. A separate sandbox project comes later.
modr_test_ — sandbox / lower rate limitmodr_live_ — productionFixed window per minute per key. Exceeding the limit returns 429 with 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
Optionally send X-Correlation-Id. The same value is returned and included in error payloads — use it when contacting support.
All paths are relative to the base URL above.
/versionpublicAPI version (no key)
curl -sS "https://vbkvldzmjycapdlkoawr.supabase.co/functions/v1/open-api/v1/version"/environmentKey environment and outlet binding
curl -sS "https://vbkvldzmjycapdlkoawr.supabase.co/functions/v1/open-api/v1/environment" \
-H "Authorization: Bearer modr_test_…"/productsPublished menu / catalog
curl -sS "https://vbkvldzmjycapdlkoawr.supabase.co/functions/v1/open-api/v1/products" \
-H "Authorization: Bearer modr_test_…"/checksList open checks
curl -sS "https://vbkvldzmjycapdlkoawr.supabase.co/functions/v1/open-api/v1/checks?limit=50" \
-H "Authorization: Bearer modr_test_…"/checksCreate open check (no payment)
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}]}'/checks/{id}Get one open check
curl -sS "https://vbkvldzmjycapdlkoawr.supabase.co/functions/v1/open-api/v1/checks/<checkId>" \
-H "Authorization: Bearer modr_test_…"/salesClosed sales (closed_checks)
curl -sS "https://vbkvldzmjycapdlkoawr.supabase.co/functions/v1/open-api/v1/sales?limit=50" \
-H "Authorization: Bearer modr_test_…"Configure HTTPS URL and events in Backoffice. Deliveries are logged; v1 makes one sync attempt and stores a row for retry.
check.createdcheck.updatedsale.createdHeaders: X-Modr-Timestamp, X-Modr-Signature, X-Modr-Event
HMAC-SHA256 hex of{timestamp}.{rawBody} using the webhook secret.
# verify (pseudo)
expected = hmac_sha256(secret, timestamp + "." + rawBody)
assert expected == X-Modr-SignatureJSON errors use a consistent shape:
{
"code": "unauthorized",
"message": "Missing API key …",
"correlationId": "…"
}Pay/terminal, refunds, cash, Z/X/fiscal, staff PIN, device link and manager override are not part of Open API v1.