Schemas
SolveRequest
The Problem object embedded within the main solve request.
userIdYour identity for ownership comes from your API key (or Clerk token), never from this field, so a run is owned by the credential that submitted it — POST /user_runs returns the runs your key made regardless of what userId you send. Required only when you call without a credential: an API-key or token request may omit it (the value is then ignored), but a request with neither a key nor a token must supply a non-empty userId as a self-assigned id, or it is rejected with 400 MISSING_USER_ID. The browser app's legacy soft-auth path uses it this way.
exampleSlugOptional. The slug of the published example scenario this solve was loaded from (as returned by /list_examples). Published examples legitimately exceed the free tier's size limits, so sending this grants a bounded allowance sized from that example's own row counts plus a small edit margin - enough to run and tweak the demo, and never more than the named example's real size. Omit it for a user's own scenarios; an unrecognised slug is ignored.
ProblemRequest
problemTypeThis schema defines the problem data for an optimization Problem. The particular data objects used will depend on the problemType.
This schema defines how to interpet the input time field settings. Optimiciti allows for input times to be specified as absolute numeric values (i.e 0, 12, 60, etc.) or as date/time values (i.e. 1/1/2024, 2:24pm).
coordinateSystemWhich coordinate family this problem's locations use. geographic (the default, and what every existing payload means) uses latitude/longitude on the Earth. cartesian uses unbounded x/y on an arbitrary plane, for scenarios with positions but no addresses. It describes the DATA, not the costing, so it is set once per request rather than per cost setting - and it decides which distance/duration methods are valid.
StandardResponse
successIndicates if the request was successful
dataThe main response payload. Can be an object, array, boolean, or string.
ResponseError
codeInternal error code
messageHuman readable error message
detailsAdditional error context
RunSummaryEntry
run_datetime_unixWhen the run was submitted, as a Unix timestamp in seconds. An integer, the same type POST /user_runs returns for this run.
statusThe run's lifecycle status, the same value POST /run_status reports: queued, running, succeeded, failed or cancelled. Runs from before the lifecycle field existed are all finished and read succeeded.
A compact summary of the finished run: the assignmentSummary, routeSummary and costSummary parts of the result's resultSummary, key for key (the full result, including timingSummary, is in POST /run_results_by_run_id). Empty ({}) for runs finished before 2026-09-18, which predate the summary being written; there is no backfill.
run_nameThe name given with POST /update_run_name. Absent until the run has been renamed.
UserRunsResponse
ProblemData
TimeSettings
timeUnitThe time unit to use for optimization. This time unit will apply, as applicable, to location open and close windows, trip open and close windows, vehicle operating times, and travel durations. Integer (default) indicates that all times are in absolute time units from an arbitrarily defined time 0. Clock indicates that times will be interpreted as literal clock times and calendar dates. Which time fields are READ depends on this: integer reads only the *TimeInt fields; clock reads only the *TimeStr fields, plus *DayInt as a day offset to them. integer is also what you get when timeSettings is omitted, so clock times such as 9:00 AM need timeSettings with timeUnit: clock at the top level of the problem (not inside problemData). A request whose time values would be ignored under the unit it declares is refused with 400 IGNORED_TIME_WINDOW.
timeFormatThe format to expect all time fields in. This field is only relevant when timeUnit = "clock". Formattings should match the formats described by the python pandas.Period.strftime class. For example, if the format used matches 09:32pm, then '%I:%M%p'. If null is passed, then the pandas.to_datetime function will be used to detect the format.
multipleDaysA boolean field indicating whether to allow the optimization time period to extend multiple days. This field is relevant only when timeUnit = "datetime".
dateUnitThe date unit to use for optimization. This field is only relevant when timeUnit = "clock" and multipleDays = true. If this field is integer, then days will be measured as absolute days from an arbitrarily defined day 0. Calendar indidates that dates will be interpreted as literal calendar dates.
dateFormatThe format to expect all dates fields in. This field is only relevant when dateUnit = "calendar", multipleDays = true, and timeUnit = "clock". Formattings should match the formats described by the python pandas.Period.strftime class. For example, if the format used matches 2024-12-31, then '%Y-%m-%d' should be passed for this parameter. If null is passed, then the pandas.to_datetime function will be used to detect the format.
Location
locationIdA string that uniquely identifies this location.
locationNameA name for this location. Required: a request whose location has no locationName is refused with 422. It is echoed on every route stop that visits the location (RouteStop.locationName) and on unassignedLocationsFull, so a route sheet is readable without re-joining the input.
demandThe amount of vehicle capacity this location consumes
latitudeThe latitude for this location. Required only if autoCalculateDuration or autoCalculateDistance is true.
longitudeThe longitude for this location. Required only if autoCalculateDuration or autoCalculateDistance is true.
xCartesian x position on an arbitrary plane (warehouse floor, factory layout, PCB). Unbounded - deliberately NOT range-validated, unlike longitude. Use with coordinateSystem=cartesian; x is the exact counterpart of longitude (x = longitude, y = latitude), so a scenario can migrate between the two families without reordering. Supply either latitude/longitude or x/y, never both.
yCartesian y position on an arbitrary plane. Unbounded - deliberately NOT range-validated, unlike latitude. Use with coordinateSystem=cartesian; y is the exact counterpart of latitude. Supply either latitude/longitude or x/y, never both.
isDepotWhether this location serves only as a depot for vehicles (true) or if this location should be serviced.
serviceDurationHow long service at this location takes, in the problem's time unit (minutes under timeSettings.timeUnit: clock; your integer unit otherwise). Charged at the stop; defaults to 0.
minArrivalTimeIntAn integer value representing the earliest time this location can be serviced (time t=0 is the earliest start time). Leave empty if there are no time restrictions on arrival. Read only when timeSettings.timeUnit is integer (the default, including when timeSettings is omitted). Under clock it is ignored and minArrivalTimeStr is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
minArrivalTimeStrA string value representing the earliest time this location can be serviced (time t=0 is the earliest start time). Leave empty if there are no time restrictions on arrival. The time format should correspond to the timeFormat field in timeSettings (at the top level of the problem, not inside problemData). Read only when timeSettings.timeUnit is clock. The default is integer, including when timeSettings is omitted, and then this field is ignored and minArrivalTimeInt is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
minArrivalDayIntAn integer value representing the earliest day this location can be serviced. Read only when timeSettings.timeUnit is clock, as a day offset added to the matching minArrivalTimeStr time; ignored under integer or without that time, and a request that sets it where it would be ignored is refused with 400 IGNORED_TIME_WINDOW. Leave empty if there are no restrictions on arrival.
maxArrivalTimeIntAn integer value representing the latest time this location can be serviced (time t=0 is the earliest start time). Leave empty if there are no time restrictions on arrival. Read only when timeSettings.timeUnit is integer (the default, including when timeSettings is omitted). Under clock it is ignored and maxArrivalTimeStr is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
maxArrivalTimeStrA string value representing the latest time this location can be serviced (time t=0 is the earliest start time). Leave empty if there are no time restrictions on arrival. The time format should correspond to the timeFormat field in timeSettings (at the top level of the problem, not inside problemData). Read only when timeSettings.timeUnit is clock. The default is integer, including when timeSettings is omitted, and then this field is ignored and maxArrivalTimeInt is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
maxArrivalDayIntAn integer value representing the latest day this location can be serviced. Read only when timeSettings.timeUnit is clock, as a day offset added to the matching maxArrivalTimeStr time; ignored under integer or without that time, and a request that sets it where it would be ignored is refused with 400 IGNORED_TIME_WINDOW. Leave empty if there are no restrictions on arrival.
exactArrivalTimeIntAn integer value representing the exact time this location must be serviced (time t=0 is the earliest start time). Leave empty if there are no time restrictions on arrival. This is a HARD PIN: the solver must arrive at exactly this time, applied as an equal min/max window. Set EITHER the exact* fields OR the min*/max* window for this location, never both. These are checked when the run starts, not when it is submitted: POST /problem accepts the request (202), and the run then ends with status: failed, an error saying what to fix and an error_code (EXACT_ARRIVAL_CONFLICT, EXACT_ARRIVAL_INFEASIBLE or EXACT_ARRIVAL_UNSERVABLE; see RunStatus.error_code), never by silently dropping the stop -- if the exact time and a window are both set; if no vehicle can reach it in time (the error names the earliest feasible time); or if it is reachable on its own but unsatisfiable with the rest of the problem (fleet size, capacity, competing pins). Read only when timeSettings.timeUnit is integer (the default, including when timeSettings is omitted). Under clock it is ignored and exactArrivalTimeStr is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
exactArrivalTimeStrA string value representing the exact time this location must be serviced (time t=0 is the earliest start time). Leave empty if there are no time restrictions on arrival. The time format should correspond to the timeFormat field in timeSettings (at the top level of the problem, not inside problemData). This is a HARD PIN: the solver must arrive at exactly this time, applied as an equal min/max window. Set EITHER the exact* fields OR the min*/max* window for this location, never both. These are checked when the run starts, not when it is submitted: POST /problem accepts the request (202), and the run then ends with status: failed, an error saying what to fix and an error_code (EXACT_ARRIVAL_CONFLICT, EXACT_ARRIVAL_INFEASIBLE or EXACT_ARRIVAL_UNSERVABLE; see RunStatus.error_code), never by silently dropping the stop -- if the exact time and a window are both set; if no vehicle can reach it in time (the error names the earliest feasible time); or if it is reachable on its own but unsatisfiable with the rest of the problem (fleet size, capacity, competing pins). Read only when timeSettings.timeUnit is clock. The default is integer, including when timeSettings is omitted, and then this field is ignored and exactArrivalTimeInt is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
exactArrivalDayIntAn integer value representing the exact day this location must be serviced. Read only when timeSettings.timeUnit is clock, as a day offset added to the matching exactArrivalTimeStr time; ignored under integer or without that time, and a request that sets it where it would be ignored is refused with 400 IGNORED_TIME_WINDOW. Leave empty if there are no restrictions on arrival. This is a HARD PIN: the solver must arrive at exactly this time, applied as an equal min/max window. Set EITHER the exact* fields OR the min*/max* window for this location, never both. These are checked when the run starts, not when it is submitted: POST /problem accepts the request (202), and the run then ends with status: failed, an error saying what to fix and an error_code (EXACT_ARRIVAL_CONFLICT, EXACT_ARRIVAL_INFEASIBLE or EXACT_ARRIVAL_UNSERVABLE; see RunStatus.error_code), never by silently dropping the stop -- if the exact time and a window are both set; if no vehicle can reach it in time (the error names the earliest feasible time); or if it is reachable on its own but unsatisfiable with the rest of the problem (fleet size, capacity, competing pins).
colorThe color to use for this location in the output. Accepts a hex code ("#FF0000") or a CSS color name ("crimson").
vehicleTypeIdsThe vehicleTypeIds that can service this location. These vehicleTypeIds must exist in the VehicleTypes passed in ProblemData for this problem. Leave empty if there are no restrictions on which vehicle types can service this location.
fixedVehicleIdOptional. Pin this location to a specific vehicle: the solve must use this vehicle to serve this stop. The vehicleId must exist in the Vehicles passed in ProblemData. If the pin cannot be satisfied - the vehicle does not exist, or its type is excluded by this location's vehicleTypeIds - the location is returned unassigned rather than served by a different vehicle. Leave null for no pin.
Trip
tripIdA unique identifier for this trip. It must be a whole number written as a string, for example "1", with no leading zeros. Any other value (a UUID, "trip-1", "1.5") makes the run fail, and a padded one ("007") comes back as "7".
fromLocationIdThe locationId for the origin location of this trip. This locationId must exist in the Locations passed in ProblemData for this problem.
toLocationIdThe locationId for the destination location of this trip. This locationId must exist in the Locations passed in ProblemData for this problem.
tripNameA name for this trip (optional).
vehicleTypeIdsThe vehicleTypeIds that can be used to service this trip. These vehicleTypeIds must exist in the VehicleTypes passed in ProblemData for this problem.
fixedVehicleIdOptional. Pin this trip to a specific vehicle: the solve must use this vehicle for both the pickup and the delivery. The vehicleId must exist in the Vehicles passed in ProblemData. If the pin cannot be satisfied - the vehicle does not exist, or its type is excluded by this trip's vehicleTypeIds - the trip is returned unassigned rather than served by a different vehicle. Leave null for no pin.
minPickupTimeIntAn integer value representing the earliest time this trip can be picked up (time t=0 is the earliest start time). Leave empty if there are no time restrictions on pickup. Read only when timeSettings.timeUnit is integer (the default, including when timeSettings is omitted). Under clock it is ignored and minPickupTimeStr is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
minPickupTimeStrA string value representing the earliest time this trip can be picked up. Leave empty if there are no time restrictions on pickup. The time format should correspond to the timeFormat field in timeSettings (at the top level of the problem, not inside problemData). Read only when timeSettings.timeUnit is clock. The default is integer, including when timeSettings is omitted, and then this field is ignored and minPickupTimeInt is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
minPickupDayIntAn integer value representing the earliest day this trip can be picked up. Read only when timeSettings.timeUnit is clock, as a day offset added to the matching minPickupTimeStr time; ignored under integer or without that time, and a request that sets it where it would be ignored is refused with 400 IGNORED_TIME_WINDOW. Leave empty if there are no restrictions on pickup.
maxPickupTimeIntAn integer value representing the latest time this trip can be picked up (time t=0 is the earliest start time). Leave empty if there are no time restrictions on pickup. Read only when timeSettings.timeUnit is integer (the default, including when timeSettings is omitted). Under clock it is ignored and maxPickupTimeStr is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
maxPickupTimeStrA string value representing the latest time this trip can be picked up. Leave empty if there are no time restrictions on pickup. The time format should correspond to the timeFormat field in timeSettings (at the top level of the problem, not inside problemData). Read only when timeSettings.timeUnit is clock. The default is integer, including when timeSettings is omitted, and then this field is ignored and maxPickupTimeInt is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
maxPickupDayIntAn integer value representing the latest day this trip can be picked up. Read only when timeSettings.timeUnit is clock, as a day offset added to the matching maxPickupTimeStr time; ignored under integer or without that time, and a request that sets it where it would be ignored is refused with 400 IGNORED_TIME_WINDOW. Leave empty if there are no restrictions on pickup.
exactPickupTimeIntAn integer value representing the exact time this trip must be picked up (time t=0 is the earliest start time). Leave empty if there are no time restrictions on pickup. This is a HARD PIN: the solver must pick up at exactly this time, applied as an equal min/max window. Set EITHER the exact* fields OR the min*/max* window for the same end, never both. These are checked when the run starts, not when it is submitted: POST /problem accepts the request (202), and the run then ends with status: failed, an error saying what to fix and an error_code (EXACT_ARRIVAL_CONFLICT, EXACT_ARRIVAL_INFEASIBLE or EXACT_ARRIVAL_UNSERVABLE; see RunStatus.error_code), never by silently dropping the trip -- if the exact time and a window are both set; if no vehicle can reach it in time (the error names the earliest feasible time); or if it is reachable on its own but unsatisfiable with the rest of the problem (fleet size, capacity, competing pins). Read only when timeSettings.timeUnit is integer (the default, including when timeSettings is omitted). Under clock it is ignored and exactPickupTimeStr is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
exactPickupTimeStrA string value representing the exact time this trip must be picked up. Leave empty if there are no time restrictions on pickup. The time format should correspond to the timeFormat field in timeSettings (at the top level of the problem, not inside problemData). This is a HARD PIN: the solver must pick up at exactly this time, applied as an equal min/max window. Set EITHER the exact* fields OR the min*/max* window for the same end, never both. These are checked when the run starts, not when it is submitted: POST /problem accepts the request (202), and the run then ends with status: failed, an error saying what to fix and an error_code (EXACT_ARRIVAL_CONFLICT, EXACT_ARRIVAL_INFEASIBLE or EXACT_ARRIVAL_UNSERVABLE; see RunStatus.error_code), never by silently dropping the trip -- if the exact time and a window are both set; if no vehicle can reach it in time (the error names the earliest feasible time); or if it is reachable on its own but unsatisfiable with the rest of the problem (fleet size, capacity, competing pins). Read only when timeSettings.timeUnit is clock. The default is integer, including when timeSettings is omitted, and then this field is ignored and exactPickupTimeInt is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
exactPickupDayIntAn integer value representing the exact day this trip must be picked up. Leave empty if there are no restrictions on pickup. This is a HARD PIN: the solver must pick up at exactly this time, applied as an equal min/max window. Set EITHER the exact* fields OR the min*/max* window for the same end, never both. These are checked when the run starts, not when it is submitted: POST /problem accepts the request (202), and the run then ends with status: failed, an error saying what to fix and an error_code (EXACT_ARRIVAL_CONFLICT, EXACT_ARRIVAL_INFEASIBLE or EXACT_ARRIVAL_UNSERVABLE; see RunStatus.error_code), never by silently dropping the trip -- if the exact time and a window are both set; if no vehicle can reach it in time (the error names the earliest feasible time); or if it is reachable on its own but unsatisfiable with the rest of the problem (fleet size, capacity, competing pins). Read only when timeSettings.timeUnit is clock, as a day offset added to the matching exactPickupTimeStr time; ignored under integer or without that time, and a request that sets it where it would be ignored is refused with 400 IGNORED_TIME_WINDOW.
minDeliveryTimeIntAn integer value representing the earliest time this trip can be delivered (time t=0 is the earliest start time). Leave empty if there are no time restrictions on delivery. Read only when timeSettings.timeUnit is integer (the default, including when timeSettings is omitted). Under clock it is ignored and minDeliveryTimeStr is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
minDeliveryTimeStrA string value representing the earliest time this trip can be delivered. Leave empty if there are no time restrictions on delivery. The time format should correspond to the timeFormat field in timeSettings (at the top level of the problem, not inside problemData). Read only when timeSettings.timeUnit is clock. The default is integer, including when timeSettings is omitted, and then this field is ignored and minDeliveryTimeInt is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
minDeliveryDayIntAn integer value representing the earliest day this trip can be delivered. Read only when timeSettings.timeUnit is clock, as a day offset added to the matching minDeliveryTimeStr time; ignored under integer or without that time, and a request that sets it where it would be ignored is refused with 400 IGNORED_TIME_WINDOW. Leave empty if there are no restrictions on delivery.
maxDeliveryTimeIntAn integer value representing the latest time this trip can be delivered (time t=0 is the earliest start time). Leave empty if there are no time restrictions on delivery. Read only when timeSettings.timeUnit is integer (the default, including when timeSettings is omitted). Under clock it is ignored and maxDeliveryTimeStr is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
maxDeliveryTimeStrA string value representing the latest time this trip can be delivered. Leave empty if there are no time restrictions on delivery. The time format should correspond to the timeFormat field in timeSettings (at the top level of the problem, not inside problemData). Read only when timeSettings.timeUnit is clock. The default is integer, including when timeSettings is omitted, and then this field is ignored and maxDeliveryTimeInt is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
maxDeliveryDayIntAn integer value representing the latest day this trip can be delivered. Read only when timeSettings.timeUnit is clock, as a day offset added to the matching maxDeliveryTimeStr time; ignored under integer or without that time, and a request that sets it where it would be ignored is refused with 400 IGNORED_TIME_WINDOW. Leave empty if there are no restrictions on delivery.
exactDeliveryTimeIntAn integer value representing the exact time this trip must be delivered (time t=0 is the earliest start time). Leave empty if there are no time restrictions on delivery. This is a HARD PIN: the solver must deliver at exactly this time, applied as an equal min/max window. Set EITHER the exact* fields OR the min*/max* window for the same end, never both. These are checked when the run starts, not when it is submitted: POST /problem accepts the request (202), and the run then ends with status: failed, an error saying what to fix and an error_code (EXACT_ARRIVAL_CONFLICT, EXACT_ARRIVAL_INFEASIBLE or EXACT_ARRIVAL_UNSERVABLE; see RunStatus.error_code), never by silently dropping the trip -- if the exact time and a window are both set; if no vehicle can reach it in time (the error names the earliest feasible time); for an exact delivery, also if it is earlier than the trip's pickup (pinned or earliest possible) plus the pickup's service time plus the travel from pickup to delivery -- when both ends are pinned the error names both times and the travel time between them; or if it is reachable on its own but unsatisfiable with the rest of the problem (fleet size, capacity, competing pins). Read only when timeSettings.timeUnit is integer (the default, including when timeSettings is omitted). Under clock it is ignored and exactDeliveryTimeStr is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
exactDeliveryTimeStrA string value representing the exact time this trip must be delivered. Leave empty if there are no time restrictions on delivery. The time format should correspond to the timeFormat field in timeSettings (at the top level of the problem, not inside problemData). This is a HARD PIN: the solver must deliver at exactly this time, applied as an equal min/max window. Set EITHER the exact* fields OR the min*/max* window for the same end, never both. These are checked when the run starts, not when it is submitted: POST /problem accepts the request (202), and the run then ends with status: failed, an error saying what to fix and an error_code (EXACT_ARRIVAL_CONFLICT, EXACT_ARRIVAL_INFEASIBLE or EXACT_ARRIVAL_UNSERVABLE; see RunStatus.error_code), never by silently dropping the trip -- if the exact time and a window are both set; if no vehicle can reach it in time (the error names the earliest feasible time); for an exact delivery, also if it is earlier than the trip's pickup (pinned or earliest possible) plus the pickup's service time plus the travel from pickup to delivery -- when both ends are pinned the error names both times and the travel time between them; or if it is reachable on its own but unsatisfiable with the rest of the problem (fleet size, capacity, competing pins). Read only when timeSettings.timeUnit is clock. The default is integer, including when timeSettings is omitted, and then this field is ignored and exactDeliveryTimeInt is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
exactDeliveryDayIntAn integer value representing the exact day this trip must be delivered. Leave empty if there are no restrictions on delivery. This is a HARD PIN: the solver must deliver at exactly this time, applied as an equal min/max window. Set EITHER the exact* fields OR the min*/max* window for the same end, never both. These are checked when the run starts, not when it is submitted: POST /problem accepts the request (202), and the run then ends with status: failed, an error saying what to fix and an error_code (EXACT_ARRIVAL_CONFLICT, EXACT_ARRIVAL_INFEASIBLE or EXACT_ARRIVAL_UNSERVABLE; see RunStatus.error_code), never by silently dropping the trip -- if the exact time and a window are both set; if no vehicle can reach it in time (the error names the earliest feasible time); for an exact delivery, also if it is earlier than the trip's pickup (pinned or earliest possible) plus the pickup's service time plus the travel from pickup to delivery -- when both ends are pinned the error names both times and the travel time between them; or if it is reachable on its own but unsatisfiable with the rest of the problem (fleet size, capacity, competing pins). Read only when timeSettings.timeUnit is clock, as a day offset added to the matching exactDeliveryTimeStr time; ignored under integer or without that time, and a request that sets it where it would be ignored is refused with 400 IGNORED_TIME_WINDOW.
demandThe amount of vehicle capacity this trip consumes.
excessTravelTimeMaximum minutes the actual pickup->delivery transit may exceed the direct travel time for this trip (caps detours from pooling). Null = no cap.
pickupServiceDurationMinutes to service the pickup (e.g. park and load) at the trip's origin. Charged at the pickup stop. Defaults to 0.
deliveryServiceDurationMinutes to service the drop-off (e.g. park and unload) at the trip's destination. Charged at the delivery stop. Defaults to 0.
Vehicle
vehicleIdA unique identifier for this vehicle. Any non-empty string that is unique among your vehicles works — it is not required to be a UUID and the format is not validated. It is echoed back on each route stop as vehicleId.
vehicleTypeIdThe vehicleTypeId for this vehicle. This vehicleTypeId must exist in the VehicleTypes passed in ProblemData for this problem.
startLocationIdThe locationId of the depot for this vehicle type. This locationId must exist in the Locations passed in ProblemData for this problem.
vehicleNameA name for this vehicle (optional).
fixedCostThe fixed cost for using this vehicle.
minStartTimeIntAn integer value representing the earliest time this vehicle can depart from its depot to begin its route(s) (time t=0 is the earliest start time). Leave empty if there are no restrictions on when the vehicle can start. Read only when timeSettings.timeUnit is integer (the default, including when timeSettings is omitted). Under clock it is ignored and minStartTimeStr is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
minStartTimeStrA string value representing the earliest time this vehicle can depart from its depot to begin its route(s). Leave empty if there are no restrictions on when the vehicle can start. The time format should match the timeFormat field in timeSettings (at the top level of the problem, not inside problemData). Read only when timeSettings.timeUnit is clock. The default is integer, including when timeSettings is omitted, and then this field is ignored and minStartTimeInt is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
minStartDayIntAn integer value representing the earliest day this vehicle can depart from its depot to begin its route(s). Read only when timeSettings.timeUnit is clock, as a day offset added to the matching minStartTimeStr time; ignored under integer or without that time, and a request that sets it where it would be ignored is refused with 400 IGNORED_TIME_WINDOW. Leave empty if there are no restrictions on when the vehicle can start.
maxEndTimeIntAn integer value representing the latest time this vehicle must return to its depot after completing its route(s) (time t=0 is the earliest start time). Leave empty if there are no restrictions on when the vehicle must finish. Read only when timeSettings.timeUnit is integer (the default, including when timeSettings is omitted). Under clock it is ignored and maxEndTimeStr is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
maxEndTimeStrA string value representing the latest time this vehicle must return to its depot after completing its route(s). Leave empty if there are no restrictions on when the vehicle must finish. The time format should match the timeFormat field in timeSettings (at the top level of the problem, not inside problemData). Read only when timeSettings.timeUnit is clock. The default is integer, including when timeSettings is omitted, and then this field is ignored and maxEndTimeInt is read instead; a request that sets only this form there is refused with 400 IGNORED_TIME_WINDOW rather than solved without it.
maxEndDayIntAn integer value representing the latest day this vehicle must return to its depot after completing its route(s). Read only when timeSettings.timeUnit is clock, as a day offset added to the matching maxEndTimeStr time; ignored under integer or without that time, and a request that sets it where it would be ignored is refused with 400 IGNORED_TIME_WINDOW. Leave empty if there are no restrictions on when the vehicle must finish.
endLocationIdThe locationId of the depot for this vehicle type. If null, then the startLocationId will be used as the end location. This locationId must exist in the Locations passed in ProblemData for this problem.
colorThe color to use for this vehicle in the output. Accepts a hex code ("#FF0000") or a CSS color name ("crimson").
VehicleType
vehicleTypeIdA unique identifier for this vehicle type.
vehicleTypeA name for this vehicle type.
capacityThe maximum capacity of this vehicle type, in units of demand. Leave null if this vehicle type has no capacity limit.
allowResupplyWhether this vehicle type can be resupplied during an optimization run.
TravelCost
fromLocationIdThe locationId of the origin location for this travel cost. This locationId must exist in the Locations passed in ProblemData for this problem.
toLocationIdThe locationId of the destination location for this travel cost. This locationId must exist in the Locations passed in ProblemData for this problem.
vehicleTypeIdThe vehicleTypeId for this travel cost. This vehicleTypeId must exist in the VehicleTypes passed in ProblemData for this problem. If null, then the travel cost will apply to all vehicle types.
vehicleTypeThe name of the vehicle type for this travel cost. This field is optional and is provided for convenience only.
durationThe travel duration between these two locations, in the problem's time unit: minutes when timeSettings.timeUnit is clock (a value of 30 arrives half an hour later), and your own integer time unit when it is integer. The solver uses the number as-is and never rescales it, so a duration supplied in seconds under clock time makes every leg sixty times too long. POST /cost_matrix returns durations in minutes. If null, the travel duration will be calculated automatically based on the latitude and longitude of the locations.
distanceThe travel distance between these two locations. Any unit can be used, as long as it is the same for every entry: the solver never converts it, and every distance in the results (travelDistanceFromPreviousStop, totalDistanceTraveled) is reported in this same unit — there is no distance-unit setting anywhere in the problem. A matrix from POST /cost_matrix is in statute miles for geographic (latitude/longitude) coordinates and in the coordinates' own unit for cartesian (x/y) ones. If null, the travel distance will be calculated automatically based on the latitude and longitude of the locations.
costThe cost of travel between these two locations.
RequestAccepted
successUsageSummary
tasksUsedTasks counted against this month so far: stops or trips served by runs that reached succeeded, including any run that just succeeded. Not the run being submitted, whose tasks are only known when it succeeds.
tasksIncludedTasks the plan includes per UTC month. null for a plan that does not meter tasks.
periodThe UTC calendar month these numbers are for, as YYYY-MM.
resetsAtWhen the allowance resets: the first instant of the next UTC month.
planThe plan tier the allowance comes from (as listed by GET /plans).
ProblemStatus
statusThe solver's completion marker carried inside a results payload (ProblemResult.problemStatus). It is always completed: a results payload exists only for a run that finished, and the current solver writes no other value here (the other names in this enum are kept so old stored results still validate). This is not the value you poll for — the run lifecycle status returned by GET /problem/{problemId} and POST /run_status is queued/running/succeeded/failed/cancelled (see RunStatus); succeeded there and completed here describe the same finished run.
RunStatus
statusA run starts queued, becomes running, and reaches exactly one terminal state: succeeded, failed, or cancelled. Poll until the status is terminal — there is no completed value here.
run_idThe run this status is for.
progressAlways null. The key is kept so existing clients keep parsing; the solver does not report intermediate progress, and a progress bar cannot be built from it. Poll status instead.
errorA human-readable reason, present only when status is failed. To act on a failure in code, branch on error_code; this wording may change.
error_codeWhy the run failed, as a stable code: present when status is failed, and null otherwise. Branch on this, not on error -- the sentence is written to be read and its wording may improve; the code will not change. These conditions are found while the run is being solved, after POST /problem has already answered 202, so they never arrive as an HTTP error: poll for them here. One of: NO_FEASIBLE_SOLUTION (no plan satisfies the problem as specified -- conflicting time windows, capacities, vehicle shifts, or missing travel costs between stops that must reach each other), SOLVE_TIMEOUT (no solution was found within the maximum solve time), INVERTED_TIME_WINDOW (a location, trip or vehicle has a time window that ends before it starts), INVALID_TRAVEL_COSTS (specific pickup-delivery pairs have a missing or null travel cost), EXACT_ARRIVAL_CONFLICT (a stop or trip end sets an exact time AND a min/max window), EXACT_ARRIVAL_INFEASIBLE (an exact time no vehicle can make), EXACT_ARRIVAL_UNSERVABLE (exact times each reachable alone but unsatisfiable together), or INTERNAL_SERVER_ERROR -- the failure was ours, not your problem's; error still says what happened, and a code is always present so the absence of one never has to be read as meaning anything. A run that failed before this field existed has error_code: null.
run_datetime_unixWhen the run was submitted, as a Unix timestamp.
ProblemResult
problemIdThe unique identifier for this optimization run.
The status of the optimization problem identified by the problemId parameter.
Metadata about the optimization problem
A compact list of the stops visited, in order. Not populated by the solver: expect null. Read the plan from routeStopsFull instead, which is the populated, self-contained version. routeStops is retained for backward compatibility and may be absent or null even on a successful run.
The optimized plan: every stop each vehicle visits, in order, with the full location and vehicle details attached. This is the field to read for the route. A run can succeed while assigning fewer than all of your stops (an over-constrained problem, or travel costs with null entries), so always check that every stop you submitted appears here (a depot appears only as a route's start and end), and treat succeeded with fewer stops served than submitted — or with all-zero distances — as an incomplete solve rather than a clean one. Unserved stops appear under unassignedLocationsFull (vehicle-routing) or unassignedTripsFull (pickup-delivery).
Not populated by the solver: expect null, even on a run that left a stop unassigned. A null here says nothing about whether stops were dropped. Read unassignedLocationsFull, which is the list the solver fills. Retained for backward compatibility.
A list of locations that were not visited by any vehicle during the optimization run, along with additional details about the location.
Not populated by the solver: expect null, even on a run that left a trip unassigned. A null here says nothing about whether trips were dropped. Read unassignedTripsFull, which is the list the solver fills. Retained for backward compatibility.
A list of trips that were not serviced by any vehicle during the optimization run, along with additional details about the trip.
pathsPer-vehicle route geometry. Can be null. Each element's path field is a JSON-encoded string (not a nested object) — JSON.parse it before use.
A list of vehicle usage summaries for the optimization run.
VehicleUsage
vehicleIdThe unique identifier of the vehicle.
usedWhether the vehicle was used (assigned at least one stop) during the optimization run.
fixedCostIncurredThe fixed cost incurred by this vehicle. This equals the vehicle's fixed cost if the vehicle was used, otherwise 0.
VehiclesAssigned
assignedThe number of vehicles assigned at least one stop.
availableThe number of vehicles supplied in the problem (the fleet size), whether or not they were used. A vehicle that restocks and makes several trips counts once.
LocationsAssigned
assignedThe number of distinct locations visited as a stop on a vehicle's route. A route's start and end (the depot) are not counted.
totalassigned plus everything left unassigned: the unassigned locations of a vehicle-routing problem, or the unassigned trips of a pickup-delivery problem. Depots are not counted, so this is smaller than the number of locations you submitted: a depot and two stops give total: 2. It is null, not 0, only when the problem had no stops to visit (every location a depot), which POST /problem now refuses with 400 NO_STOPS_TO_VISIT; you will see it only on runs submitted before that check.
AssignmentSummary
Summary of vehicle assignment counts for an optimization run.
How many locations were served. assigned == total means nothing was left unassigned. Neither number counts depots, so neither is the number of locations you submitted.
RouteSummary
totalDistanceTraveledTotal distance traveled across all vehicle routes, in the same unit as the distance values in the submitted travelCosts (there is no distance-unit setting; the solver reports what it was given). When the matrix came from POST /cost_matrix that is statute miles for geographic coordinates and the coordinates' own unit for cartesian.
totalMinutesTraveledTotal travel time in minutes across all vehicle routes.
totalTravelCostTotal travel cost across all vehicle routes.
CostSummary
fixedCostSum of fixed costs for all vehicles used in the solution.
travelCostSum of distance- or time-based travel costs across all routes.
TimingSummary
solveTimeWall-clock time in seconds taken by the solver to produce a solution.
ResultSummary
High-level counts of vehicles and locations that were assigned during the optimization run.
Aggregate travel metrics across all vehicle routes in the optimization run.
Breakdown of fixed and variable costs for the optimization run.
Timing information for the optimization run.
ProblemResponse
The full optimization result including routes, stops, and unassigned locations.
A high-level summary of key metrics from the optimization run.
CostMatrixResponse
A list of travel costs between pairs of locations. Each travel cost represents the duration, distance, and cost of travel between two locations.
A list of errors encountered during the cost matrix calculation. Each error represents a problem with calculating the travel cost between two locations.
TravelCostResponses
This schema defines the response for travel costs between pairs of locations.
fromLocationIdThe locationId of the origin location for this travel cost
toLocationIdThe locationId of the destination location for this travel cost.
fromLocationNameThe name of the origin location for this travel cost.
toLocationNameThe name of the destination location for this travel cost.
vehicleTypeIdThe vehicleTypeId for this travel cost. If null, then the travel cost will apply to all vehicle types.
vehicleTypeThe name of the vehicle type for this travel cost. If null, then the travel cost will apply to all vehicle types.
durationThe travel duration between these two locations, in minutes (road-network durations are converted from seconds; the other methods derive minutes from the distance at averageSpeed, times roadCircuityFactor). Null when the pair could not be computed — see status.
distanceThe travel distance between these two locations: statute miles for geographic (latitude/longitude) coordinates, whatever unit the coordinates are in for cartesian (x/y) ones — no unit setting exists, and the solver later reports distances in this same unit. Null when the pair could not be computed — see status.
costThe cost of travel between these two locations.
statusWhether this pair was computed. s: computed (this is also what the zero-cost self-pairs carry). w: the road network could not serve it — the two points are unreachable from each other by car, or the routing service was unavailable — and duration/distance are null with errorMessage saying which; the pair is not filled in by another method. e: a location is missing coordinates, so nothing could be computed for it. A null off-diagonal value in a submitted travelCosts matrix means "unreachable" to the solver; it is never treated as zero.
errorMessageIf an error was encountered during the calculation of this travel cost, this field will contain a human-readable message describing the error. If no error was encountered, this field will be null.
TravelCostErrors
This schema defines an error encountered during the cost matrix calculation. Each error represents a problem with calculating the travel cost between two locations.
errorMessageA human-readable message describing the error encountered during the cost matrix calculation.
errorDescriptionA more detailed description of the error encountered during the cost matrix calculation.
RouteStop
stopIdA unique identifier for this stop, represented as a UUID.
locationIdThe locationId of the stop.
vehicleIdThe vehicleId of the vehicle that visited this stop.
serviceDurationThe amount of time the vehicle spent servicing this stop, in the problem's time unit (minutes under timeSettings.timeUnit: clock).
stopNumberThe position of this stop in its vehicle's route, 0-based: index 0 is the vehicle's departure from its start depot (route_start), the first customer stop is 1, and the final return to the depot (route_end) is the last index. Consecutive within a vehicle's route; use it directly as an array index, never stopNumber - 1.
capacityServedThe amount of capacity served at this stop.
tripIdThe tripId of the trip that visited this stop, if applicable for this problem type.
arrivalTimeIntThe time at which the vehicle arrived at this stop, in integer time units from the start of the run. Rounded to the nearest whole time unit.
arrivalTimeStrThe time at which the vehicle arrived at this stop, in the clock time format specified in the timeSettings.timeFormat field.
departureTimeIntThe time at which the vehicle departed from this stop, in integer time units. This is the number of time units from the start of the optimization run.
departureTimeStrThe time at which the vehicle departed from this stop, in the clock time format specified in the timeSettings.timeFormat field.
travelCostFromPreviousStopThe cost of the leg from the previous stop to this stop (0 on route_start), in the same units as travelCostTo. Sums to routeSummary.totalTravelCost. Absent on results saved before it existed: for those, shift travelCostTo one stop later within each route.
waitDurationStartThe amount of time the vehicle waited at this stop before servicing the location, in the problem's time unit (minutes under timeSettings.timeUnit: clock).
waitDurationEndThe amount of time the vehicle waited at this stop after servicing the location, in the problem's time unit (minutes under timeSettings.timeUnit: clock).
stopTypeThe role this stop plays on the route: location_visit (a plain vehicle-routing visit), pickup and delivery (the two ends of a pickup-delivery trip), route_start and route_end (the depot legs that open and close a vehicle's route), break_start and break_end (a scheduled driver break), restock (a return to a depot to reload mid-route), and drop (a forced-unassigned stop the solver could not serve).
actionThe action taken at this stop. This is a human-readable description of the action taken at this stop, such as "Pickup 5 passengers at Chicago for Trip 1" or "Deliver 10 packages to New York".
travelDurationFromPreviousStopThe travel duration from the previous stop to this stop, in the problem's time unit: minutes when timeSettings.timeUnit is clock, your integer time unit otherwise.
travelDistanceFromPreviousStopThe travel distance from the previous stop to this stop, in the same unit as the distance values in the submitted travelCosts (there is no distance-unit setting; the solver reports what it was given). When the matrix came from POST /cost_matrix that is statute miles for geographic coordinates and the coordinates' own unit for cartesian.
travelCostToDeprecated: read travelCostFromPreviousStop. This holds the cost of the leg from this stop to the NEXT one (0 on route_end), not the cost of reaching this stop, despite its name. It keeps that meaning so that results saved before travelCostFromPreviousStop existed still read the same.
RouteStopFull
stopIdA unique identifier for this stop, represented as a UUID.
locationIdThe locationId of the stop.
vehicleIdThe vehicleId of the vehicle that visited this stop.
serviceDurationThe amount of time the vehicle spent servicing this stop, in the problem's time unit (minutes under timeSettings.timeUnit: clock).
stopNumberThe position of this stop in its vehicle's route, 0-based: index 0 is the vehicle's departure from its start depot (route_start), the first customer stop is 1, and the final return to the depot (route_end) is the last index. Consecutive within a vehicle's route; use it directly as an array index, never stopNumber - 1.
capacityServedThe amount of capacity served at this stop.
locationNameThe name of the location for this stop.
colorThe color associated with this stop -- the serving vehicle's color, echoed back as supplied (hex code or CSS color name).
tripIdThe tripId of the trip that visited this stop, if applicable for this problem type.
arrivalTimeIntThe time at which the vehicle arrived at this stop, in integer time units from the start of the run. Rounded to the nearest whole time unit.
arrivalTimeStrThe time at which the vehicle arrived at this stop, in the clock time format specified in the timeSettings.timeFormat field.
departureTimeIntThe time at which the vehicle departed from this stop, in integer time units. This is the number of time units from the start of the optimization run.
departureTimeStrThe time at which the vehicle departed from this stop, in the clock time format specified in the timeSettings.timeFormat field.
travelCostFromPreviousStopThe cost of the leg from the previous stop to this stop (0 on route_start), in the same units as travelCostTo. Sums to routeSummary.totalTravelCost. Absent on results saved before it existed: for those, shift travelCostTo one stop later within each route.
waitDurationStartThe amount of time the vehicle waited at this stop before servicing the location, in the problem's time unit (minutes under timeSettings.timeUnit: clock).
waitDurationEndThe amount of time the vehicle waited at this stop after servicing the location, in the problem's time unit (minutes under timeSettings.timeUnit: clock).
stopTypeThe role this stop plays on the route: location_visit (a plain vehicle-routing visit), pickup and delivery (the two ends of a pickup-delivery trip), route_start and route_end (the depot legs that open and close a vehicle's route), break_start and break_end (a scheduled driver break), restock (a return to a depot to reload mid-route), and drop (a forced-unassigned stop the solver could not serve).
actionThe action taken at this stop. This is a human-readable description of the action taken at this stop, such as "Pickup 5 passengers at Chicago for Trip 1" or "Deliver 10 packages to New York".
travelDurationFromPreviousStopThe travel duration from the previous stop to this stop, in the problem's time unit: minutes when timeSettings.timeUnit is clock, your integer time unit otherwise.
travelDistanceFromPreviousStopThe travel distance from the previous stop to this stop, in the same unit as the distance values in the submitted travelCosts (there is no distance-unit setting; the solver reports what it was given). When the matrix came from POST /cost_matrix that is statute miles for geographic coordinates and the coordinates' own unit for cartesian.
vehicleNameThe name of the vehicle serving this stop, when the user provided one. Denormalized from the submitted vehicle (like locationName) so a route sheet is readable without re-joining the input; null when the vehicle is unnamed.
fixedVehicleIdThe vehicleId this stop was pinned to via the input's fixedVehicleId, or null if it was not pinned. Lets a client tell 'this vehicle was chosen by the solver' from 'this vehicle was required', without re-joining against the request.
travelCostToDeprecated: read travelCostFromPreviousStop. This holds the cost of the leg from this stop to the NEXT one (0 on route_end), not the cost of reaching this stop, despite its name. It keeps that meaning so that results saved before travelCostFromPreviousStop existed still read the same.
UnassignedLocation
locationIdThe locationId of the unassigned location.
demandDroppedThe amount of demand that was not served at this location.
UnassignedLocationFull
locationIdThe locationId of the unassigned location.
demandDroppedThe amount of demand that was not served at this location.
locationNameThe name of the unassigned location.
latitudeThe latitude of the unassigned location.
longitudeThe longitude of the unassigned location.
isDepotWhether this unassigned location serves only as a depot (true) or if this location should be serviced (false).
UnassignedTrip
tripIdThe tripId of the unassigned trip.
demandDroppedThe amount of demand that was not able to be served by any vehicle for this trip.
capacityServedThe amount of capacity that was served for this dropped trip. This will typically be 0, but in some cases (e.g. partial deliveries) it may be greater than 0.
UnassignedTripFull
tripIdThe tripId of the unassigned trip.
demandDroppedThe amount of demand that was not able to be served by any vehicle for this trip.
capacityServedThe amount of capacity that was served for this dropped trip. This will typically be 0, but in some cases (e.g. partial deliveries) it may be greater than 0.
tripNameThe name of the unassigned trip.
fromLocationNameThe name of the origin location for this trip.
toLocationNameThe name of the destination location for this trip.
fromLocationIdThe locationId of the origin location for this trip.
toLocationIdThe locationId of the destination location for this trip.
fromLatitudeThe latitude of the origin location for this trip.
fromLongitudeThe longitude of the origin location for this trip.
toLatitudeThe latitude of the destination location for this trip.
toLongitudeThe longitude of the destination location for this trip.
ProblemMetaData
problemTypeThe type of optimization problem that was run.
submissionTimestampThe date and time when the optimization problem was submitted, in unix timestamp in seconds
queueTimeThe time spent in the queue before the optimization run started, in seconds.
optimizationTimeThe time taken to run the optimization, in seconds.
CostMatrixRequest
The locations to use for calculating the cost matrix.
costSettingsThe settings to use for calculating travel costs between locations. This includes the cost metric (duration or distance), cost multiplier, cost adder, and methods for calculating distances and durations.
The travel costs to use for calculating the cost matrix. If not provided, the cost matrix will be calculated automatically based on the latitude and longitude of the locations. A partial cost matrix can be provided to avoid recalculating travel durations and distances between locations.
coordinateSystemWhich coordinate family this problem's locations use. geographic (the default, and what every existing payload means) uses latitude/longitude on the Earth. cartesian uses unbounded x/y on an arbitrary plane, for scenarios with positions but no addresses. It describes the DATA, not the costing, so it is set once per request rather than per cost setting - and it decides which distance/duration methods are valid.
CostSettings
costMetricRequired — there is no default; a costSettings without a costMetric is rejected with 422. The metric used as the base for the travel cost, before any multiplier or adder. duration bases cost on travel time, distance on travel distance, and custom uses the cost values you supply directly in travelCosts.
The cost multiplier to apply to the base cost metric (duration or distance) to calculate the final travel cost.
The cost adder to apply to the base cost metric (duration or distance) to calculate the final travel cost.
autoCalculateDurationWhether POST /cost_matrix should compute travel durations from each location's coordinates. When omitted, it defaults to true if you supply no travelCosts, and to false if you do — so your own matrix is never silently recomputed. An explicit null is rejected (send true/false or omit it). The road network (driving) is used when you name driving as the durationMethod, or when an omitted durationMethod inherits driving from a driving distanceMethod because you explicitly sent autoCalculateDuration: true; the default method (geo) never calls the road network.
autoCalculateDistanceWhether POST /cost_matrix should compute travel distances from each location's coordinates. When omitted, it defaults to true if you supply no travelCosts, and to false if you do — so your own matrix is never silently recomputed. An explicit null is rejected (send true/false or omit it). The road network (driving) is used only when you name driving as the distanceMethod; the default method (geo) never calls the road network.
distanceMethodThe method for calculating distances. geo (the default) is the ellipsoidal geodesic distance on the WGS84 ellipsoid, reported in statute miles; driving uses OpenRouteService for real road distances. euclidean is the planar straight-line distance and manhattan the right-angle (grid) distance. euclidean is accepted only for cartesian (x/y) coordinates: on geographic coordinates it would treat degrees as planar units, so the request is refused with 400 INVALID_METHOD_FOR_COORDINATE_SYSTEM — the straight-line method on the globe is geo. manhattan works for both: on the plane it is |dx| + |dy| in the coordinates' unit; on geographic coordinates it is the sum of the two geodesic legs (the north–south and east–west separations), in statute miles. driving is likewise geographic-only.
durationMethodThe method to use for calculating durations between locations. geo derives a duration from the ellipsoidal geodesic (WGS84) distance; driving uses OpenRouteService for real road durations; manhattan/euclidean derive it from the planar (cartesian) or, for geographic coordinates, geodesic distance. There is no fixed default — if you omit durationMethod it is inherited from distanceMethod so the two stay consistent (do not rely on a geo default: an SDK that fills one would break a cartesian request). An omitted durationMethod inherits driving from distanceMethod only when you explicitly send autoCalculateDuration: true; otherwise it falls back to geo.
averageSpeedAverage travel speed used to turn a computed DISTANCE into a DURATION for the non-driving methods (geo, manhattan, euclidean), in distance units per hour. Ignored when durationMethod is "driving", where the road network supplies real durations.
This exists because a straight-line distance is not a time. Before it, geo durations were the distance number itself, which meant every vehicle travelled at exactly 60 mph between adjacent stops. The default of 30 suits urban and suburban work; raise it for long inter-city legs, lower it for dense city centres or mountain roads.
roadCircuityFactorMultiplier applied to a straight-line distance when deriving DURATION, to account for roads not running as the crow flies. Affects duration only - the reported distance stays the true geodesic value the method name promises. 1.25 is a common urban rule of thumb; use 1.0 to model travel that really is direct.
CostMultiplier
vehicleTypeDependenceWhether the cost multiplier should depend on the vehicle type. If true, then the cost multiplier will be applied separately for each vehicle type. If false, then the cost multiplier will be applied based on the first vehicle type in the VehicleTypes list.
baseMultiplierThe multiplier to apply to the base cost metric (duration or distance) to calculate the final travel cost.
CostAdder
vehicleTypeDependenceWhether the cost adder should depend on the vehicle type. If true, then the cost adder will be applied separately for each vehicle type. If false, then the cost adder will be applied based on the first vehicle type in the VehicleTypes list.
baseAdderThe adder to apply to the base cost metric (duration or distance) to calculate the final travel cost.
PlanLimits
Limits for locations table
Limits for trips table
Limits for vehicles table
Limits for vehicle types table
saved_scenariosMaximum saved scenarios (null for unlimited)
run_history_daysDays of run history retention (null for unlimited)
max_concurrent_solvesMaximum number of solves (queued + running) the user may have in flight at once
monthly_included_tasksOptimization tasks included per month on this plan (null for tiers that do not meter tasks, i.e. the web tiers). A billable task is one stop or trip served by a SUCCEEDED solve; unassigned stops, and failed or cancelled runs, cost nothing.
PublicPlan
tierStable internal tier key (never changes), e.g. "free" or "professional".
planNameCustomer-facing display name as configured in the Clerk dashboard, e.g. "Professional".
Resolved per-tier limits.
Capability flags keyed by feature; absent keys default to allowed.
ExampleScenarioCard
instance_idUnique id of the stored scenario behind this example. To load the example, use slug with GET /example_scenario/{slug}.
slugStable, URL-safe unique key ([a-z0-9-]).
scenario_nameFull display name of the scenario.
model_typeModel type, e.g. "pickup-delivery" or "vehicle-routing".
titleShort card heading (may be empty).
brief_description1-3 sentence blurb shown under the title.
banner_imageCard image URL; empty when none is set.
constraintsKey constraints shown as bullets.
tagsTags for gallery filtering and card chips.
Small stat objects, e.g. [{"Locations":17},{"Trips":12}].
industryIndustry/vertical for gallery filtering, e.g. "healthcare", "transportation" (empty when not set).
secondary_industriesAdditional industries this example also belongs to, beside the primary industry. A gallery filter should treat an example as matching if the requested industry is the primary OR appears here. Optional and additive: an absent or empty array behaves exactly as a card with only industry set, so clients that ignore it are unaffected. Exists because some scenarios genuinely sit in two verticals - special-needs school transport is education and healthcare; roll-off container swaps are public-works and logistics - and forcing one label makes an industry page look emptier than the library actually is.
Where an example scenario is set, for gallery filtering.
scaleDerived instance size bucket: "small", "medium", or "large" (empty when not set).
constraints_tagsConstraint-shape tags for gallery filtering (e.g. "time windows", "vehicle types"), distinct from industry.
colorDimensionWhich fact this example's per-location colours encode. The same light-to-dark ramp means time of day on one example and demand on another, so a legend must read this rather than infer meaning from the swatches. "none" means the example's stops are uniform and are deliberately left uncoloured.
colorDimensionLabelDisplay name for colorDimension, rendered verbatim as a legend title. Null when colorDimension is "none".
colorScaleHow to render the legend: "categorical" for a swatch per group, "ramp" for an ordered light-to-dark strip. Null when colorDimension is "none".
colorBucketsOnly the colours this example actually uses, in scale order, so a legend shows the two steps in play rather than every step of the scale. Empty when colorDimension is "none".
ExampleGeography
cityregioncountryScenarioTables
CoordinateSystem
Which coordinate family this problem's locations use. geographic (the default, and what every existing payload means) uses latitude/longitude on the Earth. cartesian uses unbounded x/y on an arbitrary plane, for scenarios with positions but no addresses. It describes the DATA, not the costing, so it is set once per request rather than per cost setting - and it decides which distance/duration methods are valid.
