Shipper Logistics API Documentation (3.0.0)

Download OpenAPI specification:

Getting Started

Overview

Shipper API is an exclusive way to connect with the Shipper platform. It is an HTTP-based API that applications can interact with our location, pricing, and shipment features, and many more. Users can customize their data freely with this API.

Shipper Shipping Service

Service Include/Not Include
Regular Include
Express Include
Trucking Include
Instant Include
Sameday Include
Shipper 360 Access Include
COD Not Included, by request to our internal team. There might be fees applied
Recommended By Shipper Not Included, by request to our internal team. There might be fees applied
Location Limitation for Pickup/Delivery Not Included, by request to our internal team. There might be fees applied

Getting Started Using Shipper Postman Collection

  1. Install Postman.
  2. Download the Shipper Logistic API Postman Collection.
  3. Import the collection into your Postman App.
  4. Use your Shipper API Key to authenticate (see How to Get Shipper API Key below).
  5. Update the api_key value on the Postman collection with the API key generated for you.

How to Get Shipper API Key (Authentication)

  1. Go to the Sandbox Dashboard and register for a Sandbox account.
  2. Complete your registration and verify your account.
  3. Inform our sales team via email at cs@shipper.id so they can grant you access to an API key.

X-API-Key_Header

To authenticate your request to Shipper API v3 you need to provide your API Key in the HTTP request header X-API-Key.

Security Scheme Type API Key
Header parameter name X-API-Key

