You are on page 1of 44

Public API Documentation v2.13.

0
Last updated 1 March 2021

Overview
The Shipper API is an exclusive way to connect with shipper platform. It’s an http-based
API that apps can interact with all features same as shipper product. Users can
customize their data freely with this API.

Steps to implement until Production


1. After getting this API Documentation and sign the NDA, you can get a Sandbox
API Key that can be used to start development.
2. During the API development process, you can ask Shipper teams if you have any
problems/questions regarding the API, operation flow etc.
3. After you have done with API Development, please arrange UAT with us for
Shipper teams to understand more about how you implement the flow at your
system and do alignment with operation teams to decide when to go to
Production.
4. Production API Key will be given after agreement has been signed.

Get Started
1. You can download our API postman collection here :
https://www.getpostman.com/collections/f0a265d7c434b2683841
2. Both request and response bodies are formatted in JSON unless otherwise
stated.
3. For authentication, every request must have a query string
apiKey=[YOUR_API_KEY] where apiKey is obtained from account creation API
unless otherwise stated.
Example :
https://api.sandbox.shipper.id/public/v1/countries?apiKey={{YOUR_API_KEY}}.
4. Every request must have header User-Agent = Shipper/
5. Base URL endpoint :
- Sandbox Environment : https://api.sandbox.shipper.id/
- Prod Environment : https://api.shipper.id/prod/
6. [COMPULSORY] URL for getting our sticker. You must print & put the label on
the package:
- Sandbox Environment :
https://sandbox.shipper.id/label/sticker.php?oid[]={{ORDER_ID}}&uid={{LABELCHECK
SUM_ORDER}}
- Prod Environment :
https://shipper.id/label/sticker.php?oid[]={{ORDER_ID}}&uid={{LABELCHECKSUM_OR
DER}}
- If you don’t have a printer to print out the label, you must write the orderid on the
packet.
7. URL for getting our receipt:
- Sandbox Environment :
https://sandbox.shipper.id/label/receipt.php?oid[]={{ORDER_ID}}&uid={{LABELCHECK
SUM_ORDER}}
- Prod Environment :
https://shipper.id/label/receipt.php?oid[]={{ORDER_ID}}&uid={{LABELCHECKSUM_OR
DER}}
(You can get [ORDER_ID] from endpoint order creation and
[LABELCHECKSUM_ORDER] from endpoint order detail.)

Error Response (example) :


Base Flow of API
This is our main flow API
There are Shipper agents that will pick up the package from the origin address. If you
use pickup request, you must choose an agent that will pick the package. If you use
order activation, our System will automatically choose an agent.

1. Location
In this section, you can get all types of locations from our system which are :
a. Country (Negara)
b. Province (Provinsi)
c. City (Kota)
d. Suburb (Kecamatan)
e. Area (Kelurahan)
Our pricing endpoint and order creation endpoint requires location area id. There are 2
ways to get area id :

1. Shortcut Step
Flow :

Step for this way :


a. Request on Search All Location
b. Request on Get Suburb (if you get order_list = 1)
c. Request on Get Areas (if you get order_list = 1 through get suburbs or
order_list = 2)
2. Complete Step
Flow :

Step for this way :


a. Request on Get Provinces
b. Request on Get Cities
c. Request on Get Suburbs
d. Request on Get Areas
Interface Example :

Here is detail of all endpoints :

a. Get Countries
Retrieve country data in a list.
Method GET

Url public/v1/countries

Example Request :
curl -X GET -H 'User-Agent: Shipper/'
'https://api.sandbox.shipper.id/public/v1/countries?apiKey=[YOUR_A
PIKEY]'

Success Response :
{
"status": "success",
"data": {
"title": "OK",
"content": "Successfully retrieve countries",
"rows": [
{
"country_name": " UNITED STATES OF AMERICA",
"country_id": 214
}
// And so on...
],
"statusCode": 200
}
}

Response list
Name Details

country_name Name of country

country_id ID of country

b. Get Provinces
Retrieve all provinces in Indonesia in a list.
Method GET

Url public/v1/provinces

Example Request :
curl -X GET -H 'User-Agent: Shipper/'
'https://api.sandbox.shipper.id/public/v1/provinces?apiKey=[YOUR_A
PIKEY]'

Success Response :
{
"status": "success",
"data": {
"title": "OK",
"content": "Successfully retrieve provinces",
"rows": [
{
"id": 1,
"name": "Bali"
},
{
"id": 34,
"name": "Sumatera Utara"
}
// And so on...
],
"statusCode": 200
}
}

Response list
Name Details

id ID of Province

name Name of Province

c. Get Cities
Either retrieve every city based on the submitted province ID OR every city and
provinces. Either one parameter must be provided.
Method GET

Url public/v1/cities

Parameter URL Query


At this part, you can choose 1 parameter only.
Name Type Details Compulsory
(mandatory)

province Integer Province id obtained from get provinces. -

origin String If you want to use this parameter, you have -


