EasyRoutes API

Update route stop location

PATCH
/routes/{routeId}/stops/{stopId}/location

Updates the address and/or planned coordinates for a stop on a route by route ID and stop ID. This updates only the stop as it exists on this route; the imported stop it originated from is not modified. Only stops that were previously imported via ImportStops (i.e. stops with an importedStopId) can be updated through this endpoint. This is a partial update: provide the fields to change in location and list their paths in updateMask, which must contain at least one of address or plannedCoordinates. Changing a stop's location affects its distances and ETAs and marks the route as not optimized; fetch the route to see the updated directions, and call ReoptimizeRoute if the stop order should be adjusted. The route must not be archived. The response returns the single updated RouteStop.

Authorization

bearerAuth
AuthorizationBearer <token>

Access token from /authenticate

In: header

Path Parameters

routeId*string

The ID of the route containing the stop to update.

stopId*string

The ID of the stop to update.

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X PATCH "https://example.com/routes/rte-123e4567-e89b-12d3-a456-426614174000/stops/rst-123e4567-e89b-12d3-a456-426614174000/location" \  -H "Content-Type: application/json" \  -d '{    "location": {},    "updateMask": "string"  }'
{  "id": "rst-123e4567-e89b-12d3-a456-426614174000",  "type": "DELIVERY",  "deliveryStatus": "ATTEMPTED_DELIVERY",  "breakStatus": "COMPLETED",  "updatedAt": "2019-08-24T14:15:22Z",  "duration": "string",  "plannedArrival": "2019-08-24T14:15:22Z",  "note": "Leave at door.",  "address": {    "address1": "123 Main St",    "address2": "Apt 3B",    "city": "New York",    "provinceCode": "NY",    "countryCode": "US",    "zip": "10001"  },  "contact": {    "firstName": "John",    "lastName": "Doe",    "company": "Roundtrip Systems Inc",    "phone": "+14265551000",    "email": "john.doe@roundtrip.ai"  },  "plannedCoordinates": {    "latitude": 0.1,    "longitude": 0.1  },  "items": [    {      "name": "Bananas",      "quantity": 5,      "grams": 500,      "sku": "BANANA-001"    }  ],  "source": "IMPORTED_STOP",  "shopifyOrderId": "6229749334323",  "savedStopId": "sst-123e4567-e89b-12d3-a456-426614174000",  "deliveredCoordinates": {    "latitude": 0.1,    "longitude": 0.1  },  "proofOfDeliveryNote": "Left at door.",  "proofOfDeliveryPhotos": [    {      "id": "att-123e4567-e89b-12d3-a456-426614174000",      "createdAt": "2019-08-24T14:15:22Z",      "url": "https://example.com/stop-attachment/attachment-2025-06-03-1"    }  ],  "proofOfDeliverySignatures": [    {      "id": "att-123e4567-e89b-12d3-a456-426614174000",      "createdAt": "2019-08-24T14:15:22Z",      "url": "https://example.com/stop-attachment/attachment-2025-06-03-1"    }  ],  "tasks": [    {      "id": "tsk-123e4567-e89b-12d3-a456-426614174000",      "title": "Delivery checklist",      "type": "TEXT_INPUT",      "items": [],      "input": {        "value": "020123456789",        "updatedAt": "2019-08-24T14:15:22Z",        "inputMethod": "SCANNED"      },      "requiredToMarkStopAsDelivered": true,      "requiredToMarkStopAsAttempted": true    }  ],  "priority": 8,  "importedStopId": "ist-123e4567-e89b-12d3-a456-426614174000",  "orderName": "#1234",  "distanceMeters": 123.45,  "updatedArrival": "2019-08-24T14:15:22Z",  "timeWindows": [    {      "start": {        "hours": 13,        "minutes": 37,        "seconds": 16      },      "end": {        "hours": 13,        "minutes": 37,        "seconds": 16      }    }  ],  "deliveryDate": {    "year": 2019,    "month": 11,    "day": 15  },  "attributes": [    {      "key": "delivery_date",      "value": "2025-12-16"    }  ],  "clientStopId": "test-order-1234",  "tags": [    "foo",    "bar"  ],  "attemptedReason": "NOT_AVAILABLE",  "attemptedNote": "Customer did not answer the door.",  "customerRating": {    "rating": 5,    "comment": "Excellent delivery",    "createdAt": "2019-08-24T14:15:22Z"  },  "customSignatureDisclosure": "I acknowledge that I have received this delivery.",  "shopifyOrder": {    "orderNote": "Customer has paid.",    "customerNote": "Leave at door."  },  "proofOfDeliveryBarcodes": [    {      "value": "string",      "createdAt": "2019-08-24T14:15:22Z"    }  ],  "proofOfDeliveryBarcodeIssues": [    {      "reason": "ITEM_MISSING",      "note": "Item was not packed.",      "createdAt": "2019-08-24T14:15:22Z"    }  ]}
{  "code": 0,  "message": "string",  "details": [    {      "@type": "string"    }  ]}