Routing API v1

Routing API Reference

Request

Please contact us for details of the Sandbox (or testing) Environment details for your experimentation and integration developments!

Base Url
https://isp.beans.ai/enterprise/v1
Authentication
The Beans Routing API uses a simple authorization header to authenticate client requests. You must sign in and create a routing account here to get your key before you access the API. If you use an unauthorized key or do not provide one, you will get a NOT_ALLOWED response.

Once you have your key and secret available, you are required to specify them in the Authorization header of all your requests, as below.

Authorization: 8OAwhbK0:C7752E2405914945E7D08

There may be some extra fields in the objects below that are not documented. We advise that your response parsers ignore such fields.

Get Routes

Path
GET https://isp.beans.ai/enterprise/v1/lists/routes
Query Parameters
Parameter Type Required? Values
updatedAfter EpochMillis No Only return routes updated after timestamp in epoch milliseconds
Response
RouteList Object. Only open routes are returned by default. If updatedAfter timestamp parameter is specified, the response will include routes closed after the given timestamp.

Add or Update Routes

Path
POST https://isp.beans.ai/enterprise/v1/lists/routes
Body
RouteList Object
Response
UpdateResponse Object

Update Route

Path
POST https://isp.beans.ai/enterprise/v1/lists/routes/{listRouteId}
Body
Route Object
Response
UpdateResponse Object

Get Warehouses

Path
GET https://isp.beans.ai/enterprise/v1/lists/warehouses
Response
WarehouseList Object

Add or Update Warehouses

Path
POST https://isp.beans.ai/enterprise/v1/lists/warehouses
Body
WarehouseList Object
Response
UpdateResponse Object

Update Warehouse

Path
POST https://isp.beans.ai/enterprise/v1/lists/warehouses/{listWarehouseId}
Body
Warehouse Object
Response
UpdateResponse Object

Get Items Request

Path
GET https://isp.beans.ai/enterprise/v1/lists/items
Query Parameters
Parameter Type Required? Values
updatedAfter EpochMillis No Only return items updated after timestamp in epoch milliseconds
Response
ItemList Object. Only undeleted items are returned by default. If updatedAfter timestamp parameter is specified, the response will include items deleted after the given timestamp.

Add or Update Items

Path
POST https://isp.beans.ai/enterprise/v1/lists/items
Body
ItemList Object
Response
UpdateResponse Object

Update Item

Path
POST https://isp.beans.ai/enterprise/v1/lists/items/{listItemId}
Body
Item Object
Response
UpdateResponse Object

Get Assignees

Path
GET https://isp.beans.ai/enterprise/v1/lists/assignees
Query Parameters
Parameter Type Required? Values
updatedAfter EpochMillis No Only return assignees updated after timestamp in epoch milliseconds
Response
AssigneeList Object. Only undeleted items are returned by default. If updatedAfter timestamp parameter is specified, the response will include items deleted after the given timestamp.

Add or Update Assignees

Path
POST https://isp.beans.ai/enterprise/v1/lists/assignees
Body
AssigneeList Object
Response
UpdateResponse Object

Update Assignee

Path
POST https://isp.beans.ai/enterprise/v1/lists/assignees/{listAssigneeId}
Body
Assignee Object
Response
UpdateResponse Object

Get Assignee Vehicle Constraints

Path
GET https://isp.beans.ai/enterprise/v1/lists/assigneevehicles
Response
AssigneeVehicleList Object.

Add or Update Assignee Vehicle Constraints

Path
POST https://isp.beans.ai/enterprise/v1/lists/assigneevehicles
Body
AssigneeVehicleList Object
Response
AssigneeVehicleList Object

Route Planning (Stateful)

Path
POST https://isp.beans.ai/enterprise/v1/dro/run-stateful

Stateful Route Planning calls only read the input routes, items, and assignees from the persisted state; the output is non-persistent, and will not make any state changes to your account.

Query Parameters
Parameter Type Required? Values
country String No Default USA. ISO3 code of the country that you're optimizing.
Body
Type Required? Description
state Planning State Object Yes
request Stateless Planning Request Object Yes request.item, request.assignee, and request.warehouse may be ommited if they are provided by the state.
Response
SegmentList Object

Route Optimization (Stateful)

Path
POST https://isp.beans.ai/enterprise/v1/lists/items/do/optimize
Query Parameters
Parameter Type Required? Values
moveToFront Boolean No Move optimized items to front of route
startMode Enum No Either of WAREHOUSE, ASSIGNEE_LOCATION, ASSIGNEE_ADDRESS, PREVIOUS_STOP, or NONE
endMode Enum No Either of WAREHOUSE, ASSIGNEE_LOCATION, ASSIGNEE_ADDRESS, or ANYWHERE
start String No Pair of LAT,LNG to be used as start position
end String No Pair of LAT,LNG to be used as end position
Body
ItemIdList Object
Response
ItemList Object. All items effected by the optimization are returned, which could be a set bigger than the originally specified list as items can move within a route due to optimization.

Route Path (Stateless)

Path
POST https://isp.beans.ai/enterprise/v1/dro/path
Body
ItemList Object
Response
PolylineList Object.

Route Planning (Stateless)

Route Planning calls are non-persistent, and will not make any state changes to your account.

