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.

Base URL
Click to copy
https://api.dashelectric.co

Deprecation 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.

EnvironmentFunctionalityAPI hostVersion
SandboxTesting and development space. By invitation only.https://api.dashelectric.cov1
ProductionLive, operational system. By invitation only.https://api.dashelectric.cov1

Deprecated endpoints — do not use for new integrations

EnvironmentDashboardAPI hostStatus
Sandboxhttps://sandbox-portal.dashelectric.cohttps://sandbox-api.dashelectric.coDeprecated 21 May 2026
Productionhttps://portal.dashelectric.cohttps://api.dashelectric.co (host unchanged; new auth schema)Deprecated 21 May 2026

API #0

Authentication

POST/v1/auth/providers/token

Access 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_keystringRequired

Your provider client key.

e.g. SAMPLE_CLIENT

client_secretstringRequired

Your provider client secret.

e.g. random_and_unique_secret_key

Response

tokenstring

Access token to use as a Bearer credential.

e.g. random_and_unique_token

Error responses

401Unauthorized
{
  "status": 401,
  "message": "Tidak punya akses"
}
400Bad Request — invalid field
{
  "status": 400,
  "message": "Terjadi kesalahan pada isian",
  "errors": [
    {
      "field": "client_key",
      "message": "Bidang client_key tidak boleh kosong"
    }
  ]
}
Request
Click to copy
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"
  }'
Response
Click to copy
{
  "token": "random_and_unique_token"
}

API #1

Get Delivery Quotes

POST/v1/deliveries/quotes

Get 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”.

serviceTypestringOptional

EXPRESS → “INSTANT” or “SAME_DAY”. LOGISTIC → “SAME_DAY”.

paymentMethodstringOptional

“CASH” or “CASHLESS”. Default: “CASHLESS”.

packagesarrayRequired

Array of package objects being sent from sender to receiver.

originobjectRequired

Origin (pickup) information.

destinationobjectRequired

Destination (drop-off) information.

scheduleobjectOptional

ISO-8601 pickup window. Max range 3 days. EXPRESS only.

Response

quotesarray

Array of quote objects.

locationAvailabilityboolean

True if service covers the location.

driverAvailabilityboolean

Driver/operation-hour availability for the request.

availabilityboolean

true → Dash service available; false → not available.

Error responses

422Distance SLA exceeded — destination too far.
{
  "status": "Failed",
  "error": "Lokasi pengantaran terlalu jauh."
}
404Service type not found.
{
  "status": "Failed",
  "error": "Data tipe layanan tidak ditemukan"
}
404Invalid service type for your project.
{
  "status": "Failed",
  "error": "Tipe layanan tidak disupport untuk project Anda. Hubungi admin Dash Electric."
}
400Invalid parameters.
{
  "status": "Failed",
  "error": "Field tidak dikenali: [KEY_NAME]"
}
400Invalid payment method.
{
  "status": "Failed",
  "error": "`paymentMethod` harus berisi CASH atau CASHLESS"
}
Request
Click to copy
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 }
    }
  }'
