univoozAPI

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:

ItemWhere you set it
A plan with features_standardApi or features_advancedApiDashboard
One branch with a main address that has coordinatesDashboard
A connection from that branch to a fleet zone, set as primaryDashboard

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

MethodPlanSpeed
WebhooksAdvancedImmediate
GET /v1/ordersStandardRead it every 30 seconds

Go live

  1. Make a uv_live_ key. Test and live keys, endpoints and secrets are separate.
  2. Check that your subscription is active. See Plans and payment.
  3. Handle branch_not_connected, address_low_confidence, no_shift_coverage and duplicate_external_order_id.
  4. Read the RateLimit headers and slow down before Univooz rejects you.

On this page