Endpoint Utama
Ringkasan
POST /v1/rates adalah endpoint inti AgenWebsite Rate API. Kirim titik asal (shipper), titik tujuan (destination), dan berat paket — API mengembalikan daftar tarif kurir yang sudah ternormalisasi dan ter-branding: harga, estimasi waktu tiba (ETD), diskon, cashback, serta penanda termurah dan tercepat secara otomatis.
Base URL: https://api.agenwebsite.com/v1 · Autentikasi lewat header x-api-key · Content-Type application/json.
Request Body
Untuk setiap pihak (shipper & destination) kirim salah satu: postal_code (kode pos) atau subdistrict_id (dari /v1/locations/search). Jangan kirim keduanya sekaligus, jangan pula mengosongkan keduanya.
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
shipper |
object | Ya | Titik asal pengiriman. |
shipper.postal_code |
string | Salah satu* | Kode pos asal, mis. "40135". |
shipper.subdistrict_id |
string | Salah satu* | ID kecamatan dari /v1/locations/search. |
shipper.subdistrict_name |
string | Opsional | Nama kecamatan untuk memperjelas hasil (mis. "Dago"). |
destination |
object | Ya | Titik tujuan — struktur sama dengan shipper. |
weight |
integer | Ya | Berat paket dalam gram. Minimal 1. Contoh: 1200 = 1,2 kg. |
dimensions |
object | Opsional | Dimensi paket untuk perhitungan berat volumetrik. |
dimensions.length / width / height |
integer | Opsional | Panjang · lebar · tinggi dalam cm. |
item_value |
integer | Opsional | Nilai barang (IDR). Hanya dipakai untuk perhitungan asuransi, tidak menambah ongkir dasar. |
couriers |
array<string> | Opsional | Subset dari ["jnt","lion","sap","spx","jtc"]. Kosongkan untuk meminta semua kurir. |
sort |
string | Opsional | "cheapest" atau "fastest". Mengurutkan array rates. Default: termurah lebih dulu. |
*Untuk tiap pihak kirim tepat satu dari postal_code atau subdistrict_id.
Contoh Request
Request · cURL (lengkap)
curl -X POST https://api.agenwebsite.com/v1/rates \
-H "x-api-key: awk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"shipper": { "postal_code": "40135", "subdistrict_name": "Dago" },
"destination": { "postal_code": "10110", "subdistrict_name": "Gambir" },
"weight": 1200,
"dimensions": { "length": 20, "width": 15, "height": 10 },
"item_value": 250000,
"couriers": ["jnt", "lion"],
"sort": "cheapest"
}'
Payload minimum hanya butuh asal, tujuan, dan berat:
Request · cURL (minimum)
curl -X POST https://api.agenwebsite.com/v1/rates \
-H "x-api-key: awk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"shipper": { "postal_code": "40135" },
"destination": { "postal_code": "10110" },
"weight": 1000
}'
Struktur Response
Response mengembalikan tarif ter-branding — bukan data mentah kurir. Perhatikan data.rates[] (daftar layanan), data.cheapest / data.fastest (helper), dan rate_limit (kuota harian tersisa).
Response · 200 OK
{
"success": true,
"currency": "IDR",
"data": {
"rates": [
{
"courier_code": "jnt",
"courier_name": "J&T Express",
"courier_logo_url": "https://cdn.agenwebsite.com/couriers/jnt.png",
"service_code": "jnt_ez",
"service_name": "EZ Reguler",
"service_type": "regular",
"cost": 14000,
"cost_formatted": "Rp 14.000",
"etd_min_days": 2,
"etd_max_days": 3,
"etd_text": "2-3 hari",
"estimated_delivery": { "from": "2026-07-04", "to": "2026-07-05" },
"insurance": { "available": true, "fee": 0 },
"discount": 1000,
"discounted_cost": 13000,
"cashback": 500,
"cheapest": true,
"fastest": false,
"source": "live"
},
{
"courier_code": "lion",
"courier_name": "Lion Parcel",
"courier_logo_url": "https://cdn.agenwebsite.com/couriers/lion.png",
"service_code": "lion_reg",
"service_name": "Regpack",
"service_type": "regular",
"cost": 16000,
"cost_formatted": "Rp 16.000",
"etd_min_days": 1,
"etd_max_days": 2,
"etd_text": "1-2 hari",
"estimated_delivery": { "from": "2026-07-03", "to": "2026-07-04" },
"insurance": { "available": true, "fee": 2500 },
"discount": 0,
"discounted_cost": 16000,
"cashback": 0,
"cheapest": false,
"fastest": true,
"source": "live"
}
],
"cheapest": { "service_code": "jnt_ez", "cost": 14000 },
"fastest": { "service_code": "lion_reg", "etd_max_days": 2 },
"summary": {
"count": 2,
"cost_range": { "min": 14000, "max": 16000 }
}
},
"rate_limit": {
"limit": 30000,
"remaining": 29998,
"reset_at": "2026-07-03T00:00:00+07:00"
}
}
Penjelasan Field Response
| Field | Tipe | Keterangan |
|---|---|---|
success |
boolean | Selalu true untuk response sukses. |
currency |
string | Mata uang seluruh nilai harga — selalu "IDR". |
data.rates[] |
array | Daftar layanan pengiriman tersedia. Satu baris = satu layanan kurir. |
rates[].courier_code |
string | Kode kurir: jnt, lion, sap, spx, jtc. |
rates[].courier_name |
string | Nama tampilan kurir, mis. "J&T Express". |
rates[].courier_logo_url |
string | URL logo kurir (siap dipakai di UI checkout). |
rates[].service_code |
string | Kode unik layanan, mis. jnt_ez. Gunakan sebagai identifier. |
rates[].service_name |
string | Nama layanan, mis. "EZ Reguler". |
rates[].service_type |
string | Tipe layanan. Pada v1 selalu "regular". |
rates[].cost |
integer | Ongkir dasar (IDR) sebelum diskon. |
rates[].cost_formatted |
string | cost yang sudah diformat Rupiah, mis. "Rp 14.000". |
rates[].etd_min_days / etd_max_days |
integer | Estimasi hari tiba minimum & maksimum. |
rates[].etd_text |
string | ETD siap tampil, mis. "2-3 hari". |
rates[].estimated_delivery |
object | { from, to } — rentang tanggal perkiraan tiba (ISO date). |
rates[].insurance |
object | { available, fee } — ketersediaan & biaya asuransi (dihitung dari item_value). |
rates[].discount |
integer | Nilai diskon (IDR) yang dipotong dari cost. Selalu nilai riil, termasuk di tier Free. |
rates[].discounted_cost |
integer | Harga akhir setelah diskon = cost - discount. |
rates[].cashback |
integer | Nilai cashback (IDR) bila tersedia. Selalu nilai riil. |
rates[].cheapest |
boolean | true pada layanan dengan harga akhir termurah. |
rates[].fastest |
boolean | true pada layanan dengan ETD tercepat. |
rates[].source |
string | "live" (langsung dari kurir) atau "cache" (hasil cache 30 menit). |
data.cheapest |
object | Pintasan layanan termurah: { service_code, cost }. |
data.fastest |
object | Pintasan layanan tercepat: { service_code, etd_max_days }. |
data.summary |
object | count jumlah layanan & cost_range { min, max }. |
rate_limit |
object | limit, remaining, dan reset_at kuota harian (WIB). |
Helper Termurah & Tercepat
Tidak perlu menghitung sendiri. API sudah menandai layanan termurah dan tercepat di dua tempat, jadi Anda bisa langsung memakainya di UI checkout:
- Per-baris: flag
cheapestdanfastestpada setiap objekrates[]. - Pintasan: objek
data.cheapestdandata.fastestdi level atasdata.
Contoh mengambil rekomendasi termurah dengan JavaScript:
Helper · JavaScript
const res = await fetch("https://api.agenwebsite.com/v1/rates", {
method: "POST",
headers: {
"x-api-key": "awk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
},
body: JSON.stringify({
shipper: { postal_code: "40135" },
destination: { postal_code: "10110" },
weight: 1000,
sort: "cheapest",
}),
});
const json = await res.json();
// Opsi 1 — pakai pintasan
const termurahCode = json.data.cheapest.service_code; // "jnt_ez"
// Opsi 2 — cari lewat flag di tiap baris
const termurah = json.data.rates.find(r => r.cheapest);
const tercepat = json.data.rates.find(r => r.fastest);
console.log(termurah.courier_name, termurah.discounted_cost); // "J&T Express" 13000
Catatan Penting
- Khusus cek ongkir. API ini hanya menghitung & mengembalikan tarif ongkos kirim — tidak membuat order maupun AWB, dan tidak menangani COD/checkout. COD & AWB belum tersedia — masih dalam roadmap.
- Berat dalam gram. Kirim
weightsebagai integer gram (mis.1200). Konversi ke kilogram (pembulatan ke atas) dilakukan di sisi server — Anda tidak perlu mengurusnya. - Diskon & cashback selalu riil — termasuk di tier Free — sehingga angka yang tampil ke pembeli akurat.
- 1 request = 1 pemakaian kuota, berapa pun jumlah kurir yang diminta. Cek sisa kuota lewat header
X-RateLimit-RemainingatauGET /v1/usage.