Evaluate
Score a fixed assignment — objective totals, timing, loads and constraint violations, without optimizing
curl --request POST \
--url https://api.solvice.io/v3/routing/evaluate \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"plan": {
"routes": [
{
"shift": "mon",
"stops": [
{
"id": "job-1",
"type": "job"
}
],
"vehicle": "v1"
}
]
},
"problem": {
"jobs": [
{
"id": "job-1",
"location": [
3.725,
51.05
],
"pickup": {
"weight": 10
},
"service_duration_s": 300
}
],
"vehicles": [
{
"capacity": {
"weight": 500
},
"id": "v1",
"shifts": [
{
"end": {
"location": [
3.7174,
51.0543
]
},
"from": "2026-07-01T08:00:00+02:00",
"id": "mon",
"start": {
"location": [
3.7174,
51.0543
]
},
"to": "2026-07-01T17:00:00+02:00"
}
]
}
]
}
}
'import requests
url = "https://api.solvice.io/v3/routing/evaluate"
payload = {
"plan": { "routes": [
{
"shift": "mon",
"stops": [
{
"id": "job-1",
"type": "job"
}
],
"vehicle": "v1"
}
] },
"problem": {
"jobs": [
{
"id": "job-1",
"location": [3.725, 51.05],
"pickup": { "weight": 10 },
"service_duration_s": 300
}
],
"vehicles": [
{
"capacity": { "weight": 500 },
"id": "v1",
"shifts": [
{
"end": { "location": [3.7174, 51.0543] },
"from": "2026-07-01T08:00:00+02:00",
"id": "mon",
"start": { "location": [3.7174, 51.0543] },
"to": "2026-07-01T17:00:00+02:00"
}
]
}
]
}
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
plan: {routes: [{shift: 'mon', stops: [{id: 'job-1', type: 'job'}], vehicle: 'v1'}]},
problem: {
jobs: [
{
id: 'job-1',
location: [3.725, 51.05],
pickup: {weight: 10},
service_duration_s: 300
}
],
vehicles: [
{
capacity: {weight: 500},
id: 'v1',
shifts: [
{
end: {location: [3.7174, 51.0543]},
from: '2026-07-01T08:00:00+02:00',
id: 'mon',
start: {location: [3.7174, 51.0543]},
to: '2026-07-01T17:00:00+02:00'
}
]
}
]
}
})
};
fetch('https://api.solvice.io/v3/routing/evaluate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.solvice.io/v3/routing/evaluate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'plan' => [
'routes' => [
[
'shift' => 'mon',
'stops' => [
[
'id' => 'job-1',
'type' => 'job'
]
],
'vehicle' => 'v1'
]
]
],
'problem' => [
'jobs' => [
[
'id' => 'job-1',
'location' => [
3.725,
51.05
],
'pickup' => [
'weight' => 10
],
'service_duration_s' => 300
]
],
'vehicles' => [
[
'capacity' => [
'weight' => 500
],
'id' => 'v1',
'shifts' => [
[
'end' => [
'location' => [
3.7174,
51.0543
]
],
'from' => '2026-07-01T08:00:00+02:00',
'id' => 'mon',
'start' => [
'location' => [
3.7174,
51.0543
]
],
'to' => '2026-07-01T17:00:00+02:00'
]
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.solvice.io/v3/routing/evaluate"
payload := strings.NewReader("{\n \"plan\": {\n \"routes\": [\n {\n \"shift\": \"mon\",\n \"stops\": [\n {\n \"id\": \"job-1\",\n \"type\": \"job\"\n }\n ],\n \"vehicle\": \"v1\"\n }\n ]\n },\n \"problem\": {\n \"jobs\": [\n {\n \"id\": \"job-1\",\n \"location\": [\n 3.725,\n 51.05\n ],\n \"pickup\": {\n \"weight\": 10\n },\n \"service_duration_s\": 300\n }\n ],\n \"vehicles\": [\n {\n \"capacity\": {\n \"weight\": 500\n },\n \"id\": \"v1\",\n \"shifts\": [\n {\n \"end\": {\n \"location\": [\n 3.7174,\n 51.0543\n ]\n },\n \"from\": \"2026-07-01T08:00:00+02:00\",\n \"id\": \"mon\",\n \"start\": {\n \"location\": [\n 3.7174,\n 51.0543\n ]\n },\n \"to\": \"2026-07-01T17:00:00+02:00\"\n }\n ]\n }\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.solvice.io/v3/routing/evaluate")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"plan\": {\n \"routes\": [\n {\n \"shift\": \"mon\",\n \"stops\": [\n {\n \"id\": \"job-1\",\n \"type\": \"job\"\n }\n ],\n \"vehicle\": \"v1\"\n }\n ]\n },\n \"problem\": {\n \"jobs\": [\n {\n \"id\": \"job-1\",\n \"location\": [\n 3.725,\n 51.05\n ],\n \"pickup\": {\n \"weight\": 10\n },\n \"service_duration_s\": 300\n }\n ],\n \"vehicles\": [\n {\n \"capacity\": {\n \"weight\": 500\n },\n \"id\": \"v1\",\n \"shifts\": [\n {\n \"end\": {\n \"location\": [\n 3.7174,\n 51.0543\n ]\n },\n \"from\": \"2026-07-01T08:00:00+02:00\",\n \"id\": \"mon\",\n \"start\": {\n \"location\": [\n 3.7174,\n 51.0543\n ]\n },\n \"to\": \"2026-07-01T17:00:00+02:00\"\n }\n ]\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.solvice.io/v3/routing/evaluate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"plan\": {\n \"routes\": [\n {\n \"shift\": \"mon\",\n \"stops\": [\n {\n \"id\": \"job-1\",\n \"type\": \"job\"\n }\n ],\n \"vehicle\": \"v1\"\n }\n ]\n },\n \"problem\": {\n \"jobs\": [\n {\n \"id\": \"job-1\",\n \"location\": [\n 3.725,\n 51.05\n ],\n \"pickup\": {\n \"weight\": 10\n },\n \"service_duration_s\": 300\n }\n ],\n \"vehicles\": [\n {\n \"capacity\": {\n \"weight\": 500\n },\n \"id\": \"v1\",\n \"shifts\": [\n {\n \"end\": {\n \"location\": [\n 3.7174,\n 51.0543\n ]\n },\n \"from\": \"2026-07-01T08:00:00+02:00\",\n \"id\": \"mon\",\n \"start\": {\n \"location\": [\n 3.7174,\n 51.0543\n ]\n },\n \"to\": \"2026-07-01T17:00:00+02:00\"\n }\n ]\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"plan": {
"routes": [
{
"shift": "mon",
"stops": [
{
"id": "job-1",
"type": "job"
},
{
"id": "job-2",
"type": "job"
}
],
"vehicle": "v1"
}
]
},
"routes": [
{
"distance_m": 8450,
"load_peak": {
"weight": 55
},
"shift": "mon",
"stops": [
{
"arrival": "2026-07-01T08:00:00+02:00",
"departure": "2026-07-01T08:00:00+02:00",
"depot": "gent",
"load_after": {
"weight": 0
},
"location": [
3.7174,
51.0543
],
"service_s": 0,
"type": "start"
},
{
"arrival": "2026-07-01T08:10:00+02:00",
"departure": "2026-07-01T09:05:00+02:00",
"distance_m": 2600,
"id": "job-1",
"lateness_s": 0,
"load_after": {
"weight": 20
},
"location": [
3.725,
51.05
],
"service_s": 300,
"travel_s": 600,
"type": "job",
"wait_s": 3000
},
{
"arrival": "2026-07-01T09:13:00+02:00",
"departure": "2026-07-01T09:23:00+02:00",
"distance_m": 2350,
"id": "job-2",
"lateness_s": 0,
"load_after": {
"weight": 55
},
"location": [
3.71,
51.06
],
"service_s": 600,
"travel_s": 480,
"type": "job",
"wait_s": 0
},
{
"arrival": "2026-07-01T09:38:00+02:00",
"departure": "2026-07-01T09:38:00+02:00",
"depot": "gent",
"distance_m": 3500,
"load_after": {
"weight": 55
},
"location": [
3.7174,
51.0543
],
"service_s": 0,
"travel_s": 900,
"type": "end"
}
],
"time": {
"break_s": 0,
"depot_s": 0,
"overtime_s": 0,
"service_s": 900,
"span_s": 5880,
"travel_s": 1980,
"wait_s": 3000
},
"vehicle": "v1"
}
],
"summary": {
"distance_m": 8450,
"score": {
"components": {
"depot_visits": 0,
"distance": 1.69,
"drop_fees": 0,
"fixed": 0,
"grouping": 0,
"lateness": 0,
"other": 0,
"overtime": 0,
"tag_preference": 0,
"target": 0,
"time": 57.1536,
"waiting": 0,
"window_choice": 0
},
"cost": 58.8436,
"currency": "EUR",
"unserved_priority": 0,
"violations": 0
},
"shifts_used": 1,
"tasks": {
"served": 2,
"unserved": 0,
"unserved_required": 0
},
"time": {
"break_s": 0,
"depot_s": 0,
"overtime_s": 0,
"service_s": 900,
"span_s": 5880,
"travel_s": 1980,
"wait_s": 3000
},
"timings": {
"search_ms": 100,
"total_ms": 142
},
"vehicles_used": 1
},
"unassigned": []
}{
"code": "invalid_request",
"errors": [
{
"code": "out_of_range",
"message": "depot 'gent': service_duration_s must be >= 0, got -60",
"pointer": "/problem/depots/0/service_duration_s"
}
],
"message": "depot 'gent': service_duration_s must be >= 0, got -60",
"request_id": "req_7f3a2c90d1e4b5a6",
"status": "BAD_REQUEST"
}{
"code": "feature_not_enabled",
"message": "travel.engine: 'tomtom_real_time' is not enabled for this account; use engine 'tomtom'",
"request_id": "req_7f3a2c90d1e4b5a6",
"status": "FORBIDDEN"
}{
"code": "payload_too_large",
"message": "Request body exceeds 10485760 bytes",
"request_id": "req_7f3a2c90d1e4b5a6",
"status": "PAYLOAD_TOO_LARGE"
}{
"code": "unsupported_media_type",
"message": "Expected request with `Content-Type: application/json`",
"request_id": "req_7f3a2c90d1e4b5a6",
"status": "UNSUPPORTED_MEDIA_TYPE"
}{
"code": "invalid_request",
"errors": [
{
"code": "out_of_range",
"message": "depot 'gent': service_duration_s must be >= 0, got -60",
"pointer": "/problem/depots/0/service_duration_s"
}
],
"message": "depot 'gent': service_duration_s must be >= 0, got -60",
"request_id": "req_7f3a2c90d1e4b5a6",
"status": "BAD_REQUEST"
}{
"code": "invalid_request",
"errors": [
{
"code": "out_of_range",
"message": "depot 'gent': service_duration_s must be >= 0, got -60",
"pointer": "/problem/depots/0/service_duration_s"
}
],
"message": "depot 'gent': service_duration_s must be >= 0, got -60",
"request_id": "req_7f3a2c90d1e4b5a6",
"status": "BAD_REQUEST"
}{
"code": "overloaded",
"message": "Circuit breaker is open — Solvice Maps temporarily unavailable",
"request_id": "req_7f3a2c90d1e4b5a6",
"status": "SERVICE_UNAVAILABLE"
}Authorizations
Query Parameters
Check the request without fetching a matrix or searching. 200
{"valid": true, "warnings": []}, or a 400 for the problem, options
and caps; plan is matched against the problem only by the real call,
after the fetch (suggest's check that plan leaves a task to place
does run here).
Any other query parameter is rejected with a 400 unknown_field, as in
the body: a misspelt validateOnly must not fall through to a billed
solve.
Body
Request body for POST /v3/routing/evaluate.
Scores plan against problem without running the optimizer: objective
totals, timing, loads and constraint violations. Tasks absent from every
route are reported as unassigned. A solve response's plan goes in as it
stands.
The plan to score.
Show child attributes
Show child attributes
Problem definition — identical to POST /v3/routing/solve.
Show child attributes
Show child attributes
{ "depots": [ { "id": "gent", "location": [3.7174, 51.0543] } ], "jobs": [ { "id": "job-1", "location": [3.725, 51.05], "pickup": { "weight": 20 }, "service_duration_s": 300 } ], "vehicles": [ { "capacity": { "weight": 500 }, "id": "v1", "shifts": [ { "end": { "depot": "gent" }, "from": "2026-07-01T08:00:00+02:00", "id": "mon", "start": { "depot": "gent" }, "to": "2026-07-01T17:00:00+02:00" } ] } ] }
Response
Solution evaluated. With ?validate_only=true: a ValidateOnlyResponse, {"valid": true, "warnings": []}, without a matrix fetch, not billed.
- Option 1
- Option 2
The 200 body of solve, evaluate and suggest: the call's result, or with
?validate_only=true the validation verdict (ValidateOnlyResponse).
The plan these routes follow, in the request's vocabulary: valid input to evaluate, suggest or a warm-started solve as it stands.
Show child attributes
Show child attributes
One entry per non-empty route.
Show child attributes
Show child attributes
Aggregate statistics for the solve run.
Show child attributes
Show child attributes
{ "distance_m": 8450, "score": { "components": { "depot_visits": 0, "distance": 1.69, "drop_fees": 0, "fixed": 0, "grouping": 0, "lateness": 0, "other": 0, "overtime": 0, "tag_preference": 0, "target": 0, "time": 57.1536, "waiting": 0, "window_choice": 0 }, "cost": 58.8436, "currency": "EUR", "unserved_priority": 0, "violations": 0 }, "shifts_used": 1, "tasks": { "served": 2, "unserved": 0, "unserved_required": 0 }, "time": { "break_s": 0, "depot_s": 0, "overtime_s": 0, "service_s": 900, "span_s": 5880, "travel_s": 1980, "wait_s": 3000 }, "timings": { "search_ms": 100, "total_ms": 142 }, "vehicles_used": 1 }
Tasks that could not be feasibly assigned.
Show child attributes
Show child attributes
Was this page helpful?
curl --request POST \
--url https://api.solvice.io/v3/routing/evaluate \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"plan": {
"routes": [
{
"shift": "mon",
"stops": [
{
"id": "job-1",
"type": "job"
}
],
"vehicle": "v1"
}
]
},
"problem": {
"jobs": [
{
"id": "job-1",
"location": [
3.725,
51.05
],
"pickup": {
"weight": 10
},
"service_duration_s": 300
}
],
"vehicles": [
{
"capacity": {
"weight": 500
},
"id": "v1",
"shifts": [
{
"end": {
"location": [
3.7174,
51.0543
]
},
"from": "2026-07-01T08:00:00+02:00",
"id": "mon",
"start": {
"location": [
3.7174,
51.0543
]
},
"to": "2026-07-01T17:00:00+02:00"
}
]
}
]
}
}
'import requests
url = "https://api.solvice.io/v3/routing/evaluate"
payload = {
"plan": { "routes": [
{
"shift": "mon",
"stops": [
{
"id": "job-1",
"type": "job"
}
],
"vehicle": "v1"
}
] },
"problem": {
"jobs": [
{
"id": "job-1",
"location": [3.725, 51.05],
"pickup": { "weight": 10 },
"service_duration_s": 300
}
],
"vehicles": [
{
"capacity": { "weight": 500 },
"id": "v1",
"shifts": [
{
"end": { "location": [3.7174, 51.0543] },
"from": "2026-07-01T08:00:00+02:00",
"id": "mon",
"start": { "location": [3.7174, 51.0543] },
"to": "2026-07-01T17:00:00+02:00"
}
]
}
]
}
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
plan: {routes: [{shift: 'mon', stops: [{id: 'job-1', type: 'job'}], vehicle: 'v1'}]},
problem: {
jobs: [
{
id: 'job-1',
location: [3.725, 51.05],
pickup: {weight: 10},
service_duration_s: 300
}
],
vehicles: [
{
capacity: {weight: 500},
id: 'v1',
shifts: [
{
end: {location: [3.7174, 51.0543]},
from: '2026-07-01T08:00:00+02:00',
id: 'mon',
start: {location: [3.7174, 51.0543]},
to: '2026-07-01T17:00:00+02:00'
}
]
}
]
}
})
};
fetch('https://api.solvice.io/v3/routing/evaluate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.solvice.io/v3/routing/evaluate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'plan' => [
'routes' => [
[
'shift' => 'mon',
'stops' => [
[
'id' => 'job-1',
'type' => 'job'
]
],
'vehicle' => 'v1'
]
]
],
'problem' => [
'jobs' => [
[
'id' => 'job-1',
'location' => [
3.725,
51.05
],
'pickup' => [
'weight' => 10
],
'service_duration_s' => 300
]
],
'vehicles' => [
[
'capacity' => [
'weight' => 500
],
'id' => 'v1',
'shifts' => [
[
'end' => [
'location' => [
3.7174,
51.0543
]
],
'from' => '2026-07-01T08:00:00+02:00',
'id' => 'mon',
'start' => [
'location' => [
3.7174,
51.0543
]
],
'to' => '2026-07-01T17:00:00+02:00'
]
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.solvice.io/v3/routing/evaluate"
payload := strings.NewReader("{\n \"plan\": {\n \"routes\": [\n {\n \"shift\": \"mon\",\n \"stops\": [\n {\n \"id\": \"job-1\",\n \"type\": \"job\"\n }\n ],\n \"vehicle\": \"v1\"\n }\n ]\n },\n \"problem\": {\n \"jobs\": [\n {\n \"id\": \"job-1\",\n \"location\": [\n 3.725,\n 51.05\n ],\n \"pickup\": {\n \"weight\": 10\n },\n \"service_duration_s\": 300\n }\n ],\n \"vehicles\": [\n {\n \"capacity\": {\n \"weight\": 500\n },\n \"id\": \"v1\",\n \"shifts\": [\n {\n \"end\": {\n \"location\": [\n 3.7174,\n 51.0543\n ]\n },\n \"from\": \"2026-07-01T08:00:00+02:00\",\n \"id\": \"mon\",\n \"start\": {\n \"location\": [\n 3.7174,\n 51.0543\n ]\n },\n \"to\": \"2026-07-01T17:00:00+02:00\"\n }\n ]\n }\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.solvice.io/v3/routing/evaluate")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"plan\": {\n \"routes\": [\n {\n \"shift\": \"mon\",\n \"stops\": [\n {\n \"id\": \"job-1\",\n \"type\": \"job\"\n }\n ],\n \"vehicle\": \"v1\"\n }\n ]\n },\n \"problem\": {\n \"jobs\": [\n {\n \"id\": \"job-1\",\n \"location\": [\n 3.725,\n 51.05\n ],\n \"pickup\": {\n \"weight\": 10\n },\n \"service_duration_s\": 300\n }\n ],\n \"vehicles\": [\n {\n \"capacity\": {\n \"weight\": 500\n },\n \"id\": \"v1\",\n \"shifts\": [\n {\n \"end\": {\n \"location\": [\n 3.7174,\n 51.0543\n ]\n },\n \"from\": \"2026-07-01T08:00:00+02:00\",\n \"id\": \"mon\",\n \"start\": {\n \"location\": [\n 3.7174,\n 51.0543\n ]\n },\n \"to\": \"2026-07-01T17:00:00+02:00\"\n }\n ]\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.solvice.io/v3/routing/evaluate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"plan\": {\n \"routes\": [\n {\n \"shift\": \"mon\",\n \"stops\": [\n {\n \"id\": \"job-1\",\n \"type\": \"job\"\n }\n ],\n \"vehicle\": \"v1\"\n }\n ]\n },\n \"problem\": {\n \"jobs\": [\n {\n \"id\": \"job-1\",\n \"location\": [\n 3.725,\n 51.05\n ],\n \"pickup\": {\n \"weight\": 10\n },\n \"service_duration_s\": 300\n }\n ],\n \"vehicles\": [\n {\n \"capacity\": {\n \"weight\": 500\n },\n \"id\": \"v1\",\n \"shifts\": [\n {\n \"end\": {\n \"location\": [\n 3.7174,\n 51.0543\n ]\n },\n \"from\": \"2026-07-01T08:00:00+02:00\",\n \"id\": \"mon\",\n \"start\": {\n \"location\": [\n 3.7174,\n 51.0543\n ]\n },\n \"to\": \"2026-07-01T17:00:00+02:00\"\n }\n ]\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"plan": {
"routes": [
{
"shift": "mon",
"stops": [
{
"id": "job-1",
"type": "job"
},
{
"id": "job-2",
"type": "job"
}
],
"vehicle": "v1"
}
]
},
"routes": [
{
"distance_m": 8450,
"load_peak": {
"weight": 55
},
"shift": "mon",
"stops": [
{
"arrival": "2026-07-01T08:00:00+02:00",
"departure": "2026-07-01T08:00:00+02:00",
"depot": "gent",
"load_after": {
"weight": 0
},
"location": [
3.7174,
51.0543
],
"service_s": 0,
"type": "start"
},
{
"arrival": "2026-07-01T08:10:00+02:00",
"departure": "2026-07-01T09:05:00+02:00",
"distance_m": 2600,
"id": "job-1",
"lateness_s": 0,
"load_after": {
"weight": 20
},
"location": [
3.725,
51.05
],
"service_s": 300,
"travel_s": 600,
"type": "job",
"wait_s": 3000
},
{
"arrival": "2026-07-01T09:13:00+02:00",
"departure": "2026-07-01T09:23:00+02:00",
"distance_m": 2350,
"id": "job-2",
"lateness_s": 0,
"load_after": {
"weight": 55
},
"location": [
3.71,
51.06
],
"service_s": 600,
"travel_s": 480,
"type": "job",
"wait_s": 0
},
{
"arrival": "2026-07-01T09:38:00+02:00",
"departure": "2026-07-01T09:38:00+02:00",
"depot": "gent",
"distance_m": 3500,
"load_after": {
"weight": 55
},
"location": [
3.7174,
51.0543
],
"service_s": 0,
"travel_s": 900,
"type": "end"
}
],
"time": {
"break_s": 0,
"depot_s": 0,
"overtime_s": 0,
"service_s": 900,
"span_s": 5880,
"travel_s": 1980,
"wait_s": 3000
},
"vehicle": "v1"
}
],
"summary": {
"distance_m": 8450,
"score": {
"components": {
"depot_visits": 0,
"distance": 1.69,
"drop_fees": 0,
"fixed": 0,
"grouping": 0,
"lateness": 0,
"other": 0,
"overtime": 0,
"tag_preference": 0,
"target": 0,
"time": 57.1536,
"waiting": 0,
"window_choice": 0
},
"cost": 58.8436,
"currency": "EUR",
"unserved_priority": 0,
"violations": 0
},
"shifts_used": 1,
"tasks": {
"served": 2,
"unserved": 0,
"unserved_required": 0
},
"time": {
"break_s": 0,
"depot_s": 0,
"overtime_s": 0,
"service_s": 900,
"span_s": 5880,
"travel_s": 1980,
"wait_s": 3000
},
"timings": {
"search_ms": 100,
"total_ms": 142
},
"vehicles_used": 1
},
"unassigned": []
}{
"code": "invalid_request",
"errors": [
{
"code": "out_of_range",
"message": "depot 'gent': service_duration_s must be >= 0, got -60",
"pointer": "/problem/depots/0/service_duration_s"
}
],
"message": "depot 'gent': service_duration_s must be >= 0, got -60",
"request_id": "req_7f3a2c90d1e4b5a6",
"status": "BAD_REQUEST"
}{
"code": "feature_not_enabled",
"message": "travel.engine: 'tomtom_real_time' is not enabled for this account; use engine 'tomtom'",
"request_id": "req_7f3a2c90d1e4b5a6",
"status": "FORBIDDEN"
}{
"code": "payload_too_large",
"message": "Request body exceeds 10485760 bytes",
"request_id": "req_7f3a2c90d1e4b5a6",
"status": "PAYLOAD_TOO_LARGE"
}{
"code": "unsupported_media_type",
"message": "Expected request with `Content-Type: application/json`",
"request_id": "req_7f3a2c90d1e4b5a6",
"status": "UNSUPPORTED_MEDIA_TYPE"
}{
"code": "invalid_request",
"errors": [
{
"code": "out_of_range",
"message": "depot 'gent': service_duration_s must be >= 0, got -60",
"pointer": "/problem/depots/0/service_duration_s"
}
],
"message": "depot 'gent': service_duration_s must be >= 0, got -60",
"request_id": "req_7f3a2c90d1e4b5a6",
"status": "BAD_REQUEST"
}{
"code": "invalid_request",
"errors": [
{
"code": "out_of_range",
"message": "depot 'gent': service_duration_s must be >= 0, got -60",
"pointer": "/problem/depots/0/service_duration_s"
}
],
"message": "depot 'gent': service_duration_s must be >= 0, got -60",
"request_id": "req_7f3a2c90d1e4b5a6",
"status": "BAD_REQUEST"
}{
"code": "overloaded",
"message": "Circuit breaker is open — Solvice Maps temporarily unavailable",
"request_id": "req_7f3a2c90d1e4b5a6",
"status": "SERVICE_UNAVAILABLE"
}