API Integration Journey

  1. After discussing commercials with our Sales team, our Legal Team will accompany you to sign the Letter of Agreement.
  2. After signing the Agreement, you can start integrating with our API using your Sandbox API Key.
  3. If you have not registered on our Sandbox Dashboard yet, register at https://bos.sandbox.shipper.id/register. You can find the Sandbox API Key on the API menu.
  4. Shipper Team will support you during the integration process via Sales representative or Contact Center (https://faq.shipper.id/#contact-us).
  5. Once integration is complete, fill in the UAT form and send it to partnership.api@shipper.id or your Sales representative for review.
  6. If your UAT form passes, we schedule a UAT Session with you. If it fails, revise and resend it.
  7. Before the UAT Session, settle administration/payment requirements (e.g. setup fee) with your Sales representative.
  8. During the UAT Session you will simulate order creation and pickup requests for two scenarios: item value above IDR 1,000,000 and item value below IDR 1,000,000.
  9. If you pass the UAT Session, an Onboarding Call is scheduled to walk through operational flow, pickup schedule/confirmation, delivery PIC, and how to use the Shipper Dashboard.
  10. After the Onboarding Call you get access to the Shipper Production Dashboard, where you can obtain your Production API Key from the API menu.

What's the difference between Sandbox and Production? Sandbox is a free testing environment. Production is the live environment used once the User Acceptance Test, Onboarding Call, and Agreement have been completed with our dedicated team.

Base URL

Sandbox base URL:

https://merchant-api-sandbox.shipper.id

Production base URL:

https://merchant-api.shipper.id

Location API

You'll obtain the area_id of the desired location for pricing and order creation before proceeding to the Pricing API. There are two ways to obtain the area_id of a location:

  1. Search Location by Keyword
  2. Search Location Complete Step (Country -> Province -> City -> Suburb -> Area)

Pricing API

This step is required to obtain the pricing rates and available services on Shipper. There are two ways to obtain domestic pricing rates: Get Pricing Domestic (all logistics available on that route) and Get Pricing Domestic by Rate Type (only logistics matching a specific rate type).

Order API

This is the next step required after obtaining the shipment rates. With the Order API you are able to create an order, get order details (by order id or by external id), get the shipping label/receipt, and cancel an order.

Pickup API

This is the last step of the integration process. It is required to make a pickup request call for a driver to collect the order; otherwise the order stays idle in an inactive state.

Important Notes

Access to Shipper Dashboard

You can access Shipper Dashboards at the Production Dashboard and the Sandbox Dashboard. On the Dashboard you can monitor your orders and manually create orders in the respective environment. The Sandbox environment does not trigger any real shipping process.

Sandbox: bos.sandbox.shipper.id  |  Production: dashboard.shipper.id

Order Cancellation

There are two types of cancellation that might occur during delivery: Cancel Order by 3PL and Cancel Order by Merchant. In both cases the Shipper status moves to 999 (Cancelled) and you need to recreate a new order with a new Order ID and a new pickup request — the existing order id can no longer be used for a new pickup request.

To avoid cancellation, ensure the order(s) are ready for pickup before the driver arrives.

Release Notes

Shipper Logistic API team regularly updates the API with new features, bug fixes, and performance improvements. Subscribe to the Shipper Logistic API Notify Group for updates.

3.0.2 — 9 May 2023

  • Hotfix for an instant order cancellation issue where the 3PL's driver still arrived to pick up an order after it was cancelled.
  • Location service now keeps precision data. You must use the correct area_id from the Location API together with lat/lng when getting pricing and creating orders. For Get Pricing you may now remove area_id from the request entirely and rely on lat/lng.

3.0.1 — 15 March 2023

  • POST /v3/order: the origin.direction and destination.direction parameters are now limited to a maximum of 100 characters (only the first 100 characters are printed on the order label).

Weight Calculation

The final weight of an order is the heavier of actual weight and volumetric weight. Every logistic and service has its own volumetric weight formula (volume divided by 4000, 5000, or 6000).

The final weight must be calculated from items that have been packed — if there are multiple items, assume they are all packed into a single package.

Dimension Calculation with Multiple Items

If you do not have a standardized package for multiple items, estimate length/width/height with:

(P x L x T) + (P x L x T) = Z
a = cube root of Z
P = L = T = a

Where P = Length, L = Width, T = Height, Z = Total Dimension. Use the resulting a value for length, width and height in the Pricing API and Create Order API.

List of 3PL Partners

logistic_name rate_id rate_name rate_desc service_name min_kg max_kg volumetric_factor
Anteraja 562 Regular Regular Regular 1 50 6000
Anteraja 564 Next Day Next Day Express 1 50 6000
GO-SEND 336 Same Day (Direct) Go-Send Same Day (Direct) Same Day 0 5 6000
GO-SEND 329 Instant Go-Send Instant Courier Instant 0 20 6000
Grab Express 341 Same Day (Direct) Grab Same Day (Direct) Same Day 0 7 6000
Grab Express 340 Instant Grab Instant Courier Instant 0 10 6000
J&T 57 Express Express Rate Regular 0 125 6000
JNE 4 CTC Regular Regular 0 69 6000
JNE 3 OKE Regular Package Regular 0 69 6000
JNE 312 JTR JNE Trucking Trucking 0 10000 6000
JNE 1 REG Regular Regular 0 306 6000
JNE 10 CTCYES Yakin Esok Sampai Express 0 69 6000
JNE 2 YES Yakin Esok Sampai Express 0 69 6000
Lion Parcel 44 REGPACK Regular Rate Regular 0 500 6000
Lion Parcel 42 ONEPACK One Day Delivery Express 0 100 6000
Ninja Xpress 228 Standard Standard Regular 0 70 6000
Ninja Xpress 227 Next Day Next Day Express 0 100 6000
SAP 349 Reguler Reguler Regular 0 150 6000
SAP 350 One Day Service One Day Service Express 1 150 6000
SiCepat 565 GOKIL GOKIL Trucking 1 50 6000
SiCepat 570 HALU HALU Regular 0 50 6000
SiCepat 59 BEST Besok Sampai Tujuan Express 0 50 6000
SiCepat 58 REG Regular Regular 0 50 6000
Sentral Cargo - - - - - - -
Pos Indonesia - - - - - - -
Lalamove - - - - - - -

rate_id uniquely identifies the service rate you use when creating an order. min_kg/max_kg describe the weight range accepted by the 3PL (empty response outside this range). See also the full partner list.

Insurance Calculation Rules

Shipper gets insurance prices from each logistic partner, each of which has its own insurance calculation rules. There are compulsory insurance rules: if the item price of the order exceeds a 3PL's insurance threshold, insurance is required on that order (use_insurance must be true).

Insurance Threshold

3PL Insurance Threshold
JNE Rp 1.000.000
SiCepat Rp 500.000
Tiki Rp 1.000.000
J&T Rp 1.000.000
Wahana Rp 199.999
Ninja Xpress Rp 1.000.000
Lion Parcel Rp 1.000.000
SAP Rp 1.000.000
Indah Cargo Rp 100.000
Dakota Cargo Rp 200.000
Sentral Cargo Rp 1.000.000

Example: if your item value is Rp 1.500.000 and you choose JNE, must_use_insurance will be true on the Get Pricing response, so use_insurance must be true on Create Order.

Compulsory Insurance Flow

  • If must_use_insurance is true on Get Pricing, use_insurance must be true on Create Order, otherwise order creation fails with "This order must use insurance."
  • If must_use_insurance is false, use_insurance is optional (true or false).
  • Always use insurance when sending fragile goods or important documents.
  • Always set use_insurance = false when using a 3PL whose insurance is automatically covered (GoSend & Grab Express).

Lalamove Vehicle Insurance Coverage

Vehicle Name Insurance Coverage
Motorcycle Rp1,000,000
Sedan / Sedan Intercity Rp2,000,000
MPV / MPV Intercity Rp2,000,000
Van / Van Intercity Rp4,000,000
Pickup Bak / Pickup Box (1 Ton), incl. Intercity Rp6,000,000
Engkel Bak/Box (2–2.5 Ton), incl. Intercity Rp6,000,000
CDD Bak/Box (5 Ton), incl. Intercity Rp6,000,000
Heavy Truck Open/Box (8 Ton) Rp6,000,000

Shipper Control Tower

For inquiries, email support@shipper.id.

Questions — Subject: CompanyName_API_Questions. Body: company name, list of questions and reasonings.

Troubleshooting — Subject: CompanyName_API_troubleshooting. Body: company name, company BOS account phone number, Order ID or External ID, environment (Sandbox/Production), issue explanation, request/response payload, and screenshots if any.

For shipment issues, contact Control Tower on +62 8033 2160 215 or support@shipper.id.

Origin Coverage Area

Origin Coverage refers to the origin coverage served by the 3PLs already integrated with Shipper.

Lalamove Order Flow

Lalamove orders follow a different flow than the usual create-order flow:

  1. Get the city id via GET Cities by Province ID.
  2. Get the vehicle id via GET Vehicle ID for Lalamove (GET /v3/vehicle/city/{city_id}).
  3. The vehicle id response also lists the special instructions available for that vehicle in that city.
  4. Get pricing using the desired vehicle_id, optionally adding special_instructions and a schedule_at date/time — this returns the actual price including any additional charges.
  5. Create the order with the rate_id obtained from pricing, optionally adding courier.special_instructions and courier.schedule_at.

List of Error Code

General

Error Code EN ID
10001 Unauthorized Access. You are not authorized to access this resource. Akses Ditolak. Anda Belum Diijinkan Untuk Mengakses Aplikasi.
10002 Unauthorized Access. You are not authorized to access this resource. Akses Ditolak. Anda Belum Diijinkan Untuk Mengakses Aplikasi.
10003 Internal Server Error. Please Call Administrator. Terjadi Kendala Pada Server. Mohon Hubungi Administrator.
10004 Record Does Not Exist. Please Validate Your Input Or Contact Administrator. Data Tidak Diketemukan. Mohon Cek Kembali Masukkan Anda Atau Hubungi Administrator.
10005 Invalid Input. Please Validate Your Input. Kesalahan Input. Mohon Cek Kembali Masukkan Anda.
10006 Record has existed and must be unique. Please Validate Your Input Or Contact Administrator. Data sudah ada. Mohon Cek Kembali Masukkan Anda Atau Hubungi Administrator.
10007 Too Many Request. Please Contact Administrator For Further Information. Terlalu Banyak Permintaan. Silakan Hubungi Administrator Untuk Informasi Lebih Lanjut.
10008 Internal Server Error. Please Call Administrator. Terjadi Kendala Pada Server. Mohon Hubungi Administrator.
10009 Content-Type value not supported. Jenis Content-Type tidak didukung.
10010 Request body or parameter value not valid. Isi permintaan atau nilai parameter tidak valid.
10011 Record cannot be processed. Please Validate Your Input Or Contact Administrator. Data Tidak Dapat Diproses. Mohon Cek Kembali Masukkan Anda Atau Hubungi Administrator.

Country

Error Code EN ID
11001 Invalid CountryID parameter. Parameter CountryID tidak valid.
11002 Country Not Found. Negara Tidak Ditemukan.

Province

Error Code EN ID
11101 Invalid CountryID parameter. Parameter CountryID tidak valid.
11102 Invalid ProvinceID parameter. Parameter ProvinceID tidak valid.
11103 Province Not Found. Provinsi Tidak Ditemukan.

City

Error Code EN ID
11201 Invalid ProvinceID parameter. Parameter ProvinceID tidak valid.
11202 Invalid CityID parameter. Parameter CityID tidak valid.
11203 City Not Found. Kota atau Kabupaten Tidak Ditemukan.

Suburb

Error Code EN ID
11301 Invalid CityID parameter. Parameter CityID tidak valid.
11302 Invalid SuburbID parameter. Parameter SuburbID tidak valid.
11303 Suburb Not Found. Kecamatan Tidak Ditemukan.

Area

Error Code EN ID
11401 Invalid SuburbID parameter. Parameter SuburbID tidak valid.
11402 Invalid AreaID parameter. Parameter AreaID tidak valid.
11403 Area Not Found. Kelurahan Tidak Ditemukan.

Location Projection

Error Code EN ID
11501 Minimum keyword input is %s character. Minimum input keyword adalah %s karakter.
11502 Postcode consist of 5 digits. Postcode terdiri dari 5 digit.

Pricing

Error Code EN ID
31001 Invalid request parameter: %s Parameter request tidak valid: %s
31002 Internal Server Error. Please Call Administrator. Terjadi Kendala Pada Server. Mohon Hubungi Administrator.
31003 Invalid lat or long pattern parameter. Parameter lat atau long pattern tidak valid.
31004 Invalid JSON format. Format JSON tidak valid.
31005 Request body or parameter value not valid. Isi permintaan atau nilai parameter tidak valid.
31006 Pricing does not exist. Ongkos kirim tidak ditemukan.
31007 Pricing is not available. Ongkos kirim tidak tersedia.
31041 The Origin area_id and coordinate is not matched. Area origin dan koordinat tidak cocok.
31042 The Destination area_id and coordinate is not matched. Area tujuan dan koordinat tidak cocok.

Create Order

Error Code EN ID
21001 Invalid Email parameter. Parameter Email tidak valid.
21002 Invalid Coordinates parameter. Parameter Coordinates tidak valid.
21003 Record has existed and must be unique. Data sudah ada.
21004 AreaID is Required. AreaID wajib diisi.
21005 Dimension is Required. Dimension wajib diisi.
21006 Internal Server Error. Please Call Administrator. Terjadi Kendala Pada Server. Mohon Hubungi Administrator.
21007 Error on creating sticker. Error saat membuat sticker.
21008 Internal Server Error. Please Call Administrator. Terjadi Kendala Pada Server. Mohon Hubungi Administrator.
21009 Error on TrackingCreation. Error saat TrackingCreation.
21010 Internal Server Error. Please Call Administrator. Terjadi Kendala Pada Server. Mohon Hubungi Administrator.
21011 Deduct balance cannot be processed. Pengurangan balance tidak dapat diproses.
21012 Balance is not enough. Balance tidak cukup.
21013 Error on PostAgentTransaction. Error saat PostAgentTransaction.
21014 Invalid Sticker parameter. Parameter Sticker tidak valid.
21015 SuburbID or AreaID is Required. SuburbID atau AreaID wajib diisi.
21016 CountryID is Required. CountryID wajib diisi.
21017 Invalid coverage parameter, must be either domestic or international. Parameter coverage tidak valid, harus berisi domestik atau internasional.
21018 This order must use insurance. Order ini harus menggunakan asuransi.
21019 Consignee name is mandatory. Consignee name wajib diisi.
21020 Consignee Phone Number is mandatory. Consignee Phone Number wajib diisi.
21021 RateID is mandatory. RateID wajib diisi.
21022 PackageHeight is mandatory. PackageHeight wajib diisi.
21023 PackageLength is mandatory. PackageLength wajib diisi.
21024 PackageWidth is mandatory. PackageWidth wajib diisi.
21025 PackageWeight is mandatory. PackageWeight wajib diisi.
21026 PackagePrice is mandatory. PackagePrice wajib diisi.
21027 PackageItems is mandatory. PackageItems wajib diisi.
21028 PackageItemName is mandatory. PackageItemName wajib diisi.
21029 PackageItemPrice is mandatory. PackageItemPrice wajib diisi.
21030 PackageItemQty is mandatory. PackageItemQty wajib diisi.

Update Order

(Reference only — this operation is not exposed as a published endpoint.)

Error Code EN ID
22001 Invalid Email parameter. Parameter Email tidak valid.
22002 Invalid coverage parameter, must be either domestic or international. Parameter coverage tidak valid, harus berisi domestik atau internasional.
22003 Record has existed and must be unique. Data sudah ada.
22004 Internal Server Error. Please Call Administrator. Terjadi Kendala Pada Server. Mohon Hubungi Administrator.
22005 Invalid OrderID parameter. Parameter OrderID tidak valid.
22006 Record is being processed. Record sedang diproses.
22007 Internal Server Error. Please Call Administrator. Terjadi Kendala Pada Server. Mohon Hubungi Administrator.
22008 Internal Server Error. Please Call Administrator. Terjadi Kendala Pada Server. Mohon Hubungi Administrator.
22009 Error on validating deduct balance. Error saat menvalidasi pengurangan balance.
22010 Deduct balance cannot be processed. Pengurangan balance tidak dapat diproses.
22011 Error on updating AgentTransaction. Error saat mengubah AgentTransaction.
22012 Error on updating Log. Error saat mengubah Log.
22013 Error on updating sticker. Error saat mengubah sticker.
22014 Invalid Sticker parameter. Parameter Sticker tidak valid.

Get Order

Error Code EN ID
23001 Invalid StartDate or EndDate parameter. Parameter StartDate or EndDate tidak valid.
23002 Invalid OrderID parameter. Parameter OrderID tidak valid.
23003 Invalid Input. Please Validate Your Input. Kesalahan Input. Mohon Cek Kembali Masukkan Anda.
23004 Record Does Not Exist. Please Validate Your Input Or Contact Administrator. Data Tidak Diketemukan. Mohon Cek Kembali Masukkan Anda Atau Hubungi Administrator.
23005 Internal Server Error. Please Call Administrator. Terjadi Kendala Pada Server. Mohon Hubungi Administrator.

Patch Order

(Reference only — this operation is not exposed as a published endpoint.)

Error Code EN ID
24001 Invalid request parameter: %s Parameter request tidak valid: %s
24002 Pickup time %s Waktu pickup %s
24003 Internal Server Error. Please Call Administrator. Terjadi Kendala Pada Server. Mohon Hubungi Administrator.
24004 Invalid User parameter. Parameter User tidak valid.
24005 Invalid Status parameter. Parameter Status tidak valid.
24006 Invalid Agent parameter. Parameter Agent tidak valid.
24007 Internal Server Error. Please Call Administrator. Terjadi Kendala Pada Server. Mohon Hubungi Administrator.
24008 Deposit is not enough. Deposit tidak cukup.
24009 Error on RefundDeposit. Error saat RefundDeposit.
24010 Record cannot be processed. Record tidak dapat diproses.
24011 Invalid Status parameter. Parameter Status tidak valid.
24012 Error on PatchTracking. Error saat PatchTracking.
24013 Invalid Input. Please Validate Your Input. Kesalahan Input. Mohon Cek Kembali Masukkan Anda.
24014 Record status cannot be changed. Record status tidak dapat diubah.
24015 Record cannot be processed. Record tidak dapat diproses.
24016 Invalid Input. Please Validate Your Input. Kesalahan Input. Mohon Cek Kembali Masukkan Anda.

Cancel Order

Error Code EN ID
25001 Invalid OrderID parameter. Parameter OrderID tidak valid.
25002 Invalid Input. Please Validate Your Input. Kesalahan Input. Mohon Cek Kembali Masukkan Anda.
25003 Internal Server Error. Please Call Administrator. Terjadi Kendala Pada Server. Mohon Hubungi Administrator.

Validation Order

(Reference only — internal validation codes that may surface on order-related endpoints.)

Error Code EN ID
26001 Invalid Input. Please Validate Your Input. Kesalahan Input. Mohon Cek Kembali Masukkan Anda.
26002 Error on validating StickerNumber. Error saat menvalidasi StickerNumber.
26003 StickerNumber has existed. StickerNumber sudah ada.
26004 Error on validating GetOrder. Error saat menvalidasi GetOrder.
26005 JOBNUmber has existed. JOBNumber sudah ada.
26006 JOBNUmber3PL has existed. JOBNumber3PL sudah ada.
26007 Internal Server Error. Please Call Administrator. Terjadi Kendala Pada Server. Mohon Hubungi Administrator.
26008 Error on validating AWBNumber. Error saat menvalidasi AWBNumber.
26009 AWBNumber has existed. AWBNumber sudah ada.
26010 Internal Server Error. Please Call Administrator. Terjadi Kendala Pada Server. Mohon Hubungi Administrator.
26011 Error on getting Merchant. Error saat mendapatkan Merchant.
26012 Invalid Input. Please Validate Your Input. Kesalahan Input. Mohon Cek Kembali Masukkan Anda.
26013 Invalid Input. Please Validate Your Input. Kesalahan Input. Mohon Cek Kembali Masukkan Anda.
26014 Error on getting Suburb. Error saat mendapatkan Suburb.
26015 Invalid Input. Please Validate Your Input. Kesalahan Input. Mohon Cek Kembali Masukkan Anda.
26016 Error on getting Area. Error saat mendapatkan Area.
26017 Error on creating Merchant. Error saat membuat Merchant.
26018 Invalid Input. Please Validate Your Input. Kesalahan Input. Mohon Cek Kembali Masukkan Anda.
26019 Error on getting DomesticPricing. Error saat mendapatkan DomesticPricing.
26020 Invalid Input. Please Validate Your Input. Kesalahan Input. Mohon Cek Kembali Masukkan Anda.
26021 Error on getting InternationalPricing. Error saat mendapatkan InternationalPricing.
26022 Invalid ShipmentArea parameter. Parameter ShipmentArea tidak valid.
26023 Error on getting OrderTemplate. Error saat mendapatkan OrderTemplate.
26024 Error on getting Status. Error saat mendapatkan Status.
26025 Error on getting InternalStatus. Error saat mendapatkan InternalStatus.
26026 Error on getting ExternalStatus. Error saat mendapatkan ExternalStatus.
26027 Error on getting OldExternalStatus. Error saat mendapatkan OldExternalStatus.
26028 Invalid Input. Please Validate Your Input. Kesalahan Input. Mohon Cek Kembali Masukkan Anda.
26029 Invalid ImageURL parameter. Parameter ImageURL tidak valid.
26030 Internal Server Error. Please Call Administrator. Terjadi Kendala Pada Server. Mohon Hubungi Administrator.
26031 Error on creating OrderGroup. Error saat membuat OrderGroup.
26032 Error on getting OrderGroup. Error saat mendapatkan OrderGroup.
26033 ExternalID has existed. ExternalID sudah ada.
26034 Error on getting ExternalID. Error saat mendapatkan ExternalID.
26035 Internal Server Error. Please Call Administrator. Terjadi Kendala Pada Server. Mohon Hubungi Administrator.
26036 Error on getting AgentCitiesAllocation. Error saat mendapatkan AgentCitiesAllocation.
26037 Invalid Input. Please Validate Your Input. Kesalahan Input. Mohon Cek Kembali Masukkan Anda.
26038 Error on getting ZoneID. Error saat mendapatkan ZoneID.
26039 Error on getting Agent. Error saat mendapatkan Agent.
26040 Agent is not active. Agent tidak aktif.
26041 Error on getting LogisticBlock. Error saat mendapatkan LogisticBlock.
26042 Agent is not eligible. Agent tidak memiliki hak.
26043 Invalid Input. Please Validate Your Input. Kesalahan Input. Mohon Cek Kembali Masukkan Anda.
26044 Error on getting AgentSuburb. Error saat mendapatkan AgentSuburb.
26045 Error on validating Package. Error saat menvalidasi Package.
26046 Invalid AWBNumber parameter. Parameter AWBNumber tidak valid.
26047 Invalid PhoneNumber parameter. Parameter PhoneNumber tidak valid.
26048 Invalid Email parameter. Parameter Email tidak valid.
26049 Invalid PaymentType parameter. Parameter PaymentType tidak valid.

Shipper Status

These statuses represent the order status shown in Get Order Details as shipper_status/ shipment_status, on the Shipper Dashboard as "Shipper Status", and inside the webhook callback payload as external_status.

Code Status Name Status Description
1000 Paket sedang dipersiapkan Paket sedang dipersiapkan
1001 Penjemputan Diajukan Pengajuan penjemputan untuk order telah dibuat
1010 Tunggu Penjemputan Menunggu Penjemputan oleh [driver_name]
1020 Sedang Dijemput Paket sedang dijemput driver [driver_name]
1030 Proses Penjemputan Paket dalam proses penjemputan oleh driver [driver_name]
1040 Paket Siap Dikirim Paket sudah siap dikirim dari [Store Public Name]
1041 Pengajuan Penjemputan ke Hub Penjemputan sudah diajukan ke Hub [Hub Public Name]
1042 Penjemputan Dikonfirmasi Hub Penjemputan sudah dikonfirmasi oleh Hub [Hub Public Name]
1043 Paket Dijemput Driver Hub Paket dijemput oleh driver Hub [Hub Public Name]
1044 Paket Bersama Driver Hub Paket dibawa oleh driver Hub [Hub Public Name]
1050 Sampai di HUB Paket diterima hub [hub_location]
1060 Sortir Barang Paket Menuju Gudang Sorting [warehouse_location]
1070 Paket Diterima di Hub Paket sudah diterima di Hub [Hub Public Name]
1080 Paket Diproses di Hub Paket sedang diproses di Hub [Hub Public Name]
1090 Paket Siap Dikirim Dari Hub Paket sudah siap dikirim dari Hub [Hub Public Name]
1091 Pengajuan Penjemputan ke Sorting Hub Penjemputan sudah diajukan ke SHub [Public Name]
1100 Penjemputan Dikonfirmasi Sorting Hub Penjemputan sudah dikonfirmasi oleh SHub [Public Name]
1110 Paket Dijemput Driver Sorting Hub Paket dijemput oleh driver SHub [Public Name]
1120 Paket Bersama Driver Sorting Hub Paket Bersama Driver Sorting Hub
1130 Paket Diterima di Sorting Hub Paket sudah diterima di SHub [Public Name]
1140 Paket Diproses di Sorting Hub Paket sedang diproses di SHub [Public Name]
1150 Paket Siap Dikirim dari Sorting Hub Paket sudah siap dikirim dari SHub [Public Name]
1160 Paket Dikirim ke [3PL_Name] Paket Dikirim ke [3PL_Name]
1170 Paket Diterima oleh [3PL_Name] Paket Diterima oleh [3PL_Name]
1180 Paket Dalam Perjalanan Bersama [3PL_Name] Order Dalam Perjalanan dengan [3pl_Name]
1190 Paket Sampai Ke Kota Tujuan Order Sampai ke Kota Tujuan
1310 Salah Alamat Tujuan Salah Alamat Tujuan
1320 Antar Ulang Paket akan diantar Ulang
1330 Tidak Ada Penerima Tidak Ada Penerima
1340 Paket Dikembalikan Paket Dikembalikan
1350 Lain Lain Lain Lain - [reason]
1360 Penjemputan Dikonfirmasi Penjemputan sudah dikonfirmasi
1370 Gagal Kirim (FINAL) Paket Gagal Kirim
1380 Paket Hilang & Rusak di 3PL (FINAL) Paket Hilang atau Rusak di 3PL
1410 Retur Dalam Perjalanan Paket Retur Dalam Perjalanan
1420 Retur Sampai ke Kota Pengirim Paket Retur Sampai ke Kota Pengirim
2000 Paket Terkirim (FINAL) Paket sudah diterima oleh [receiver_name]
2010 Paket Terkirim (FINAL) Paket Terkirim dengan [3pl_Name]
3000 Paket Terkirim (FINAL) Paket Terkirim
999 Cancelled by [actor_name] (FINAL) Dibatalkan oleh [actor_name]

Webhook Configuration

How To Use

Shipper Webhook lets Shipper clients receive the latest order and delivery status data in real-time. To use it you need to provide a stateless, open API endpoint to receive requests from the Shipper server.

Integration steps

  1. Provide one endpoint, stateless and open, to receive requests from the Shipper server.
  2. Set the webhook URL on the Shipper Dashboard.
  3. Simulate orders in Sandbox to receive status updates on your endpoint.

Payload

Shipper sends a POST request with Content-Type: application/json:

{
  "auth": "7984d7039821972c27dbaa9a0f9f3b29",
  "order_id": "60af69a2d48465d30e2b5b85",
  "tracking_id": "2CQJADENEAU",
  "order_tracking_id": "60af69b98f62b9082bdfebf9",
  "external_id": "SHIP-001",
  "status_date": "2021-05-27T09:43:21+00:00",
  "internal": {
    "id": 3,
    "name": "Dijemput Driver",
    "description": "Paket Anda sudah dijemput oleh Shipper Driver"
  },
  "external": {
    "id": 99,
    "name": "Dijemput Driver",
    "description": "Paket Anda sudah dijemput oleh Shipper Driver"
  },
  "internal_status": {
    "code": 1001,
    "name": "Valid",
    "description": "Valid"
  },
  "external_status": {
    "code": 1000,
    "name": "Paket sedang dipersiapkan",
    "description": "Paket sedang dipersiapkan"
  },
  "awb": "010116222971811"
}

The awb property is only sent once an AWB number is attached to the order.

auth is generated by the Shipper system as:

auth = crypto.createHash("md5").update(<api_key> + <endpoint_url> + <response_format>).digest("hex");

where response_format is the literal lowercase string json.

Parameter mapping to Get Order Details

Parameter in Webhook Parameter in Order Detail
internal -
external logistic_status
internal_status -
external_status shipper_status

No response is expected from your endpoint — the Shipper webhook engine does not act on the response received.

Set Webhook URL

Sandbox: visit the Sandbox Dashboard → API menu → Set Webhook → input your endpoint URL → choose type JSON → Submit.

Production: visit the Production Dashboard → API menu → Set Webhook → input your endpoint URL → choose type JSON → Submit.

Simulate Order Status

Simulation is only available on the Sandbox environment, and currently only for Gosend, Grab, and JNE.

  1. Create an order via API (JNE, Grab, or Gosend only).
  2. Request pickup for the order via API.
  3. Set the webhook URL (see above).
  4. Visit the Sandbox Dashboard.
  5. Go to API menu → Simulasi Order.
  6. Fill in the order id.
  7. Click "Simulasi" on the status you want to simulate.
  8. See "riwayat status" to view the status change.
  9. Check your endpoint for the webhook payload received.

Location

Location API — obtain the area_id of a location for pricing and order creation

Search Location by Keyword

Retrieves location(s) up to the requested administrative level based on a free-text keyword.

If adm_level_cur in the response is level 5 (area), its id can be used directly for Get Pricing and Create Order.

Authorizations:
X-API-Key_Header
query Parameters
adm_level
integer
Enum: 1 2 3 4 5
Example: adm_level=5

Location administrative level: 1=country, 2=province, 3=city, 4=suburb, 5=area (default: show all)

keyword
required
string >= 3 characters
Example: keyword=jakarta

Location keyword, minimum 3 characters

limit
integer

Maximum items per page

Responses

Response samples

Content type
application/json
{
  • "metadata": {
    },
  • "data": [
    ],
  • "pagination": {
    }
}

Get Countries

Returns a list of countries. First step of the Search Location Complete Step flow used to obtain the area_id required for Get Pricing and Create Order (Country -> Province -> City -> Suburb -> Area).

Authorizations:
X-API-Key_Header
query Parameters
country_id
integer
Example: country_id=228

Shipper's Country ID (default: 228)

limit
integer
Example: limit=100

Limit data for each page (default: 30)

page
integer
Example: page=1

Page number (default: 1)

Responses

Response samples

Content type
application/json
{
  • "metadata": {
    },
  • "data": [
    ],
  • "pagination": {
    }
}

Get Provinces by Country ID

Returns a list of provinces based on the Country ID. Second step of the Search Location Complete Step flow.

Authorizations:
X-API-Key_Header
path Parameters
country_id
required
integer
Example: 228

Shipper's Country ID

query Parameters
limit
integer

Limit data for each page (default: 30)

page
integer

Page number (default: 1)

province_id
integer
Example: province_id=6

Shipper's Province ID (default: show all)

Responses

Response samples

Content type
application/json
{
  • "metadata": {
    },
  • "data": [
    ],
  • "pagination": {
    }
}

Get Cities by Province ID

Returns a list of cities based on the Province ID. Third step of the Search Location Complete Step flow. You can also use the returned City ID to get the Vehicle ID for Lalamove.

Authorizations:
X-API-Key_Header
path Parameters
province_id
required
integer
Example: 6

Shipper's Province ID

query Parameters
city_ids
string

Array of Shipper's City ID as a comma separated string, e.g. 41,42,43,44 (default: show all)

limit
integer

Limit data for each page (default: 30)

page
integer

Page number (default: 1)

Responses

Response samples

Content type
application/json
{
  • "metadata": {
    },
  • "data": [
    ],
  • "pagination": {
    }
}

Get Suburbs by City ID

Returns a list of suburbs based on the City ID. Fourth step of the Search Location Complete Step flow.

Authorizations:
X-API-Key_Header
path Parameters
city_id
required
integer
Example: 41

Shipper's City ID

query Parameters
suburb_ids
string

Array of Shipper's Suburb ID as a comma separated string, e.g. 482,483,484 (default: show all)

limit
integer

Limit data for each page (default: 30)

page
integer

Page number (default: 1)

Responses

Response samples

Content type
application/json
{
  • "metadata": {
    },
  • "data": [
    ],
  • "pagination": {
    }
}

Get Areas by Suburb ID

Returns a list of areas based on the Suburb ID. Final step of the Search Location Complete Step flow — use the returned area id for Get Pricing and Create Order.

Authorizations:
X-API-Key_Header
path Parameters
suburb_id
required
integer
Example: 482

Shipper's Suburb ID

query Parameters
area_ids
string

Array of Shipper's Area ID as a comma separated string, e.g. 4707,4708 (default: show all)

limit
integer

Limit data for each page

page
integer

Page number (default: 1)

Responses

Response samples

Content type
application/json
{
  • "metadata": {
    },
  • "data": [
    ],
  • "pagination": {
    }
}

Pricing

Pricing API — obtain shipping rates and Lalamove vehicle information

Domestic Pricing

Displays all logistics services available from Shipper for a given origin/destination route.

By default area_id and lat/lng can be used interchangeably. If both are sent they must match the same suburb, otherwise an error is returned. Please contact the Shipper team to enable COD pricing/orders.

Authorizations:
X-API-Key_Header
Request Body schema: application/json
required
item_categories
Array of strings
Items Enum: "Cairan" "Dokumen" "Elektronik" "Furnitur" "Kosmetik" "Makanan" "Minuman" "Pakaian" "Sepatu" "Spare Parts" "Aksesoris" "Dekorasi Rumah" "Mainan" "Obat dan Herbal" "Garmen dan Tekstil" "Buku" "Lainnya"

Item categories of the package

required
object (PricingLocationInput)
required
object (PricingLocationInput)
for_order
required
boolean

Set to true to ensure pricing eligibility for order creation

height
required
integer

Height in cm

length
required
integer

Length in cm

width
required
integer

Width in cm

weight
required
number

Weight in kg

item_value
required
integer

Value of the item in IDR

vehicle_id
integer

Only used for Lalamove. Obtained from GET /v3/vehicle/city/{city_id}.

special_instructions
Array of integers

Only used for Lalamove. Special instruction id(s) obtained from GET /v3/vehicle/city/{city_id}.

schedule_at
string <date-time>

Only used for Lalamove. Scheduled date/time of the order, e.g. 2024-08-09T00:00:00Z

cod_amount
integer

COD amount to get pricing for COD. Contact Shipper to be whitelisted for COD.

drop_off
boolean

Use this to filter by drop off support

is_rbsv4
boolean

RBS v4

qty
integer

Quantity of package (used in multikoli orders)

rate_type
Array of strings

Use this to filter by rate type

limit
integer

Limit data displayed per page (default 30)

page
integer

Page number (default 1)

sort_by
Array of strings

Sort the results, e.g. ["final_price"]

Responses

Request samples

Content type
application/json
{
  • "cod_amount": 40000,
  • "destination": {
    },
  • "drop_off": false,
  • "for_order": true,
  • "height": 10,
  • "item_value": 40000,
  • "length": 10,
  • "limit": 30,
  • "origin": {
    },
  • "page": 1,
  • "qty": 1,
  • "sort_by": [
    ],
  • "weight": 0.5,
  • "width": 10
}

Response samples

Content type
application/json
{
  • "metadata": {
    },
  • "data": {
    },
  • "pagination": {
    }
}

Domestic Pricing by Rate Type

Displays only the logistics services matching the requested rate type for a given origin/destination route.

Authorizations:
X-API-Key_Header
path Parameters
rate_type
required
string
Enum: "instant" "regular" "express" "trucking" "same-day"
Example: regular

The type of service to display

Request Body schema: application/json
required
item_categories
Array of strings
Items Enum: "Cairan" "Dokumen" "Elektronik" "Furnitur" "Kosmetik" "Makanan" "Minuman" "Pakaian" "Sepatu" "Spare Parts" "Aksesoris" "Dekorasi Rumah" "Mainan" "Obat dan Herbal" "Garmen dan Tekstil" "Buku" "Lainnya"

Item categories of the package

required
object (PricingLocationInput)
required
object (PricingLocationInput)
for_order
required
boolean

Set to true to ensure pricing eligibility for order creation

height
required
integer

Height in cm

length
required
integer

Length in cm

width
required
integer

Width in cm

weight
required
number

Weight in kg

item_value
required
integer

Value of the item in IDR

vehicle_id
integer

Only used for Lalamove. Obtained from GET /v3/vehicle/city/{city_id}.

special_instructions
Array of integers

Only used for Lalamove. Special instruction id(s) obtained from GET /v3/vehicle/city/{city_id}.

schedule_at
string <date-time>

Only used for Lalamove. Scheduled date/time of the order, e.g. 2024-08-09T00:00:00Z

cod_amount
integer

COD amount to get pricing for COD. Contact Shipper to be whitelisted for COD.

drop_off
boolean

Use this to filter by drop off support

is_rbsv4
boolean

RBS v4

qty
integer

Quantity of package (used in multikoli orders)

rate_type
Array of strings

Use this to filter by rate type

limit
integer

Limit data displayed per page (default 30)

page
integer

Page number (default 1)

sort_by
Array of strings

Sort the results, e.g. ["final_price"]

Responses

Request samples

Content type
application/json
{
  • "cod_amount": 40000,
  • "destination": {
    },
  • "drop_off": false,
  • "for_order": true,
  • "height": 10,
  • "item_value": 40000,
  • "length": 10,
  • "limit": 30,
  • "origin": {
    },
  • "page": 1,
  • "qty": 1,
  • "sort_by": [
    ],
  • "weight": 0.5,
  • "width": 10
}

Response samples

Content type
application/json
{
  • "metadata": {
    },
  • "data": {
    },
  • "pagination": {
    }
}

Get Vehicle ID for Lalamove

Returns the Lalamove vehicles (and their special instructions) available in a given city. This endpoint is only used for Lalamove orders. The city_id can be obtained from GET /v3/location/province/{province_id}/cities.

Authorizations:
X-API-Key_Header
path Parameters
city_id
required
integer
Example: 42

Shipper's City ID, obtained from Get Cities by Province ID

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "metadata": {
    }
}

