Inputs the request carried that changed nothing. Always present,
empty when there are none (no input produces one today); at most 100
are returned. Each item has a code, a pointer to the field and a
message. Accept codes you do not know.
How the best plan improved during the search, oldest first: the
starting plan, every improvement (thinned to at most 500 entries), and
the final plan, which equals summary.score (it can equal, or be
slightly worse than, the entry before it). Present on every solve;
absent on evaluate, which does not search. A large request that is
solved in parts has the final entry alone.
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>'
{
"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"
}
{"docsConfig":{"theme":"maple","$schema":"https://mintlify.com/docs.json","name":"Solvice Docs","description":"Solvice API documentation for cloud-native optimization solvers. Build powerful route optimization, workforce scheduling, and resource allocation solutions with our VRP, shift planning, and clustering APIs.","colors":{"primary":"#0f62fe","light":"#0f62fe","dark":"#0f62fe"},"logo":{"light":"https://mintcdn.com/solvice-68592f22/1KJ_2AIotizI1Bng/logo/light.svg?fit=max\u0026auto=format\u0026n=1KJ_2AIotizI1Bng\u0026q=85\u0026s=e93560fee320491613107060a1afc094","dark":"https://mintcdn.com/solvice-68592f22/1KJ_2AIotizI1Bng/logo/dark.svg?fit=max\u0026auto=format\u0026n=1KJ_2AIotizI1Bng\u0026q=85\u0026s=1baeb15bf7826f571444a1d6a36fb31a"},"favicon":"https://mintcdn.com/solvice-68592f22/noMIHjSWP2Tg_tTz/favicon.png?fit=max\u0026auto=format\u0026n=noMIHjSWP2Tg_tTz\u0026q=85\u0026s=beff99df9d507e0794596b5437be687f","api":{"mdx":{"auth":{"method":"key","name":"Authorization"}}},"navbar":{"links":[{"href":"mailto:support@solvice.io","label":"Support"},{"href":"https://www.solvice.io","label":"Solvice website"}],"primary":{"type":"button","label":"Dashboard","href":"https://platform.solvice.io"}},"footer":{"socials":{"website":"https://www.solvice.io","x":"https://x.com/solvice_io","github":"https://github.com/solvice","linkedin":"https://linkedin.com/company/solvice"}},"seo":{"metatags":{"og:image":"link to your default meta tag image","charset":"UTF-8","viewport":"width=device-width, initial-scale=1.0","description":"Solvice API documentation for cloud-native optimization solvers. Build powerful route optimization, workforce scheduling, and resource allocation solutions with our VRP, shift planning, and clustering APIs.","keywords":"Route Optimization, Route API, Optimization API, Workforce Scheduling, Solvice","author":"Christophe Van Huele","robots":"index, follow","googlebot":"index, follow","google":"notranslate","google-site-verification":"verification_token"},"indexing":"all"},"integrations":{"ga4":{"measurementId":"G-2L8R78J6J9"}},"banner":{"content":"Solvice VRP API v3 is in beta. General availability (GA) is planned for January 2027.","dismissible":false},"contextual":{"options":["claude","copy"],"display":"header"},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"Dashboard","icon":"book-open-cover","href":"https://platform.solvice.io"},{"anchor":"Website","icon":"planet-ringed","href":"https://www.solvice.io"},{"anchor":"Blog","icon":"newspaper","href":"https://www.solvice.io/blog/news"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"solvice-68592f22","hasAudioNarration":false,"actualSubdomain":"solvice-68592f22","customDomains":["docs.solvice.io"],"gitSource":{"type":"gitlab","owner":"solvice","repo":"solver2","projectId":44919668,"deployBranch":"main","contentDirectory":"mintlify","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae8a641a8f1f3e8fc87af17","collectionId":"b3244b96-2a04-43b8-873c-0c10031429ef","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae8a641a8f1f3e8fc87af17"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"REMOVE_BRANDING":{"status":"DISABLED"}},"buildId":"6aeae726b6209aca2c9cc036","clientVersion":"0.0.4054","searchFilterCounts":[{"language":"default","tag":"Guides","count":81},{"language":"default","tag":"VRP API","count":49},{"language":"default","tag":"Features","count":32},{"language":"default","tag":"Routing API","count":28},{"language":"default","tag":"API Reference","count":26},{"language":"default","tag":"Fill API","count":20},{"language":"default","tag":"Platform","count":10},{"language":"default","tag":"Examples","count":9},{"language":"default","tag":"Concepts","count":9},{"language":"default","tag":"Info","count":6}]},"assistantConfig":{"deflection":{"enabled":true,"email":"support@solvice.io","showHelpButton":true}},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/vrp/v3/runs-result","slug":"/api-reference/vrp/v3/runs-result","pageMetadata":{"title":"Run result","openapi":"vrp-v3-runs GET /v3/routing/runs/{id}/result","description":"Fetch the plan of a finished run","href":"/api-reference/vrp/v3/runs-result"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Fetch the plan of a finished run\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={p:`p`,strong:`strong`,..._provideComponents(),...props.components},{Info}=_components;if(!Info)_missingMdxReference(`Info`,true);return _jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`V3 is in beta.`}),` General availability (GA) is planned for January 2027.`]})})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Run result","openapi":"vrp-v3-runs GET /v3/routing/runs/{id}/result","description":"Fetch the plan of a finished run","href":"/api-reference/vrp/v3/runs-result"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Runs"],"operationId":"getRoutingRunResult","summary":"Get the plan of a run","description":"Fetch the plan of a finished run","parameters":["0ffe2af0-f8f7-49f5-b780-dc8499f4f522"],"responses":{"200":"a0f6135b-7e47-45cf-a5f9-97f1fbc6d4b4","400":"136bb299-4eef-4aa6-8d40-e1e27b58ea81","401":"4c4badac-135c-45c9-b296-fdecf1add6db","404":"4cf38f93-a33d-4084-8e54-f4c24b0659d9","409":"e21cc461-9ffa-4a2e-8b2b-38926dd46caf"},"method":"get","type":"path","servers":["930d64ef-59cd-4f02-81be-5477d690275e"],"security":["36d28b08-280b-4faf-9bc6-6f7a926d111a"],"path":"/v3/routing/runs/{id}/result","baseUrlOptions":["https://api.solvice.io"],"title":"Get the plan of a run","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"0ffe2af0-f8f7-49f5-b780-dc8499f4f522":{"name":"id","in":"path","required":true,"description":"The run id returned by `POST /v3/routing/runs`.","schema":{"type":"string","format":"uuid","isRequired":true,"description":"The run id returned by `POST /v3/routing/runs`.","uniqueKey":"","typeLabel":"string\u003cuuid>"}}},"responses":{"a0f6135b-7e47-45cf-a5f9-97f1fbc6d4b4":{"description":"The plan.","content":{"application/json":{"schema":{"type":"object","description":"The result of `POST /v3/routing/solve` and `POST /v3/routing/evaluate`:\none shape for a plan the solver built and a plan it was given to score.","required":["summary","routes","plan","unassigned","warnings"],"properties":{"plan":{"type":"object","description":"The plan these routes follow, in the request's vocabulary: valid input\nto evaluate, suggest or a warm-started solve as it stands.","required":["routes"],"properties":{"routes":{"type":"array","items":{"type":"object","description":"One vehicle shift's route: every trip of the shift, split by `reload` stops.","required":["vehicle","shift","stops"],"properties":{"shift":{"type":"string","description":"Shift id, within that vehicle.","isRequired":true,"uniqueKey":"plan.routes.items.[INDEX].shift","typeLabel":"string"},"stops":{"type":"array","items":{"oneOf":[{"type":"object","title":"PlanStopJob","description":"One stop of a plan route. Start, end and breaks are placed by the solver\nand are not listed.","required":["id","type"],"example":{"id":"parts-9:pickup","type":"pickup"},"properties":{"id":{"type":"string","description":"Job id.","example":"boiler-17","isRequired":true,"uniqueKey":"plan.routes.items.[INDEX].stops.items.[INDEX].oneOf.0.id","typeLabel":"string"},"type":{"type":"string","description":"Discriminator: always `job`.","enum":["job"],"isRequired":true,"uniqueKey":"plan.routes.items.[INDEX].stops.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"pinned":{"type":"boolean","description":"On solve, pins the vehicle, not the position: the stop stays on the\nvehicle of the route it sits in (any shift of that vehicle, unless it\nbelongs to a `same_day` or `same_route` group) and is never removed\nfrom the plan, but the search may still reorder it within the route.\nWorks anywhere in a route, unlike the prefix `locked_count`. A stop\nthat cannot be driven is a 400 on synchronous solve and stream, as is\na pinned stop that shares a `same_vehicle`, `same_day` or `same_route`\ngroup with another pinned or locked stop the relation forbids.\nAccepted on evaluate and suggest, where it is inert. A result's `plan`\nnever carries it.","uniqueKey":"plan.routes.items.[INDEX].stops.items.[INDEX].oneOf.0.pinned","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"plan.routes.items.[INDEX].stops.items.[INDEX].oneOf.0","typeLabel":"PlanStopJob · object"},{"type":"object","title":"PlanStopPickup","description":"One stop of a plan route. Start, end and breaks are placed by the solver\nand are not listed.","required":["id","type"],"example":{"id":"parts-9:pickup","type":"pickup"},"properties":{"id":{"type":"string","description":"The leg's stop id: its own `id`, else `{shipment}:pickup`.","example":"parts-9:pickup","isRequired":true,"uniqueKey":"plan.routes.items.[INDEX].stops.items.[INDEX].oneOf.1.id","typeLabel":"string"},"type":{"type":"string","description":"Discriminator: always `pickup`.","enum":["pickup"],"isRequired":true,"uniqueKey":"plan.routes.items.[INDEX].stops.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"pinned":{"type":"boolean","description":"Pinned as on a job; pinning one leg pins both.","uniqueKey":"plan.routes.items.[INDEX].stops.items.[INDEX].oneOf.1.pinned","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"plan.routes.items.[INDEX].stops.items.[INDEX].oneOf.1","typeLabel":"PlanStopPickup · object"},{"type":"object","title":"PlanStopDelivery","description":"One stop of a plan route. Start, end and breaks are placed by the solver\nand are not listed.","required":["id","type"],"example":{"id":"parts-9:pickup","type":"pickup"},"properties":{"id":{"type":"string","description":"The leg's stop id: its own `id`, else `{shipment}:delivery`.","example":"parts-9:delivery","isRequired":true,"uniqueKey":"plan.routes.items.[INDEX].stops.items.[INDEX].oneOf.2.id","typeLabel":"string"},"type":{"type":"string","description":"Discriminator: always `delivery`.","enum":["delivery"],"isRequired":true,"uniqueKey":"plan.routes.items.[INDEX].stops.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"pinned":{"type":"boolean","description":"Pinned as on a job; pinning one leg pins both.","uniqueKey":"plan.routes.items.[INDEX].stops.items.[INDEX].oneOf.2.pinned","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"plan.routes.items.[INDEX].stops.items.[INDEX].oneOf.2","typeLabel":"PlanStopDelivery · object"},{"type":"object","title":"PlanStopReload","description":"One stop of a plan route. Start, end and breaks are placed by the solver\nand are not listed.","required":["depot","type"],"example":{"type":"pickup"},"properties":{"depot":{"type":"string","description":"A depot id from the shift's `reloads`.","example":"gent","isRequired":true,"uniqueKey":"plan.routes.items.[INDEX].stops.items.[INDEX].oneOf.3.depot","typeLabel":"string"},"type":{"type":"string","description":"Discriminator: always `reload`.","enum":["reload"],"isRequired":true,"uniqueKey":"plan.routes.items.[INDEX].stops.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"plan.routes.items.[INDEX].stops.items.[INDEX].oneOf.3","typeLabel":"PlanStopReload · object"}],"uniqueKey":"plan.routes.items.[INDEX].stops.items.[INDEX]","typeLabel":"PlanStopJob · object | PlanStopPickup · object | PlanStopDelivery · object | PlanStopReload · object"},"description":"Stops in visiting order.","isRequired":true,"uniqueKey":"plan.routes.items.[INDEX].stops","typeLabel":"(PlanStopJob · object | PlanStopPickup · object | PlanStopDelivery · object | PlanStopReload · object)[]"},"vehicle":{"type":"string","description":"Vehicle id.","isRequired":true,"uniqueKey":"plan.routes.items.[INDEX].vehicle","typeLabel":"string"},"locked_count":{"oneOf":[{"type":"integer","format":"uint32","description":"On solve, the first `locked_count` stops stay where they are (already\ndispatched). Counts every listed stop. Cannot be combined with a\n`reload` stop, and must not exceed the route's stop count — both are\nvalidated on every endpoint that takes a plan. Otherwise inert on\nevaluate. On suggest, no insertion lands before them.","example":1,"minimum":0,"uniqueKey":"plan.routes.items.[INDEX].locked_count.oneOf.0","typeLabel":"integer\u003cuint32>"},{"type":"null","format":"uint32","description":"On solve, the first `locked_count` stops stay where they are (already\ndispatched). Counts every listed stop. Cannot be combined with a\n`reload` stop, and must not exceed the route's stop count — both are\nvalidated on every endpoint that takes a plan. Otherwise inert on\nevaluate. On suggest, no insertion lands before them.","example":1,"minimum":0,"uniqueKey":"plan.routes.items.[INDEX].locked_count.oneOf.1","typeLabel":"null"}],"uniqueKey":"plan.routes.items.[INDEX].locked_count","typeLabel":"integer\u003cuint32> | null"}},"additionalProperties":false,"example":{"shift":"mon","stops":[{"id":"boiler-17","type":"job"}],"vehicle":"van-3"},"uniqueKey":"plan.routes.items.[INDEX]","typeLabel":"object"},"description":"One entry per vehicle shift that serves something.","isRequired":true,"uniqueKey":"plan.routes","typeLabel":"object[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"plan","typeLabel":"object"},"routes":{"type":"array","items":{"type":"object","description":"A single vehicle's route.","required":["vehicle","shift","distance_m","time","stops"],"properties":{"distance_m":{"type":"integer","format":"int64","description":"Total route distance, in metres.","example":8450,"isRequired":true,"uniqueKey":"routes.items.[INDEX].distance_m","typeLabel":"integer\u003cint64>"},"shift":{"type":"string","description":"The shift id (`vehicles[].shifts[].id`) this route runs on.","example":"mon","isRequired":true,"uniqueKey":"routes.items.[INDEX].shift","typeLabel":"string"},"stops":{"type":"array","items":{"type":"object","description":"A single stop within a route.\n\nOne flat object for every stop `type`. `type`, `arrival` and `departure`\nare present on every stop; every other field is present only on the stop\ntypes its description names, and absent (not `null`) elsewhere:\n\n| `type` | fields beyond `type`, `arrival`, `departure` |\n| --- | --- |\n| `job`, `pickup`, `delivery` | `id`, `location`, `service_start`, `wait_s`, `service_s`, `travel_s`, `distance_m`, `lateness_s`; `hold_s`, `target_lateness_s`, `violations` when they apply |\n| `start` | `depot`, `location`, `service_s` (absent on an open start) |\n| `end` | `depot`, `location`, `wait_s`, `service_s` (absent on an open end), `travel_s`, `distance_m` |\n| `reload` | `depot`, `location`, `service_start`, `wait_s`, `service_s`, `travel_s`, `distance_m` |\n| `break` | `id` (when the request break names one), `service_s` |\n\n`load_after` is on every stop when the problem declares a capacity\ndimension, and `snapped_location` wherever there is a `location` and the\nrouting graph snapped it.\n\nEvery stop time is RFC 3339, rendered in the UTC offset of the route's\nshift `from` (`Z` when that `from` is UTC or has no offset): a `+02:00`\nshift reports `2026-07-01T08:10:00+02:00`, the same instant as\n`2026-07-01T06:10:00Z`.","required":["type","arrival","departure"],"properties":{"arrival":{"type":"string","format":"date-time","description":"Physical arrival, before any waiting. On `start` when the route\nbegins; on `break` when the break starts.","example":"2026-07-01T08:10:00+02:00","isRequired":true,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].arrival","typeLabel":"string\u003cdate-time>"},"departure":{"type":"string","format":"date-time","description":"Departure. On `end` when the route finishes, after any depot\nhandling time; on `break` when the break ends (`arrival + service_s`).","example":"2026-07-01T09:05:00+02:00","isRequired":true,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].departure","typeLabel":"string\u003cdate-time>"},"type":{"type":"string","description":"What kind of stop this is.","example":"job","x-extensible-enum":["start","job","pickup","delivery","break","reload","end"],"isRequired":true,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].type","typeLabel":"string"},"break_s":{"oneOf":[{"type":"integer","format":"int32","description":"Seconds of driver break taken inside this stop's service, pausing it:\na `fixed`, `windowed` or `triggered` break that fell mid-service on a\njob with `break_interruptible: true`. Such a break gets no `break`\nstop of its own; its time is counted here and in the route's\n`time.break_s`. The stop reconciles as\n`departure - service_start == service_s + setup + break_s`, where\nsetup is the unscaled `setup_duration_s` when paid, else 0. Present on\n`job` stops only, when non-zero.","example":3600,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].break_s.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","format":"int32","description":"Seconds of driver break taken inside this stop's service, pausing it:\na `fixed`, `windowed` or `triggered` break that fell mid-service on a\njob with `break_interruptible: true`. Such a break gets no `break`\nstop of its own; its time is counted here and in the route's\n`time.break_s`. The stop reconciles as\n`departure - service_start == service_s + setup + break_s`, where\nsetup is the unscaled `setup_duration_s` when paid, else 0. Present on\n`job` stops only, when non-zero.","example":3600,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].break_s.oneOf.1","typeLabel":"null"}],"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].break_s","typeLabel":"integer\u003cint32> | null"},"depot":{"oneOf":[{"type":"string","description":"The `depots[].id` of this stop: on every `reload` stop, and on a\n`start`/`end` stop whose shift end names a depot. Absent on a\n`location` or open end and on task and break stops.","example":"gent","uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].depot.oneOf.0","typeLabel":"string"},{"type":"null","description":"The `depots[].id` of this stop: on every `reload` stop, and on a\n`start`/`end` stop whose shift end names a depot. Absent on a\n`location` or open end and on task and break stops.","example":"gent","uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].depot.oneOf.1","typeLabel":"null"}],"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].depot","typeLabel":"string | null"},"distance_m":{"oneOf":[{"type":"integer","format":"int32","description":"Travel distance from the previous stop, in metres. On task, `reload`\nand `end` stops.","example":2600,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].distance_m.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","format":"int32","description":"Travel distance from the previous stop, in metres. On task, `reload`\nand `end` stops.","example":2600,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].distance_m.oneOf.1","typeLabel":"null"}],"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].distance_m","typeLabel":"integer\u003cint32> | null"},"hold_s":{"oneOf":[{"type":"integer","format":"int32","description":"The part of `wait_s` spent holding for a `synchronized` or\n`time_lag` partner on another vehicle, beyond any wait the time\nwindow already imposed. On task stops, only when non-zero.","example":0,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].hold_s.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","format":"int32","description":"The part of `wait_s` spent holding for a `synchronized` or\n`time_lag` partner on another vehicle, beyond any wait the time\nwindow already imposed. On task stops, only when non-zero.","example":0,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].hold_s.oneOf.1","typeLabel":"null"}],"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].hold_s","typeLabel":"integer\u003cint32> | null"},"id":{"oneOf":[{"type":"string","description":"On a `job` stop the job id; on `pickup`/`delivery` the leg's stop id\n(its own `id`, else `{shipment}:pickup` / `{shipment}:delivery`); on a\n`break` stop the `id` of the request break (`shifts[].breaks[].id`)\nit realises, absent when that break named none. Absent on `start`,\n`end` and `reload`.","example":"job-1","uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].id.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `job` stop the job id; on `pickup`/`delivery` the leg's stop id\n(its own `id`, else `{shipment}:pickup` / `{shipment}:delivery`); on a\n`break` stop the `id` of the request break (`shifts[].breaks[].id`)\nit realises, absent when that break named none. Absent on `start`,\n`end` and `reload`.","example":"job-1","uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].id.oneOf.1","typeLabel":"null"}],"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].id","typeLabel":"string | null"},"lateness_s":{"oneOf":[{"type":"integer","format":"int32","description":"Seconds the start of service is past the time window's `to` (`0` when\non time), on task stops, measured from the arrival plus any `windowed`\nbreak taken on arrival at this stop (idle until that break's window\nopens included). Measures the time window only; a soft target is\nreported in `target_lateness_s`.","example":0,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].lateness_s.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","format":"int32","description":"Seconds the start of service is past the time window's `to` (`0` when\non time), on task stops, measured from the arrival plus any `windowed`\nbreak taken on arrival at this stop (idle until that break's window\nopens included). Measures the time window only; a soft target is\nreported in `target_lateness_s`.","example":0,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].lateness_s.oneOf.1","typeLabel":"null"}],"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].lateness_s","typeLabel":"integer\u003cint32> | null"},"load_after":{"oneOf":[{"type":"null","description":"Load on board after this stop, by named dimension: on `start` when\nthe vehicle leaves, on `reload` the next trip's departure stock, on\n`break` the load after the previous stop. Absent when the problem\ndeclares no capacity dimension.","uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].load_after.oneOf.0","typeLabel":"null"},{"type":"object","description":"Load on board after this stop, by named dimension: on `start` when\nthe vehicle leaves, on `reload` the next trip's departure stock, on\n`break` the load after the previous stop. Absent when the problem\ndeclares no capacity dimension.","example":{"volume":2,"weight":20},"additionalProperties":{"type":"integer","format":"int32","minimum":0,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].load_after.oneOf.1.additionalProperties","typeLabel":"integer\u003cint32>"},"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].load_after.oneOf.1","typeLabel":"object"}],"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].load_after","typeLabel":"null | object"},"location":{"oneOf":[{"type":"array","items":{"type":"number","format":"double","uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].location.oneOf.0.items.[INDEX]","typeLabel":"number\u003cdouble>"},"description":"Stop location `[longitude, latitude]` (GeoJSON order). Absent on\nevery `break` stop, and on\n`start`/`end` stops for a genuinely open end (no configured\ncoordinate for that end of the shift). A virtual (location-less) job\nhas no coordinate of its own and reports its nearest located\nneighbor's instead, so it is absent only when the whole route is\nvirtual with open depot ends.","example":[3.725,51.05],"maxItems":2,"minItems":2,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].location.oneOf.0","typeLabel":"number\u003cdouble>[]"},{"type":"null","items":{"type":"number","format":"double"},"description":"Stop location `[longitude, latitude]` (GeoJSON order). Absent on\nevery `break` stop, and on\n`start`/`end` stops for a genuinely open end (no configured\ncoordinate for that end of the shift). A virtual (location-less) job\nhas no coordinate of its own and reports its nearest located\nneighbor's instead, so it is absent only when the whole route is\nvirtual with open depot ends.","example":[3.725,51.05],"maxItems":2,"minItems":2,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].location.oneOf.1","typeLabel":"null"}],"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].location","typeLabel":"number\u003cdouble>[] | null"},"service_s":{"oneOf":[{"type":"integer","format":"int32","description":"Time spent at this stop, in seconds.\n\nOn task stops, the **effective** on-site service time, not the\nnominal `service_duration_s` from the request: it already has the\nserving vehicle's `service_factor` applied. `departure -\nservice_start - service_s - break_s` is the stop's setup time: the\nrequest's `setup_duration_s` (unscaled) for the first stop of a run at\nthe same location (setup is charged when the previous stop is\nelsewhere), and 0 for a co-located successor.\n\nOn `reload`, the depot's handling time (`departure - service_start\n== service_s`). On `start`/`end`, the depot handling time applied\nthere (0 on a free-travel end), so `departure - arrival == service_s`\non a start and `departure - arrival - wait_s - Σ windowed break\nservice_s == service_s` on an end; absent on an open start or end. On `break`, the\nbreak length (`departure - arrival`). `service_factor` never scales\ndepot, reload or break time.","example":300,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].service_s.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","format":"int32","description":"Time spent at this stop, in seconds.\n\nOn task stops, the **effective** on-site service time, not the\nnominal `service_duration_s` from the request: it already has the\nserving vehicle's `service_factor` applied. `departure -\nservice_start - service_s - break_s` is the stop's setup time: the\nrequest's `setup_duration_s` (unscaled) for the first stop of a run at\nthe same location (setup is charged when the previous stop is\nelsewhere), and 0 for a co-located successor.\n\nOn `reload`, the depot's handling time (`departure - service_start\n== service_s`). On `start`/`end`, the depot handling time applied\nthere (0 on a free-travel end), so `departure - arrival == service_s`\non a start and `departure - arrival - wait_s - Σ windowed break\nservice_s == service_s` on an end; absent on an open start or end. On `break`, the\nbreak length (`departure - arrival`). `service_factor` never scales\ndepot, reload or break time.","example":300,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].service_s.oneOf.1","typeLabel":"null"}],"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].service_s","typeLabel":"integer\u003cint32> | null"},"service_start":{"oneOf":[{"type":"string","format":"date-time","description":"When service starts: `arrival + wait_s` plus the duration of any\nbreak taken on arrival here (a `windowed` one; on a\n`break_interruptible` job also a `fixed` or duty-`triggered` one that\nfalls in the wait). On task and `reload` stops only.","example":"2026-07-01T09:00:00+02:00","uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].service_start.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When service starts: `arrival + wait_s` plus the duration of any\nbreak taken on arrival here (a `windowed` one; on a\n`break_interruptible` job also a `fixed` or duty-`triggered` one that\nfalls in the wait). On task and `reload` stops only.","example":"2026-07-01T09:00:00+02:00","uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].service_start.oneOf.1","typeLabel":"null"}],"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].service_start","typeLabel":"string\u003cdate-time> | null"},"snapped_location":{"oneOf":[{"type":"array","items":{"type":"number","format":"double","uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].snapped_location.oneOf.0.items.[INDEX]","typeLabel":"number\u003cdouble>"},"description":"The same point snapped to the routable graph, when available.","maxItems":2,"minItems":2,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].snapped_location.oneOf.0","typeLabel":"number\u003cdouble>[]"},{"type":"null","items":{"type":"number","format":"double"},"description":"The same point snapped to the routable graph, when available.","maxItems":2,"minItems":2,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].snapped_location.oneOf.1","typeLabel":"null"}],"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].snapped_location","typeLabel":"number\u003cdouble>[] | null"},"target_lateness_s":{"oneOf":[{"type":"integer","format":"int32","description":"Seconds past this task's `target.at`, measured at the stop's arrival\n(plus any `windowed` break taken on arrival there, idle before it\nincluded) or departure per `target.on`; `0` when met. Present only on a task\nstop carrying a target. A shipment's own `target` is measured on its\ndelivery leg, so it appears on the `:delivery` stop; a `pickup.target`\nor `delivery.target` appears on that leg's stop.","example":0,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].target_lateness_s.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","format":"int32","description":"Seconds past this task's `target.at`, measured at the stop's arrival\n(plus any `windowed` break taken on arrival there, idle before it\nincluded) or departure per `target.on`; `0` when met. Present only on a task\nstop carrying a target. A shipment's own `target` is measured on its\ndelivery leg, so it appears on the `:delivery` stop; a `pickup.target`\nor `delivery.target` appears on that leg's stop.","example":0,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].target_lateness_s.oneOf.1","typeLabel":"null"}],"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].target_lateness_s","typeLabel":"integer\u003cint32> | null"},"travel_s":{"oneOf":[{"type":"integer","format":"int32","description":"Travel time from the previous stop, in seconds. On task, `reload`\nand `end` stops.","example":600,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].travel_s.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","format":"int32","description":"Travel time from the previous stop, in seconds. On task, `reload`\nand `end` stops.","example":600,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].travel_s.oneOf.1","typeLabel":"null"}],"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].travel_s","typeLabel":"integer\u003cint32> | null"},"violations":{"type":"array","items":{"type":"object","description":"A single constraint violation detected while evaluating an imported solution.\n\nReported on stops (`routes[].stops[].violations`) and on routes\n(`routes[].violations`) in the `POST /v3/routing/evaluate` response.","required":["code","message"],"properties":{"code":{"type":"string","description":"The constraint broken. `max_stops`, `break`, `multi_trip`,\n`period_limit` and `quota` are route-level; `sequence` and `shipment`\nare on the stop; `unreachable`, `max_leg_travel` and `capacity` can be\neither. `unknown`\nmeans a stop was refused without a specific constraint being named\n(not expected in practice).","example":"capacity","x-extensible-enum":["unreachable","max_leg_travel","required_skills","serves_tags","capacity","time_window","eligible_vehicles","shift_end","max_distance","max_route_duration","max_stops","sequence","tag_order","shipment","break","multi_trip","unload_before_end","same_vehicle","same_day","same_route","compatible_vehicles","synchronized","time_lag","all_or_none","period_limit","quota","max_intake","unknown"],"isRequired":true,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].violations.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable description of what was violated.","example":"Cumulative load 30 exceeds vehicle capacity 15 (dimension weight)","isRequired":true,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].violations.items.[INDEX].message","typeLabel":"string"},"dimension":{"oneOf":[{"type":"string","description":"The capacity dimension over its limit. Only on `capacity`,\n`unload_before_end` and `max_intake`.","example":"weight","uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].violations.items.[INDEX].dimension.oneOf.0","typeLabel":"string"},{"type":"null","description":"The capacity dimension over its limit. Only on `capacity`,\n`unload_before_end` and `max_intake`.","example":"weight","uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].violations.items.[INDEX].dimension.oneOf.1","typeLabel":"null"}],"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].violations.items.[INDEX].dimension","typeLabel":"string | null"},"excess":{"oneOf":[{"type":"integer","format":"int64","description":"How far over the limit, in `unit`. On `capacity`, `time_window` (the\nseconds late), `shift_end`, `max_distance`, `max_route_duration`,\n`quota`, `unload_before_end` and `max_intake`.","example":15,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].violations.items.[INDEX].excess.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","format":"int64","description":"How far over the limit, in `unit`. On `capacity`, `time_window` (the\nseconds late), `shift_end`, `max_distance`, `max_route_duration`,\n`quota`, `unload_before_end` and `max_intake`.","example":15,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].violations.items.[INDEX].excess.oneOf.1","typeLabel":"null"}],"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].violations.items.[INDEX].excess","typeLabel":"integer\u003cint64> | null"},"unit":{"oneOf":[{"type":"null","description":"Unit of `excess`; present exactly when `excess` is.","uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].violations.items.[INDEX].unit.oneOf.0","typeLabel":"null"},{"type":"string","description":"Unit of `excess`; present exactly when `excess` is.","x-extensible-enum":["s","m","load","stops"],"example":"s","uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].violations.items.[INDEX].unit.oneOf.1","typeLabel":"string"}],"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].violations.items.[INDEX].unit","typeLabel":"null | string"}},"example":{"code":"capacity","dimension":"weight","excess":15,"message":"Cumulative load 30 exceeds vehicle capacity 15 (dimension weight)","unit":"load"},"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].violations.items.[INDEX]","typeLabel":"object"},"description":"Constraint violations detected at this task stop. Only populated by\n`POST /v3/routing/evaluate` (imported solutions may be infeasible); a\nsolve response never emits violations, so this is absent there.","uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].violations","typeLabel":"object[]"},"wait_s":{"oneOf":[{"type":"integer","format":"int32","description":"Seconds spent waiting here, counted in `time.wait_s`. On task stops:\nbefore service, for the time window to open and for any cross-route\nhold (`hold_s`, included in this figure). On `reload`: before the\nreload. On both, also the idle before a windowed break taken on\narrival here whose window had not opened yet, so `service_start ==\narrival + wait_s + Σ` those breaks' `service_s`. On `end`: idle time\nat the end, `departure - arrival - service_s` less the `service_s` of\nbreak stops taken there, clamped to be never negative. Idle before a\nbreak is not charged by `per_wait_hour`. Absent on `start` (a start\nnever waits) and `break`.","example":3000,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].wait_s.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","format":"int32","description":"Seconds spent waiting here, counted in `time.wait_s`. On task stops:\nbefore service, for the time window to open and for any cross-route\nhold (`hold_s`, included in this figure). On `reload`: before the\nreload. On both, also the idle before a windowed break taken on\narrival here whose window had not opened yet, so `service_start ==\narrival + wait_s + Σ` those breaks' `service_s`. On `end`: idle time\nat the end, `departure - arrival - service_s` less the `service_s` of\nbreak stops taken there, clamped to be never negative. Idle before a\nbreak is not charged by `per_wait_hour`. Absent on `start` (a start\nnever waits) and `break`.","example":3000,"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].wait_s.oneOf.1","typeLabel":"null"}],"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX].wait_s","typeLabel":"integer\u003cint32> | null"}},"example":{"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,"service_start":"2026-07-01T09:00:00+02:00","travel_s":600,"type":"job","wait_s":3000},"uniqueKey":"routes.items.[INDEX].stops.items.[INDEX]","typeLabel":"object"},"description":"Stops in time order (by `departure`), including depot bookends. A\nwindowed break taken while the vehicle is at a stop is listed just\nbefore that stop and lies within that stop's `arrival` to `departure`\n(the end stop included); drive, duty and unavailability breaks end\nbefore the next stop's `arrival`.","isRequired":true,"uniqueKey":"routes.items.[INDEX].stops","typeLabel":"object[]"},"time":{"type":"object","description":"Where this route's time goes. `time.span_s` is what the route's\n`costs.per_route_hour` is charged on: the shift's rate, else its\nvehicle's, else `objective.costs.per_route_hour`.","required":["span_s","travel_s","service_s","depot_s","wait_s","break_s","overtime_s"],"properties":{"break_s":{"type":"integer","format":"int64","description":"Time on driver breaks: the `break` stops plus the breaks that paused\na job's service (the job stops' `break_s`).","isRequired":true,"uniqueKey":"routes.items.[INDEX].time.break_s","typeLabel":"integer\u003cint64>"},"depot_s":{"type":"integer","format":"int64","description":"Handling time at start, end and reload stops.","isRequired":true,"uniqueKey":"routes.items.[INDEX].time.depot_s","typeLabel":"integer\u003cint64>"},"overtime_s":{"type":"integer","format":"int64","description":"The part of the span after the shift's `to` (possible only with\n`max_overtime_s`).","isRequired":true,"uniqueKey":"routes.items.[INDEX].time.overtime_s","typeLabel":"integer\u003cint64>"},"service_s":{"type":"integer","format":"int64","description":"On-site service time at job, pickup and delivery stops.","isRequired":true,"uniqueKey":"routes.items.[INDEX].time.service_s","typeLabel":"integer\u003cint64>"},"span_s":{"type":"integer","format":"int64","description":"Wall-clock span: travel, service, setup, depot handling, waiting and\nbreaks.","isRequired":true,"uniqueKey":"routes.items.[INDEX].time.span_s","typeLabel":"integer\u003cint64>"},"travel_s":{"type":"integer","format":"int64","description":"Driving time: the sum of the stops' `travel_s`.","isRequired":true,"uniqueKey":"routes.items.[INDEX].time.travel_s","typeLabel":"integer\u003cint64>"},"wait_s":{"type":"integer","format":"int64","description":"Waiting before service, cross-route holds included, plus the idle\nbefore a windowed break's window opens, at any stop. It is the sum of\nthe stops' `wait_s`, so it can exceed `score.components.waiting` and\nwhat `per_wait_hour` charges for: that idle is priced only through\nthe span.","isRequired":true,"uniqueKey":"routes.items.[INDEX].time.wait_s","typeLabel":"integer\u003cint64>"}},"example":{"break_s":0,"depot_s":0,"overtime_s":0,"service_s":900,"span_s":5880,"travel_s":1980,"wait_s":3000},"isRequired":true,"uniqueKey":"routes.items.[INDEX].time","typeLabel":"object"},"vehicle":{"type":"string","description":"The vehicle id (`vehicle.id` from the request) serving this route.","isRequired":true,"uniqueKey":"routes.items.[INDEX].vehicle","typeLabel":"string"},"load_peak":{"oneOf":[{"type":"null","description":"Peak load reached on the route, by named dimension.","uniqueKey":"routes.items.[INDEX].load_peak.oneOf.0","typeLabel":"null"},{"type":"object","description":"Peak load reached on the route, by named dimension.","example":{"volume":2,"weight":20},"additionalProperties":{"type":"integer","format":"int32","minimum":0,"uniqueKey":"routes.items.[INDEX].load_peak.oneOf.1.additionalProperties","typeLabel":"integer\u003cint32>"},"uniqueKey":"routes.items.[INDEX].load_peak.oneOf.1","typeLabel":"object"}],"uniqueKey":"routes.items.[INDEX].load_peak","typeLabel":"null | object"},"polyline":{"oneOf":[{"type":"string","description":"Road geometry for this route as an [encoded polyline] at precision 5\n(~1.1 m), ready to hand to a map library. Present only when\n`options.polyline` was set, and absent for a route whose geometry the\nrouting engine could not produce.\n\nTraced with this vehicle's `profile` at the solve's departure time, so\nit is the same road path the plan was costed on — not a generic car\nroute. It is a decoration, though: `distance_m` and `time` come\nfrom the solver's matrix and are authoritative if the two ever disagree.\n\n[encoded polyline]: https://developers.google.com/maps/documentation/utilities/polylinealgorithm","example":"_p~iF~ps|U_ulLnnqC_mqNvxq`@","uniqueKey":"routes.items.[INDEX].polyline.oneOf.0","typeLabel":"string"},{"type":"null","description":"Road geometry for this route as an [encoded polyline] at precision 5\n(~1.1 m), ready to hand to a map library. Present only when\n`options.polyline` was set, and absent for a route whose geometry the\nrouting engine could not produce.\n\nTraced with this vehicle's `profile` at the solve's departure time, so\nit is the same road path the plan was costed on — not a generic car\nroute. It is a decoration, though: `distance_m` and `time` come\nfrom the solver's matrix and are authoritative if the two ever disagree.\n\n[encoded polyline]: https://developers.google.com/maps/documentation/utilities/polylinealgorithm","example":"_p~iF~ps|U_ulLnnqC_mqNvxq`@","uniqueKey":"routes.items.[INDEX].polyline.oneOf.1","typeLabel":"null"}],"uniqueKey":"routes.items.[INDEX].polyline","typeLabel":"string | null"},"violations":{"type":"array","items":{"type":"object","description":"A single constraint violation detected while evaluating an imported solution.\n\nReported on stops (`routes[].stops[].violations`) and on routes\n(`routes[].violations`) in the `POST /v3/routing/evaluate` response.","required":["code","message"],"properties":{"code":{"type":"string","description":"The constraint broken. `max_stops`, `break`, `multi_trip`,\n`period_limit` and `quota` are route-level; `sequence` and `shipment`\nare on the stop; `unreachable`, `max_leg_travel` and `capacity` can be\neither. `unknown`\nmeans a stop was refused without a specific constraint being named\n(not expected in practice).","example":"capacity","x-extensible-enum":["unreachable","max_leg_travel","required_skills","serves_tags","capacity","time_window","eligible_vehicles","shift_end","max_distance","max_route_duration","max_stops","sequence","tag_order","shipment","break","multi_trip","unload_before_end","same_vehicle","same_day","same_route","compatible_vehicles","synchronized","time_lag","all_or_none","period_limit","quota","max_intake","unknown"],"isRequired":true,"uniqueKey":"routes.items.[INDEX].violations.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable description of what was violated.","example":"Cumulative load 30 exceeds vehicle capacity 15 (dimension weight)","isRequired":true,"uniqueKey":"routes.items.[INDEX].violations.items.[INDEX].message","typeLabel":"string"},"dimension":{"oneOf":[{"type":"string","description":"The capacity dimension over its limit. Only on `capacity`,\n`unload_before_end` and `max_intake`.","example":"weight","uniqueKey":"routes.items.[INDEX].violations.items.[INDEX].dimension.oneOf.0","typeLabel":"string"},{"type":"null","description":"The capacity dimension over its limit. Only on `capacity`,\n`unload_before_end` and `max_intake`.","example":"weight","uniqueKey":"routes.items.[INDEX].violations.items.[INDEX].dimension.oneOf.1","typeLabel":"null"}],"uniqueKey":"routes.items.[INDEX].violations.items.[INDEX].dimension","typeLabel":"string | null"},"excess":{"oneOf":[{"type":"integer","format":"int64","description":"How far over the limit, in `unit`. On `capacity`, `time_window` (the\nseconds late), `shift_end`, `max_distance`, `max_route_duration`,\n`quota`, `unload_before_end` and `max_intake`.","example":15,"uniqueKey":"routes.items.[INDEX].violations.items.[INDEX].excess.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","format":"int64","description":"How far over the limit, in `unit`. On `capacity`, `time_window` (the\nseconds late), `shift_end`, `max_distance`, `max_route_duration`,\n`quota`, `unload_before_end` and `max_intake`.","example":15,"uniqueKey":"routes.items.[INDEX].violations.items.[INDEX].excess.oneOf.1","typeLabel":"null"}],"uniqueKey":"routes.items.[INDEX].violations.items.[INDEX].excess","typeLabel":"integer\u003cint64> | null"},"unit":{"oneOf":[{"type":"null","description":"Unit of `excess`; present exactly when `excess` is.","uniqueKey":"routes.items.[INDEX].violations.items.[INDEX].unit.oneOf.0","typeLabel":"null"},{"type":"string","description":"Unit of `excess`; present exactly when `excess` is.","x-extensible-enum":["s","m","load","stops"],"example":"s","uniqueKey":"routes.items.[INDEX].violations.items.[INDEX].unit.oneOf.1","typeLabel":"string"}],"uniqueKey":"routes.items.[INDEX].violations.items.[INDEX].unit","typeLabel":"null | string"}},"example":{"code":"capacity","dimension":"weight","excess":15,"message":"Cumulative load 30 exceeds vehicle capacity 15 (dimension weight)","unit":"load"},"uniqueKey":"routes.items.[INDEX].violations.items.[INDEX]","typeLabel":"object"},"description":"Route-level constraint violations (e.g. `max_distance`, `max_route_duration`,\nor `unreachable` for a leg whose destination is not a job stop — the\nreturn to the end depot, or a leg into a reload).\nOnly populated by `POST /v3/routing/evaluate`; absent on solve responses.","uniqueKey":"routes.items.[INDEX].violations","typeLabel":"object[]"}},"example":{"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,"service_start":"2026-07-01T09:00:00+02:00","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,"service_start":"2026-07-01T09:13:00+02:00","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","wait_s":0}],"time":{"break_s":0,"depot_s":0,"overtime_s":0,"service_s":900,"span_s":5880,"travel_s":1980,"wait_s":3000},"vehicle":"v1"},"uniqueKey":"routes.items.[INDEX]","typeLabel":"object"},"description":"One entry per non-empty route.","isRequired":true,"uniqueKey":"routes","typeLabel":"object[]"},"summary":{"type":"object","description":"Aggregate statistics for the solve run.","required":["score","tasks","vehicles_used","shifts_used","distance_m","time","timings","search"],"properties":{"distance_m":{"type":"integer","format":"int64","description":"Sum of all route distances, in metres.","example":8450,"isRequired":true,"uniqueKey":"summary.distance_m","typeLabel":"integer\u003cint64>"},"score":{"type":"object","description":"How good the plan is. On `/solve`, `score.violation_count` is always 0; on\n`/evaluate` it counts the constraints the given plan breaks.","required":["violation_count","unassigned_priority","cost","components"],"properties":{"components":{"type":"object","description":"The money of each objective term.","required":["routes","vehicles","time","distance","waiting","overtime","lateness","window_choice","target","tag_preference","reloads","grouping","workload_share","drop_costs","preferences","assignment","delay"],"properties":{"assignment":{"type":"number","format":"double","description":"Cost of the serving vehicle's `assignment_costs[].cost`, in currency\nunits.","isRequired":true,"uniqueKey":"summary.score.components.assignment","typeLabel":"number\u003cdouble>"},"delay":{"type":"number","format":"double","description":"Cost of delay, in currency units (`objective.per_delay_workday`): each\nserved task pays the rate once per workday its shift lies after the\nearliest workday in the request.","isRequired":true,"uniqueKey":"summary.score.components.delay","typeLabel":"number\u003cdouble>"},"distance":{"type":"number","format":"double","description":"Distance cost, in currency units: each route's distance priced at\nits `costs.per_travel_km` (shift, vehicle or fleet).","isRequired":true,"uniqueKey":"summary.score.components.distance","typeLabel":"number\u003cdouble>"},"drop_costs":{"type":"number","format":"double","description":"The summed `drop_cost` of the tasks left unassigned, in currency units.","isRequired":true,"uniqueKey":"summary.score.components.drop_costs","typeLabel":"number\u003cdouble>"},"grouping":{"type":"number","format":"double","description":"Cost of splitting close tasks across routes, in currency units\n(`objective.grouping`).","isRequired":true,"uniqueKey":"summary.score.components.grouping","typeLabel":"number\u003cdouble>"},"lateness":{"type":"number","format":"double","description":"Cost of priced lateness past a time window, in currency units\n(`objective.per_late_hour` or `time_windows[].per_late_hour`).","isRequired":true,"uniqueKey":"summary.score.components.lateness","typeLabel":"number\u003cdouble>"},"overtime":{"type":"number","format":"double","description":"Cost of work past a soft shift end, in currency units: priced at the\nroute's `costs.per_overtime_hour`.","isRequired":true,"uniqueKey":"summary.score.components.overtime","typeLabel":"number\u003cdouble>"},"preferences":{"type":"number","format":"double","description":"Cost of `preferences[].violation_cost`, in currency units: paid for\neach listed vehicle that did not serve the task. Tag preferences are\n`tag_preference`.","isRequired":true,"uniqueKey":"summary.score.components.preferences","typeLabel":"number\u003cdouble>"},"reloads":{"type":"number","format":"double","description":"Cost of reload visits, in currency units (`depots[].per_reload`).","isRequired":true,"uniqueKey":"summary.score.components.reloads","typeLabel":"number\u003cdouble>"},"routes":{"type":"number","format":"double","description":"Shift cost, in currency units: `costs.per_route` once per used shift,\nat the shift's, vehicle's or fleet's rate.","isRequired":true,"uniqueKey":"summary.score.components.routes","typeLabel":"number\u003cdouble>"},"tag_preference":{"type":"number","format":"double","description":"Cost of serving tasks outside a vehicle's `preferred_tags`, in\ncurrency units.","isRequired":true,"uniqueKey":"summary.score.components.tag_preference","typeLabel":"number\u003cdouble>"},"target":{"type":"number","format":"double","description":"Cost of missing tasks' `target` times, in currency units\n(`target.per_late_hour`).","isRequired":true,"uniqueKey":"summary.score.components.target","typeLabel":"number\u003cdouble>"},"time":{"type":"number","format":"double","description":"Time cost, in currency units: each route's span priced at its\n`costs.per_route_hour` (shift, vehicle or fleet).","isRequired":true,"uniqueKey":"summary.score.components.time","typeLabel":"number\u003cdouble>"},"vehicles":{"type":"number","format":"double","description":"Vehicle cost, in currency units: `costs.per_used_vehicle` once per\nvehicle that serves a task, however many of its shifts it works, at the\nvehicle's or fleet's rate.","isRequired":true,"uniqueKey":"summary.score.components.vehicles","typeLabel":"number\u003cdouble>"},"waiting":{"type":"number","format":"double","description":"Cost of waiting for time windows to open, in currency units: each\nroute's wait priced at its `costs.per_wait_hour`. Idle before a\nwindowed break opens is in `time.wait_s` but not priced here.","isRequired":true,"uniqueKey":"summary.score.components.waiting","typeLabel":"number\u003cdouble>"},"window_choice":{"type":"number","format":"double","description":"The price of the time window each task was served in, in currency\nunits (`time_windows[].choice_cost`).","isRequired":true,"uniqueKey":"summary.score.components.window_choice","typeLabel":"number\u003cdouble>"},"workload_share":{"type":"number","format":"double","description":"Workload outside the equal-share band, in currency units\n(`objective.workload_share`).","isRequired":true,"uniqueKey":"summary.score.components.workload_share","typeLabel":"number\u003cdouble>"}},"example":{"assignment":0,"delay":0,"distance":1.69,"drop_costs":0,"grouping":0,"lateness":0,"overtime":0,"preferences":0,"reloads":0,"routes":0,"tag_preference":0,"target":0,"time":57.1536,"vehicles":0,"waiting":0,"window_choice":0,"workload_share":0},"isRequired":true,"uniqueKey":"summary.score.components","typeLabel":"object"},"cost":{"type":"number","format":"double","description":"Total cost, in the objective's currency: the sum of `components`.","example":58.8436,"isRequired":true,"uniqueKey":"summary.score.cost","typeLabel":"number\u003cdouble>"},"unassigned_priority":{"type":"integer","format":"int64","description":"Summed `priority` of the required tasks left unassigned (a task that\npriced a `drop_cost` counts in `components.drop_costs` instead).","example":0,"isRequired":true,"uniqueKey":"summary.score.unassigned_priority","typeLabel":"integer\u003cint64>"},"violation_count":{"type":"integer","format":"uint32","description":"How many hard-constraint violations the plan has (the `violations`\narrays on routes and stops list them). Always `0` on a solve result.","example":0,"minimum":0,"isRequired":true,"uniqueKey":"summary.score.violation_count","typeLabel":"integer\u003cuint32>"},"currency":{"oneOf":[{"type":"string","description":"Informational currency label, echoed from `objective.currency`.","example":"EUR","uniqueKey":"summary.score.currency.oneOf.0","typeLabel":"string"},{"type":"null","description":"Informational currency label, echoed from `objective.currency`.","example":"EUR","uniqueKey":"summary.score.currency.oneOf.1","typeLabel":"null"}],"uniqueKey":"summary.score.currency","typeLabel":"string | null"}},"example":{"components":{"assignment":0,"delay":0,"distance":1.69,"drop_costs":0,"grouping":0,"lateness":0,"overtime":0,"preferences":0,"reloads":0,"routes":0,"tag_preference":0,"target":0,"time":57.1536,"vehicles":0,"waiting":0,"window_choice":0,"workload_share":0},"cost":58.8436,"currency":"EUR","unassigned_priority":0,"violation_count":0},"isRequired":true,"uniqueKey":"summary.score","typeLabel":"object"},"search":{"type":"object","description":"How the search ended.","required":["termination","iterations"],"properties":{"iterations":{"type":"integer","format":"uint64","description":"Search iterations performed. `0` when nothing was searched.","example":48210,"minimum":0,"isRequired":true,"uniqueKey":"summary.search.iterations","typeLabel":"integer\u003cuint64>"},"termination":{"type":"string","description":"How the search ended.","x-extensible-enum":["time_limit","no_improvement","not_searched"],"isRequired":true,"uniqueKey":"summary.search.termination","typeLabel":"string"}},"isRequired":true,"uniqueKey":"summary.search","typeLabel":"object"},"shifts_used":{"type":"integer","format":"uint32","description":"Routes with at least one task stop: one per used shift.","example":1,"minimum":0,"isRequired":true,"uniqueKey":"summary.shifts_used","typeLabel":"integer\u003cuint32>"},"tasks":{"type":"object","description":"Tasks served and left out.","required":["served","unassigned","unassigned_required"],"properties":{"served":{"type":"integer","format":"uint32","description":"Tasks on a route.","minimum":0,"isRequired":true,"uniqueKey":"summary.tasks.served","typeLabel":"integer\u003cuint32>"},"unassigned":{"type":"integer","format":"uint32","description":"Tasks on no route: the length of `unassigned`.","minimum":0,"isRequired":true,"uniqueKey":"summary.tasks.unassigned","typeLabel":"integer\u003cuint32>"},"unassigned_required":{"type":"integer","format":"uint32","description":"The unassigned tasks that carry no `drop_cost`: tasks the plan was\nrequired to serve and did not.","minimum":0,"isRequired":true,"uniqueKey":"summary.tasks.unassigned_required","typeLabel":"integer\u003cuint32>"}},"example":{"served":2,"unassigned":0,"unassigned_required":0},"isRequired":true,"uniqueKey":"summary.tasks","typeLabel":"object"},"time":{"type":"object","description":"Where the fleet's time goes, summed over routes.","required":["span_s","travel_s","service_s","depot_s","wait_s","break_s","overtime_s"],"properties":{"break_s":{"type":"integer","format":"int64","description":"Time on driver breaks: the `break` stops plus the breaks that paused\na job's service (the job stops' `break_s`).","isRequired":true,"uniqueKey":"summary.time.break_s","typeLabel":"integer\u003cint64>"},"depot_s":{"type":"integer","format":"int64","description":"Handling time at start, end and reload stops.","isRequired":true,"uniqueKey":"summary.time.depot_s","typeLabel":"integer\u003cint64>"},"overtime_s":{"type":"integer","format":"int64","description":"The part of the span after the shift's `to` (possible only with\n`max_overtime_s`).","isRequired":true,"uniqueKey":"summary.time.overtime_s","typeLabel":"integer\u003cint64>"},"service_s":{"type":"integer","format":"int64","description":"On-site service time at job, pickup and delivery stops.","isRequired":true,"uniqueKey":"summary.time.service_s","typeLabel":"integer\u003cint64>"},"span_s":{"type":"integer","format":"int64","description":"Wall-clock span: travel, service, setup, depot handling, waiting and\nbreaks.","isRequired":true,"uniqueKey":"summary.time.span_s","typeLabel":"integer\u003cint64>"},"travel_s":{"type":"integer","format":"int64","description":"Driving time: the sum of the stops' `travel_s`.","isRequired":true,"uniqueKey":"summary.time.travel_s","typeLabel":"integer\u003cint64>"},"wait_s":{"type":"integer","format":"int64","description":"Waiting before service, cross-route holds included, plus the idle\nbefore a windowed break's window opens, at any stop. It is the sum of\nthe stops' `wait_s`, so it can exceed `score.components.waiting` and\nwhat `per_wait_hour` charges for: that idle is priced only through\nthe span.","isRequired":true,"uniqueKey":"summary.time.wait_s","typeLabel":"integer\u003cint64>"}},"example":{"break_s":0,"depot_s":0,"overtime_s":0,"service_s":900,"span_s":5880,"travel_s":1980,"wait_s":3000},"isRequired":true,"uniqueKey":"summary.time","typeLabel":"object"},"timings":{"type":"object","description":"Where the request's time went.","required":["total_ms"],"properties":{"total_ms":{"type":"integer","format":"uint64","description":"From the request's arrival to the end of the search (of the scoring,\non `/evaluate`; of the suggestion search, on `/suggest`): fetching\ntravel times and waiting for capacity included, building the response\nnot.","minimum":0,"isRequired":true,"uniqueKey":"summary.timings.total_ms","typeLabel":"integer\u003cuint64>"},"search_ms":{"oneOf":[{"type":"integer","format":"uint64","description":"Time spent in the search. Absent on `/evaluate`, which runs none, and\non `/suggest`, which has no separate search figure.","minimum":0,"uniqueKey":"summary.timings.search_ms.oneOf.0","typeLabel":"integer\u003cuint64>"},{"type":"null","format":"uint64","description":"Time spent in the search. Absent on `/evaluate`, which runs none, and\non `/suggest`, which has no separate search figure.","minimum":0,"uniqueKey":"summary.timings.search_ms.oneOf.1","typeLabel":"null"}],"uniqueKey":"summary.timings.search_ms","typeLabel":"integer\u003cuint64> | null"}},"example":{"search_ms":100,"total_ms":142},"isRequired":true,"uniqueKey":"summary.timings","typeLabel":"object"},"vehicles_used":{"type":"integer","format":"uint32","description":"Distinct vehicles with at least one route.","example":1,"minimum":0,"isRequired":true,"uniqueKey":"summary.vehicles_used","typeLabel":"integer\u003cuint32>"},"travel_estimated":{"type":"boolean","description":"`true` when travel times could not be fetched and the plan was costed\non estimated travel: straight-line distance × a detour factor, at a\ntypical speed for the profile. No one-way streets or traffic, so it\ncan be tens of percent off: the plan, `unassigned[].reasons` and\n`score.violation_count` hold only against it, and no `routes[].polyline`\nis returned. Solve again once Maps is back if the plan must hold on the\nroad; on a solve or suggest, `options.travel_fallback: \"fail\"` returns\nthe error instead. Absent when travel came from the requested engine,\n`straight_line` included.","uniqueKey":"summary.travel_estimated","typeLabel":"boolean"}},"example":{"distance_m":8450,"score":{"components":{"assignment":0,"delay":0,"distance":1.69,"drop_costs":0,"grouping":0,"lateness":0,"overtime":0,"preferences":0,"reloads":0,"routes":0,"tag_preference":0,"target":0,"time":57.1536,"vehicles":0,"waiting":0,"window_choice":0,"workload_share":0},"cost":58.8436,"currency":"EUR","unassigned_priority":0,"violation_count":0},"search":{"iterations":48210,"termination":"time_limit"},"shifts_used":1,"tasks":{"served":2,"unassigned":0,"unassigned_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},"isRequired":true,"uniqueKey":"summary","typeLabel":"object"},"unassigned":{"type":"array","items":{"type":"object","description":"A task the plan leaves unassigned.","required":["task","category","reasons","relaxations"],"properties":{"category":{"type":"string","description":"Which kind of \"unassigned\" this is.","example":"priced_out","x-extensible-enum":["impossible","blocked","priced_out","time_limit"],"isRequired":true,"uniqueKey":"unassigned.items.[INDEX].category","typeLabel":"string"},"reasons":{"type":"array","items":{"type":"object","description":"A machine-readable reason a task could not be assigned: the\n`constraint` to blame, when one is, and a sentence.","required":["message"],"properties":{"message":{"type":"string","description":"Human-readable explanation.","example":"A route cannot reach this task within its time window","isRequired":true,"uniqueKey":"unassigned.items.[INDEX].reasons.items.[INDEX].message","typeLabel":"string"},"constraint":{"oneOf":[{"type":"null","description":"The constraint that refused the task on at least one vehicle (or\n`all_or_none`, for a task its group holds back), in the vocabulary of\nthe evaluate violations' `code`. A task lists one reason\nper constraint, once each, in the order the `code` values are listed. Absent on the\nsingle reason of a `time_limit` or `priced_out` task, which names no\nconstraint.","uniqueKey":"unassigned.items.[INDEX].reasons.items.[INDEX].constraint.oneOf.0","typeLabel":"null"},{"type":"string","description":"The constraint that refused the task on at least one vehicle (or\n`all_or_none`, for a task its group holds back), in the vocabulary of\nthe evaluate violations' `code`. A task lists one reason\nper constraint, once each, in the order the `code` values are listed. Absent on the\nsingle reason of a `time_limit` or `priced_out` task, which names no\nconstraint.","x-extensible-enum":["unreachable","max_leg_travel","required_skills","serves_tags","capacity","time_window","eligible_vehicles","shift_end","max_distance","max_route_duration","max_stops","sequence","tag_order","shipment","break","multi_trip","unload_before_end","same_vehicle","same_day","same_route","compatible_vehicles","synchronized","time_lag","all_or_none","period_limit","quota","max_intake","unknown"],"example":"capacity","uniqueKey":"unassigned.items.[INDEX].reasons.items.[INDEX].constraint.oneOf.1","typeLabel":"string"}],"uniqueKey":"unassigned.items.[INDEX].reasons.items.[INDEX].constraint","typeLabel":"null | string"}},"example":{"constraint":"time_window","message":"A route cannot reach this task within its time window"},"uniqueKey":"unassigned.items.[INDEX].reasons.items.[INDEX]","typeLabel":"object"},"description":"Never empty. When `category` is `impossible` or `blocked` there is\none reason per constraint that refused the task on at least one\nvehicle, named in `constraint`, once each, `unreachable` first\n(`unknown` when no constraint was recorded); a task that fits but\nwhose `all_or_none` group holds it back has the one reason\n`all_or_none`, and one whose all-or-none `synchronized`/`time_lag`\ngroup cannot be placed together has `synchronized` and/or `time_lag`.\nOtherwise there is one reason with no `constraint`.","isRequired":true,"uniqueKey":"unassigned.items.[INDEX].reasons","typeLabel":"object[]"},"relaxations":{"type":"array","items":{"type":"object","description":"A best-effort, actionable suggestion for relaxing the problem so a task can be\nassigned — derived from the smallest constraint relaxation the solver found.","required":["pointer","op","amount","unit","message"],"properties":{"amount":{"type":"integer","format":"int64","description":"Magnitude of the change, expressed in `unit`.","example":900,"isRequired":true,"uniqueKey":"unassigned.items.[INDEX].relaxations.items.[INDEX].amount","typeLabel":"integer\u003cint64>"},"message":{"type":"string","description":"Human-readable suggestion.","example":"Extend a time window by 900s (~15 min).","isRequired":true,"uniqueKey":"unassigned.items.[INDEX].relaxations.items.[INDEX].message","typeLabel":"string"},"op":{"type":"string","description":"The kind of change suggested.","example":"extend_time_window","x-extensible-enum":["reduce_load","extend_time_window"],"isRequired":true,"uniqueKey":"unassigned.items.[INDEX].relaxations.items.[INDEX].op","typeLabel":"string"},"pointer":{"type":"string","description":"[RFC 6901] JSON Pointer to the request field to change, like\n`warnings[].pointer`. For a job: `/problem/jobs/{i}/pickup_load`\n(`/problem/jobs/{i}/delivery_load` for a job with only a\n`delivery_load`) or `/problem/jobs/{i}/time_windows`. For a shipment:\n`/problem/shipments/{i}/load` or `/problem/shipments/{i}/pickup/time_windows`\n(either leg's window may be the one to extend). It may name a field the\nrequest omits (a JSON Patch `add` target); its task prefix always resolves.\n\n[RFC 6901]: https://www.rfc-editor.org/rfc/rfc6901","example":"/problem/jobs/1/time_windows","isRequired":true,"uniqueKey":"unassigned.items.[INDEX].relaxations.items.[INDEX].pointer","typeLabel":"string"},"unit":{"type":"string","description":"Unit of `amount`: `s` for `extend_time_window`, `load` for `reduce_load`.","example":"s","x-extensible-enum":["s","m","load","stops"],"isRequired":true,"uniqueKey":"unassigned.items.[INDEX].relaxations.items.[INDEX].unit","typeLabel":"string"}},"example":{"amount":900,"message":"Extend a time window by 900s (~15 min).","op":"extend_time_window","pointer":"/problem/jobs/1/time_windows","unit":"s"},"uniqueKey":"unassigned.items.[INDEX].relaxations.items.[INDEX]","typeLabel":"object"},"description":"Best-effort, actionable relaxation suggestions. Empty when no simple\nrelaxation exists (e.g. a skills mismatch).","isRequired":true,"uniqueKey":"unassigned.items.[INDEX].relaxations","typeLabel":"object[]"},"task":{"type":"string","description":"The unassigned task: a job id or a shipment id.","example":"job-2","isRequired":true,"uniqueKey":"unassigned.items.[INDEX].task","typeLabel":"string"}},"example":{"category":"blocked","reasons":[{"constraint":"time_window","message":"A route cannot reach this task within its time window"}],"relaxations":[{"amount":900,"message":"Extend a time window by 900s (~15 min).","op":"extend_time_window","pointer":"/problem/jobs/1/time_windows","unit":"s"}],"task":"job-2"},"uniqueKey":"unassigned.items.[INDEX]","typeLabel":"object"},"description":"Tasks that could not be feasibly assigned.","isRequired":true,"uniqueKey":"unassigned","typeLabel":"object[]"},"warnings":{"type":"array","items":{"type":"object","description":"One problem in a request.","required":["code","message"],"properties":{"code":{"type":"string","description":"What is wrong.","x-extensible-enum":["invalid_json","invalid_type","unknown_field","missing_field","invalid_value","not_supported","out_of_range","duplicate_id","unknown_reference","conflicting_fields","limit_exceeded"],"isRequired":true,"uniqueKey":"warnings.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable description.","isRequired":true,"uniqueKey":"warnings.items.[INDEX].message","typeLabel":"string"},"actual":{"oneOf":[{"type":"integer","format":"uint64","description":"`limit_exceeded` only: the count this request has.","minimum":0,"uniqueKey":"warnings.items.[INDEX].actual.oneOf.0","typeLabel":"integer\u003cuint64>"},{"type":"null","format":"uint64","description":"`limit_exceeded` only: the count this request has.","minimum":0,"uniqueKey":"warnings.items.[INDEX].actual.oneOf.1","typeLabel":"null"}],"uniqueKey":"warnings.items.[INDEX].actual","typeLabel":"integer\u003cuint64> | null"},"limit":{"oneOf":[{"type":"integer","format":"uint64","description":"`limit_exceeded` only: the published cap.","minimum":0,"uniqueKey":"warnings.items.[INDEX].limit.oneOf.0","typeLabel":"integer\u003cuint64>"},{"type":"null","format":"uint64","description":"`limit_exceeded` only: the published cap.","minimum":0,"uniqueKey":"warnings.items.[INDEX].limit.oneOf.1","typeLabel":"null"}],"uniqueKey":"warnings.items.[INDEX].limit","typeLabel":"integer\u003cuint64> | null"},"pointer":{"oneOf":[{"type":"string","description":"RFC 6901 JSON Pointer into the request body, when the problem has a\nlocation. It is relative to the root of the body, so a field of the\nproblem reads `/problem/...` (e.g.\n`\"/problem/vehicles/0/shifts/0/from\"`).","uniqueKey":"warnings.items.[INDEX].pointer.oneOf.0","typeLabel":"string"},{"type":"null","description":"RFC 6901 JSON Pointer into the request body, when the problem has a\nlocation. It is relative to the root of the body, so a field of the\nproblem reads `/problem/...` (e.g.\n`\"/problem/vehicles/0/shifts/0/from\"`).","uniqueKey":"warnings.items.[INDEX].pointer.oneOf.1","typeLabel":"null"}],"uniqueKey":"warnings.items.[INDEX].pointer","typeLabel":"string | null"}},"uniqueKey":"warnings.items.[INDEX]","typeLabel":"object"},"description":"Inputs the request carried that changed nothing. Always present,\nempty when there are none (no input produces one today); at most 100\nare returned. Each item has a `code`, a `pointer` to the field and a\n`message`. Accept codes you do not know.","isRequired":true,"uniqueKey":"warnings","typeLabel":"object[]"},"search_progress":{"oneOf":[{"type":"array","items":{"type":"object","description":"One point of `search_progress`: the best plan's score `elapsed_ms` into\nthe search. `unassigned_priority` and `cost` mean what they mean in\n`summary.score`; the best plan has the lowest `unassigned_priority`, then the\nlowest `cost`, so `cost` can rise when more tasks get served.","required":["elapsed_ms","unassigned_priority","cost"],"properties":{"cost":{"type":"number","format":"double","description":"Total cost, in the objective's currency.","isRequired":true,"uniqueKey":"search_progress.oneOf.0.items.[INDEX].cost","typeLabel":"number\u003cdouble>"},"elapsed_ms":{"type":"integer","format":"uint64","description":"Milliseconds since the search started (the clock of\n`summary.timings.search_ms`).","minimum":0,"isRequired":true,"uniqueKey":"search_progress.oneOf.0.items.[INDEX].elapsed_ms","typeLabel":"integer\u003cuint64>"},"unassigned_priority":{"type":"integer","format":"int64","description":"Summed `priority` of the required tasks left unassigned.","isRequired":true,"uniqueKey":"search_progress.oneOf.0.items.[INDEX].unassigned_priority","typeLabel":"integer\u003cint64>"}},"example":{"cost":58.8436,"elapsed_ms":180,"unassigned_priority":0},"uniqueKey":"search_progress.oneOf.0.items.[INDEX]","typeLabel":"object"},"description":"How the best plan improved during the search, oldest first: the\nstarting plan, every improvement (thinned to at most 500 entries), and\nthe final plan, which equals `summary.score` (it can equal, or be\nslightly worse than, the entry before it). Present on every solve;\nabsent on evaluate, which does not search. A large request that is\nsolved in parts has the final entry alone.","uniqueKey":"search_progress.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","description":"One point of `search_progress`: the best plan's score `elapsed_ms` into\nthe search. `unassigned_priority` and `cost` mean what they mean in\n`summary.score`; the best plan has the lowest `unassigned_priority`, then the\nlowest `cost`, so `cost` can rise when more tasks get served.","required":["elapsed_ms","unassigned_priority","cost"],"properties":{"cost":{"type":"number","format":"double","description":"Total cost, in the objective's currency."},"elapsed_ms":{"type":"integer","format":"uint64","description":"Milliseconds since the search started (the clock of\n`summary.timings.search_ms`).","minimum":0},"unassigned_priority":{"type":"integer","format":"int64","description":"Summed `priority` of the required tasks left unassigned."}},"example":{"cost":58.8436,"elapsed_ms":180,"unassigned_priority":0}},"description":"How the best plan improved during the search, oldest first: the\nstarting plan, every improvement (thinned to at most 500 entries), and\nthe final plan, which equals `summary.score` (it can equal, or be\nslightly worse than, the entry before it). Present on every solve;\nabsent on evaluate, which does not search. A large request that is\nsolved in parts has the final entry alone.","uniqueKey":"search_progress.oneOf.1","typeLabel":"null"}],"uniqueKey":"search_progress","typeLabel":"object[] | null"}},"example":{"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,"service_start":"2026-07-01T09:00:00+02:00","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,"service_start":"2026-07-01T09:13:00+02:00","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","wait_s":0}],"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":{"assignment":0,"delay":0,"distance":1.69,"drop_costs":0,"grouping":0,"lateness":0,"overtime":0,"preferences":0,"reloads":0,"routes":0,"tag_preference":0,"target":0,"time":57.1536,"vehicles":0,"waiting":0,"window_choice":0,"workload_share":0},"cost":58.8436,"currency":"EUR","unassigned_priority":0,"violation_count":0},"search":{"iterations":48210,"termination":"time_limit"},"shifts_used":1,"tasks":{"served":2,"unassigned":0,"unassigned_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":[],"warnings":[]},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"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,"service_start":"2026-07-01T09:00:00+02:00","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,"service_start":"2026-07-01T09:13:00+02:00","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","wait_s":0}],"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":{"assignment":0,"delay":0,"distance":1.69,"drop_costs":0,"grouping":0,"lateness":0,"overtime":0,"preferences":0,"reloads":0,"routes":0,"tag_preference":0,"target":0,"time":57.1536,"vehicles":0,"waiting":0,"window_choice":0,"workload_share":0},"cost":58.8436,"currency":"EUR","unassigned_priority":0,"violation_count":0},"search":{"iterations":48210,"termination":"time_limit"},"shifts_used":1,"tasks":{"served":2,"unassigned":0,"unassigned_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":[],"warnings":[]}}},"exampleType":"generated"}},"exampleType":"generated"},"136bb299-4eef-4aa6-8d40-e1e27b58ea81":{"description":"`id` is not a UUID. Body: `{\"error\": \"Invalid UUID string: …\"}`.","content":{"application/json":{"schema":{"type":"object","description":"The gateway's own error answer on `/v3/routing/runs*`, not the `ErrorBody` shape. On `404` and `409` the `message` starts with a code (`not_found`, `run_not_finished`, `no_result`), a colon and a sentence; branch on the HTTP status and that code. The other answers carry no code.","required":["error"],"properties":{"error":{"type":"string","description":"`GATEWAY_ERROR`, or the reason for a malformed `id`.","example":"GATEWAY_ERROR","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","description":"Absent on a malformed `id`.","example":"not_found: routing run d28568b1-34cc-4f89-b10b-dc24b26a8275","uniqueKey":"message","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":"Invalid UUID string: not-a-uuid"},"examples":{"Example":{"title":"Example","value":{"error":"Invalid UUID string: not-a-uuid"}}},"exampleType":"examples"}},"exampleType":"examples"},"4c4badac-135c-45c9-b296-fdecf1add6db":{"description":"Missing or invalid API key. Returned by the API gateway, so it does not use the `ErrorBody` shape and can have an empty body. Branch on the HTTP status.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"4cf38f93-a33d-4084-8e54-f4c24b0659d9":{"description":"No run with this id on your account. Runs of other accounts are also `404`.","content":{"application/json":{"schema":{"type":"object","description":"The gateway's own error answer on `/v3/routing/runs*`, not the `ErrorBody` shape. On `404` and `409` the `message` starts with a code (`not_found`, `run_not_finished`, `no_result`), a colon and a sentence; branch on the HTTP status and that code. The other answers carry no code.","required":["error"],"properties":{"error":{"type":"string","description":"`GATEWAY_ERROR`, or the reason for a malformed `id`.","example":"GATEWAY_ERROR","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","description":"Absent on a malformed `id`.","example":"not_found: routing run d28568b1-34cc-4f89-b10b-dc24b26a8275","uniqueKey":"message","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"example":{"message":"not_found: routing run d28568b1-34cc-4f89-b10b-dc24b26a8275","error":"GATEWAY_ERROR"},"examples":{"Example":{"title":"Example","value":{"message":"not_found: routing run d28568b1-34cc-4f89-b10b-dc24b26a8275","error":"GATEWAY_ERROR"}}},"exampleType":"examples"}},"exampleType":"examples"},"e21cc461-9ffa-4a2e-8b2b-38926dd46caf":{"description":"The run has no plan to return. `message` starts with `run_not_finished` while the run is `queued` or `running`, and with `no_result` when it `failed` or was `cancelled`.","content":{"application/json":{"schema":{"type":"object","description":"The gateway's own error answer on `/v3/routing/runs*`, not the `ErrorBody` shape. On `404` and `409` the `message` starts with a code (`not_found`, `run_not_finished`, `no_result`), a colon and a sentence; branch on the HTTP status and that code. The other answers carry no code.","required":["error"],"properties":{"error":{"type":"string","description":"`GATEWAY_ERROR`, or the reason for a malformed `id`.","example":"GATEWAY_ERROR","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","description":"Absent on a malformed `id`.","example":"not_found: routing run d28568b1-34cc-4f89-b10b-dc24b26a8275","uniqueKey":"message","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"example":{"message":"run_not_finished: run d28568b1-34cc-4f89-b10b-dc24b26a8275 is queued","error":"GATEWAY_ERROR"},"examples":{"Example":{"title":"Example","value":{"message":"run_not_finished: run d28568b1-34cc-4f89-b10b-dc24b26a8275 is queued","error":"GATEWAY_ERROR"}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"36d28b08-280b-4faf-9bc6-6f7a926d111a":{"apiKey":{"type":"apiKey","in":"header","name":"Authorization","scopes":[],"schemeName":"apiKey"}}},"servers":{"930d64ef-59cd-4f02-81be-5477d690275e":{"url":"https://api.solvice.io","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"Authorization","scopes":[],"schemeName":"apiKey"},"schema":{"title":"Authorization","type":"string","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"apiKey","name":"Authorization"}],"title":"apiKey"}]},"originalFileLocation":"api-reference/vrp-v3-runs.json"},"subdomain":"solvice-68592f22","siteName":"Solvice Docs","title":"Run result - Solvice Docs","navMaps":{"firstHrefInVersion":{"v3":{"href":"/api-reference/vrp/v3/runs-result","matchLevel":0},"v2":{"href":"/guides/platform/platform","matchLevel":4}},"firstHrefInLanguage":{}},"lastModified":"2026-10-15T08:13:38.211Z","originalFileLocation":"api-reference/vrp/v3/runs-result.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Fetch the plan of a finished run\">\u003cmeta data-mint-head name=\"keywords\" content=\"Route Optimization, Route API, Optimization API, Workforce Scheduling, Solvice\">\u003cmeta data-mint-head name=\"application-name\" content=\"Solvice Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003cmeta data-mint-head name=\"robots\" content=\"index, follow\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/solvice-68592f22/wZOj_k-mDHXJa5jh/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/solvice-68592f22/wZOj_k-mDHXJa5jh/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/solvice-68592f22/wZOj_k-mDHXJa5jh/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/solvice-68592f22/wZOj_k-mDHXJa5jh/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/solvice-68592f22/wZOj_k-mDHXJa5jh/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/solvice-68592f22/wZOj_k-mDHXJa5jh/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/solvice-68592f22/wZOj_k-mDHXJa5jh/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/solvice-68592f22/wZOj_k-mDHXJa5jh/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/solvice-68592f22/wZOj_k-mDHXJa5jh/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Run result - Solvice Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Fetch the plan of a finished run\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Solvice Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.solvice.io/api-reference/vrp/v3/runs-result\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://solvice-68592f22.mintlify.app/link to your default meta tag image\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Run result - Solvice Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Fetch the plan of a finished run\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://solvice-68592f22.mintlify.app/link to your default meta tag image\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/solvice-68592f22/wZOj_k-mDHXJa5jh/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Solvice Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0f62fe\">\u003cmeta data-mint-head name=\"charset\" content=\"UTF-8\">\u003cmeta data-mint-head name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\u003cmeta data-mint-head name=\"author\" content=\"Christophe Van Huele\">\u003cmeta data-mint-head name=\"googlebot\" content=\"index, follow\">\u003cmeta data-mint-head name=\"google\" content=\"notranslate\">\u003cmeta data-mint-head name=\"google-site-verification\" content=\"verification_token\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.solvice.io/api-reference/vrp/v3/runs-result\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/vrp/v3/runs-result.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.solvice.io/#organization\",\"name\":\"Solvice Docs\",\"url\":\"https://docs.solvice.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/solvice-68592f22/1KJ_2AIotizI1Bng/logo/light.svg?fit=max\u0026auto=format\u0026n=1KJ_2AIotizI1Bng\u0026q=85\u0026s=e93560fee320491613107060a1afc094\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.solvice.io#website\",\"name\":\"Solvice Docs\",\"url\":\"https://docs.solvice.io\",\"publisher\":{\"@id\":\"https://docs.solvice.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.solvice.io/api-reference/vrp/v3/runs-result#webpage\",\"url\":\"https://docs.solvice.io/api-reference/vrp/v3/runs-result\",\"name\":\"Run result\",\"description\":\"Fetch the plan of a finished run\",\"dateModified\":\"2026-10-15T08:13:38.211Z\",\"isPartOf\":{\"@id\":\"https://docs.solvice.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.solvice.io/api-reference/vrp/v3/runs-result#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.solvice.io/api-reference/vrp/v3/runs-result#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Routing API\",\"item\":\"https://docs.solvice.io/api-reference/vrp/v3/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Async runs\",\"item\":\"https://docs.solvice.io/api-reference/vrp/v3/runs-submit\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Run result\",\"item\":\"https://docs.solvice.io/api-reference/vrp/v3/runs-result\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.solvice.io/api-reference/vrp/v3/runs-result#apireference\",\"headline\":\"Run result\",\"name\":\"Run result\",\"description\":\"Fetch the plan of a finished run\",\"url\":\"https://docs.solvice.io/api-reference/vrp/v3/runs-result\",\"mainEntityOfPage\":{\"@id\":\"https://docs.solvice.io/api-reference/vrp/v3/runs-result#webpage\"},\"image\":\"https://docs.solvice.io/link%20to%20your%20default%20meta%20tag%20image\",\"dateModified\":\"2026-10-15T08:13:38.211Z\",\"publisher\":{\"@id\":\"https://docs.solvice.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.solvice.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Solvice Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Solvice Docs","nav":{"global":{"anchors":[{"anchor":"Dashboard","icon":"book-open-cover","href":"https://platform.solvice.io"},{"anchor":"Website","icon":"planet-ringed","href":"https://www.solvice.io"},{"anchor":"Blog","icon":"newspaper","href":"https://www.solvice.io/blog/news"}]},"versions":[{"version":"v3","tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":"/guides/platform/platform"}]},{"tab":"API Reference","groups":[{"group":"Routing API","pages":[{"title":"Introduction","href":"/api-reference/vrp/v3/introduction"},{"title":"OpenAPI specification","href":"/api-reference/vrp/v3/openapi"},{"group":"Endpoints","pages":[{"title":"Solve","openapi":"vrp-v3 POST /v3/routing/solve","href":"/api-reference/vrp/v3/solve"},{"title":"Evaluate","openapi":"vrp-v3 POST /v3/routing/evaluate","href":"/api-reference/vrp/v3/evaluate"},{"title":"Suggest","openapi":"vrp-v3 POST /v3/routing/suggest","href":"/api-reference/vrp/v3/suggest"}]},{"group":"Validate","pages":[{"title":"Validate solve","openapi":"vrp-v3 POST /v3/routing/validate/solve","href":"/api-reference/vrp/v3/validate-solve"},{"title":"Validate evaluate","openapi":"vrp-v3 POST /v3/routing/validate/evaluate","href":"/api-reference/vrp/v3/validate-evaluate"},{"title":"Validate suggest","openapi":"vrp-v3 POST /v3/routing/validate/suggest","href":"/api-reference/vrp/v3/validate-suggest"}]},{"group":"Async runs","pages":[{"title":"Submit a run","openapi":"vrp-v3-runs POST /v3/routing/runs","href":"/api-reference/vrp/v3/runs-submit"},{"title":"Run status","openapi":"vrp-v3-runs GET /v3/routing/runs/{id}","description":"Poll the status of an async run","href":"/api-reference/vrp/v3/runs-status"},{"title":"Run result","openapi":"vrp-v3-runs GET /v3/routing/runs/{id}/result","href":"/api-reference/vrp/v3/runs-result"},{"title":"Cancel a run","openapi":"vrp-v3-runs POST /v3/routing/runs/{id}/cancel","description":"Cancel a queued or running run","href":"/api-reference/vrp/v3/runs-cancel"}]}]}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog/vrp"}]}]},{"version":"v2","default":true,"pages":[{"title":"v2","href":"/guides/platform/platform"}]}]},"basePath":"","title":"Run result - Solvice Docs","buildId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","deploymentId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","dynamics":["c2aa737661","b0f84f53ff","a9bb46feb3","2b790eda92"],"chunks":["OpenApiReferenceProvider-C8RPHPxo.js","utils-0BK-9q6z.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DfjzsUJT.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-B4v9psJ4.js","snippetPresets-CpTQv-Ez.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","Page-Buji1S4J.js","ApiExamples-BNP-Fvr0.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BSgu6h1D.js","shallow-Biv1i9Gs.js","getApiPlaygroundDisplay-BoGOXhtF.js","CodeSnippet-DvQoT18_.js","CodeSnippets-Dnpa15xT.js","getPastedJson-xAIyhUFE.js","icon-S6FBih11.js","MethodPill-SaYeUZyk.js","DuplicateIcon-Cs-p3v2Q.js","createIcon-DjCFEoHq.js","DynamicMarkdown-BcnBltEQ.js","SectionHeading-BUBl0eEF.js","axios-vUo_bRtp.js","Markdown-h4cOoD8d.js","clsx-B2v50t8t.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DJnKvr0g.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BHrrjR1K.js"]}