Skip to main content

Overview

The V3 Routing API is a high-performance vehicle routing solver. It replaces the V2 VRP API with a faster engine, a cleaner job model with flat visit fields, and an itemised cost breakdown in every response.

Base URL

https://api.solvice.io/v3/routing

Your first solve

1

Get your API key

Sign in to the Solvice Dashboard and copy your API key from Settings → API Keys.
2

Send a solve request

curl -X POST https://api.solvice.io/v3/routing/solve \
  -H "Authorization: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "vehicles": [
      {
        "id": "truck-1",
        "capacity": { "weight": 100 },
        "shifts": [
          {
            "from": "2026-04-01T08:00:00+02:00",
            "to":   "2026-04-01T17:00:00+02:00",
            "start": { "coordinate": [4.3517, 50.8503] },
            "end":   { "coordinate": [4.3517, 50.8503] }
          }
        ]
      }
    ],
    "jobs": [
      {
        "id": "delivery-1",
        "location": { "coordinate": [4.7005, 50.8798] },
        "service_duration_s": 300,
        "time_windows": [
          {
            "from": "2026-04-01T09:00:00+02:00",
            "to":   "2026-04-01T12:00:00+02:00"
          }
        ],
        "demand": { "weight": 10 }
      },
      {
        "id": "delivery-2",
        "location": { "coordinate": [3.7303, 51.0500] },
        "service_duration_s": 600,
        "time_windows": [
          {
            "from": "2026-04-01T10:00:00+02:00",
            "to":   "2026-04-01T15:00:00+02:00"
          }
        ],
        "demand": { "weight": 20 }
      }
    ]
  }'
3

Read the response

The response includes optimised routes with arrival times, distances, an itemised cost breakdown, and any unassigned jobs:
{
  "summary": {
    "status": "solved",
    "vehicles_used": 1,
    "jobs_assigned": 2,
    "jobs_unassigned": 0,
    "total_distance_m": 142000,
    "total_duration_s": 7200,
    "estimated_cost": {
      "total": 7200,
      "components": {
        "travel": 7200,
        "waiting": 0,
        "overtime": 0,
        "lateness": 0,
        "vehicles_fixed": 0,
        "unassigned": 0,
        "preferences": 0,
        "imbalance": 0
      }
    },
    "elapsed_ms": 850,
    "iterations": 1200
  },
  "routes": [
    {
      "vehicle": { "type": "truck-1", "instance": 1 },
      "distance_m": 142000,
      "duration_s": 7200,
      "overtime_s": 0,
      "stops": [
        {
          "type": "start",
          "location": [4.3517, 50.8503],
          "departure": "2026-04-01T08:00:00+02:00"
        },
        {
          "type": "job",
          "id": "delivery-2",
          "location": [3.7303, 51.0500],
          "arrival": "2026-04-01T10:00:00+02:00",
          "departure": "2026-04-01T10:10:00+02:00",
          "wait_s": 0,
          "service_s": 600,
          "travel_time_s": 7200,
          "load_after": { "weight": 20 }
        },
        {
          "type": "job",
          "id": "delivery-1",
          "location": [4.7005, 50.8798],
          "arrival": "2026-04-01T11:10:00+02:00",
          "departure": "2026-04-01T11:15:00+02:00",
          "wait_s": 0,
          "service_s": 300,
          "travel_time_s": 3600,
          "load_after": { "weight": 30 }
        },
        {
          "type": "end",
          "location": [4.3517, 50.8503],
          "arrival": "2026-04-01T12:15:00+02:00"
        }
      ]
    }
  ],
  "unassigned": []
}

What’s new in V3

FeatureV2V3
Solver engineTimefoldNext-gen Solvice engine
Task modeljobs[] flat array (V2 schema)jobs[] with flat visit fields; shipments Coming soon
Capacity / demandArray [100]Named map { "weight": 100 }
Start/end depotVehicle top-levelInside shifts[]
Distance matricesManual or autoAuto via Solvice Maps
Response formatNested trips/visitsTyped stops[] with load_after named map
Cost breakdownNoneItemised estimated_cost in every response
Endpoint/v2/vrp/sync/solve/v3/routing/solve

Next steps