POST /v1/rates — Cek Ongkir

Daftar Isi
  1. Ringkasan
  2. Request Body
  3. Contoh Request
  4. Struktur Response
  5. Penjelasan Field Response
  6. Helper Termurah & Tercepat
  7. Catatan Penting

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.

Cakupan: API ini khusus untuk cek ongkos kirim (menghitung tarif) — tidak membuat order maupun AWB dan tidak menangani COD/checkout. Mendukung semua kurir yang didukung AgenWebsite. Berat selalu dalam gram (integer). COD & AWB belum tersedia — masih dalam roadmap.

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 cheapest dan fastest pada setiap objek rates[].
  • Pintasan: objek data.cheapest dan data.fastest di level atas data.

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 weight sebagai 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-Remaining atau GET /v1/usage.