Dikebut API
Satu API key, dua layanan: Pengiriman (multi-kurir nasional) & Maps (geocode, jarak, rute). REST · JSON · ongkir at-cost (tanpa markup).
Introduction
Dikebut adalah gateway pengiriman & peta. Kamu daftar ke kami, pakai 1 API key Dikebut, dan dapat akses penuh fitur pengiriman: cek ongkir multi-ekspedisi, buat order, jadwalkan pickup, lacak resi, cetak label, batalkan, plus webhook status. Ongkir diteruskan apa adanya — kami untung dari langganan, bukan markup.
- • Service A — Shipping:
/v1/shipping/*(cek ongkir, order, pickup, resi, label, cancel, webhook). - • Service B — Maps:
/v1/maps/*(geocode, reverse, jarak, rute, matrix).
Endpoint
Semua request ke base URL di bawah (HTTPS). Sandbox & live dibedakan oleh prefix API key, bukan host.
https://dikebut.zenenta.net/api/v1
Format respons sukses = objek/array JSON. Error = { statusCode, message }.
Authorization
Sertakan secret API key di tiap request (header Bearer atau x-api-key). Buat di Dashboard → API Keys.
Authorization: Bearer sk_live_xxxxxxxx # atau x-api-key: sk_live_xxxxxxxx
- •
sk_test_…— sandbox (uji coba, tak menagih saldo riil). - •
sk_live_…— produksi (paket Pro+). - • ⚠️ Secret key rahasia — panggil dari server, jangan tanam di browser publik.
3PL Availability
Daftar kurir (3PL) yang didukung. Beri parameter rute untuk tahu kurir & layanan yang benar-benar tersedia untuk rute itu.
| GET | /shipping/couriers | Daftar kurir didukung (semua available). |
| GET | /shipping/couriers?origin=&destination=&weight= | Ketersediaan REAL per rute (origin/destination = destinationId, weight gram). |
curl "https://dikebut.zenenta.net/api/v1/shipping/couriers?destination=12345&weight=1000" \ -H "Authorization: Bearer sk_live_xxx"
[ { "code":"jne", "name":"JNE", "available":true,
"services":[ { "service":"REG", "cost":18000, "etd":"2-3 hari" } ] }, ... ]Postman Collection
Impor koleksi siap-pakai (semua endpoint + contoh body). Set variable baseUrl & apiKey.
Search Destination
Cari kota/kecamatan tujuan → dapat destinationId yang dipakai saat hitung ongkir & buat order.
| GET | /shipping/destinations?q= | Autocomplete alamat → kandidat + id. |
curl "https://dikebut.zenenta.net/api/v1/shipping/destinations?q=bandung" -H "Authorization: Bearer sk_live_xxx"
Calculate Delivery Price
Hitung ongkir semua kurir untuk rute + berat. Harga = tarif kurir apa adanya (at-cost).
| POST | /shipping/rates | Daftar tarif semua kurir (reguler + cargo). |
curl https://dikebut.zenenta.net/api/v1/shipping/rates -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" -d '{
"shipperDestinationId": "111",
"receiverDestinationId": "12345",
"weightGram": 1000, "itemValue": 50000, "cod": false }'Create Order
Buat order kirim → cek kuota → potong saldo sebesar ongkir (non-COD) → order ke kurir. Mengembalikan order + AWB (bila langsung terbit).
| POST | /shipping/orders | Buat order pengiriman. |
curl https://dikebut.zenenta.net/api/v1/shipping/orders -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" -d '{
"warehouseId": "wh_xxx",
"receiver": { "name":"Budi", "phone":"08120000000",
"address":"Jl. Mawar 1, Bandung", "destinationId":"12345" },
"courier": "jne", "service": "REG",
"weightGram": 1000, "itemValue": 50000,
"insurance": false, "cod": false,
"items": [{ "name":"Produk A", "price":50000, "qty":1 }] }'warehouseId opsional bila sudah ada gudang utama; atau kirim objek shipper lengkap.
About Insurance
Asuransi melindungi nilai barang. Aktifkan dengan insurance:true + itemValue saat buat order.
| GET | /shipping/insurance | Aturan asuransi (minimum nilai, premi). |
{ "minInsurableValue": 300000, "ratePercent": 0.2, "currency": "IDR",
"note": "Asuransi hanya untuk barang > Rp300.000…" }⚠️ Barang < Rp300.000 → order tetap dibuat, tapi tanpa asuransi (aturan asuransi kurir).
About Commodity
Jenis komoditas barang (untuk klasifikasi cargo/asuransi).
| GET | /shipping/commodities | Daftar jenis komoditas (id + nama). |
Pickup Order
Jadwalkan penjemputan paket oleh kurir.
| POST | /shipping/orders/:id/pickup | Jadwalkan pickup (date, time, vehicle). |
curl https://dikebut.zenenta.net/api/v1/shipping/orders/ORDER_ID/pickup -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" -d '{ "date":"2026-07-01", "time":"09:00", "vehicle":"Motor" }'Detail Order
| GET | /shipping/orders/:id | Detail 1 order (status, AWB, biaya, alamat). |
Label Order
Ambil URL label/resi untuk dicetak & ditempel di paket.
| GET | /shipping/orders/:id/label | URL label PDF (atau AWB bila label belum tersedia). |
{ "awb": "JNE000123", "courier": "JNE", "service": "REG", "url": "https://…/label.pdf" }Cancel Order
Batalkan order yang belum dijemput. Saldo dikembalikan (non-COD).
| POST | /shipping/orders/:id/cancel | Batalkan + refund saldo at-cost. |
History Order
Daftar semua order (paginasi + filter status). Juga tersedia + bisa di-track/batal di Dashboard → Kiriman.
| GET | /shipping/orders?page=&limit=&status= | Riwayat order. |
| GET | /shipping/orders/:id/track | Lacak posisi resi (manifest). |
Webhook
Set URL di Dashboard → Webhook (Pro+). Kami POST tiap update status, ditandatangani HMAC-SHA256.
POST <url-anda>
x-dikebut-event: shipment.status
x-dikebut-signature: <hmac_sha256(rawBody, signing_secret)>
{ "event":"shipment.status",
"data":{ "id":"...", "status":"delivered", "awb":"...", "courier":"JNE" },
"timestamp":"2026-..." }Verifikasi: hitung HMAC-SHA256 atas raw body dengan signing secret, bandingkan dengan header.
Maps API (Service B)
Engine default (at-cost) sudah aktif — tak perlu parameter. Tambah ?engine=google untuk Google Maps (BYOK key di Pengaturan).
| GET | /maps/geocode?q= | Alamat → kandidat titik (lat,lng,label). |
| GET | /maps/reverse?lat=&lng= | Titik → alamat. |
| POST | /maps/distance | Jarak tempuh jalan + durasi (2 titik). |
| POST | /maps/route | Rute lengkap + geometri (GeoJSON). |
| POST | /maps/matrix | Matriks jarak/durasi (maks 100 pasangan). |
curl https://dikebut.zenenta.net/api/v1/maps/distance -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" -d '{
"origin": { "lat": -6.2441, "lng": 106.7976 },
"dest": { "lat": -6.3088, "lng": 106.7979 } }'{ "engine": "osm", "distanceMeters": 8858, "distanceKm": 8.86, "durationSec": 625 }💡 Presisi terbaik: kirim koordinat (dari pin peta), bukan teks alamat. Jarak deterministik → bisa di-cache/audit.
Kurir Per Jarak (kurir sendiri)
Untuk merchant yang antar sendiri. Set Titik Asal & tarif di Dashboard → Kurir Per Jarak. Rumus: basePrice + ceil(max(0, km−freeRadius)) × perKm.
| POST | /distance-rates | Hitung ongkir kurir-sendiri ke titik tujuan. |
| POST | /distance-shipments | Catat kiriman kurir-sendiri (tak potong saldo Dikebut). |
curl https://dikebut.zenenta.net/api/v1/distance-rates -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" -d '{ "receiver": { "lat":-6.3088, "lng":106.7979 } }'JavaScript SDK
SDK ringan (browser + Node, tanpa dependency). Namespace dk.shipping.* & dk.maps.*.
<script src="https://dikebut.zenenta.net/sdk/dikebut.js"></script>
<script>
const dk = new Dikebut({ apiKey: 'sk_live_xxx' });
// Shipping
const rates = await dk.shipping.rates({ shipperDestinationId:'111', receiverDestinationId:'12345', weightGram:1000 });
const order = await dk.shipping.createOrder({ /* … */ });
const trk = await dk.shipping.track(order.id);
// Maps
const d = await dk.maps.distance({ lat:-6.2441, lng:106.7976 }, { lat:-6.3088, lng:106.7979 });
console.log(d.distanceKm, 'km'); // 8.86 km
</script>const Dikebut = require('dikebut');
const dk = new Dikebut({ apiKey: process.env.DIKEBUT_KEY });
const couriers = await dk.shipping.couriers({ destination:'12345', weight:1000 });Komponen peta + pin: Dikebut.mapPicker(el, opts) (peta + pin siap pakai). Coba di Dashboard → Maps.
Error & Limit
401— API key tidak ada / tidak valid.402— Saldo tidak cukup (shipping) → topup.403— Kuota paket habis (order/maps) / fitur tak termasuk paket.400— Parameter tidak valid (bacamessage).
Error selalu { statusCode, message }.