deliveryId. That identifier is what you use on every update for that delivery’s lifetime. Updates only land on deliveries owned by your organization — anything else returns not-found.
Reporting state for a single delivery
Use Update Delivery (PATCH /v1/fleet/deliveries/{delivery_id}) to report a change on one delivery. The body is partial — include only the fields that changed.
Receive the dispatch and capture the deliveryId
When Nash dispatches the job (delivery) to you, store the
deliveryId it carries. You’ll send it on every subsequent update.Report the first assignment
On assignment, send the
courier object (name, phone, vehicle, and profile image as available) and a status such as assigned_driver. You can include coordinates and an ETA in the same call.Send progress updates as the delivery moves
As the courier advances,
PATCH each transition — pickup_enroute, pickup_arrived, pickup_complete, and so on. coordinates are append-only and safe to send on every location tick, alongside pickupEta / dropoffEta and any pickupNote / dropoffNote.Attach proof of delivery
At pickup or dropoff, include
proofOfDelivery — image artifacts (photo or signature) or barcode scans — discriminated by type.| Field | What it carries |
|---|---|
status | A lifecycle transition (see Lifecycle & validation). |
coordinates | { latitude, longitude } for the courier’s current position. Append-only; safe to resend. |
courier | Courier identity and vehicle — name, phone, vehicle, profile image. |
proofOfDelivery | Image (photo or signature) or barcode artifacts captured at a stop. |
failure | Structured { code, reason } when the delivery enters failed or canceled_by_provider. |
pickupEta / dropoffEta | Provider-supplied ETAs, ISO 8601. |
pickupNote / dropoffNote | Free-text notes the courier captured at a stop. |
parkingLocation / returnParkingLocation | Where the courier parked at the stop or when returning the package. |
externalDeliveryId | Your own identifier for the delivery, for cross-system reconciliation. |
Bulk updates
When you have updates for many deliveries to flush at once, use Bulk Update Deliveries (PATCH /v1/fleet/deliveries). Send a deliveries array of up to 100 items, where each item is the same partial update you’d send to the single endpoint, keyed by its deliveryId.
The response returns a results array with one entry per request item, in order. Each result carries:
deliveryId— the Nash delivery id.success— whether that item’s update was applied.delivery— the updated delivery, on success.errorCode/errorMessage— failure detail, whensuccessisfalse.
success flag rather than relying on the overall HTTP status.
Testing with Fleet simulators
In sandbox you can exercise your integration without a real courier. Two complementary tools:- Fleet simulators — mock fleets that emulate real-world scenarios.
FleetSimulatorcycles a job through statuses from driver-not-assigned up to dropoff-complete,FleetSimulatorFastdoes the same on a shorter interval, andFailingFleetSimulatorsends a failed status. Simulators start the job based on its scheduled pickup time. See Environments for the full list. - Simulate Delivery Status Transition — this endpoint (
POST /v1/deliveries/{delivery_id}/simulate) advances a delivery to a specific status on demand, so you can drive your handlers through each state deliberately.
The simulate endpoint is available in dev and sandbox only, and only for deliveries dispatched to the Nash sandbox test provider. The behavior of fleets and fleet simulators is not an indication of how real fleets behave in production.
Lifecycle & validation
A typical happy path moves through:not_assigned_driver, assigned_driver, pickup_enroute, pickup_arrived, pickup_complete, dropoff_enroute, dropoff_arrived, dropoff_complete, failed, canceled_by_provider, return_in_progress, return_arrived, returned_to_store.
Terminal failures use failed or canceled_by_provider, paired with a structured failure.code. Valid codes are customer_unavailable, address_not_found, out_of_service_area, damage_in_transit, item_unavailable, age_verification_failed, no_capacity, and other, with an optional free-text reason.
Validation rules to keep in mind:
- At least one mutating field is required per update — empty bodies return
422. coordinates.latitudemust be in[-90, 90]andcoordinates.longitudein[-180, 180].- Wire format is camelCase; snake_case is also accepted.
- Sending the same status twice is a no-op, so updates are safe to retry.
Next steps
Fleet overview
How the inbound Fleet API surface fits together.
Update Delivery
PATCH a single delivery’s state.
Bulk Update Deliveries
Flush updates for up to 100 deliveries at once.
Simulate Delivery Status Transition
Drive a sandbox delivery to a given status.