Partner API
Build delivery into your own system
A small REST API over HTTPS with JSON in and out. Quote a journey, book it, and hear back by webhook as the courier collects and delivers.
# 1. What will it cost?curl -u $KEY:$SECRET https://api…/v1/quotes \ -d '{"pickup": {"latitude": 51.508, "longitude": -0.128}, "dropoff": {"latitude": 51.508, "longitude": -0.076}, "vehicle": "bicycle"}'# 2. Book it. Safe to retry: same key, same job.curl -u $KEY:$SECRET https://api…/v1/jobs \ -H "Idempotency-Key: order-1042" \ -d '{"quote_id": "…", "pickup": {…}, "dropoff": {…}}'→ 201 {"reference": "JOB-7F3K2Q", "status": "searching", "tracking_url": "https://track…"}What you build with
Quotes
A fixed price for a journey and a vehicle, broken down line by line, valid until it expires.
POST /v1/quotesJobs
Book against a quote. An Idempotency-Key makes a retry return the same job, never a second one.
POST /v1/jobsTracking
Read a job’s status and stops, the courier’s live position, and a tracking link for your customer.
GET /v1/jobs/{id}Webhooks
Signed with HMAC-SHA256 and retried ten times over about an hour and a half, so a short outage loses nothing.
POST /v1/webhooksPayments
A card on file, held at booking and captured on delivery. Every charge readable through the API.
GET /v1/chargesPlaces and routes
Address search, reverse lookup and the route between two points, for your own booking screens.
GET /v1/places
A job’s life
Every status change is a webhook, and the same status on GET /v1/jobs/{id}.
pendingsearchingcourier_assignedpicking_upin_transitdelivered
in_transitreturningreturnedCould not be handed over, brought back to you
cancelledCalled off before collection — not charged
failedNobody took it before the deadline
Webhook events
Each delivery carries the event name, a delivery id to de-duplicate on, and a signature over the timestamp and the body.
# Headers
Courier-Event: job.delivered
Courier-Delivery: 7f3c9e2a-…
Courier-Signature: t=1760090000,v1=5f2c…
job.bookedThe job is acceptedjob.courier_assignedA courier took itjob.picked_upCollected from youjob.deliveredHanded over, with proofjob.returnedBrought back to youjob.cancelledCalled offjob.failedNo courier took it in timejob.status_changedChanged by our operations teampayment_method.deadYour card stopped working
Getting a key
- 1
Ask for an account
We set up your merchant account and its first user.
- 2
Create a sandbox key
In the portal, under Integration. Keys starting ck_test_ only ever book pretend deliveries.
- 3
Build and test
Book against the sandbox with test cards and watch the webhooks arrive.
- 4
Go live
Swap in a ck_live_ key. Nothing else in your code changes.
Start with the quickstart
From a sandbox key to a booked delivery in a few minutes, with curl.