Skip to main content
The Developer API is a JSON REST API. Every endpoint in this reference is grouped in the sidebar by resource — auth, locations, connections, menu, orders, and webhooks. This page covers the conventions they all share; the linked concept pages go deeper.

Base URL

Each environment has its own host, both served under the /v1 prefix:
https://api.staging.maple.inc/v1   # Sandbox — development and testing
https://api.maple.inc/v1           # Production — live traffic
Use the credential that matches the host (mpk_test_… in the sandbox, mpk_live_… in production). See Environments.

Authentication

Send a Bearer credential on every request:
Authorization: Bearer mpk_test_…
Send your API key (mpk_test_… for the sandbox, mpk_live_… for production) as the bearer token. GET /v1/me returns the app, environment, and scopes for any key. Full detail in Authentication.

Resource conventions

  • Opaque IDs carry a type prefix — str_ (location), ord_ (order), dws_ (webhook subscription), evt_ (event), and so on. Treat them as opaque strings.
  • Money is integer USD cents. 450 means $4.50. Never parse amounts as floats. Currency codes are always uppercase ISO‑4217 (USD).
  • Field casing. Menu payloads use camelCase (externalId, minSelections, modifierGroups); order and webhook payloads use snake_case (fulfillment_type, menu_entity_id, payment_status). A line item’s menu_entity_id carries the externalId you published for that menu object.
  • Timestamps on events and orders are Unix seconds (the created field).
  • Object typing. Most resources carry an object field (order, location, event, …) so you can tell them apart.

Lists

List endpoints return an envelope with an object of list and a data array:
{ "object": "list", "data": [ /* … */ ] }
Lists return a bounded, most-recent-first window rather than full cursor pagination:
  • GET /v1/orders returns up to 100 orders and includes a has_more flag indicating more exist.
  • GET /v1/webhook_events returns up to 50 events, most recent first.
  • GET /v1/locations and GET /v1/webhook_subscriptions return the full set for your app.
For complete history and recovery, use the event ledger and replay rather than paging.
Filtering and pagination on GET /v1/orders are under construction. The endpoint takes no query parameters today — it returns the 100 most-recent orders across all of your connected locations, with has_more signalling that more exist. There’s no location_id filter or cursor to page further back yet; both are coming. For now, rely on order.notification webhooks to receive orders as they happen, and treat the list endpoint as a recent-activity view.

Errors

Errors use standard HTTP status codes with a JSON body carrying a stable _tag and a human-readable message. Branch on the tag, not the message. The full catalog is in Errors.

Rate limits

There are no published per-app rate limits today. Be a good citizen — respond to webhooks asynchronously, avoid tight polling loops (you don’t need to poll; orders are pushed), and retry 5xx responses with exponential backoff and jitter.