Path
POST https://isp.beans.ai/enterprise/v1/dro/run
Query Parameters
Parameter Type Required? Values
country String No Default USA. ISO3 code of the country that you're optimizing.
Body
Type Required? Description
optimizeFor String No Either of TIME (default) or DISTANCE
item Array Yes Array of Item. This method does not geocode the address. Item.position is required.
assigneeWithVehicle Array Yes Array of AssigneeVehicle. This method does not geocode the start address and the end address. AssigneeVehicle.sposition and AssigneeVehicle.eposition are required if the start and end address are specified.
warehouse Warehouse Object Yes This method does not geocode the address. Warehouse.position is required.
Capacity Constraints
defaultCapacity Integer Yes The default capacity for each vehicle, in the number of packages
defaultDimensions Dimensions Object No The default dimensions for each vehicle
Shifts and Time Constraints
defaultShiftStartTime String Yes Time in HH:MM format when the drivers start their shifts
defaultShiftLength Double Yes Time, in hours, of the length of a drivers shift
startAnytime Boolean No Allows the start time to be flexible while keeping the shift length constraint in place. Typically used when drivers start time is better determined by the delivery windows of the stops in their route
maxDistanceM Integer No Maximum distance, in meters, that a vehicle can travel. Defaults to 10k kms if ommited
break Break Object No
defaultStopTimeSeconds Integer Yes Time, in seconds, that the driver spends on a stop
defaultDropoffTimeSeconds Integer Yes Time, in seconds, that the driver spends on a dropoff stop. Takes precedence over defaultStopTimeSeconds
defaultPickupTimeSeconds Integer Yes Time, in seconds, that the driver spends on a pickup stop. Takes precedence over defaultStopTimeSeconds
Assignee Locations
useAssigneesStartAddress Boolean No True if the the drivers shift time is calculated from their start address.
useAssigneesEndAddress Boolean No True if the the drivers shift time is calculated until their end address.
startAnywhere Boolean No Calculates the start time and distance of every driver from their first stop, and not the warehouse or the start address
endAnywhere Boolean No Calculates the end time and distance of every driver at their last stop, and not the warehouse or the end address
Workareas
workarea Array No Array of Workarea Objects
Warehouse Deliveries
disallowPickupDropoffMode Boolean No When false (default), adjusts initial numPackages for vehicles that have preassigned dropoff stops with no corresponding pickups. Also if a pickup stop corresponds to multiple dropoffs, splits the pickup into multiple pickups that may be serviced by different drivers. When true, presumes that the numPackages on the vehicles are set correctly, and no splitting is done on stops. While this may lead to failures, it is 100x faster than pickup and delivery mode, and is ideal to use when deliveries are happening out of a single warehouse.
hasWarehouseCapacityConstraints Boolean No When true, uses the warehouse capacity to constrain the number of vehicles that can be loaded parallely at the depot. Only used when disallowPickupDropoffMode is enabled
isWarehouseCapacityConstraintPerPackage Boolean No If true, the warehouse capacity constraint is applied to the capcities of the vehicles, and not the number of vehicles
warehouseCapacity Boolean No Sets the capacity at the warehouse loading. It specifies the number of vehicles if isWarehouseCapacityConstraintPerPackage is false, otherwise number of packages
warehouseCapacityDurationSeconds Integer No Sets the time it takes to load a vehicle or a package at the warehouse
Constraint Requirements
allowDropAssigneesWithAddresses Boolean No True if the optimizer is allowed drop any drivers with start or end requirements
allowDropAssigneeAddresses Boolean No True if the optimizer is allowed drop driver start and end requirements
allowDropTimeConstraints Boolean No True if the optimizer is allowed drop any time constraints
Penalties
allowPenalty Boolean No True if the optimizer is allowed skip stops and incur the specified penalty
penalty Double No Time in hours (if optimizing for TIME), or distance in meters (if optimizing for DISTANCE) to penalize if an item is skipped
allowAssigneePenalty Boolean No True if the optimizer is should impose a penalty on every vehicle that is dispatches
assigneePenalty Double No Time in hours (if optimizing for TIME), or distance in meters (if optimizing for DISTANCE) to penalize for every vehicle. Weighted by maximum capacity so smaller trucks have higher penalty
Runtime
timeoutSeconds Integer No Default 60s. Specifies the number of seconds after which the algorithm should timeout
solutionCount Integer No Default unlimited. Specifies the number of solutions to find after which the algorithm should stop finding new solutions
Response
SegmentList Object

Route Optimization (Stateless)

Path
POST https://isp.beans.ai/enterprise/v1/dro/sequence
Query Parameters
Parameter Type Required? Values
start String No Pair of LAT,LNG to be used as start position
end String No Pair of LAT,LNG to be used as end position
Body
ItemList Object
Response
ItemList Object. All items effected by the optimization are returned.

Matrix (Stateless)

