Skip to main content

Create delivery

Places a booking on the Dash Express fleet. Returns a deliveryID in status ALLOCATING. The driver is assigned asynchronously — track progress via webhooks.

POST/express/v1/deliveries

The legacy path POST /v1/deliveries (category chosen via serviceCategory) is deprecated (21 May 2026) and will be obsoleted on 21 November 2026. New integrations must use /express/v1/deliveries.

Request body

providerOrderIDstringrequired
Your AWB / order reference. Echoed in every webhook and the Get Delivery response.
serviceCategorystringoptional
One of EXPRESS, LOGISTIC. This page documents EXPRESS.
serviceTypestringrequired
For EXPRESS: INSTANT or SAME_DAY. Must match a tier returned by the quote.
paymentMethodstringoptional
CASH or CASHLESS. Default CASHLESS.
cashOnDeliveryobjectconditional
Required when paymentMethod = "CASH". Contains amount (IDR).
packages[]arrayrequired
Package rows; same shape as the quote request.
packages[].namestringrequired
Display name.
packages[].typestringoptional
One of REGULAR, SPECIAL, SENSITIVE, HIGH_VALUE, OTHER. Omitted, null, or empty is stored as REGULAR. See Package type.
packages[].descriptionstringrequired
Free-form description of the items.
packages[].quantityintegerrequired
Item count.
packages[].weightdecimalrequired
Weight in kilograms.
packages[].insuranceobjectoptional
Optional package insurance object. Requires provider, premi, coverage. Can optionally include label.
packages[].price / width / length / height / descriptionvariousoptional
Optional metadata, see Quote endpoint.
senderobjectrequired
Sender contact details.
sender.firstNamestringrequired
Sender first name.
sender.phonestringrequired
Sender phone (e.164 or local format).
sender.lastName / companyNamestringoptional
Optional sender metadata.
recipientobjectrequired
Recipient contact.
recipient.firstNamestringrequired
Recipient first name.
recipient.lastName / companyName / email / phonestringoptional
Optional recipient metadata.
originobjectconditional
Required for EXPRESS; optional for LOGISTIC.
origin.addressstringrequired
Human-readable pickup address.
origin.coordinates.latitude / longitudedecimalrequired
WGS-84 decimal.
origin.province / city / district / subDistrict / postalCodestringoptional
Optional address metadata.
origin.notesstringoptional
Free-form pickup note shown to the driver. Trimmed; omit or send null for none.
destinationobjectrequired
Dropoff location with the same shape as origin. Coordinates required for EXPRESS.
destination.notesstringoptional
Free-form dropoff note shown to the driver at handover. Trimmed; omit or send null for none.
instructions[]arrayoptional
Up to 1 instruction object (see below).
scheduleobjectoptional
Optional pickup window (ISO-8601). Max 3 days ahead, EXPRESS only.

Package type

packages[].type labels what is inside the package. It is optional and accepts exactly five values — REGULAR, SPECIAL, SENSITIVE, HIGH_VALUE, OTHER. Omit it, or send null or an empty string, and the package is stored as REGULAR. Anything else is rejected with 400. Surrounding whitespace is trimmed before the value is checked, so " HIGH_VALUE " is accepted as HIGH_VALUE — on this endpoint and on Get delivery quote.

The stored value is returned per package by this endpoint and by Get delivery details.

"packages": [
{ "name": "Cincin emas", "type": "HIGH_VALUE", "quantity": 1, "weight": 0.1 }
]

type is a label only. Sending HIGH_VALUE does not change the fare, the courier chosen, or how the delivery is batched with others — the value is recorded and echoed back, nothing else. If a package needs special handling, arrange it with Dash Ops.

Cash on Delivery

When paymentMethod is CASH, pass a cashOnDelivery.amount in IDR. The driver collects this on handover.

{
"paymentMethod": "CASH",
"cashOnDelivery": { "amount": 250000 }
}

Instructions

Optional per-delivery instruction shown to the driver. At most one instruction is supported today. Setting type: "WEBVIEW" opens the URL inside the courier app.

"instructions": [
{
"type": "WEBVIEW",
"text": "Please do something on this delivery",
"url": "https://example.com/runbook"
}
]

Error responses

201

Delivery created in ALLOCATING. Courier is assigned asynchronously.

400Butuh request body.
Empty request body.
400Field tidak dikenali: [<field>]
Request body contains an unrecognised key. The key is interpolated into the message.
400Validation message
Payload validation failed — the message names the first failing field.
400Field `packages.type` harus berisi salah satu dari: REGULAR, SPECIAL, SENSITIVE, HIGH_VALUE, OTHER
packages[].type was sent with a value outside the accepted list.
400Ups! Sepertinya waktu pengantaran yang Anda pilih sudah lewat. Yuk, pilih waktu lain yang masih tersedia.
Scheduled time is in the past.
400Pengantaran hanya dapat dijadwalkan dalam rentang hari ini hingga maksimal 3 hari ke depan
Scheduled time is outside the allowed booking window.
400Layanan tidak tersedia di area ini. Silakan pilih layanan lain.
Origin area is not covered for the requested schedule.
400Layanan tidak tersedia pada jam ini
No driver shift covers the requested schedule.
400Layanan tidak tersedia di area ini. Silakan pilih layanan lain.
Quote re-check at booking time came back unavailable.
400Lokasi pengantaran terlalu jauh (<km> km) atau berat paket melebihi batas (<kg> kg). Sesuaikan jarak pengantaran atau hubungi admin Dash Electric.
No pricing tier covers the distance or weight. The actual distance / weight are interpolated into the message.