Response
Click to copy
{
  "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

POST/express/v1/deliveries

Once 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

providerOrderIDstringRequired

Your order reference (AWB-equivalent).

e.g. {{$randomUUID}}

serviceCategorystringRequired

“EXPRESS” or “LOGISTIC”.

serviceTypestringRequired

EXPRESS → “INSTANT” or “SAME_DAY”. LOGISTIC → “SAME_DAY”.

paymentMethodstringOptional

“CASH” or “CASHLESS”. Default: “CASHLESS”.

cashOnDeliveryobjectConditional

COD info. Required if paymentMethod is “CASH”.

packagesarrayRequired

Array of package objects.

senderobjectRequired

Sender contact details.

recipientobjectRequired

Recipient contact details.

originobjectConditional

Optional for LOGISTIC, required for EXPRESS.

destinationobjectRequired

Destination information.

instructionsarrayOptional

Driver instructions (max 1 entry).

Response

deliveryIDstring

Unique delivery identifier.

e.g. DE-1727921269869

providerOrderIDstring

Your order reference.

e.g. b1057443-7d59-4b8e-a41f-...

providerOutletIDstring

Outlet identifier.

e.g. Outlet Tebet

paymentMethodstring

Payment method.

e.g. CASHLESS

cashOnDeliveryobject

COD amount to collect by courier.

statusstring

Initial status.

e.g. ALLOCATING

courierobject

Always null on creation — courier not yet allocated.

scheduleobject

Echoes the received pickup window.

senderobject

Sender info.

recipientobject

Recipient info.

quoteobject

Quote info (service, currency, amount, timeline, distance, packages, origin, destination).

instructions[]array

Driver instructions (type, url).

Error responses

422Distance SLA exceeded.
{
  "status": "Failed",
  "error": "Lokasi pengantaran terlalu jauh."
}
404Invalid service type.
{
  "status": "Failed",
  "error": "Jenis layanan tidak dikenali."
}
404Payment type not found.
{
  "status": "Failed",
  "error": "Metode pembayaran tidak dikenali."
}
400Invalid parameters.
{
  "status": "Failed",
  "error": "Kata kunci tidak dikenal."
}
400Outside service operating time/area.
{
  "status": "Failed",
  "error": "Layanan gagal karena di luar waktu atau area operasional."
}
Request
Click to copy
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 }
    }
  }'