to pass ‘all’.
Example Request and Success Response :
a. Use province parameter
Request :
curl -X GET -H 'User-Agent: Shipper/'
'https://api.sandbox.shipper.id/public/v1/cities?apiKey=[YOU
R_APIKEY]&province=6'
Response :
{
"status": "success",
"data": {
"title": "OK",
"content": "Successfully retrieve cities",
"rows": [
{
"id": 42,
"name": "Jakarta Barat"
},
// And so on...
],
"statusCode": 200
}
}

b. Use origin parameter


Request :
curl -X GET -H 'User-Agent: Shipper/'
'https://api.sandbox.shipper.id/public/v1/cities?apiKey=[YOU
R_APIKEY]&origin=all'
Response :
{
"status": "success",
"data":
{
"title": "OK",
"content": "Successfully retrieve all origin",
"rows": [
{
"id": 39,
"name": "Jakarta Utara",
"province_id": 6,
"province_name": "DKI Jakarta"
}
// And so on...
],
"statusCode": 200
}
}
Response list
Name Details

id ID of City

name Name of City

province_id ID of Province

province_name Name of Province

d. Get Suburbs
Retrieve suburbs based on submitted city ID.
Method GET

Url public/v1/suburbs

Parameter URL Query


Name Type Details Compulsory (mandatory)

city Integer City id obtained from get cities. Yes

Example Request :
curl -X GET -H 'User-Agent: Shipper/'
'https://api.sandbox.shipper.id/public/v1/suburbs?apiKey=[YOUR_API
KEY]&city=23'

Success Response :
{
"status": "success",
"data": {
"title": "OK",
"content": "Successfully retrieve suburbs",
"rows": [
{
"id": 260,
"name": "Muara Kemumu",
"alias": ""
},
// and so on ...
]
}
}
Response list
Name Details

id ID of Suburbs

name Name of Suburbs

alias Alias of Suburbs

e. Get Areas
Retrieve areas based on submitted suburb ID.
Method GET

Url public/v1/areas

Parameter URL Query


Name Type Details Compulsory
(mandatory)

suburb Integer Suburb id obtained from GET Yes


suburbs.

Example Request :
curl -X GET -H 'User-Agent: Shipper/'
'https://api.sandbox.shipper.id/public/v1/areas?apiKey=[YOUR_APIKE
Y]&suburb=678'

Success Response :
{
"status": "success",
"data": {
"title": "OK",
"content": "Successfully retrieve areas",
"rows": [
{
"id": 6656,
"name": "Rantau Indah",
"alias": "",
"postcode": "36763"
},
{
"id": 6657,
"name": "Sido Mukti",
"alias": "",
"postcode": "36763"
}
// and so on ...
]
}
}

Response list
Name Details

id ID of Areas

name Name of Areas

alias Alias of Areas

postcode Postcode of Areas

f. Search All Location (by Substring)


Retrieve every area, suburb, and city whose names include the submitted
substring (including postcode).
Method GET

Url public/v1/details/[SUBSTRING]

Parameter URL Params


Name Type Details Compulsory (mandatory)

SUBSTRING String Place name or postal Yes


code from user’s input

Result Explanation
There are 3 conditions in this part of the results.
Field Value Affected Value
Name Field
order_list 1 value 41|6
city_id|province_id

2 378|41|6
suburb_id|city_id|province_id

3 11460|4833|378|41|6
postcode|area_id|suburb_id|city_id|province_id
Based on the table above, if the order_list is 1, the value is the concatenation of
city_id and province_id. If the order_list is 2, the value is the concatenation of
suburb_id, city_id and province_id. If the order_list is 3, the value is the
concatenation of postcode, area_id, suburb_id, city_id and province_id.

Example Request :
curl -X PUT -H 'User-Agent: Shipper/'
'https://api.sandbox.shipper.id/public/v1/details/jogo?apiKey=[YOUR_APIKE
Y]'

Success Response :
{
"status": "success",
"data": {
"title": "OK",
"content": "Successfully retrieve all related locations",
"rows": [
{
"label": "Singkawang",
"value": "148|12",
"city_name": "Singkawang",
"suburb_name": "",
"area_name": "",
"order_list": 1
},
{
"label": "Singkohor, Aceh Singkil",
"value": "3728|239|21",
"city_name": "Aceh Singkil",
"suburb_name": "Singkohor",
"area_name": "",
"order_list": 2
},
{
"label": "Amasing Kota Utara, Bacan, Halmahera
Selatan, 97791",
"value": "97791|40716|3548|223|19",
"city_name": "Halmahera Selatan",
"suburb_name": "Bacan",
"area_name": "Amasing Kota Utara",
"order_list": 3
}
],
"statusCode": 200
}
}

2. Rates
In this section, you can get all of our rate price. This endpoint will return every logistic
rates that depends on :
a. Coverage area of selected Logistic - Service
b. Shipment DIstance (km) for instant and same day service
c. Final Weight (Actual weight and Volumetric weight). Each Logistic - Service have
minimum and maximum weight.
d. Shipper Pickup Coverage Area

Interface Example :

Only 2 endpoints, see below for details :


a. Get Domestic Rates

Method GET

Url public/v1/domesticRates

Parameter URL Query


Name Type Details Compulsory
(mandatory)
o Integer Origin (Area id obtained from Yes
get areas or search all
location)

