Skip to main content

EXPRESS

On-demand last-mile delivery. Dash allocates the nearest available driver, the package is collected at pickup, and delivered in a single leg. The bulk of the API surface is built for this flow.

Deprecation — service-category create path. Creating deliveries on the shared POST /v1/deliveries endpoint (where the category is chosen via the serviceCategory field) is deprecated. EXPRESS now uses the dedicated POST /express/v1/deliveries path. The legacy shared path will be obsoleted on 21 November 2026 and stops accepting requests after that date — migrate before then.

When to use EXPRESS

Use serviceCategory: "EXPRESS" when:

  • You need same-hour or same-day fulfilment.
  • The package is collected from a known pickup point (a restaurant, an outlet, a shop) and delivered to a single recipient.
  • No warehouse verification is required.

Service types

INSTANT
On-demand allocation to the nearest available driver. Typical pickup window: a few minutes.
SAME_DAY
Scheduled pickup within a same-day window. Use the schedule.pickupTimeFrom / pickupTimeTo fields. Max 3 days ahead.

State machine

QUEUEING(if scheduled)ALLOCATINGPENDING_PICKUPPICKING_UPPENDING_DELIVERYIN_DELIVERYCOMPLETEDreassignmentCANCELLEDprovider · before pickupFAILEDLifecycleCompletedCancelledFailed(green, orange, red = terminal)

Transitions

create → ALLOCATING / QUEUEING
On creation, an unscheduled delivery starts in ALLOCATING. A scheduled one starts in QUEUEING and moves to ALLOCATING when its pickup window opens.
ALLOCATING → PENDING_PICKUP
Driver accepts. courier.name and courier.phone become available.
PENDING_PICKUP → PICKING_UP
Driver is moving toward pickup. Dash may still re-assign — a fresh webhook fires with updated courier.
PICKING_UP → PENDING_DELIVERY
Driver captured PICKUP_PROOF. Package is in hand — pickupAt is set and cancellation is now closed.
PENDING_DELIVERY → IN_DELIVERY
Driver is en route to drop. trackingURL is now valid.
IN_DELIVERY → COMPLETED
Driver captured DELIVERY_PROOF at the destination. recipient.actualRecipientName populated.
… → CANCELLED
Provider DELETE is allowed any time before pickup — ALLOCATING, PENDING_PICKUP, or PICKING_UP. Closed once the package is picked up (PENDING_DELIVERY). Terminal.
… → FAILED
Recipient unavailable, COD refused, SLA exceeded, or ops-cancelled. failedReason populated. Terminal.

Reassignment loops. The Dash dispatcher can move a delivery back to PENDING_PICKUP from PICKING_UP, PENDING_DELIVERY, or IN_DELIVERY when a driver becomes unavailable. Each reassignment fires a fresh webhook with the updated courier block — always treat the most recent value as authoritative.

EXPRESS-only fields and webhook statuses

These are emitted only when serviceCategory: "EXPRESS":

  • Statuses: ALLOCATING, PENDING_PICKUP
  • Webhook field: trackingURL (present from PENDING_PICKUP onward)
  • POD media: PICKUP_PROOF is captured by the driver (LOGISTIC skips this)

Endpoints

EXPRESS uses the dedicated create-delivery path. Everything else (quote, get, cancel, notify) is shared with LOGISTIC.

POST /v1/deliveries/quotes
Pre-flight quote. See Get delivery quote.
POST /express/v1/deliveries
The EXPRESS-specific create endpoint. The legacy POST /v1/deliveries path is deprecated (21 May 2026) and obsoleted 21 Nov 2026. See Create delivery.
GET /v1/deliveries/{deliveryID}
Read current state. See Get delivery details.
DELETE /v1/deliveries/{deliveryID}
Cancel any time before pickup — ALLOCATING / PENDING_PICKUP / PICKING_UP. See Cancel delivery.
POST /v1/deliveries/{deliveryID}/additional-notifications
Notify the driver. See Notify driver.

Gotchas

  • Driver re-assignment can happen on PENDING_PICKUP, PICKING_UP, PENDING_DELIVERY, or IN_DELIVERY. A re-assignment fires a fresh webhook with updated courier.name / courier.phone — keep the most recent values.
  • Cancellation eligibility runs through PICKING_UP — you can cancel any time before the package is picked up (ALLOCATING, PENDING_PICKUP, PICKING_UP). Once the driver collects the package (PENDING_DELIVERY), the only terminal states are COMPLETED or FAILED.
  • trackingURL only exists on EXPRESS deliveries and only from PENDING_PICKUP onward.