Response
Click to copy
{
  "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

GET/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

deliveryIDstringRequired

Path parameter — the delivery to fetch.

e.g. DE-INSTANT-1727922086941

Response

deliveryIDstring

Unique delivery identifier.

e.g. DE-INSTANT-1727922086941

providerOrderIDstring

Your order reference.

e.g. ef6b86b9-8e2d-489e-b703-...

paymentMethodstring

“CASH” or “CASHLESS”.

quoteobject

Quote info (service, currency, amount, timeline, distance, packages, origin, destination).

statusstring

One of ALLOCATING, PREPARING, VERIFIED, NOT_VERIFIED, PENDING_PICKUP, PICKING_UP, IN_DELIVERY, COMPLETED, FAILED, CANCELLED.

courierobject

Courier info (name, phone).

media[]array

Image proofs (url, type).

timeline[]array

Status-change history.

scheduleobject

Pickup window (max 3 days).

advanceInfo.failedReasonstring

Failure reason, if any.

senderobject

Sender info (firstName, lastName, companyName, phone).

recipientobject

Recipient info (firstName, lastName, companyName, email, phone).

pickupAtISO 8601

Pickup timestamp.

e.g. 2025-02-02T04:49:40.471Z

completedAtISO 8601

Completion timestamp.

e.g. 2025-02-02T04:49:40.471Z

createdAtISO 8601

Creation timestamp.

e.g. 2025-02-02T04:49:40.471Z

Request
Click to copy
curl -X GET https://api.dashelectric.co/v1/deliveries/DE-INSTANT-1727922086941 \
  -H "Authorization: Bearer <your_access_token>"
Response
Click to copy
{
  "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

DELETE/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

deliveryIDstringRequired

Path parameter — the delivery to cancel.

e.g. DE-INSTANT-1727922086941

notesstringOptional

Body parameter — reason for cancellation.

Response

200 OK

Success. Pengantaran berhasil dibatalkan.

Error responses

404Delivery not found (invalid orderID).
{
  "status": "Failed",
  "error": "Pengantaran tidak ditemukan"
}
409Already in a final state (COMPLETED, FAILED, CANCELLED).
{
  "status": "Failed",
  "error": "Perubahan status antaran tidak dapat dilakukan."
}
409Already picked up (PICKING_UP / IN_DELIVERY).
{
  "status": "Failed",
  "error": "Pengantaran sudah diambil"
}
Request
Click to copy
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" }'
Response
Click to copy
{
  "status": "Success",
  "message": "Pengantaran berhasil dibatalkan."
}

API #5

Additional Notification

POST/v1/deliveries/{deliveryID}/additional-notifications

Notify 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

deliveryIDstringRequired

Path parameter — the delivery to notify on.

e.g. DE-17279220

typestringRequired

Body parameter — must be “READY_TO_PICKUP”.

e.g. READY_TO_PICKUP

Response

200 OK

{ status: “Success”, message: “Notifikasi berhasil dikirim” }

Error responses

400type other than “READY_TO_PICKUP”.
{
  "status": "Failed",
  "error": "Field `type` tidak dikenali"
}
400Valid deliveryID but no driver assigned yet.
{
  "status": "Failed",
  "error": "Kurir belum ditugaskan untuk antaran ini."
}
404Invalid deliveryID.
{
  "status": "Failed",
  "error": "Pengantaran tidak ditemukan"
}
400Status is not PENDING_PICKUP or PICKING_UP.
{
  "status": "Failed",
  "error": "Notifikasi tidak dapat dikirim karena status pengantaran tidak sesuai."
}
Request
Click to copy
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" }'
Response
Click to copy
{
  "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.
  • trackingURL only exists for the EXPRESS service category; for LOGISTIC, the PICKUP_PROOF media entry is not produced.
Example payload — COMPLETED
Click to copy
{
  "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.

QUEUEINGBOTH

Scheduled-scheme status with a specific time before it can change to ALLOCATING.

PREPARINGBOTH

Delivery created and acknowledged by the system. A valid entry that has not yet entered processing.

VERIFIEDLOGISTIC

Package verified by warehouse Ops, awaiting driver assignment. LOGISTIC only.

NOT_VERIFIEDLOGISTIC

Package data received by Ops but not physically received. LOGISTIC only.

ALLOCATINGEXPRESS

Dash is allocating nearby drivers. EXPRESS only.

PENDING_PICKUPEXPRESS

Allocation finished and assigned to a driver. Note: Dash may reassign the driver, which triggers another webhook. EXPRESS only.

PICKING_UPBOTH

The driver was notified and is starting to pick up the delivery.

PENDING_DELIVERYBOTH

Picked up and in an intermediate state before the next stage.

IN_DELIVERYBOTH

Actively progressing toward the destination.

COMPLETEDBOTH

Driver arrived and captured a DELIVERY_PROOF photo, completing the delivery.

FAILEDBOTH

Driver at destination but the package failed (recipient absent, COD declined, SLA exceeded, etc.).

CANCELLEDBOTH

Cancelled 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.

providerOrderIDstringOptional

Shipping receipt number (your reference).

deliveryIDstringOptional

Unique value of the delivery.

statusstringOptional

Delivery status (see Webhook Events).

courierobjectRequired

Courier details, present from PENDING_PICKUP / IN_DELIVERY onward.

trackingURLstringRequired

Web live-tracking URL (EXPRESS only).

weightfloatOptional

Total weight of items across the packages array.

senderobjectOptional

Sender contact details.

recipientobjectOptional

Recipient contact details.

originobjectOptional

Pickup location details.

destinationobjectOptional

Delivery location details.

packages[]arrayOptional

Package details.

mediaarrayOptional

Media proofs; empty array if none exist.

quoteobjectOptional

Delivery cost details.

failedCountnumberOptional

Increments each time a failure occurs.

createdAtdatetimeOptional

When the delivery was created.

updatedAtdatetimeOptional

Shown on VERIFIED, NOT_VERIFIED, PENDING_PICKUP, PICKING_UP, IN_DELIVERY.

completedAtdatetimeOptional

Shown only when status is COMPLETED.

failedAtdatetimeOptional

Shown only when status is FAILED.

failedReasonstringOptional

Reason when a failure occurs.

cancelledAtdatetimeOptional

Shown only when status is CANCELLED.

cancelledReasonstringRequired

Reason when a cancellation occurs.

Terminology

providerOrderID

Similar to an Airway Bill (AWB), generated on the client side.

deliveryID

Defined by Dash Ops based on driver assessment and capability. A group of deliveryIDs forms an AWB.

Retry logic

If a webhook fails to send, Dash retries up to 3 times within 60-second intervals.

Event

Captures 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.

StateDescription
ALLOCATINGInitial state of a non-scheduled order, or allocating a courier.
PENDING_PICKUPThe courier has been assigned but has not started the job.
PICKING_UPThe courier has accepted and is on the way to pick up the packages.
IN_DELIVERYThe courier is on the way to the receiver.
COMPLETEDOrder successfully delivered.
CANCELLEDCancelled by the provider side.
FAILEDExceeded SLA, or cancelled by the Dash Operations team.