d Integer Destination (Area id Yes


obtained from get areas or
search all location)

l Integer/Float Item Length (cm) Yes

w Integer/Float Item Width (cm) Yes

h Integer/Float Item Height (cm) Yes

wt Integer/Float Item Weight (kg) Yes

v Integer Item Price (Rp.) Yes

order Integer Order flag = 1 Yes


So the rates is eligible to
create order

type Integer Package Type No

1 for document (default)


2 for small package
3 for medium package

originCoord String Origin coordinate(latitude No


longitude) from map or GPS
(Use to show instant/same
day service)

destinationCoord String Destination coordinate No


(latitude longitude) from map
or GPS (Use to show
instant/same day service)

Example Request :
curl -X GET -H 'User-Agent: Shipper/'
'https://api.sandbox.shipper.id/public/v1/domesticRates?apiKey=[YO
UR_APIKEY]&o=4802&d=4852&wt=1.0&v=199000&l=20&w=15&h=10&cod=0&type
=1&originCoord=-6.1575362903,106.7858796692&destinationCoord=-6.17
846396594961,106.84122923291011'

Success Response :
{
"status": "success",
"data": {
"title": "OK",
"content": "Successfully retrieving rates",
"rule": "Pengiriman barang cairan dan powerbank untuk
sementara belum bisa dilakukan.",
"originArea": "Suryodiningratan, Mantrijeron, Yogyakarta",
"destinationArea": "Way Halim Permai, Way Halim, Bandar
Lampung",
"rates": {
"logistic": {
"regular": [
{
"name": "Lion Parcel",
"logo_url":
"http://cdn.shipper.cloud/logistic/small/LPA.png",
"rate_id": 44,
"show_id": 1,
"rate_name": "REGPACK",
"stop_origin": 113,
"stop_destination": 19,
"weight": 1,
"volumeWeight": 0.5,
"finalWeight": 1,
"itemPrice": 199000,
"item_price": 199000,
"finalRate": 24998,
"insuranceRate": 7000,
"compulsory_insurance": 0,
"liability": 199000,
"discount": 1249.9,
"min_day": 3,
"max_day": 5,
"pickup_agent": 1
}
// and so on ...
],

}
},
"statusCode": 200
}
}
b. Get International Rates

Method GET

Url public/v1/intlRates

Parameter URL Query

Name Type Details Compulsory


(mandatory)

o Integer Area id obtained from get areas or Yes


search all location

d Integer Country id obtained from get country Yes

l Integer/Float Item Length (cm) Yes

w Integer/Float Item Width (cm) Yes

h Integer/Float Item Height (cm) Yes

wt Integer/Float Item Weight (kg) Yes

v Integer Item Price (Rp.) Yes

type Integer Package Type No

1 for document (default)


2 for small package
3 for medium package

order Integer Order flag = 1 Yes

Example Request :
curl -X GET -H 'User-Agent: Shipper/'
'https://api.sandbox.shipper.id/public/v1/intlRates?apiKey=fdbb3c8
e1f428590ff14ea1ecfe2e671&o=4802&d=180&wt=1.0&v=199000&l=20&w=15&h
=10&type=2'

Success Response :
{
"status": "success",
"data": {
"title": "OK",
"content": "Successfully retrieving rates",
"rule": "Text about Shipping Restriction is here",
"originArea": "Jelambar, Grogol Petamburan, Jakarta Barat,
INDONESIA",
"destinationCountry": "SINGAPORE",
"rates": {
"logistic": {
"international": [
{
"name": "POS Indonesia",
"logo_url":
"http://cdn.shipper.cloud/logistic/small/POS.png",
"rate_id": 210,
"show_id": 3,
"rate_name": "EMS",
"stop_origin": 51,
"stop_destination": 21013,
"weight": 3,
"volumeWeight": 1.6,
"finalWeight": 3,
"itemPrice": 65000,
"item_price": 65000,
"finalRate": 452115,
"insuranceRate": 325,
"compulsory_insurance": 0,
"liability": 65000,
"min_day": 2,
"max_day": 3,
"pickup_agent": 0
}
]
}
// and so on ...
},
"statusCode": 200
}
}

c. Important Return Parameter at Domestic & International Rates

Name Type Details


name String Name of Logistic

logo_url String Logo of Logistic

rate_id Integer Shipper Identifier of Logistic - Service


(Example, rate_id of SiCepat REG is 58)

rate_name String Service name of Logistic

weight Integer/Float Actual Weight (kg)

volumeWeight Integer/Float Volumetric Weight (kg)

finalWeight Integer/Float The heaviest weight between actual and


volumetric weight (kg)

itemPrice Integer Package price (Rp)

finalRate Integer Logistic - Service Rate / Price

insuranceRate Integer Logistic - Service Insurance Rate / Price

compulsory_insu Integer Flag that contain insurance is charged or


rance not (1 is true, 0 is false)

min_day Integer Minimum SLA of Logistic - Service

max_day Integer Maximum SLA of Logistic - Service

There are 5 type of services which are :


a. Regular Service
b. Express / Next Day Service
c. Trucking / Cargo Service
d. Same day Service
e. Instant Service

