Dikebut

Dikebut API

Satu API key, dua layanan: Pengiriman (multi-kurir nasional) & Maps (geocode, jarak, rute). REST · JSON · ongkir at-cost (tanpa markup).

Service A · /v1/shippingService B · /v1/maps

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/couriersDaftar kurir didukung (semua available).
GET/shipping/couriers?origin=&destination=&weight=Ketersediaan REAL per rute (origin/destination = destinationId, weight gram).
curl
curl "https://dikebut.zenenta.net/api/v1/shipping/couriers?destination=12345&weight=1000" \
  -H "Authorization: Bearer sk_live_xxx"
json
[ { "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.

⬇️ Download Postman Collection

Cari kota/kecamatan tujuan → dapat destinationId yang dipakai saat hitung ongkir & buat order.

GET/shipping/destinations?q=Autocomplete alamat → kandidat + id.
curl
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/ratesDaftar tarif semua kurir (reguler + cargo).
curl
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/ordersBuat order pengiriman.
curl
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/insuranceAturan asuransi (minimum nilai, premi).
json
{ "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/commoditiesDaftar jenis komoditas (id + nama).

Pickup Order

Jadwalkan penjemputan paket oleh kurir.

POST/shipping/orders/:id/pickupJadwalkan pickup (date, time, vehicle).
curl
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/:idDetail 1 order (status, AWB, biaya, alamat).

Label Order

Ambil URL label/resi untuk dicetak & ditempel di paket.

GET/shipping/orders/:id/labelURL label PDF (atau AWB bila label belum tersedia).
json
{ "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/cancelBatalkan + 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/trackLacak posisi resi (manifest).

Webhook

Set URL di Dashboard → Webhook (Pro+). Kami POST tiap update status, ditandatangani HMAC-SHA256.

http
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/distanceJarak tempuh jalan + durasi (2 titik).
POST/maps/routeRute lengkap + geometri (GeoJSON).
POST/maps/matrixMatriks jarak/durasi (maks 100 pasangan).
curl
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 } }'
json
{ "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-ratesHitung ongkir kurir-sendiri ke titik tujuan.
POST/distance-shipmentsCatat kiriman kurir-sendiri (tak potong saldo Dikebut).
curl
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.*.

html
<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>
node
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 (baca message).

Error selalu { statusCode, message }.