Find out how to book a delivery with Quiver.
The Quiver API lets you offer Quiver delivery at your checkout, book collections and deliveries, and track them through to completion.
How an integration works
Every booking follows the same three steps:
- Quote — ask Quiver what services are available for a given collection point, delivery address and date. You get back a list of rates with prices and delivery windows.
- Book — create a delivery using one of the rates from that quote. A quote is always required before booking.
- Track — receive status updates via webhooks, or poll the delivery.
Quotes expire. A quote reflects live capacity, so it goes stale after roughly 2 minutes, or as soon as any detail changes (address, date, contents). Always request a fresh quote immediately before booking — don't cache them.
Base URL
https://api.quiver.london
All endpoints in this reference are relative to that host — for example POST https://api.quiver.london/task/quotes.
Getting an account
New to Quiver? Start at quiver.co.uk/onboard to set up an account — you can sign up directly or book a 30-minute walkthrough with the team.
Already a Quiver merchant and just need API access? Email [email protected] with your company name and the platform you're integrating from.
Authentication
Every request must include your API key in the x-api-key header:
curl https://api.quiver.london/task/quotes \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ ... }'
Find your key by logging in at app.quiver.co.uk and going to Settings.
Requests without a valid key are rejected with 403 Forbidden. Treat the key as a secret: never expose it in browser or mobile app code — call the Quiver API from your server.
Errors
Errors return a non-2xx HTTP status and a JSON body containing a human-readable message:
{ "error": "task: with merchantOrderId 1234567890 already exists as taskId 228760" }
| HTTP | Meaning | What to do |
|---|---|---|
| 400 | Invalid or missing fields | Fix the request. Retrying won't help. |
| 401 / 403 | Missing or invalid API key | Check the x-api-key header. |
| 404 | Resource not found | Check the ID. |
| 409 | Already exists (see below) | Usually safe to treat as success. |
| 429 | Too many requests | Back off and retry. |
| 500 / 503 / 504 | Temporary problem our end | Retry with backoff. |
Duplicate orders and safe retries
The API de-duplicates on merchantOrderId. You cannot accidentally create two deliveries for the same order — which means retrying a booking is safe.
If a delivery already exists for that order ID, you'll get one of:
already exists as taskId N— the booking succeeded previously. Use the returned task ID; do not retry.creation already in progress— an identical request is still being processed. Wait a moment, then look the order up rather than re-sending.
Both mean the order is safely with us. Treat them as success, not failure.
Recommended retry behaviour
- Retry on 500, 502, 503, 504 and network timeouts, with exponential backoff (e.g. 1s, 2s, 4s, 8s) for up to a few minutes.
- Do not retry on 400 — the request needs fixing first.
- Always send the same
merchantOrderIdwhen retrying, so de-duplication protects you. - If a booking is still failing after your retries, the order has not been booked. Fall back to your normal process and contact support.
Set a request timeout of at least 10 seconds for bookings. Quote calls are typically fast, but allow 5 seconds before timing out.
Fair use
There is no hard rate limit on standard accounts, but please keep request rates reasonable and avoid tight polling loops — use webhooks for status updates instead. If you expect high volume, contact us first so we can plan for it.
Webhooks
Rather than polling, subscribe to webhooks for delivery creation and status changes. See the Webhooks section of this reference.
Support
Email [email protected] for integration help or to report a problem. Include your merchant name and, where relevant, the merchantOrderId or task ID involved.