d. Recommended By Shipper (RBS) Rate

RBS is one of our service rates where we choose the best price from the list of
the returned rates from Get Domestic Rates. The name will return
“Recommended by Shipper” and whitelist the 3PL.
To show the RBS rate, add this variable to the parameters:

Name Type Details


bestPrices Integer RBS flag, to show a recommended by shipper
rate on the list of returned rates

1 for showing RBS


0 to hide RBS (default)

order Integer Order flag, to make sure that the RBS comes
from eligible 3PL rates

1 for order purpose


0 for check rates only (default)

One of the rates response example :

{
"name": "Recommended by Shipper",
"Logo_url": "http://cdn.shipper.cloud/logistic/small/SHP.png",
"rate_id": 365,
"show_id": 1,
"rate_name": "Regular",
"stop_origin": 50,
"stop_destination": 4670,
"weight": 1.5,
"volumeWeight": 0.0675,
"finalWeight": 2,
"itemPrice": 150000,
"item_price": 150000,
"finalRate": 44000,
"insuranceRate": 5300,
"compulsory_insurance": 0,
"liability": 0,
"discount": 0,
"min_day": 3,
"max_day": 6,
"pickup_agent": 1
}

3. Order
This is the final step. You can create orders and send your goods through Shipper easily.
After you create order, please use Get Tracking ID (3c) to get our tracking number
a. Domestic Order Creation

Method POST

Url public/v1/orders/domestics

Parameter Body
Name Type Details Compulsory
(mandatory)

o Integer Origin (Area id obtained from Yes


get areas or search all
location)

d Integer Destination (Area id obtained Yes


from get areas or search all
location)

l Integer/Float Final Item Length (cm) Yes

w Integer/Float Final Item Width (cm) Yes

h Integer/Float Final Item Height (cm) Yes

wt Integer/Float Final Item Weight (kg) Yes

v Integer Final Item Price (Rp.) Yes

rateID Integer Rate id obtained from get Yes


rates (choose one from
results rate list)

consigneeName String Consignee’s name Yes

consigneePhone String Consignee’s phone number Yes


Number

consignerName String Consigner’s name Yes

consignerPhone String Consigner’s phone number Yes


Number

originAddress String Origin’s address or Yes


consigner’s address

originDirection String Origin’s add direction or Yes


consigner’s direction. Add “-”
if no direction required.
destinationAddre String Destination’s address or Yes
ss consignee’s address

destinationDirect String Destination’s direction or Yes


ion consignee’s direction. Add “-”
if no direction is required.

itemName Array of name (String) : Item name Yes


Object qty (Integer) : Item quantity
value (Integer) : Item value

Can be multiple. See


example below.r

contents String Item Description. Leave “-” if Yes


no description is required.

useInsurance Integer Is insurance needed? ( 1 for No


yes; 0 for no) (integer). If
compulsory insurance is
flagged by system, then
this does not make any
difference.

externalID String The merchant’s self-tailored No


order ID

paymentType String payment type for the user’s No


orders. By default it will be
postpay for API Clients.

packageType Integer Package Type Yes

1 for document (default)


2 for small package
3 for medium package

originCoord String Origin (consigner) coordinate No


from map or GPS (latitude
longitude)

destinationCoord String Destination (consignee) No


coordinate from map or GPS
(latitude longitude)

Example :
- Use header ‘Content-Type: application/json’
. . .
"itemName": [
{
"name": "Celana",
"qty": 1,
"value": 50000
},
{
"name": "Baju",
"qty": 1,
"value": 150000
}
]
. . .
- Use header ‘Content-Type: application/x-www-form-urlencoded’
itemName[0][name]:Celana
itemName[0][qty]:1
itemName[0][value]:50000
itemName[1][name]:Baju
itemName[1][qty]:1
itemName[1][value]:150000

Example Request :
curl -X POST
'https://api.sandbox.shipper.id/public/v1/orders/domestics?apiKey=
[YOUR_APIKEY]' -H 'User-Agent: Shipper/' -H
'Content-Type:application/json' -d '{ "o": 4828, "d": 4833, "wt":
1, "l": 10, "w": 10, "h": 10, "v": 100000, "rateID": 49,
"consigneeName": "Peoorang", "consigneePhoneNumber":
"089899878987", "consignerName": "Peorang",
"consignerPhoneNumber": "089891891818", "originAddress": "Mangga
Dua Selatan", "originDirection": "", "destinationAddress": "Pasar
Baru", "destinationDirection": "", "itemName": [
{
"name": "Celana",
"qty": 1,
"value": 50000
},
{
"name": "Baju",
"qty": 1,
"value": 150000
}
]
, "contents": "-", "useInsurance": 0, "packageType": 2,
"paymentType": "cash", "externalID": "" }'

Success Response :
{
"status": "success",
"data": {
"title": "Created",
"content": "The data has been saved and validated",
"statusCode": 201,
"id": "bByYNnMj7Yuxc"
}
}

b. Recommended by Shipper (RBS) Order Creation

To create an order using RBS rates in domestic creation, you need to set these
parameters in the body:

Name Type Details

rateID Integer Set it to null or empty string

bestPrices Integer RBS flag, to ensure orders are using