Path
POST https://isp.beans.ai/enterprise/v1/dro/distance_matrix
Path
POST https://isp.beans.ai/enterprise/v1/dro/time_matrix
Path
POST https://isp.beans.ai/enterprise/v1/dro/timedistance_matrix
Query Parameters
Parameter Type Required? Values
country String No Default USA. ISO3 code of the country that you're optimizing.
Body
Type Required? Description
points Array Yes Array of DROPoint Object
sourcesIdx Array No Array of Integers representing the indices of points to use for sources. If not specified, uses all points as sources.
destinationsIdx Array No Array of Integers representing the indices of points to use for destinations. If not specified, uses all points as destinations.
asynchronous Boolean No Default false. Set to true for asynchronous calls. Use the GET method to find status.
optimizeResponse Boolean No Reduces the response by combining rows and columns that have the same source lat/lng.
requestId Integer No A unique request id for requests. We cache and store the matrix response for the request id for up to 72 hours.
referenceRequestId Integer No If the new matrix request has incremental changes compared to a previous matrix request, you may pass the request id of the previous request. The system will read the previous data and only compute the differential. Matrix calculations can be 10x faster if the size of diffs << size of the original request.
Response
Type Required? Description
rows Array Yes Array of Array of Double. The size of the array is sourceIdx.size x destinationIdx.size for time and distance matrix requests. For time-distance matrix, the size is sourceIdx.size x (destinationIdx.size x 2). If optimizeResponse is enabled, the size may be smaller.

Objects

