Dash Open API · v1
API Reference
The Dash API lets providers place, cancel, quote, and track delivery orders through a simple REST integration, and receive real-time status updates via webhooks. The API is organized around predictable, resource-oriented URLs, accepts JSON request bodies, and returns JSON responses using standard HTTP status codes.
https://api.dashelectric.coDeprecation notice — effective 21 May 2026
The separate sandbox-api.dashelectric.co and api.dashelectric.co host pair has been deprecated. All environments (Sandbox and Production) are now served from a single base URL: https://api.dashelectric.co. Environments are differentiated by the authentication key/value issued per environment, not by hostname. Sunset for deprecated endpoints is 21 Nov 2026, after which requests to sandbox-api.dashelectric.co return 410 Gone.
Environments
Both environments are served from the same host and differentiated by the credentials issued per environment. Access is by invitation only.
| Environment | Functionality | API host | Version |
|---|---|---|---|
| Sandbox | Testing and development space. By invitation only. | https://api.dashelectric.co | v1 |
| Production | Live, operational system. By invitation only. | https://api.dashelectric.co | v1 |
Deprecated endpoints — do not use for new integrations
| Environment | Dashboard | API host | Status |
|---|---|---|---|
| Sandbox | https://sandbox-portal.dashelectric.co | https://sandbox-api.dashelectric.co | Deprecated 21 May 2026 |
| Production | https://portal.dashelectric.co | https://api.dashelectric.co (host unchanged; new auth schema) | Deprecated 21 May 2026 |
API #0
Authentication
/v1/auth/providers/tokenAccess to the Dash API uses a token-based mechanism. Obtain your client_key and client_secret from the Dash Next Portal, exchange them here for an access token, then send that token as a Bearer credential on every subsequent request.
- For security reasons, keep your client_key and client_secret confidential.
- Include the token on subsequent requests as: Authorization: Bearer <your_access_token>
Request parameters
client_keystringRequiredYour provider client key.
e.g. SAMPLE_CLIENT
client_secretstringRequiredYour provider client secret.
e.g. random_and_unique_secret_key
Response
tokenstringAccess token to use as a Bearer credential.
e.g. random_and_unique_token
Error responses
{
"status": 401,
"message": "Tidak punya akses"
}{
"status": 400,
"message": "Terjadi kesalahan pada isian",
"errors": [
{
"field": "client_key",
"message": "Bidang client_key tidak boleh kosong"
}
]
}curl -X POST https://api.dashelectric.co/v1/auth/providers/token \
-H "Content-Type: application/json" \
--data '{
"client_key": "SAMPLE_CLIENT",
"client_secret": "random_and_unique_secret_key"
}'{
"token": "random_and_unique_token"
}API #1
Get Delivery Quotes
/v1/deliveries/quotesGet delivery quotes before placing an order. When serviceType details aren't provided, a single cheapest-category package is assumed. An array of delivery services with their respective quote is returned. The quote can change with distance, time of day, or parcel size.
- Header x-client-time-zone accepts Asia/Jakarta, Asia/Makassar, or Asia/Jayapura.
Request parameters
serviceCategorystringOptional“EXPRESS” or “LOGISTIC”. Default: “EXPRESS”.
serviceTypestringOptionalEXPRESS → “INSTANT” or “SAME_DAY”. LOGISTIC → “SAME_DAY”.
paymentMethodstringOptional“CASH” or “CASHLESS”. Default: “CASHLESS”.
packagesarrayRequiredArray of package objects being sent from sender to receiver.
originobjectRequiredOrigin (pickup) information.
destinationobjectRequiredDestination (drop-off) information.
scheduleobjectOptionalISO-8601 pickup window. Max range 3 days. EXPRESS only.
Response
quotesarrayArray of quote objects.
locationAvailabilitybooleanTrue if service covers the location.
driverAvailabilitybooleanDriver/operation-hour availability for the request.
availabilitybooleantrue → Dash service available; false → not available.
Error responses
{
"status": "Failed",
"error": "Lokasi pengantaran terlalu jauh."
}{
"status": "Failed",
"error": "Data tipe layanan tidak ditemukan"
}{
"status": "Failed",
"error": "Tipe layanan tidak disupport untuk project Anda. Hubungi admin Dash Electric."
}{
"status": "Failed",
"error": "Field tidak dikenali: [KEY_NAME]"
}{
"status": "Failed",
"error": "`paymentMethod` harus berisi CASH atau CASHLESS"
}curl -X POST https://api.dashelectric.co/v1/deliveries/quotes \
-H "Authorization: Bearer <your_access_token>" \
-H "x-client-time-zone: Asia/Jakarta" \
-H "Content-Type: application/json" \
--data '{
"serviceCategory": "EXPRESS",
"serviceType": "INSTANT",
"paymentMethod": "CASHLESS",
"packages": [
{ "name": "Martabak Manis", "quantity": 1, "weight": 14 }
],
"origin": {
"address": "Manis Cafe & Eatery",
"coordinates": { "latitude": -6.993893932, "longitude": 110.457499498 }
},
"destination": {
"address": "ALEX AC MOBIL SEMARANG",
"coordinates": { "latitude": -6.998215614, "longitude": 110.456339637 }
}
}'{
"quotes": [
{
"service": {
"category": "EXPRESS",
"type": "INSTANT",
"name": "Dash Instant Delivery"
},
"currency": { "code": "IDR", "symbol": "Rp" },
"amount": 9000,
"estimatedTimeline": {
"pickup": "2024-10-03T08:49:57+07:00",
"dropoff": "2024-10-03T08:50:57+07:00"
},
"distance": 499
}
],
"locationAvailability": true,
"driverAvailability": true,
"availability": true
}API #2
Create Delivery Request
/express/v1/deliveriesOnce you have a quote, use this endpoint to place a booking. A delivery is uniquely identified by its deliveryID. Couriers are not allocated immediately, so courier is always null in this response. Note: the legacy POST /v1/deliveries path is deprecated 21 May 2026 — use /express/v1/deliveries for new integrations.
Request parameters
providerOrderIDstringRequiredYour order reference (AWB-equivalent).
e.g. {{$randomUUID}}
serviceCategorystringRequired“EXPRESS” or “LOGISTIC”.
serviceTypestringRequiredEXPRESS → “INSTANT” or “SAME_DAY”. LOGISTIC → “SAME_DAY”.
paymentMethodstringOptional“CASH” or “CASHLESS”. Default: “CASHLESS”.
cashOnDeliveryobjectConditionalCOD info. Required if paymentMethod is “CASH”.
packagesarrayRequiredArray of package objects.
senderobjectRequiredSender contact details.
recipientobjectRequiredRecipient contact details.
originobjectConditionalOptional for LOGISTIC, required for EXPRESS.
destinationobjectRequiredDestination information.
instructionsarrayOptionalDriver instructions (max 1 entry).
Response
deliveryIDstringUnique delivery identifier.
e.g. DE-1727921269869
providerOrderIDstringYour order reference.
e.g. b1057443-7d59-4b8e-a41f-...
providerOutletIDstringOutlet identifier.
e.g. Outlet Tebet
paymentMethodstringPayment method.
e.g. CASHLESS
cashOnDeliveryobjectCOD amount to collect by courier.
statusstringInitial status.
e.g. ALLOCATING
courierobjectAlways null on creation — courier not yet allocated.
scheduleobjectEchoes the received pickup window.
senderobjectSender info.
recipientobjectRecipient info.
quoteobjectQuote info (service, currency, amount, timeline, distance, packages, origin, destination).
instructions[]arrayDriver instructions (type, url).
Error responses
{
"status": "Failed",
"error": "Lokasi pengantaran terlalu jauh."
}{
"status": "Failed",
"error": "Jenis layanan tidak dikenali."
}{
"status": "Failed",
"error": "Metode pembayaran tidak dikenali."
}{
"status": "Failed",
"error": "Kata kunci tidak dikenal."
}{
"status": "Failed",
"error": "Layanan gagal karena di luar waktu atau area operasional."
}curl -X POST https://api.dashelectric.co/express/v1/deliveries \
-H "Authorization: Bearer <your_access_token>" \
-H "Content-Type: application/json" \
--data '{
"providerOrderID": "AWB-TEST-1",
"serviceCategory": "EXPRESS",
"serviceType": "INSTANT",
"paymentMethod": "CASHLESS",
"packages": [
{ "name": "martabak manis", "description": "coklat dan keju",
"quantity": 1, "weight": 14 }
],
"sender": { "firstName": "arifatul", "phone": "081234548899" },
"recipient": { "firstName": "Tony", "phone": "082186789900" },
"origin": {
"address": "Manis Cafe & Eatery",
"coordinates": { "latitude": -6.993930049, "longitude": 110.457666336 }
},
"destination": {
"address": "ALEX AC MOBIL SEMARANG",
"coordinates": { "latitude": -6.998215614, "longitude": 110.456339637 }
}
}'{
"deliveryID": "DE-1727921269869",
"providerOrderID": "AWB-TEST-1",
"paymentMethod": "CASHLESS",
"status": "ALLOCATING",
"courier": null,
"quote": {
"service": { "category": "EXPRESS", "type": "INSTANT",
"name": "Dash Instant Delivery" },
"currency": { "code": "IDR", "symbol": "Rp" },
"amount": 9000,
"distance": 509
}
}API #3
Get Delivery Details
/v1/deliveries/{deliveryID}Get information about an in-progress delivery. Callable any time after the delivery has been created successfully. Returns the full quote, courier, media proofs, and a status timeline.
Request parameters
deliveryIDstringRequiredPath parameter — the delivery to fetch.
e.g. DE-INSTANT-1727922086941
Response
deliveryIDstringUnique delivery identifier.
e.g. DE-INSTANT-1727922086941
providerOrderIDstringYour order reference.
e.g. ef6b86b9-8e2d-489e-b703-...
paymentMethodstring“CASH” or “CASHLESS”.
quoteobjectQuote info (service, currency, amount, timeline, distance, packages, origin, destination).
statusstringOne of ALLOCATING, PREPARING, VERIFIED, NOT_VERIFIED, PENDING_PICKUP, PICKING_UP, IN_DELIVERY, COMPLETED, FAILED, CANCELLED.
courierobjectCourier info (name, phone).
media[]arrayImage proofs (url, type).
timeline[]arrayStatus-change history.
scheduleobjectPickup window (max 3 days).
advanceInfo.failedReasonstringFailure reason, if any.
senderobjectSender info (firstName, lastName, companyName, phone).
recipientobjectRecipient info (firstName, lastName, companyName, email, phone).
pickupAtISO 8601Pickup timestamp.
e.g. 2025-02-02T04:49:40.471Z
completedAtISO 8601Completion timestamp.
e.g. 2025-02-02T04:49:40.471Z
createdAtISO 8601Creation timestamp.
e.g. 2025-02-02T04:49:40.471Z
curl -X GET https://api.dashelectric.co/v1/deliveries/DE-INSTANT-1727922086941 \
-H "Authorization: Bearer <your_access_token>"{
"deliveryID": "DE-INSTANT-1727922086941",
"providerOrderID": "ef6b86b9-8e2d-489e-b703-...",
"paymentMethod": "CASHLESS",
"status": "IN_DELIVERY",
"courier": { "name": "Nata", "phone": "085720860294" },
"media": [
{ "url": "https://.../PICKUP_PROOF", "type": "PICKUP_PROOF" }
],
"timeline": [
{ "status": "ALLOCATING", "createdAt": "2025-02-02T11:49:40+07:00" },
{ "status": "PENDING_PICKUP", "createdAt": "2025-02-02T11:52:10+07:00" }
],
"createdAt": "2025-02-02T04:49:40.471Z"
}API #4
Cancel Delivery
/v1/deliveries/{deliveryID}Cancel a delivery order while it is in state ALLOCATING or PENDING_PICKUP. Only the client (provider) can cancel a delivery — Dash drivers and Ops teams cannot.
Request parameters
deliveryIDstringRequiredPath parameter — the delivery to cancel.
e.g. DE-INSTANT-1727922086941
notesstringOptionalBody parameter — reason for cancellation.
Response
200 OK—Success. Pengantaran berhasil dibatalkan.
Error responses
{
"status": "Failed",
"error": "Pengantaran tidak ditemukan"
}{
"status": "Failed",
"error": "Perubahan status antaran tidak dapat dilakukan."
}{
"status": "Failed",
"error": "Pengantaran sudah diambil"
}curl -X DELETE https://api.dashelectric.co/v1/deliveries/DE-INSTANT-1727922086941 \
-H "Authorization: Bearer <your_access_token>" \
-H "Content-Type: application/json" \
--data '{ "notes": "Barang tidak jadi dikirim" }'{
"status": "Success",
"message": "Pengantaran berhasil dibatalkan."
}API #5
Additional Notification
/v1/deliveries/{deliveryID}/additional-notificationsNotify the assigned driver that a package is ready to pick up. Valid while the delivery is in state PENDING_PICKUP or PICKING_UP.
Request parameters
deliveryIDstringRequiredPath parameter — the delivery to notify on.
e.g. DE-17279220
typestringRequiredBody parameter — must be “READY_TO_PICKUP”.
e.g. READY_TO_PICKUP
Response
200 OK—{ status: “Success”, message: “Notifikasi berhasil dikirim” }
Error responses
{
"status": "Failed",
"error": "Field `type` tidak dikenali"
}{
"status": "Failed",
"error": "Kurir belum ditugaskan untuk antaran ini."
}{
"status": "Failed",
"error": "Pengantaran tidak ditemukan"
}{
"status": "Failed",
"error": "Notifikasi tidak dapat dikirim karena status pengantaran tidak sesuai."
}curl -X POST \
https://api.dashelectric.co/v1/deliveries/DE-17279220/additional-notifications \
-H "Authorization: Bearer <your_access_token>" \
-H "Content-Type: application/json" \
--data '{ "type": "READY_TO_PICKUP" }'{
"status": "Success",
"message": "Notifikasi berhasil dikirim"
}Webhooks
Real-time status updates
Webhooks let providers receive real-time order-status changes without polling. Register one webhook URL per environment on the Dash dashboard, choose the POST method, and optionally set an authentication key/value Dash will send with each call.
- If a webhook delivery fails, Dash retries up to 3 times at 60-second intervals before marking it failed. This applies to all events.
- Per environment, only one URL and authentication pair is allowed.
trackingURLonly exists for the EXPRESS service category; for LOGISTIC, thePICKUP_PROOFmedia entry is not produced.
{
"providerOrderID": "AWB-TEST-1",
"deliveryID": "DE-1735308506306",
"status": "COMPLETED",
"failedCount": 0,
"courier": { "name": "Agus Wijayanto", "phone": "087777777777" },
"weight": 80,
"sender": {
"firstName": "Budi", "lastName": "Darmadi",
"companyName": "PT BUDI DARMADI", "phone": "081234567891"
},
"recipient": {
"firstName": "Sari", "lastName": "Sutarni",
"companyName": "PT SARI SUTARNI", "email": "sari.sutarni@ss.com",
"phone": "089999999999", "actualRecipientName": "John Doe"
},
"origin": {
"address": "Cipete",
"coordinates": { "latitude": -6.277774703, "longitude": 106.800365240 }
},
"destination": {
"address": "Depok",
"coordinates": { "latitude": -6.2943323, "longitude": 106.7821084 }
},
"packages": [
{
"name": "Helm Sepeda", "description": "Helm Sepeda Lokal",
"quantity": 1, "price": 23000, "weight": 80,
"length": 10, "width": 10, "height": 10
}
],
"media": [
{ "url": "https://.../PICKUP_PROOF", "type": "PICKUP_PROOF",
"createdAt": "2024-12-27T14:07:49.300Z" },
{ "url": "https://.../DELIVERY_PROOF", "type": "DELIVERY_PROOF",
"createdAt": "2024-12-27T14:07:49.300Z" }
],
"quote": { "amount": 21000 },
"createdAt": "2024-12-27T12:18:17.128Z",
"pickupAt": "2024-12-27T13:18:17.128Z",
"completedAt": "2024-12-27T14:18:58.750Z"
}Webhook events
Each delivery status change emits an event. Some statuses are specific to a service category, as marked below.
QUEUEINGBOTHScheduled-scheme status with a specific time before it can change to ALLOCATING.
PREPARINGBOTHDelivery created and acknowledged by the system. A valid entry that has not yet entered processing.
VERIFIEDLOGISTICPackage verified by warehouse Ops, awaiting driver assignment. LOGISTIC only.
NOT_VERIFIEDLOGISTICPackage data received by Ops but not physically received. LOGISTIC only.
ALLOCATINGEXPRESSDash is allocating nearby drivers. EXPRESS only.
PENDING_PICKUPEXPRESSAllocation finished and assigned to a driver. Note: Dash may reassign the driver, which triggers another webhook. EXPRESS only.
PICKING_UPBOTHThe driver was notified and is starting to pick up the delivery.
PENDING_DELIVERYBOTHPicked up and in an intermediate state before the next stage.
IN_DELIVERYBOTHActively progressing toward the destination.
COMPLETEDBOTHDriver arrived and captured a DELIVERY_PROOF photo, completing the delivery.
FAILEDBOTHDriver at destination but the package failed (recipient absent, COD declined, SLA exceeded, etc.).
CANCELLEDBOTHCancelled by the provider. Only possible from ALLOCATING or PENDING_PICKUP.
Webhook payload reference
Every webhook delivers the same delivery object. Fields that only appear in certain states (e.g. completedAt, failedReason, cancelledReason) are noted in their descriptions.
providerOrderIDstringOptionalShipping receipt number (your reference).
deliveryIDstringOptionalUnique value of the delivery.
statusstringOptionalDelivery status (see Webhook Events).
courierobjectRequiredCourier details, present from PENDING_PICKUP / IN_DELIVERY onward.
trackingURLstringRequiredWeb live-tracking URL (EXPRESS only).
weightfloatOptionalTotal weight of items across the packages array.
senderobjectOptionalSender contact details.
recipientobjectOptionalRecipient contact details.
originobjectOptionalPickup location details.
destinationobjectOptionalDelivery location details.
packages[]arrayOptionalPackage details.
mediaarrayOptionalMedia proofs; empty array if none exist.
quoteobjectOptionalDelivery cost details.
failedCountnumberOptionalIncrements each time a failure occurs.
createdAtdatetimeOptionalWhen the delivery was created.
updatedAtdatetimeOptionalShown on VERIFIED, NOT_VERIFIED, PENDING_PICKUP, PICKING_UP, IN_DELIVERY.
completedAtdatetimeOptionalShown only when status is COMPLETED.
failedAtdatetimeOptionalShown only when status is FAILED.
failedReasonstringOptionalReason when a failure occurs.
cancelledAtdatetimeOptionalShown only when status is CANCELLED.
cancelledReasonstringRequiredReason when a cancellation occurs.
Terminology
providerOrderIDSimilar to an Airway Bill (AWB), generated on the client side.
deliveryIDDefined by Dash Ops based on driver assessment and capability. A group of deliveryIDs forms an AWB.
Retry logicIf a webhook fails to send, Dash retries up to 3 times within 60-second intervals.
EventCaptures a delivery status change.
Delivery state machine
A delivery moves through the states below. Express and Logistic categories share these states; only the client (provider) can cancel a delivery.
| State | Description |
|---|---|
ALLOCATING | Initial state of a non-scheduled order, or allocating a courier. |
PENDING_PICKUP | The courier has been assigned but has not started the job. |
PICKING_UP | The courier has accepted and is on the way to pick up the packages. |
IN_DELIVERY | The courier is on the way to the receiver. |
COMPLETED | Order successfully delivered. |
CANCELLED | Cancelled by the provider side. |
FAILED | Exceeded SLA, or cancelled by the Dash Operations team. |