RBS

1 to use RBS
0 to unuse RBS (default)

serviceType Integer serviceType flag, match it with the


RBS rate_name from get rates

1 for Regular
2 for Next Day
c. International Order Creation

Method POST

Url public/v1/orders/internationals

Parameter Body
Name Type Details Compulsory
(mandatory)

o Integer Origin (Area id obtained Yes


from get areas or search
all location)

d Integer Destination Country Yes


(Country id obtained from
get countries)

l Integer/Float Item Length (cm) Yes

w Integer/Float Item Width (cm) Yes

h Integer/Float Item Height (cm) Yes

wt Integer/Float Item Weight (kg) Yes

v Integer Item Price (Rp.) Yes

rateID Integer Rate id obtained from get Yes


rates (choose one from
results rate list)

consigneeName String Consignee’s name Yes

consigneePhoneNu String Consignee’s phone Yes


mber number

consignerName String Consigner’s name No

consignerPhoneNu String Consigner’s phone No


mber number

originAddress String Origin’s address or Yes


consigner’s address

originDirection String Origin’s add direction or No


consigner’s direction.
Can be empty
destinationAddress String Destination’s address or Yes
consignee’s address

destinationDirection String Destination’s direction or No


consignee’s direction.
Can be empty

destinationArea String Destination area (can be No


empty)

destinationSuburb String Destination suburb (can No


be empty)

destinationCity String Destination city (can be No


empty)

destinationProvince String Destination area (can be No


empty)

destinationPostcode String Destination postcode No


(can be empty)

itemName Array of name (String) : Item Yes


Object name
qty (Integer) : Item
quantity
value (Integer) : Item
value

Can be multiple. See


example from create
domestic order

contents String Item Description (can be Yes


empty) ex : black, soft,
and so on

useInsurance Integer Is insurance needed? ( 1 No


for yes; 0 for no)
(integer). If compulsory
insurance is flagged by
system, then this does
not make any difference.

externalID String The merchant’s No


self-tailored order ID

paymentType String payment type for the No


user’s orders. Valid
values are currently cash
and the default value
postpay

packageType Integer Package Type Yes


1 for document (default)
2 for small package
3 for medium package

Example Request :
curl -X POST
'https://api.sandbox.shipper.id/public/v1/orders/interntaionals?ap
iKey=[YOUR_APIKEY]' -H 'User-Agent: Shipper/' -H
'Content-Type:application/json' -d '{ "o": 4802, "d": 180, "wt":
1, "l": 10, "w": 10, "h": 10, "v": 100000, "rateID": 210,
"consigneeName": "Peoorang", "consigneePhoneNumber":
"089899878987", "consignerName": "Peorang",
"consignerPhoneNumber": "089891891818", "originAddress": "Mangga
Dua Selatan", "originDirection": "", "destinationAddress":
"Orchard Road 101", "destinationDirection": "", "destinationArea":
"Singapore", "destinationSuburb": "Singapore", "destinationCity":
"Singapore", "destinationProvince": "Singapore",
"destinationPostcode": "111111", "itemName": "baju", "contents":
"merah", "useInsurance": 0, "packageType": 2, "paymentType":
"cash", "externalID": ""}'

Success Response :
{
"status": "success",
"data": {
"title": "Created",
"content": "The data has been saved and validated",
"statusCode": 201,
"id": "bByYNnMj7Yuxc"
}
}

d. Get Tracking ID
Retrieves tracking ID of the order with the provided ID.
Method GET

Url public/v1/orders

Parameter URL Query


Name Type Details Compulsory
(mandatory)

id String Id obtained from Order Creation (string) Yes

Example Request :
curl -X GET
'https://api.sandbox.shipper.id/public/v1/orders?apiKey=[YOUR_APIK
EY]&id=86jh87y87h87yh87y87yy' -H 'User-Agent: Shipper/'

Success Response :
{
"status": "success",
"data": {
"title": "OK",
"content": "Successfully retrieve order ID",
"id": "1AXXXXX",
"statusCode": 200
}
}

e. Order Detail
Retrieves an order’s detail including tracking log. Date format is UTC time.
Method GET

Url public/v1/orders/[ORDER_ID]
Parameter URL Params
Name Type Details Compulsory
(mandatory)

ORDER_ID String Id obtained from Order Creation Yes


(string) or order tracking ID (string)