RouteList Object
RouteList Object Type Always? Writing? Updating? Description
route Array Yes Yes Yes Array of Route Object
Route Object
Route Object Type Always? Writing? Updating? Description
listRouteId String Yes Yes Yes
name String Yes Yes Yes
dateStr String Yes Yes Yes YYYY-MM-DD
status Enum Yes Yes Yes Either of OPEN or CLOSED
assignee Assignee Object No Optional Yes
warehouse Warehouse Object No Optional Yes
updatedAt EpochMillis Yes No No
WarehouseList Object
WarehouseList Object Type Always? Writing? Updating? Description
warehouse Array Yes Yes Yes Array of Warehouse Object
Warehouse Object
Warehouse Object Type Always? Writing? Updating? Description
listWarehouseId String Yes Yes Yes
address String Yes Yes Yes
formattedAddress String Yes No No
position LatLng Object No No No
updatedAt EpochMillis Yes No No
ItemList Object
ItemList Object Type Always? Writing? Updating? Description
item Array Yes Yes Yes Array of Item Object
Item Object
Item Object Type Always? Writing? Updating? Description
listItemId String Yes Yes Yes
route Route Object No Optional Yes
type Enum Yes Yes Yes Either of DROPOFF or PICKUP
address String Yes Yes Yes
formattedAddress String Yes No No
unit String No Optional Yes
skipGeocoder Boolean No Optional Yes True if system should skip geocoding
position LatLng Object Yes Optional Optional Required if skipGeocoding is set to true
customerName String No Optional Yes
customerPhone String No Optional Yes
notes String No Optional Yes
trackingId String No Optional Yes
numPackages Integer No Optional Yes Defaults to 1 if omitted
dimensions Dimensions Object No Optional Yes
status Enum Yes Yes Yes Either of NEW, FINISHED, FAILED, or NOLOCATION
statusUpdatedAt EpochMillis Yes No No
stopTimeSeconds Integer No Optional Yes Default 60s. The default time spent at the stop. This value is used to optimize the route with time windows and run route planner with higher precision.
flavors String No Optional Yes Comma separted list of flavors required by this stop. For example, "HOT,REFRIGERATED"
updatedAt EpochMillis Yes No No
signatureRequired Boolean No Optional Yes True if signature is required on the item's POD
ItemIdList Object
ItemIdList Object Type Always? Writing? Updating? Description
item Array Yes Yes Yes Array of ItemId Object
ItemId Object
ItemId Object Type Always? Writing? Updating? Description
listItemId String Yes Yes Yes
route RouteId Object Yes Yes Yes
RouteId Object
RouteId Object Type Always? Writing? Updating? Description
listRouteId String Yes Yes Yes
AssigneeList Object
AssigneeList Object Type Always? Writing? Updating? Description
assignee Array Yes Yes Yes Array of Assignee Object
Assignee Object
Assignee Object Type Always? Writing? Updating? Description
listAssigneeId String Yes Yes Yes
name String Yes Yes Yes
email String No Optional Yes
phone String No Optional Yes
code String Yes No No
state Enum Yes Yes Yes Either of ACTIVE or DISABLED
role Enum Yes Yes Yes Either of OWNER, MANAGER, or DRIVER
updatedAt EpochMillis Yes No No
disableInviteCommunication Boolean No Yes No When set the true, the created assignee will not be sent default onboarding SMS or Email notification. This is only applicable during assignee creation only
AssigneeVehicleList Object
AssigneeVehicleList Object Type Always? Writing? Updating? Description
vehicle Array Yes Yes Yes Array of AssigneeVehicle Object
AssigneeVehicle Object
AssigneeVehicle Object Type Always? Writing? Updating? Description
listAssigneeId String Yes Yes Yes
capacity Integer No Optional Yes
dimensions Dimensions Object No Optional Yes
saddress String No Optional Yes
sformattedAddress String No No No
sposition LatLng Object No No No
eaddress String No Optional Yes
eformattedAddress String No No No
eposition LatLng Object No No No
startAnywhere Boolean No Optional Yes Calculates the start time and distance of the driver from their first stop, and not the warehouse or the start address. If either this or request.startAnywhere are true, then the time and distance to the first stop is presumed to be 0
endAnywhere Boolean No Optional Yes Calculates the end time and distance of the driver at their last stop, and not the warehouse or the end address. If either this or request.endAnywhere are true, then the time and distance to the first stop is presumed to be 0
flavors String No Optional Yes Comma separted list of flavors accepted by this vehicle. For example, "HOT,REFRIGERATED"
shiftStartTime String No - - Time in HH:MM format when the shift starts. Not persisted, and takes precedence over request.defaultShiftStartTime and workarea.shiftStartTime
shiftLength Double No - - Time, in hours, of the length of the shift. Not persisted, and takes precedence over request.defaultShiftLength and workarea.shiftLength
startAnytime Boolean No - - Allows the start time to be flexible while keeping the shift length constraint in place. Typically used when drivers start time is better determined by the delivery windows of the stops in their route
maxDistanceM Integer No - - Maximum distance, in meters, that this vehicle can travel. Defaults to request.maxDistanceM if ommited
break Break Object No - -
assignedItemIds Array No - - Array of String with the item ids of stops that must remain assigned to the driver. Not persisted
currentNumPackages Integer No Optional Yes
currentDimensions Dimensions Object No Optional Yes
updatedAt EpochMillis Yes No No
AssigneeIdWithKeepCurrent Object
AssigneeIdWithKeepCurrent Object Type Required Description
listAssigneeId String Yes
keepCurrentAssignments Boolean No
Planning State Object
Planning State Object Type Required Description
routeId Array No Array of String consisting of all routes participating in the planning
assignee Array Yes Array of AssigneeIdWithKeepCurrent Object, listing out the assignees that participate in the planning, along with a boolean specifying whether or not their current assignments should be preserved
findAssigneesFromRoutes Boolean No If true, finds all assignees on the routes specified with the routeId field above, and adds them to the pool of assignees for this planning. Preserves the current assignments of the assignees
Workarea Object
Workarea Object Type Required Description
name String Yes
polygon Array No Array of Polygon Object. If a stop falls within any of the given polygons, it is considered a part of this workarea
address Array No Array of String. If a stop contains any one of the address strings, it is considered a part of this workarea
warehouse Warehouse Object No Warehouse in a workarea solves two different use cases. First, it specifies the warehouse to be used for this workarea. If omitted, the workarea uses the warehouse from the request object. Second, if there are stops that do not fall within the addresses and polygons for any of the workareas, these stops are distributed amongst the workareas, based on proximity, with just a warehouse and no address or polygon restriction. The warehouse therefore acts as a "magnate" for all the orphaned stops.
filter Array No Array of Filter Object. A stop must pass any one of the specified filters to be consider in this workarea
strict Boolean No If false (default), takes the corresponding pickups and dropoffs for stops that pass the filter. If true, only takes the stops that match the address and filter pattern.
shiftStartTime String No Takes precedence over defaultShiftStartTime
disallowPickupDropoffMode Boolean No See request.disallowPickupDropoffMode
hasWarehouseCapacityConstraints Boolean No See request.hasWarehouseCapacityConstraints
isWarehouseCapacityConstraintPerPackage Boolean No See request.isWarehouseCapacityConstraintPerPackage
warehouseCapacity Boolean No See request.warehouseCapacity
warehouseCapacityDurationSeconds Integer No See request.warehouseCapacityDurationSeconds
Break Object
Break Object Type Required Description
type String Yes Either of FIXED_TIME or MIN_DISTANCE
startTime String Required if FIXED_TIME Time in HH:MM format when the break must start
endTime String Required if FIXED_TIME Time in HH:MM format when the break must end
startDistance Integer Required if MIN_DISTANCE Distance, in meters, after which a break must start
breakLength Double Required if MIN_DISTANCE Length of the break, in hours
Filter Object
Filter Object Type Always? Writing? Updating? Description
trackingId String No - -
type No - - Either of DROPOFF or PICKUP
SegmentList Object
SegmentList Object Type Always? Writing? Updating? Description
segment Array Yes Yes Yes Array of Segment Object
Segment Object
Segment Object Type Always? Writing? Updating? Description
listAssigneeId String Yes Yes Yes
item Array Yes Yes Yes Array of Item Object
timeS Integer Yes Yes Yes
distanceM Double Yes Yes Yes
pathEncoded String No No No Encoded Polyline
shiftStartTime String No No No Time in HH:MM format when the shift starts
Dimensions Object
Dimension Object Type Always? Writing? Updating? Description
dims Array Yes Yes Yes Array of Dimension Object
Dimension Object
Dimension Object Type Always? Writing? Updating? Description
t String Yes Yes Yes One of UNKNOWN, WEIGHT, VOLUME, COUNT
v String Yes Yes Yes String value (or Number cast as String) with the value of the dimension
LatLng Object
A latlng object captures the coordinates of a given location.
LatLng Object Type Required? Description
latitude double Yes Latitude of the location to maximum precision.
longitude double Yes Longitude of the location to maximum precision.
Polygon Object
A polygon object captures the coordinates of a given shape, expressed as an ordered series of LatLng objects.
Polygon Object Type Required? Description
point Array Yes Array of LatLng Object.
PolylineList Object
PolylineList Object Type Always? Writing? Updating? Description
line Array Yes Yes Yes Array of Polyline Object
Polyline Object
A polyline object captures the coordinates of a given route, expressed as an ordered series of LatLng objects.
Polyline Object Type Required? Description
point Array Yes Array of LatLng Object.
distanceM Double Yes Distance covered by the route segment in meters
timeS Double Yes Time needed by the route segment in meters
DROPoint Object
DROPoint Object Type Always? Writing? Updating? Description
position LatLng Object No No No
UpdateResponse Object
UpdateResponse Object Type Always? Description
route Array No Array of Route Object
warehouse Array No Array of Warehouse Object
item Array No Array of Item Object
assignee Array No Array of Assignee Object

