Skip to content
Public API · v1

Toster API

REST API to read orders, customers, analytics, and more — or push data back into Toster from any external system. Everything uses standard JSON over HTTPS.

https://api.toster.co/api
1 000 req / min per key
TLS 1.3 · scope-based auth

Overview

All API endpoints are REST and return JSON. Authentication uses a Bearer token sent in the Authorization header. Each API key carries a set of scopes that controls exactly which endpoints it can reach.

Scoped API keys

Grant only the permissions your integration needs.

1 000 req/min

Per-key rate limit with standard 429 response.

Webhooks

Push events to your endpoint instead of polling.

Authentication

Generate an API key in Settings → API Keys inside your Toster dashboard. Keys look like 966_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.

Pass the key as a Bearer token on every request:

bash
curl https://api.toster.co/api/orders \
  -H "Authorization: Bearer 966_YOUR_API_KEY" \
  -H "Accept: application/json"
javascript
const res = await fetch('https://api.toster.co/api/orders', {
  headers: {
    Authorization: 'Bearer 966_YOUR_API_KEY',
    Accept: 'application/json',
  },
});
const { items, total } = await res.json();
Never expose your API key in client-side code. Rotate keys immediately if compromised.

Scopes

Each key is issued with a set of scopes. Calling an endpoint without the required scope returns 403 Forbidden.

ScopeDescription
orders:readRead orders and order history
orders:writeCreate and update orders
customers:readAccess customer profiles and segments
customers:writeUpdate customer data and tags
products:readRead menu items and categories
kitchen:readMonitor kitchen queue and status
couriers:readView courier assignments and GPS
analytics:readAccess revenue and performance data
loyalty:readRead loyalty balances and history
loyalty:writeAward and redeem loyalty bonuses
reviews:readRead customer reviews and ratings
webhooks:writeSubscribe to real-time event hooks

Pagination & Errors

List endpoints support ?page=1&limit=20 (max 100). The response envelope is always:

json
{
  "items": [...],
  "total": 1842,
  "page": 1,
  "pages": 93
}

Errors follow a consistent shape:

json
{
  "error": "Order not found",
  "details": { "id": "ord_abc123" }
}
StatusMeaning
200 OKSuccess
201 CreatedResource created successfully
400 Bad RequestInvalid parameters or missing required fields
401 UnauthorizedMissing or invalid API key
403 ForbiddenKey lacks the required scope
404 Not FoundResource does not exist in your org
429 Too Many RequestsRate limit exceeded — back off and retry
500 Internal Server ErrorSomething went wrong on our side

Orders

Create, read, and manage the full order lifecycle from placement to delivery.

GET
/orders

List orders with pagination and filters

orders:read
GET
/orders/:id

Get a single order with full details

orders:read
POST
/orders

Create a new order

orders:write
PATCH
/orders/:id/status

Advance order status through the delivery pipeline

orders:write
GET
/orders/:id/track

Get real-time courier GPS and ETA for an order

orders:read

Customers

Access and manage customer profiles, tags, segments, and purchase history.

GET
/customers

Search and list customers

customers:read
GET
/customers/:id

Get customer profile with order history

customers:read
PATCH
/customers/:id

Update tags, notes, or contact info

customers:write
GET
/customers/:id/orders

Paginated order history for a customer

customers:read

Menu & Products

Read your full menu catalogue including categories, modifiers, and pricing.

GET
/products

List all products with categories

products:read
GET
/products/:id

Get a single product with all modifiers

products:read
GET
/products/categories

List all menu categories

products:read

Kitchen

Monitor the live kitchen queue and cooking status for each station.

GET
/kitchen/queue

Current kitchen queue ordered by priority

kitchen:read
GET
/kitchen/stats

Average prep time and throughput metrics

kitchen:read

Couriers

Track courier locations, assignments, and shift performance in real time.

GET
/couriers

List all couriers with current status

couriers:read
GET
/couriers/:id

Get courier profile and active assignment

couriers:read
GET
/couriers/:id/location

Latest GPS coordinates and route

couriers:read

Analytics

Pull revenue, order volume, and funnel data for any date range.

GET
/analytics/revenue

Revenue totals broken down by day or hour

analytics:read
GET
/analytics/orders

Order count, AOV, and conversion rate

analytics:read
GET
/analytics/top-products

Best-selling items by quantity and revenue

analytics:read

Loyalty

Read and manage loyalty balances, award bonuses, and process redemptions.

GET
/loyalty/:customer_id

Get loyalty balance and tier

loyalty:read
GET
/loyalty/:customer_id/history

Bonus earn and spend history

loyalty:read
POST
/loyalty/award

Award bonus points to a customer

loyalty:write

Webhook Events

Instead of polling, subscribe to events and Toster will POST a JSON payload to your URL within seconds of the event firing.

order.createdorder.confirmedorder.cookingorder.packedorder.dispatchedorder.deliveredorder.cancelledcustomer.createdreview.submittedloyalty.awarded

Example order.created payload:

json
{
  "event": "order.created",
  "created_at": "2026-04-28T14:22:00Z",
  "data": {
    "id": "clx7...",
    "number": 4821,
    "status": "NEW",
    "total": 1250,
    "customer": {
      "id": "clx8...",
      "name": "Anna K.",
      "phone": "+380671234567"
    },
    "items": [
      { "name": "Philadelphia Roll", "qty": 2, "price": 340 }
    ]
  }
}

Verify the request is from Toster using the X-Toster-Signature header — an HMAC-SHA256 of the raw body signed with your webhook secret.

javascript
import { createHmac } from 'crypto';

function verifySignature(rawBody, signature, secret) {
  const expected = createHmac('sha256', secret)
    .update(rawBody)
    .digest('hex');
  return `sha256=${expected}` === signature;
}

Ready to integrate?

Generate your first API key from the Toster dashboard in under a minute.