Example Request :
curl -X GET
'https://api.sandbox.shipper.id/public/v1/orders/1XKXKXK?apiKey=[Y
OUR_APIKEY]' -H 'User-Agent: Shipper/'
Success Response :
{
"status": "success",
"data":
{
"title": "OK",
"content": "Successfully retrieving history order detail",
"order": {
"tracking": [
{
"_id": "5f0942690add01f3198b456b",
"id": "5f0942690add01f3198b4569",
"orderID": "3E79561",
"uniqueID": "2542b50867053413083ba06035fea697",
"trackStatus": {
"id": 1,
"name": "Order Masuk ke sistem",
"description": "Data order sudah masuk ke sistem"
},
"logisticStatus": [
{
"id": 99,
"name": "Order Masuk ke sistem",
"description": "Data order sudah masuk ke
sistem"
}
],
"createdBy": "Tamam",
"createdDate": "2020-07-11T04:39:05+00:00"
},
{
"_id": "5f09431c9bbca0098622ebb9",
"id": "5f0942690add01f3198b4569",
"orderID": "3E79561",
"trackStatus": {
"id": 6,
"name": "Diterima Partner",
"description": "Paket Anda sudah diterima oleh
[GO-SEND]",
"reason": ""
},
"logisticStatus": [
{
"id": 1369,
"name": "confirmed",
"description": "Paket Anda sudah diterima
oleh GO-SEND. Live track di sini : <a
href='https://gosend-livetracking.gojek.co.id/go-send/livetracking/detail
?trackingId=SRqn3Sj-JpDx6_6DMMiqtOdSk8T_Z2W2w7ew8DYQeQn_Z4D9ndH-YZf5nMrcX
CITRasRljSthjsXHC64eINn8g%3D%3D'
target='_blank'>https://gosend-livetracking.gojek.co.id/go-send/livetrack
ing/detail?trackingId=SRqn3Sj-JpDx6_6DMMiqtOdSk8T_Z2W2w7ew8DYQeQn_Z4D9ndH
-YZf5nMrcXCITRasRljSthjsXHC64eINn8g%3D%3D</a>"
}
],
"createdBy": "Shipper Cron",
"createdDate": "2020-07-11T04:40:03+00:00",
"trackURL":
"https://gosend-livetracking.gojek.co.id/go-send/livetracking/detail?trac
kingId=SRqn3Sj-JpDx6_6DMMiqtOdSk8T_Z2W2w7ew8DYQeQn_Z4D9ndH-YZf5nMrcXCITRa
sRljSthjsXHC64eINn8g%3D%3D",
"uniqueID": "7cdf36d2377d0d3bfd9b3cf25c4e2720"
},
],
"detail": {
"id": "3E79561",
"externalID": "",
"labelChecksum":
"30a0108baa0adc2ba6b6e98a0f39f642",
"consigner": {
"id": "583ef085a8e9f1d81bb40c69",
"name": "",
"phoneNumber": "+6281213873326"
},
"consignee": {
"id": "5891ff00bd29b6391ca2a1e1",
"name": "Demon Lord Udin",
"phoneNumber": "+6281213452322"
},
"awbNumber": "GK-11-317240421",
"package": {
"type": "Paket Kecil",
"itemName": "Baju",
"contents": "Baju Pesta",
"price": {
"value": 10000,
"UoM": "IDR"
},
"dimension": {
"length": {
"value": 20,
"UoM": "cm"
},
"height": {
"value": 40,
"UoM": "cm"
},
"width": {
"value": 30,
"UoM": "cm"
}
},
"weight": {
"value": 1,
"UoM": "kg"
},
"volumeWeight": {
"value": 4,
"UoM": "kg"
},
"pictureURL": "",
"isConfirmed": 0
},
"origin": {
"address": "bnn cawang",
"direction": "bnn cawang",
"cityID": 42,
"cityName": "Jakarta Barat",
"provinceID": 6,
"provinceName": "DKI Jakarta"
},
"destination": {
"address": "lapangan banteng",
"direction": "lapangan banteng",
"cityID": 67,
"cityName": "Sumedang",
"provinceID": 9,
"provinceName": "Jawa Barat"
},
"driver": {
"name": "Mr. No-Brake",
"phoneNumber": "+6281213456789",
"vehicleType": "Honda Jazz Putih",
"vehicleNumber": "B 1 JI"
},
"courier": {
"rate_id": 2,
"rate_name": "REG",
"name": "JNE",
"shipmentType": "Express",
"min_day": 1,
"max_day": 1,
"rate": {
"value": 18000,
"UoM": "IDR"
}
},
"rates": {
"shipment": {
"value": 20000,
"UoM": "IDR"
},
"paidShipment": {
"value": 20000,
"UoM": "IDR"
},
"actualShipment": {
"value": 0,
"UoM": "IDR"
},
"insurance": {
"value": 0,
"UoM": "IDR"
},
"paidInsurance": {
"value": 0,
"UoM": "IDR"
},
"actualInsurance": {
"value": 0,
"UoM": "IDR"
},
"escrowCost": {
"value": 0,
"UoM": "IDR"
},
"fulfillmentCost": {
"value": 0,
"UoM": "IDR"
},
"itemPrice": {
"value": 10000,
"UoM": "IDR"
},
"discount": {
"value": 0,
"UoM": "IDR"
}
},
"useInsurance": 0,
"isLabelPrinted": 0,
"paymentType": "postpay",
"source": "api",
"isActive": 1,
"readyTime": "2020-07-11T04:39:05+00:00",
"pickUpTime": "2020-07-11T04:39:05+00:00",
"creationDate": "2020-07-11T04:39:05+00:00",
"activeDate": "2020-07-11T04:39:05+00:00",
"lastUpdatedDate": "2020-07-31T00:00:00+00:00",
"shipmentArea": "domestic",
"creationDate": "2017-02-05T23:37:44+07:00",
"lastUpdatedDate": "",
"useInsurance": 0
}
},
"statusCode": 200
}
}

