Skip to main content

Get delivery quote

Returns the available service tiers, fares (IDR), distance, and estimated pickup / dropoff times for a pickup–dropoff pair. Quotes are returned as an array; if you omit serviceType the cheapest single tier is assumed.

POST/express/v1/deliveries/quotes

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

Headers​

Authorizationstringrequired
x-client-time-zonestringrequired
One of Asia/Jakarta, Asia/Makassar, Asia/Jayapura.

Parameters​

serviceCategorystringoptional
One of EXPRESS, LOGISTIC. Default EXPRESS. Only needed on the legacy /v1/deliveries/quotes path; the /express/v1/deliveries/quotes path implies EXPRESS.
serviceTypestringoptional
For EXPRESS: INSTANT or SAME_DAY. For LOGISTIC: SAME_DAY.
paymentMethodstringoptional
CASH or CASHLESS. Default CASHLESS.
packages[]arrayrequired
One or more package objects. See nested fields below.
packages[].namestringrequired
Display name, e.g. "Martabak Manis".
packages[].typestringoptional
One of REGULAR, SPECIAL, SENSITIVE, HIGH_VALUE, OTHER. Validated here but does not change the quoted amount. The packages echo returns the normalised value, not your literal input — " HIGH_VALUE " comes back as HIGH_VALUE, and an omitted, null, or empty type is left absent from the echo rather than defaulted. Create Delivery is where an omitted value becomes REGULAR. See Package type.
packages[].descriptionstringoptional
Free-form description shown to the driver.
packages[].quantityintegerrequired
Item count for this package row.
packages[].priceintegeroptional
Declared total value in IDR (not unit price). Used for insurance and COD.
packages[].weightdecimalrequired
Weight in kilograms.
packages[].width / length / heightdecimaloptional
Dimensions in centimetres. Used for sizing/SLA.
originobjectrequired
Pickup location.
origin.addressstringrequired
Human-readable pickup address.
origin.coordinates.latitude / longitudedecimalrequired
WGS-84 decimal.
destinationobjectrequired
Dropoff location with the same shape as origin.
scheduleobjectoptional
Optional ISO-8601 pickup window. Max 3 days in the future. Currently EXPRESS only.
schedule.pickupTimeFrom / pickupTimeTostringconditional
Required inside schedule when present, e.g. 2025-05-26T23:59:59+07:00.
sandboxAvailabilitybooleanoptional
Sandbox only. Send true to skip the area and courier check, so locationAvailability, driverAvailability and availability all come back true. false or omitted runs the real check. Ignored in Production. Get Quote only — Create Delivery rejects it as UNKNOWN_FIELD. See Testing availability in Sandbox.

Error responses​

Every error below carries an errorCode — branch on it. The error message is Indonesian display copy and may change.

400REQUEST_BODY_EMPTY
Empty request body. Butuh request body.
400UNKNOWN_FIELD
Unrecognised top-level key, named in the message. Field tidak dikenali: [<field>]
400VALIDATION_FAILED
Payload validation failed; the message names the first failing field. Includes missing origin/destination coordinates, a serviceType other than INSTANT / SAME_DAY for EXPRESS (omit it to quote every tier), coordinates outside ±90 / ±180, and a packages[].type outside the accepted list.
400SCHEDULE_TIMEZONE_UNKNOWN
Scheduled quote with an x-client-time-zone that is not a recognised IANA zone.
400DELIVERY_SCHEDULE_PAST_TIME
Scheduled time has already passed. Ups! Sepertinya waktu pengantaran yang Anda pilih sudah lewat. Yuk, pilih waktu lain yang masih tersedia.
400DELIVERY_SCHEDULE_OUT_OF_RANGE
Scheduled time is outside your scheduling window (3 days ahead unless configured otherwise; the message names yours). Pengantaran hanya dapat dijadwalkan dalam rentang hari ini hingga maksimal N hari ke depan
422LOCATION_TOO_FAR
No pricing tier covers the distance or weight (both interpolated into the message), or no drivable route exists between origin and destination (Rute tidak ditemukan. Pastikan rute antar titik sesuai.).
500INTERNAL_SERVICE_ERROR
Unexpected error on our side. Quote the requestId when contacting us.

Unavailable areas or drivers do not throw — the response returns 200 with availability: false and the locationAvailability / driverAvailability flags set accordingly.

Testing availability in Sandbox​

Sandbox has no couriers of its own, so an instant quote made with a Sandbox token normally returns driverAvailability: false, even inside the coverage area. Add "sandboxAvailability": true to the body to get an available quote and carry on with the flow.

  • Sandbox, true — area and courier checks are skipped, for instant and scheduled quotes alike. locationAvailability, driverAvailability and availability are all true. Fares, distance and timeline are still computed from the real route, so the validation errors and 422 LOCATION_TOO_FAR still apply.
  • Sandbox, false or omitted — the real check runs. An origin outside the coverage area returns quotes: [] with locationAvailability: false.
  • Production — accepted but ignored; availability always reflects real courier supply. Unlike Create Delivery's forceUnavailable, it is not rejected, so a payload that still carries it will not fail. Remove it anyway before going live.

To rehearse the opposite case — a booking refused because no courier is free — send forceUnavailable: true on Create Delivery in Sandbox.