Async runs
Run result
Fetch the plan of a finished run
GET
/
v3
/
routing
/
runs
/
{id}
/
result
Get the plan of a run
curl --request GET \
--url https://api.solvice.io/v3/routing/runs/{id}/result \
--header 'Authorization: <api-key>'import requests
url = "https://api.solvice.io/v3/routing/runs/{id}/result"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.solvice.io/v3/routing/runs/{id}/result', 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/runs/{id}/result",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.solvice.io/v3/routing/runs/{id}/result"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.solvice.io/v3/routing/runs/{id}/result")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.solvice.io/v3/routing/runs/{id}/result")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
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": []
}{
"error": "Invalid UUID string: not-a-uuid"
}{
"message": "not_found: routing run d28568b1-34cc-4f89-b10b-dc24b26a8275",
"error": "GATEWAY_ERROR"
}{
"message": "run_not_finished: run d28568b1-34cc-4f89-b10b-dc24b26a8275 is queued",
"error": "GATEWAY_ERROR"
}V3 is in beta. General availability (GA) is planned for January 2027.
Authorizations
Path Parameters
The run id returned by POST /v3/routing/runs.
Response
The plan.
The result of POST /v3/routing/solve and POST /v3/routing/evaluate:
one shape for a plan the solver built and a plan it was given to score.
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
Example:
{
"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?
⌘I
Get the plan of a run
curl --request GET \
--url https://api.solvice.io/v3/routing/runs/{id}/result \
--header 'Authorization: <api-key>'import requests
url = "https://api.solvice.io/v3/routing/runs/{id}/result"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.solvice.io/v3/routing/runs/{id}/result', 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/runs/{id}/result",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.solvice.io/v3/routing/runs/{id}/result"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.solvice.io/v3/routing/runs/{id}/result")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.solvice.io/v3/routing/runs/{id}/result")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
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": []
}{
"error": "Invalid UUID string: not-a-uuid"
}{
"message": "not_found: routing run d28568b1-34cc-4f89-b10b-dc24b26a8275",
"error": "GATEWAY_ERROR"
}{
"message": "run_not_finished: run d28568b1-34cc-4f89-b10b-dc24b26a8275 is queued",
"error": "GATEWAY_ERROR"
}