Order

Order API — create, retrieve, cancel orders and generate shipping labels

Create Order

Creates a shipment order after obtaining a rate_id from the Pricing API. Returns the order_id needed to request a pickup.

COD orders: send courier.cod_amount (must be greater than data.pricings[].final_price from Get Pricing) to have the order treated as Cash on Delivery. COD requires prior whitelisting by the Shipper team. The disbursement amount is available via the Shipper 360 wallet once the order reaches Shipper Status 2000.

Authorizations:
X-API-Key_Header
Request Body schema: application/json
required
required
object (ContactInfo)
required
object (ContactInfo)
object (CourierRequest)
coverage
required
string
Enum: "domestic" "international"
order_reference
string

Order's reference, mainly used for international order

plugin
string

Created through which plugin

source
string

api-v3 / api-v3-logistic-wh

drop_off
boolean

Set to true to mark that the order will be dropped off (instead of picked up)

required
object (AddressRequest)
required
object (AddressRequest)
external_id
string

External ID generated by the user, if any

required
object (PackageRequest)
payment_type
string
Default: "postpay"
Enum: "cash" "postpay"
service_type
integer
Enum: 1 9

1 = Regular, 9 = Instant. Used for RBS (Recommended by Shipper) rate; used instead of courier.rate_id. Defaults to Regular when omitted.

