Developers
Connect BeeRoutes to everything you use
A simple REST API with read and write access, signed webhooks for every delivery update, and ready-made connections for Shopify and Zapier.
REST API
Create orders and customers, read products, stock and delivery status — JSON over HTTPS.
Webhooks
Get a signed POST the moment an order is confirmed, on the way, delivered or failed.
Shopify
New Shopify orders become deliveries automatically; cancellations follow.
Zapier
Link BeeRoutes with Google Sheets, Slack, accounting and 7,000+ apps — no code.
Authentication
Create an API key in BeeRoutes under Integrations → API keys (office accounts only). Send it in the Authorization header of every request. Keys belong to your company: they only ever see your own data.
curl https://app.beeroutes.com/api/v1/orders?status=delivered \
-H "Authorization: Bearer br_live_…"Limit: 300 requests per minute per key. Lists return up to 200 items (limit, offset).
Endpoints
https://app.beeroutes.com/api/v1
| Method | Path | What it does |
|---|---|---|
| GET | /meCheck the key: returns your company | Check the key: returns your company |
| GET | /productsList products (filters: sku, q, active) | List products (filters: sku, q, active) |
| GET | /products/{id}One product with price, VAT and stock | One product with price, VAT and stock |
| GET | /customersList customers (filters: email, q, active) | List customers (filters: email, q, active) |
| POST | /customersCreate a customer — without lat/lng the address is found on the map | Create a customer — without lat/lng the address is found on the map |
| GET | /customers/{id}One customer | One customer |
| PATCH | /customers/{id}Change a customer (only the fields you send) | Change a customer (only the fields you send) |
| GET | /ordersList orders (filters: status, date, from, to, customer_id, external_ref) | List orders (filters: status, date, from, to, customer_id, external_ref) |
| POST | /ordersCreate an order — products by product_id or sku, customer by id, email or details | Create an order — products by product_id or sku, customer by id, email or details |
| GET | /orders/{id}One order with items, driver, ETA and proof of delivery | One order with items, driver, ETA and proof of delivery |
| POST | /orders/{id}/confirmConfirm a pending order (issues the invoice) | Confirm a pending order (issues the invoice) |
| POST | /orders/{id}/cancelCancel an order before it leaves (stock goes back) | Cancel an order before it leaves (stock goes back) |
| GET | /webhooksList webhooks | List webhooks |
| POST | /webhooksSubscribe a URL to events (returns the signing secret once) | Subscribe a URL to events (returns the signing secret once) |
| DELETE | /webhooks/{id}Unsubscribe | Unsubscribe |
Create an order
Send external_ref with your own order id: sending the same order twice returns the existing one instead of a duplicate. Add "confirm": true to confirm it straight away.
curl -X POST https://app.beeroutes.com/api/v1/orders \
-H "Authorization: Bearer br_live_…" \
-H "Content-Type: application/json" \
-d '{
"external_ref": "PO-10442",
"customer_email": "orders@cafe-central.com",
"delivery_date": "2026-11-03",
"slot_from": "08:00",
"slot_to": "11:00",
"items": [
{ "sku": "WAT-05", "quantity": 20 },
{ "sku": "JUI-01", "quantity": 6 }
]
}'Webhooks
BeeRoutes POSTs a JSON event to your URL when an order is created, confirmed, assigned, on the way, delivered, failed or cancelled. Add webhooks under Integrations or with the API.
Events
order.createdorder.confirmedorder.assignedorder.in_transitorder.deliveredorder.failedorder.cancelled{
"id": "evt_5f2c…",
"event": "order.delivered",
"created_at": "2026-11-03T09:42:10.000Z",
"data": {
"id": 1842,
"number": "ORD-2026-01842",
"external_ref": "PO-10442",
"status": "delivered",
"delivery_date": "2026-11-03",
"customer": { "id": 77, "business_name": "Café Central", … },
"items": [ { "sku": "WAT-05", "quantity": 20, "delivered_qty": 20, … } ],
"total": 182.4,
"proof": { "receiver_name": "Maria", "has_signature": true, "has_photo": false },
"delivered_at": "2026-11-03T09:42:08.000Z"
}
}Verify the signature
Every request has a BeeRoutes-Signature header: t (unix time) and v1, the HMAC-SHA256 of “t.body” with your webhook's secret. Reply with any 2xx within 10 seconds; failed deliveries are retried once, and a webhook is turned off after 25 failures in a row. Reply 410 to unsubscribe.
import crypto from "node:crypto";
// header: "t=1762162930,v1=5d41…"
function verify(rawBody, header, secret) {
const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("=")));
const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300;
return fresh && crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
}Errors
Errors use HTTP status codes and a JSON body with a code and a message:
{ "error": { "code": "product_not_found", "message": "Unknown or inactive products: sku JUI-09" } }401 missing or invalid key · 404 not found · 409 not allowed in the order's status · 422 invalid fields, unknown SKU or address not found · 429 too many requests
Shopify
No app to install. In BeeRoutes open Integrations → Shopify, copy your private webhook URL into Shopify (Settings → Notifications → Webhooks, “Order creation” and “Order cancellation”) and paste Shopify's signing secret back. Products are matched by SKU; new customers are created from the shipping address.
Zapier
Use “Webhooks by Zapier”: Catch Hook as a BeeRoutes webhook to start Zaps when orders change, and POST to the API with your key to create orders or customers from any app.
Open Integrations →Plan tomorrow's routes today
Start your free 14-day trial and plan your first day in an afternoon.