Examples

Route Planning
POST /dro/run
Request
{
  "assigneeWithVehicle": [
    {
      "listAssigneeId": "driver1"
    },
    {
      "listAssigneeId": "driver2
    }
  ],
  "defaultShiftStartTime": "09:00",
  "defaultShiftLength": 2,
  "defaultCapacity": 4,
  "defaultStopTimeSeconds": 60,
  "timeoutSeconds": 5,
  "useAssigneesStartAddress": true,
  "useAssigneesEndAddress": true,
  "allowDropTimeConstraints": true,
  "warehouse": {
    "listWarehouseId": "q9byakckp4zyh9nh5esgp",
    "address": "18182 Irvine Boulevard, Tustin, CA, USA",
    "position": {
      "lat": 33.74822,
      "lng": -117.81547
    }
  },
  "item": [
    {
      "listItemId": "a3b62649112c3412bbdb9d5b8f89b20f",
      "formattedAddress": "2620 Augusta, Tustin, CA",
      "position": {
        "lat": 33.74458,
        "lng": -117.77776
      },
      "displayPosition": {
        "lat": 33.74452,
        "lng": -117.7779
      },
      "deliverFromStr": "2021-05-25 09:00",
      "deliverByStr": "2021-05-25 12:00",
      "trackingId": "",
      "type": "DROPOFF",
      "placement": "",
      "route": {
        "listRouteId": "0c82r8606eijut09fjikqfk"
      }
    },
    {
      "listItemId": "d5d0d50968b937598026b7aeb1129e26",
      "formattedAddress": "2535 Reynolds Dr, Tustin, CA",
      "position": {
        "lat": 33.75925,
        "lng": -117.76733
      },
      "displayPosition": {
        "lat": 33.75942,
        "lng": -117.76722
      },
      "deliverFromStr": "2021-05-25 09:00",
      "deliverByStr": "2021-05-25 12:00",
      "trackingId": "",
      "type": "DROPOFF",
      "placement": "",
      "route": {
        "listRouteId": "0c82r8606eijut09fjikqfk"
      }
    },
    {
      "listItemId": "b8b99f34681c3b3b8d9c72fd2dcf0fd2",
      "formattedAddress": "10920 Hiskey Ln, Tustin, CA",
      "position": {
        "lat": 33.75711,
        "lng": -117.76798
      },
      "displayPosition": {
        "lat": 33.7574,
        "lng": -117.76762
      },
      "deliverFromStr": "2021-05-25 09:00",
      "deliverByStr": "2021-05-25 12:00",
      "trackingId": "",
      "type": "DROPOFF",
      "placement": "",
      "route": {
        "listRouteId": "0c82r8606eijut09fjikqfk"
      }
    },
    {
      "listItemId": "109398d779413bd4b397c4ac0bcad9d5",
      "formattedAddress": "17661 Limetree Way, Tustin, CA",
      "position": {
        "lat": 33.76122,
        "lng": -117.8237
      },
      "displayPosition": {
        "lat": 33.76151,
        "lng": -117.8237
      },
      "deliverFromStr": "2021-05-25 09:00",
      "deliverByStr": "2021-05-25 12:00",
      "trackingId": "",
      "type": "DROPOFF",
      "placement": "",
      "route": {
        "listRouteId": "0c82r8606eijut09fjikqfk"
      }
    },
    {
      "listItemId": "ed93d592f4613ab593c934fd85c9907e",
      "formattedAddress": "10451 Prather Ln, Tustin, CA",
      "position": {
        "lat": 33.76471,
        "lng": -117.76196
      },
      "displayPosition": {
        "lat": 33.76474,
        "lng": -117.76212
      },
      "deliverFromStr": "2021-05-25 09:00",
      "deliverByStr": "2021-05-25 12:00",
      "trackingId": "",
      "type": "DROPOFF",
      "placement": "",
      "route": {
        "listRouteId": "0c82r8606eijut09fjikqfk"
      }
    }
  ]
}
Response
{
    "segment": [
        {
            "listAssigneeId": "driver1",
            "item": [
                {
                    "listItemId": "a3b62649112c3412bbdb9d5b8f89b20f",
                    "formattedAddress": "2620 Augusta, Tustin, CA",
                    "route": {
                        "listRouteId": "0c82r8606eijut09fjikqfk"
                    },
                    "type": "DROPOFF",
                    "position": {
                        "latitude": 33.74458,
                        "longitude": -117.77776
                    },
                    "displayPosition": {
                        "latitude": 33.74452,
                        "longitude": -117.7779
                    },
                    "deliverFromStr": "2021-05-25 09:00",
                    "deliverByStr": "2021-05-25 12:00"
                },
                {
                    "listItemId": "109398d779413bd4b397c4ac0bcad9d5",
                    "formattedAddress": "17661 Limetree Way, Tustin, CA",
                    "route": {
                        "listRouteId": "0c82r8606eijut09fjikqfk"
                    },
                    "type": "DROPOFF",
                    "position": {
                        "latitude": 33.76122,
                        "longitude": -117.8237
                    },
                    "displayPosition": {
                        "latitude": 33.76151,
                        "longitude": -117.8237
                    },
                    "deliverFromStr": "2021-05-25 09:00",
                    "deliverByStr": "2021-05-25 12:00"
                }
            ],
            "timeS": 1132.0,
            "distanceM": 13392.0,
            "pathEncoded": "km~lEtyanU?iBA}BAiC?wA?{@?g@@cB?S?W?c@?W?q@Ms@?a@@o@@S@s@B[BQD[J{@RgABK`@qAVe@FKDIRa@JQv@qAFKPWDGHMl@aAl@aApAuBp@gAFKLUFKVa@t@mAVc@FKVc@Ve@l@aAj@}@^k@b@s@NUPYrBeD~@yA\\k@p@gA\\i@\\k@r@gA~@{AhDsFx@sAt@oAdAcBhAgBp@gAx@sAj@g@b@q@x@qAr@iAt@kA~@wAPWW[a@_@kDkDmFmFoAoAyF}Fy@y@IIqA{Ay@uAQWc@y@s@{Ao@cBa@uAWiAEU[cBQ_BMwA]cGGiAQiDSmDWeESkBUsAKk@_@aBbAc@t@KLuAPa@NQiAqBg@V??f@WhApBOPQ`@MtAu@JcAb@UL^lBXzARlBPtCLbCJbBX|E\\vGJlA@LRbBZbB\\zAX`Al@fBp@`Bp@pABDhAbBLPt@~@d@f@bAdAhBhB`@`@|AzAzH|HhAhA~@~@b@`@^b@[f@c@n@yAdCiApBYf@]x@y@rAq@fAiAfBeAbBu@nAy@rAiDrF_AzAs@fA]j@]h@q@fA]j@_AxAsBdDQXOTc@r@_@j@k@|@m@`AWd@Wb@GJWb@u@lAW`@GJMTGJq@fAqAtBm@`Am@`AILEFQVGJw@pAKPS`@EHGJWd@a@pACJSfAKz@EZCPCZAr@ARAn@?`@Ij@?R?r@?\\?T?b@?dB?bB@|A?R@nB?bD?bA?t@?tA?n@?p@?tA?lC?`A?X?X?ZCt@OpBElA?H?z@@|B@j@@lCBnCoA@Y?iB@g@?kB@M?eA?s@?a@?a@?]?[?{@?aB?uA?qB?eC?w@AaC?kCBaC@Y?eC?mB@u@?}AAgB@Q?u@@}@?}@@Mf@?n@?R?N?`@}AAkC?YN?hA???iAXOjC?|A@@nB\\??yBA_@?SAY?]Mg@AuAAm@AcA?WAk@CyA?iAAoA?s@?{@A{D?q@?k@AeBAeBAkBAuB?cAAiA?o@A_BnA?|B@|B?h@?lA?vAAX?`CA|A?fC?z@?~BAxA?|A?vAAdC?z@?zE?nC?n@?H?L?`@?~CAp@?L?x@A?bD?bAT?"
        },
        {
            "listAssigneeId": "driver2",
            "item": [
                {
                    "listItemId": "d5d0d50968b937598026b7aeb1129e26",
                    "formattedAddress": "2535 Reynolds Dr, Tustin, CA",
                    "route": {
                        "listRouteId": "0c82r8606eijut09fjikqfk"
                    },
                    "type": "DROPOFF",
                    "position": {
                        "latitude": 33.75925,
                        "longitude": -117.76733
                    },
                    "displayPosition": {
                        "latitude": 33.75942,
                        "longitude": -117.76722
                    },
                    "deliverFromStr": "2021-05-25 09:00",
                    "deliverByStr": "2021-05-25 12:00"
                },
                {
                    "listItemId": "b8b99f34681c3b3b8d9c72fd2dcf0fd2",
                    "formattedAddress": "10920 Hiskey Ln, Tustin, CA",
                    "route": {
                        "listRouteId": "0c82r8606eijut09fjikqfk"
                    },
                    "type": "DROPOFF",
                    "position": {
                        "latitude": 33.75711,
                        "longitude": -117.76798
                    },
                    "displayPosition": {
                        "latitude": 33.7574,
                        "longitude": -117.76762
                    },
                    "deliverFromStr": "2021-05-25 09:00",
                    "deliverByStr": "2021-05-25 12:00"
                },
                {
                    "listItemId": "ed93d592f4613ab593c934fd85c9907e",
                    "formattedAddress": "10451 Prather Ln, Tustin, CA",
                    "route": {
                        "listRouteId": "0c82r8606eijut09fjikqfk"
                    },
                    "type": "DROPOFF",
                    "position": {
                        "latitude": 33.76471,
                        "longitude": -117.76196
                    },
                    "displayPosition": {
                        "latitude": 33.76474,
                        "longitude": -117.76212
                    },
                    "deliverFromStr": "2021-05-25 09:00",
                    "deliverByStr": "2021-05-25 12:00"
                }
            ],
            "timeS": 1520.0,
            "distanceM": 16615.0,
            "pathEncoded": "km~lEtyanU?iBA}BAiC?wA?{@?g@@cB?S?W?c@?W?q@Ms@?a@@o@@S@s@B[BQD[J{@RgABK`@qAVe@FKDIRa@JQv@qAFKPWDGHMl@aAl@aApAuBp@gAFKLUFKVa@t@mAVc@FKVc@Ve@l@aAj@}@^k@b@s@NUPYrBeD~@yA\\k@p@gA\\i@\\k@r@gA~@{AhDsFx@sAt@oAdAcBhAgBp@gAx@sAj@g@b@q@x@qAr@iAt@kA~@wAPWW[a@_@kDkDmFmFoAoAyF}Fy@y@IIqA{Ay@uAQWc@y@s@{Ao@cBa@uAWiAEU[cBQ_BMwA]cGGiAQiDSmDWeESkBUsAKk@_@aBaAcDiA{Cg@sAeC_HSi@GQ[}@kAgDGOM_@y@uB]aAQk@Ke@Sw@Ie@EWG]CMKu@IsA]QqDP]BE?u@EqAMB}AB_BIoA[mAc@sA}@iAk@k@s@e@gA_@a@GiCE{IBiGCgBYcAWSIOn@U`AoA]UGWTUbCCv@}@@g@MUKi@e@Y_@g@{@o@m@g@Uq@KMCECCGNyA??OxABFDBLBp@Jf@Tn@l@f@z@X^h@d@TJf@L|@ABw@TcCVU????TFnA\\TaANo@cIsCwCi@mAUcASkBo@i@_@m@c@_ByAuAcBgGkHuAaAeB{@]OuAYkAQwBKHcBx@Bb@B??c@Cy@CIbBuF]y@Ee@CqA[e@UcAaAGKYc@KWOa@COUmACwA?M~@ArBCjCA|CE~@A|@?tA?j@Bj@BvAPvAXtAb@pAj@nAt@f@\\b@\\bAbA|B`CpArAFFfAdAl@d@d@^|@j@dAh@jAd@nA`@ZHfB`@vDz@tCp@pAX`@JdCj@zBf@pAXr@PfAV|Bh@h@JrAXh@H`C^z@J~@Lp@H^Fb@FlAR`@Hf@JdAXXJh@RHDHD^Pr@`@q@lCW`BSfBGfAE~A?N?bADxABb@NzBVbBZpANp@d@tAN\\r@dBN^DJtA~DXt@xB|FhAzCz@~BZ~@r@|B^lBXzARlBPtCLbCJbBX|E\\vGJlA@LRbBZbB\\zAX`Al@fBp@`Bp@pABDhAbBLPt@~@d@f@bAdAhBhB`@`@|AzAzH|HhAhA~@~@b@`@^b@[f@c@n@yAdCiApBYf@]x@y@rAq@fAiAfBeAbBu@nAy@rAiDrF_AzAs@fA]j@]h@q@fA]j@_AxAsBdDQXOTc@r@_@j@k@|@m@`AWd@Wb@GJWb@u@lAW`@GJMTGJq@fAqAtBm@`Am@`AILEFQVGJw@pAKPS`@EHGJWd@a@pACJSfAKz@EZCPCZAr@ARAn@?`@Ij@?R?r@?\\?T?b@?dB?bB@|A?R@nB?bD?bAT?"
        }
    ]
}
Route Optimization
POST https://isp.beans.ai/enterprise/v1/lists/items/do/optimize/?startMode=WAREHOUSE&endMode=WAREHOUSE
Request
{
  "item": [
    {
      "listItemId": "81cd2800ccfd372f83d1160945d9fcad",
      "route": {
        "listRouteId": "fa6a22aa3878392188c04c3dde0231c8"
      }
    },
    {
      "listItemId": "697eb8cdbe5e30b38aae6b4c85c5d4d5",
      "route": {
        "listRouteId": "fa6a22aa3878392188c04c3dde0231c8"
      }
    },
    {
      "listItemId": "48294900ccc231f78fd467a6070f353d",
      "route": {
        "listRouteId": "fa6a22aa3878392188c04c3dde0231c8"
      }
    }
  ]
}
Response
{
    "item": [
    {
      "listItemId": "364641637ca939d1a5b5019f1f57eee3",
      "address": "1350 SHEELER AVE, APOPKA, FL 32703654250",
      "unit": "STE 1",
      "formattedAddress": "1350 Sheeler Ave, Apopka, FL",
      "status": "NEW",
      "updatedAt": 1622062743508,
      "statusUpdatedAt": 1622050969000,
      "route": {
        "listRouteId": "fa6a22aa3878392188c04c3dde0231c8"
      },
      "routePriority": 8,
      "trackingId": "2001",
      "numPackages": 3,
      "type": "DROPOFF",
      "position": {
        "latitude": 28.65922,
        "longitude": -81.49284
      },
      "displayPosition": {
        "latitude": 28.65945,
        "longitude": -81.4952
      },
      "sourceSeq": 66
    },
    {
      "listItemId": "f7a99f8438cf3c33be7c34d75fd4c8aa",
      "address": "1350 SHEELER AVE, APOPKA, FL 32703654250",
      "unit": "DOOR 34 BLDG 11",
      "formattedAddress": "1350 Sheeler Ave, Apopka, FL",
      "status": "NEW",
      "updatedAt": 1622062743508,
      "statusUpdatedAt": 1622050969000,
      "route": {
        "listRouteId": "fa6a22aa3878392188c04c3dde0231c8"
      },
      "routePriority": 9,
      "trackingId": "0",
      "numPackages": 1,
      "type": "PICKUP",
      "position": {
        "latitude": 28.65922,
        "longitude": -81.49284
      },
      "displayPosition": {
        "latitude": 28.65945,
        "longitude": -81.4952
      },
      "deliverFromStr": "2021-05-26 15:30",
      "deliverByStr": "2021-05-26 18:00",
      "sourceSeq": 66
    },
    {
      "listItemId": "13df24d753bc3a8e97ce2188cfeee16b",
      "address": "1700 S ORANGE BLOSSOM TRL, APOPKA, FL 32703774500",
      "formattedAddress": "1700 S Orange Blossom Trl, Apopka, FL",
      "status": "NEW",
      "updatedAt": 1622062743508,
      "statusUpdatedAt": 1622050968000,
      "route": {
        "listRouteId": "fa6a22aa3878392188c04c3dde0231c8"
      },
      "routePriority": 10,
      "trackingId": "0",
      "numPackages": 1,
      "type": "PICKUP",
      "position": {
        "latitude": 28.649471,
        "longitude": -81.46926479999999
      },
      "displayPosition": {
        "latitude": 28.649471,
        "longitude": -81.46926479999999
      },
      "deliverFromStr": "2021-05-26 16:00",
      "deliverByStr": "2021-05-26 18:00"
    },
    {
      "listItemId": "255e06ec227f3cebb7f8d5e1bd73f69d",
      "address": "3010 E SEMORAN BLVD, APOPKA, FL 32703594010",
      "formattedAddress": "3010 E Semoran Blvd, Apopka, FL",
      "status": "NEW",
      "updatedAt": 1622062743508,
      "statusUpdatedAt": 1622050969000,
      "route": {
        "listRouteId": "fa6a22aa3878392188c04c3dde0231c8"
      },
      "routePriority": 11,
      "trackingId": "6539",
      "numPackages": 1,
      "type": "DROPOFF",
      "position": {
        "latitude": 28.6713,
        "longitude": -81.45481
      },
      "displayPosition": {
        "latitude": 28.67119,
        "longitude": -81.4549
      },
      "sourceSeq": 58
    },
    {
      "listItemId": "677da40edc0132779c6eba73f4de1c0e",
      "address": "3050 E SEMORAN BLVD, APOPKA, FL 32703594050",
      "formattedAddress": "3050 E Semoran Blvd, Apopka, FL",
      "status": "NEW",
      "updatedAt": 1622062743508,
      "statusUpdatedAt": 1622050969000,
      "route": {
        "listRouteId": "fa6a22aa3878392188c04c3dde0231c8"
      },
      "routePriority": 12,
      "trackingId": "7056",
      "numPackages": 4,
      "type": "DROPOFF",
      "position": {
        "latitude": 28.6701408,
        "longitude": -81.4539266
      },
      "displayPosition": {
        "latitude": 28.6701408,
        "longitude": -81.4539266
      },
      "sourceSeq": 61
    },
    {
      "listItemId": "67608b72799d300bb7acc580b022ff89",
      "address": "3030 E SEMORAN BLVD, APOPKA, FL 32703590946",
      "unit": "STE 196",
      "formattedAddress": "3030 E Semoran Blvd, Apopka, FL",
      "status": "NEW",
      "updatedAt": 1622062743508,
      "statusUpdatedAt": 1622050969000,
      "route": {
        "listRouteId": "fa6a22aa3878392188c04c3dde0231c8"
      },
      "routePriority": 13,
      "trackingId": "6552",
      "numPackages": 3,
      "type": "DROPOFF",
      "position": {
        "latitude": 28.6697985,
        "longitude": -81.4545917
      },
      "displayPosition": {
        "latitude": 28.6697985,
        "longitude": -81.4545917
      },
      "sourceSeq": 60
    },
    {
      "listItemId": "48294900ccc231f78fd467a6070f353d",
      "address": "3030 E SEMORAN BLVD, APOPKA, FL 32703595358",
      "unit": "STE 208",
      "formattedAddress": "3030 E Semoran Blvd, Apopka, FL",
      "status": "NEW",
      "updatedAt": 1622062743508,
      "statusUpdatedAt": 1622050969000,
      "route": {
        "listRouteId": "fa6a22aa3878392188c04c3dde0231c8"
      },
      "routePriority": 14,
      "trackingId": "6541",
      "numPackages": 1,
      "type": "DROPOFF",
      "position": {
        "latitude": 28.6697985,
        "longitude": -81.4545917
      },
      "displayPosition": {
        "latitude": 28.6697985,
        "longitude": -81.4545917
      },
      "sourceSeq": 59
    },
    {
      "listItemId": "697eb8cdbe5e30b38aae6b4c85c5d4d5",
      "address": "3226 CHADWICK RD, APOPKA, FL 32703600726",
      "formattedAddress": "3226 Chadwick Rd, Apopka, FL",
      "status": "NEW",
      "updatedAt": 1622062743508,
      "statusUpdatedAt": 1622050969000,
      "route": {
        "listRouteId": "fa6a22aa3878392188c04c3dde0231c8"
      },
      "routePriority": 15,
      "trackingId": "7075",
      "numPackages": 1,
      "type": "DROPOFF",
      "position": {
        "latitude": 28.66886,
        "longitude": -81.45045
      },
      "displayPosition": {
        "latitude": 28.66871,
        "longitude": -81.45033
      },
      "sourceSeq": 62
    }
  ]
}