rbs_logic
string
Enum: "best_performance" "best_price"

best_performance selects the 3PL rate with the best SLA; best_price selects the cheapest. Defaults to best_performance.

Responses

Request samples

Content type
application/json
Example
{
  • "consignee": {
    },
  • "consigner": {
    },
  • "courier": {
    },
  • "coverage": "domestic",
  • "destination": {
    },
  • "external_id": "KRN1231123121",
  • "origin": {
    },
  • "package": {
    },
  • "payment_type": "postpay"
}

Response samples

Content type
application/json
Example
{
  • "metadata": {
    },
  • "data": {
    }
}

Get Order Details by External Id

Retrieves all information regarding an order using the merchant-supplied External ID.

Authorizations:
X-API-Key_Header
path Parameters
external_id
required
string
Example: EXTID1234579

Shipper External ID

Responses

Response samples

Content type
application/json
{
  • "metadata": {
    },
  • "data": {
    }
}

Get Order Details by Order Id

Retrieves all information regarding an order using the Shipper Order ID.

Authorizations:
X-API-Key_Header
path Parameters
order_id
required
string
Example: 215VKK6KQYEX2

Shipper Order ID

Responses

Response samples

Content type
application/json
{
  • "metadata": {
    },
  • "data": {
    }
}

Cancel Order