Important Return Section at Order Detail :

Category Section Details

Tracking - Contains package tracking log and status

trackStatus Contains package tracking log with Shipper


Mapping Status (please refer to endpoint Get
All Tracking Status for status example)

logisticStatus Contains package tracking log with Logistic


mapping status (For instant and sameday,
live tracking URL will be informed at this
description)

Detail ID Shipper Tracking ID

externalID The merchant’s self-tailored order ID

awbNumber Logistic Air Waybill /. Tracking ID

labelChecksum To be used to print shipper label of order

consigner Contain information about consigner


consignee Contain information about consignee

package Contain information about the package


(price, dimension, weight etc)

origin Contain information about shipment origin

destination Contain information about shipment


destination

driver Contain information about shipment driver

courier Contain information about shipment logistic /


courier

rates Contain information about shipment rates


(shipment rate, insurance rate etc)

f. Order Update
Update an order’s package’s weight and dimension.
Method PUT

Url public/v1/orders/[ORDER_ID]

Parameter URL Params


Name Type Details Compulsory
(mandatory)

ORDER_ID String Id obtained from Order Creation Yes


(string) or order tracking ID (string)

Parameter Body
Name Type Details Compulsory
(mandatory)

l Integer/Float Item Length (cm) Yes

w Integer/Float Item Width (cm) Yes

h Integer/Float Item Height (cm) Yes

wt Integer/Float Item Weight (kg) Yes


Example Request :
curl - X PUT
'https://api.sandbox.shipper.id/public/v1/orders/1XKXKXK?apiKey=[Y
OUR_APIKEY]' - H 'User-Agent: Shipper/' - H
'Content-Type:application/json' - d '{ "l": 1, "w":1, "h":1,
"wt":1 }'

Success Response :
{
"status": "success",
"data":
{
"title": "OK",
"content": "Successfully correcting order 1XXXXXK",
"correctedFields": {
"weight": 1,
"volumeWeight": 1,
"length": 10,
"height": 10,
"width": 10,
"compulsoryInsurance": 0,
"insurance": 0,
"finalRate": 18000
},
"statusCode": 200
}
}

g. Order Cancellation
Cancel an order.
Method PUT

Url public/v1/orders/[ORDER_ID]/cancel

Parameter URL Params


Name Type Details Compulsory
(mandatory)

ORDER_ID String Id obtained from Order Yes


Creation or order tracking ID

Example Request :
curl - X PUT
'https://api.sandbox.shipper.id/public/v1/orders/1XKXKXK/cancel?ap
iKey=[YOUR_APIKEY]' - H 'User-Agent: Shipper/' - H
'Content-Type:application/json' - d '{ "l": 1, "w":1, "h":1,
"wt":1 }'
Success Response :
{
"status": "success",
"data": {
"title": "OK",
"message": "Successfully cancel order 1xxxxxx",
"statusCode": 200
}
}

"statusCode": 200
}
}

Notes :
a. In regular, express and trucking service, you can cancel order if the
package is not yet to be handover to our logistic partner
b. In Instant and Sameday service, you still can cancel order if the driver
accept the order but you can’t cancel it if the driver state is “On going” to
pickup location

4. Pickup Orders

The pickup process can be done in two ways, either by requesting POST Pickup
Request or PUT Order Activation, depending on the service you chose.

Service Regular & Express Go-Send, Grab courier


services & J&T Hubless

Method POST Pickup Request PUT Order Activation


a. Pickup Request
Assign agents and activate orders. In this endpoint, you must select our agent to
assign the pickup.
Method POST

Url public/v1/pickup

Parameter Body
Name Type Details Compulsory
(mandatory)

orderIds Array Tracking id (7 char) for Yes


example : 1A00009
[You can input multiple
orderids as an array]

datePickup Date Time Date time string with Yes


format YYYY-MM-DD
HH:mm:ss

agentId Number Agent id from get No


(integer) agent by suburb

Example Request :
curl -X POST -H 'User-Agent: Shipper/' -H 'Content-Type:
application/json'
'https://api.sandbox.shipper.id/public/v1/pickup?apiKey=[YOUR_APIK
EY]' -d '{"orderIds": ["1A88888","1A88888"],"agentId": 89,"datePickup":
"2019-11-30 10:30:00"}'.

Success Response :
{
"status": "success",
"data": {
"title": "OK",
"message": "Pickup request success, please wait, our agent
will contact you soon",
"statusCode": 200
}
}
b. Cancel Pickup
Cancel pickup request. You can’t cancel if the package has been picked up.
Method PUT

Url public/v1/pickup/cancel

Parameter Body
Name Type Details Compulsory
(mandatory)

orderIds Array Tracking id (7 char) for Yes


example : 1A00009

Example Request :
curl -X PUT -H 'User-Agent: Shipper/' -H 'Content-Type:
application/json'
'https://api.sandbox.shipper.id/public/v1/pickup/cancel?apiKey=[YO
UR_APIKEY]' -d '{"orderIds": ["1A88888","1A88888"]}'.

Success Response :
{
"status": "success",
"data": {
"title": "OK",
"message": "Pickup request cancelled",
"statusCode": 200
}
}

