Quickstart
Create your first delivery in about ten minutes.
The Univooz API sends deliveries from your own software. You connect a branch to a fleet zone one time. After that you create orders with the API, and the fleet receives them immediately.
Start in test mode. Univooz checks and routes a test order for real, but no fleet sees it and you pay nothing.
Before you start
Your organization needs:
| Item | Where you set it |
|---|---|
A plan with features_standardApi or features_advancedApi | Dashboard |
| One branch with a main address that has coordinates | Dashboard |
| A connection from that branch to a fleet zone, set as primary | Dashboard |
Make a test API key
Open Developers → API keys and make a key.
You see the secret one time only. Keep it now.
The prefix decides the mode: uv_test_ makes test orders, uv_live_ makes live orders. No
field in a request can change this. See API keys.
Find your branch
The branch decides where the order goes. The delivery address does not.
curl https://api.univooz.com/v1/branches \
-H "Authorization: Bearer uv_test_YOUR_KEY"{
"data": [
{
"reference": "noerrebro",
"routesTo": {
"fleet": { "name": "Copenhagen Couriers" },
"zone": { "code": "CZ-K7M2PQR4", "name": "Central Zone" }
}
}
]
}Send reference as branch. If routesTo is null, set a primary connection first.
Create the order
curl https://api.univooz.com/v1/orders \
-H "Authorization: Bearer uv_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"externalOrderId": "PO-88213",
"branch": "noerrebro",
"customer": {
"firstName": "Alex",
"phone": "+45 20 12 34 56",
"address": {
"street": "Sortedam Dossering 55",
"city": "Copenhagen",
"postcode": "2100"
}
},
"schedule": { "mode": "asap" }
}'A 201 returns the order object:
{
"reference": "ORD-260729-LD4Q",
"status": "created",
"livemode": false,
"fleet": { "name": "Copenhagen Couriers" },
"schedule": {
"mode": "asap",
"resolved": {
"pickupTime": "2026-07-29T14:20:00+02:00",
"deliveryTime": "2026-07-29T14:50:00+02:00",
"basis": "busy_hours"
}
}
}schedule.resolved has the times Univooz agrees to.
Always send externalOrderId. Without it, a second attempt after a timeout sends two
couriers. See Stop duplicate orders.
Move it through the statuses
A test order has no courier, so you move it:
curl -X POST https://api.univooz.com/v1/test/orders/ORD-260729-LD4Q/advance \
-H "Authorization: Bearer uv_test_YOUR_KEY"Each step sends the real event to your test webhook endpoint. See Test mode.
Track it
| Method | Plan | Speed |
|---|---|---|
| Webhooks | Advanced | Immediate |
GET /v1/orders | Standard | Read it every 30 seconds |
Go live
- Make a
uv_live_key. Test and live keys, endpoints and secrets are separate. - Check that your subscription is active. See Plans and payment.
- Handle
branch_not_connected,address_low_confidence,no_shift_coverageandduplicate_external_order_id. - Read the
RateLimitheaders and slow down before Univooz rejects you.