Cancels an order. Moves the order's Shipper Status to 999 (Cancelled). A new order and a new pickup request must be created afterwards; the cancelled order id cannot be reused.

Authorizations:
X-API-Key_Header
path Parameters
order_id
required
string
Example: 215VKK6KQYEX2

Shipper Order ID

Request Body schema: application/json
optional
reason
string

State the reason why the order needs to be cancelled

Responses

Request samples

Content type
application/json
{
  • "reason": "Stock barang habis"
}

Response samples

Content type
application/json
{
  • "metadata": {
    },
  • "data": {
    }
}

[NEW] Get Shipping Label and Receipt

Generates the shipping label(s) or receipt(s) for the given order id(s). It is mandatory to print and stick the label on the package before handing it over to the courier driver — there is no alternative method.

The response data returns the full order object, in the same shape as Create Order's response data.

Authorizations:
X-API-Key_Header
Request Body schema: application/json
required
id
required
Array of strings

Shipper order ID(s)

type
required
string
Enum: "LBL" "RCP"

LBL = label, RCP = receipt

Responses

Request samples

Content type
application/json
{
  • "id": [
    ],
  • "type": "LBL"
}

Response samples

Content type
application/json
{
  • "metadata": {
    },
  • "data": {
    }
}

Pickup

Pickup API — request pickup (activation) of created orders

Create Request Pickup (Order Activation)

Requests pickup (activates) previously created order(s) so a driver is dispatched to collect them. Maximum 30 order ids per request. There is no difference in behavior between regular and multikoli orders for this endpoint.

Authorizations:
X-API-Key_Header
Request Body schema: application/json
required
object

Responses

Request samples

Content type
application/json
{
  • "data": {
    }
}

Response samples

Content type
application/json
{
  • "metadata": {
    },
  • "data": {
    }
}