Quickstart
Book your first delivery on the Dash Express fleet in five steps. Estimated time: 5 minutes.
You'll need a client_key and client_secret issued in the Dash Next Portal. Sandbox and Production each have their own credential pair.
Get your client credentials
In the Dash Next Portal, switch to Sandbox mode and open the API Keys for Host to Host card. Copy your Client Key, Client Secret, and BaseURL from there — these are the values every request below uses.
SAMPLE_CLIENTde_sb_*****https://api.dashelectric.coOn Production, find the same values under Developers → API Key. Both Sandbox and Production hit the same BaseURL; the environment is decided by which credential pair you mint the token with — Sandbox keys give you a Sandbox token, Production keys a Production one.
Exchange them for an access token
Post your credentials to the token endpoint. The returned token is what every other request uses as a Bearer.
- cURL
- Node.js
curl https://api.dashelectric.co/v1/auth/providers/token \
-H "Content-Type: application/json" \
-d '{
"client_key": "'"$DASH_CLIENT_KEY"'",
"client_secret": "'"$DASH_CLIENT_SECRET"'"
}'
const res = await fetch("https://api.dashelectric.co/v1/auth/providers/token", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_key: process.env.DASH_CLIENT_KEY,
client_secret: process.env.DASH_CLIENT_SECRET,
}),
});
const { token } = await res.json();
Response — 200 OK
{
"token": "random_and_unique_token"
}
The remaining steps all send Authorization: Bearer $DASH_TOKEN. See Authentication for the Bearer header details.
Get a delivery quote
Send pickup + dropoff coordinates and the package(s); you get back available tiers, fares (IDR), distance, and ETAs.
- cURL
- Node.js
curl https://api.dashelectric.co/v1/deliveries/quotes \
-H "Authorization: Bearer $DASH_TOKEN" \
-H "Content-Type: application/json" \
-H "x-client-time-zone: Asia/Jakarta" \
-d '{
"serviceCategory": "EXPRESS",
"serviceType": "INSTANT",
"packages": [
{ "name": "Martabak Manis", "quantity": 1, "weight": 0.8 }
],
"origin": {
"address": "Manis Cafe & Eatery",
"coordinates": { "latitude": -6.993894, "longitude": 110.457499 }
},
"destination": {
"address": "ALEX AC MOBIL SEMARANG",
"coordinates": { "latitude": -6.998216, "longitude": 110.456340 }
}
}'
const res = await fetch("https://api.dashelectric.co/v1/deliveries/quotes", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json",
"x-client-time-zone": "Asia/Jakarta",
},
body: JSON.stringify({
serviceCategory: "EXPRESS",
serviceType: "INSTANT",
packages: [{ name: "Martabak Manis", quantity: 1, weight: 0.8 }],
origin: { address: "Manis Cafe & Eatery", coordinates: { latitude: -6.993894, longitude: 110.457499 } },
destination: { address: "ALEX AC MOBIL SEMARANG", coordinates: { latitude: -6.998216, longitude: 110.456340 } },
}),
});
const { quotes } = await res.json();
Response — 200 OK
{
"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
}
],
"packages": [
{ "name": "Martabak Manis", "quantity": 1, "weight": 0.8 }
],
"origin": {
"address": "Manis Cafe & Eatery",
"coordinates": { "latitude": -6.993894, "longitude": 110.457499 }
},
"destination": {
"address": "ALEX AC MOBIL SEMARANG",
"coordinates": { "latitude": -6.998216, "longitude": 110.456340 }
},
"locationAvailability": true,
"driverAvailability": true,
"availability": true
}
→ Full request/response fields: Get delivery quote.
Create the delivery
Pick a serviceType from the quote and submit with your providerOrderID (your AWB), sender, and recipient. You get a deliveryID in status ALLOCATING.
- cURL
- Node.js
curl https://api.dashelectric.co/express/v1/deliveries \
-H "Authorization: Bearer $DASH_TOKEN" \
-H "Content-Type: application/json" \
-H "x-client-time-zone: Asia/Jakarta" \
-d '{
"providerOrderID": "AWB-1042",
"serviceType": "INSTANT",
"packages": [
{ "name": "Martabak Manis", "quantity": 1, "weight": 0.8 }
],
"sender": { "firstName": "Arifatul", "phone": "081234548899" },
"recipient": { "firstName": "Tony", "phone": "082186789900" },
"origin": {
"address": "Manis Cafe & Eatery",
"coordinates": { "latitude": -6.993894, "longitude": 110.457499 }
},
"destination": {
"address": "ALEX AC MOBIL SEMARANG",
"coordinates": { "latitude": -6.998216, "longitude": 110.456340 }
}
}'
const res = await fetch("https://api.dashelectric.co/express/v1/deliveries", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json",
"x-client-time-zone": "Asia/Jakarta",
},
body: JSON.stringify({
providerOrderID: "AWB-1042",
serviceType: "INSTANT",
packages: [{ name: "Martabak Manis", quantity: 1, weight: 0.8 }],
sender: { firstName: "Arifatul", phone: "081234548899" },
recipient: { firstName: "Tony", phone: "082186789900" },
origin: { address: "Manis Cafe & Eatery", coordinates: { latitude: -6.993894, longitude: 110.457499 } },
destination: { address: "ALEX AC MOBIL SEMARANG", coordinates: { latitude: -6.998216, longitude: 110.456340 } },
}),
});
const { deliveryID } = await res.json();
Response — 201 Created
{
"deliveryID": "DE-1727921269869",
"providerOrderID": "AWB-1042",
"providerOutletID": "Outlet Tebet",
"paymentMethod": "CASHLESS",
"status": "ALLOCATING",
"courier": null,
"sender": { "firstName": "Arifatul", "phone": "081234548899" },
"recipient": { "firstName": "Tony", "phone": "082186789900" },
"quote": {
"service": { "category": "EXPRESS", "type": "INSTANT", "name": "Dash Instant Delivery" },
"currency": { "code": "IDR", "symbol": "Rp" },
"amount": 9000,
"estimatedTimeline": {
"pickup": null,
"dropoff": "2024-10-03T09:22:26+07:00"
},
"distance": 509
}
}
→ COD, instructions, scheduling, and the full response: Create delivery.
Track via webhook
Register a webhook URL in the Portal. Dash POSTs a JSON payload every time status changes — through the lifecycle states up to COMPLETED. Don't poll; let the webhook drive your state.
→ Payload shape, the auth header model, and retry policy: Webhooks.
Next steps
Set up webhooks
Register a URL + auth header in the Portal. Retried 3× over 60s on failure.
Full Create Delivery reference
All fields including COD, instructions, schedule, and origin metadata.
EXPRESS category
On-demand last-mile. State machine, statuses, gotchas.
Errors
The standard error envelope, status codes, and Indonesian-language messages.