c. Get Agents by Suburb


Get agent by origin suburb id. You can use this endpoint to check shipper pickup
coverage area by Suburb ID(If no agent returned, its out of Shipper pickup area).
This agent id can be used for pickup request if you want to choose specific agent
id.
Method GET

Url public/v1/agents

Parameter URL Query


Name Type Details Compulsory
(mandatory)

suburbId Number (integer) Suburb id from get Yes


suburb from order detail.
Success Response :
{
"status": "success",
"data": {
"title": "OK",
"message": "Agents Available",
"statusCode": 200,
"data": [
{
"agent": {
"id": 1001,
"name": "Shipper Kuningan Timur"
},
"city": {
"id": 41,
"name": "Jakarta Selatan"
},
"location": {
"latitude": -6.231427,
"longitude": 106.827487
},
"contact": {
"name": "Yudha Utama",
"phone": "+6287780413219"
}
}
]
}
}

Example Request :
curl -X PUT -H 'User-Agent: Shipper/' -H 'Content-Type:
application/json'
'https://api.sandbox.shipper.id/public/v1/pickup/cancel?apiKey=[YO
UR_APIKEY]' -d '{"orderIds": ["1A88888","1A88888"]}'.

h. Order Activation

As explained above, order activation is used for GO-SEND, GRAB courier, and
J&T Hubless.

If you created an order using J&T, you need to check the value of isHubless
parameter from get order detail, if it is 0, you can use request pickup, if it is 1 you
must use order activation. It is because, when isHubless is 1, there is no Shipper
Agent in that area, so J&T courier will collect the item directly from the origin just
like GRAB & GO-SEND service.

Please be mindful of the cutoff time for GRAB & GO-SEND services if you want
to activate the order. Click here for the details.

If you use order activation, you don’t have to use pickup request endpoint.
Method PUT

Url public/v1/activations/[ORDER_ID]

Parameter URL Params


Name Type Details Compulsory
(mandatory)

ORDER_ID String Id obtained from Order Creation Yes


(string) or order tracking ID (string)

Parameter Body
Name Type Details Compulsory
(mandatory)

active Integer Activation flag (0 for order Yes


deactivation, 1 for activation)

agentId Integer Agent id based on your city or suburb No

Example Request :
curl -X PUT
'https://api.sandbox.shipper.id/public/v1/activations/1XKXKXK?apiK
ey=[YOUR_APIKEY]' -H 'User-Agent: Shipper/' -H
'Content-Type:application/json' -d '{ "active": 1 }'
Success Response :
{
"status": "success",
"data": {
"message": "Successfully activated order 1XKXKXK",
"statusCode": 200
}
}

5. Furthermore
Some additional endpoints to support your integrations.

a. Get All Tracking Status


Retrieve example of our status

Method GET

Url public/v1/logistics/status

Example Request :
curl -X GET -H 'User-Agent: Shipper/'
'https://api.sandbox.shipper.id/public/v1/logistics/status?apiKey=
[YOUR_APIKEY]'.

Success Response :
{
"status": "success",
"data": {
"title": "OK",
"content": "Successfully retrieve tracking Status",
"rows": [
{
"id": 1,
"name": "Order Diterima",
"description": "Order sudah diterima"
}
// And so on...
]
}
}

b. Generate AWB Number


Generate AWB from related logistic, in case that your AWB number in
your order is not generated yet when order are sent to related logistic (H+1
Pickup). You can get AWB normally at the Order detail endpoint.

Method GET

Url public/v1/awbs/generate

Parameter URL Params

Name Type Details Compulsory


(mandatory)

eid String External ID of the Yes


order

oid String Order ID or order Yes


tracking ID

Example Request :
curl -X GET -H 'User-Agent: Shipper/'
'https://api.sandbox.shipper.id/public/v1/awbs/generate
?apiKey=[YOUR_APIKEY]&eid=[YOUR_EXTERNAL_ID]&oid=[YOUR_ORDER_ID]'.

Success Response :
{
"status": "success",
"data": {
"message": "Successfully retrieving order 1A00209",
"awbNumber": "12s3",
"statusCode": 200
}
}

6. Important Notes

a. Access to Shipper BOS Dashboard


You can access Shipper BOS Dashboard at http://shipper.id/bos for production and
https://sandbox.shipper.id/bos for sandbox. At BOS, you can monitor your order and also
do manual create order as well etc.

When at login Shipper BOS page, fill your email or phone number (the one you
registered to Sandbox/Production API with Shipper teams) and password (default
password is qwerasdf for Sandbox and shipper123 for Production| You can change it
later)
b. Final Weight Calculation Rules
Final weight is the heaviest weight between actual weight and volumetric weight. Every
logistic and service have their own volumetric weight formula ( length*width*height
divided by 4000 or 5000 or 6000 ). We recommend to calculate items that have been
packed for final actual weight and volumetric weight of all items of an order.

c. Insurance Calculation Rules


Shipper get insurance prices from each logistic that has their own insurance calculation
rules. Please take note, There is compulsory insurance rules if item price of an order
exceeds insurance limit although the order does not use insurance.

You might also like