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

MethodPath
GET/me

Check the key: returns your company

GET/products

List products (filters: sku, q, active)

GET/products/{id}

One product with price, VAT and stock

GET/customers

List customers (filters: email, q, active)

POST/customers

Create a customer — without lat/lng the address is found on the map

GET/customers/{id}

One customer

PATCH/customers/{id}

Change a customer (only the fields you send)

GET/orders

List orders (filters: status, date, from, to, customer_id, external_ref)

POST/orders

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

POST/orders/{id}/confirm

Confirm a pending order (issues the invoice)

POST/orders/{id}/cancel

Cancel an order before it leaves (stock goes back)

GET/webhooks

List webhooks

POST/webhooks

Subscribe a URL to events (returns the signing secret once)

DELETE/webhooks/{id}

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.