⚑Dikebut

Dikebut API

Satu API key untuk pengiriman (multi-kurir via Komship) + peta & ongkir per jarak (OSM/Google). REST, JSON, ongkir at-cost.

πŸš€ Quickstart

1. Daftar β†’ Dashboard β†’ API Keys β†’ buat key. 2. Coba hitung jarak:

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 }

Jarak = jarak tempuh jalan (bukan garis lurus), deterministik β€” koordinat sama selalu menghasilkan km yang sama (bisa di-cache/audit).

πŸ”‘ Autentikasi

Sertakan secret API key di setiap request. Buat di Dashboard β†’ API Keys.

Authorization: Bearer sk_live_xxxxxxxx
# atau
x-api-key: sk_live_xxxxxxxx
  • β€’ sk_test_… β€” sandbox (uji coba).
  • β€’ sk_live_… β€” produksi (paket Pro+).
  • β€’ ⚠️ Secret key rahasia β€” pakai dari server, jangan tanam di browser publik.

πŸ“¦ JavaScript SDK

SDK ringan (browser + Node, tanpa dependency).

html
<script src="https://dikebut.zenenta.net/sdk/dikebut.js"></script>
<script>
  const dk = new Dikebut({ apiKey: 'sk_live_xxx' });
  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
  const g = await dk.maps.geocode('Monas Jakarta');
  console.log(g.results[0]);                // { lat, lng, label }
</script>
node
const Dikebut = require('dikebut');
const dk = new Dikebut({ apiKey: process.env.DIKEBUT_KEY });
const rate = await dk.distanceRates({ receiver: { lat:-6.3, lng:106.8 } });

Komponen peta + pin: Dikebut.mapPicker(el, opts) (Leaflet + tile OSM). Coba di Dashboard β†’ Maps.

πŸ—ΊοΈ Maps API

Engine default OSM (at-cost). Tambah ?engine=google untuk Google (butuh 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).

Contoh: rute + geometri

curl
curl https://dikebut.zenenta.net/api/v1/maps/route -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{ "points":[{"lat":-6.24,"lng":106.79},{"lat":-6.31,"lng":106.80}], "geometry":true }'

πŸ’‘ Presisi terbaik: kirim koordinat (dari pin peta), bukan teks alamat.

🚚 Ongkir 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.

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 } }'
json
{ "distanceKm": 8.86, "durationMin": 10, "engine": "osm",
  "couriers": [ { "id":"...", "name":"Kurir Toko", "price":29000, "etd":"1-3 jam" } ] }

POST /distance-shipments mencatat kiriman kurir-sendiri (tak memotong saldo Dikebut).

πŸ“¦ Shipping (multi-kurir via Komship)

Ongkir at-cost ke kurir nasional (JNE, J&T, SiCepat…). Saldo dipotong sebesar ongkir saat buat kiriman.

GET/destinations?q=Cari kode tujuan (destination id).
POST/ratesHitung ongkir semua kurir.
POST/shipmentsBuat kiriman β†’ cek kuota β†’ potong saldo β†’ order kurir.
GET/shipments/:id/trackLacak resi.
GET/shipments/:id/labelLabel/resi.
POST/shipments/:id/pickup Β· /cancelPickup / batal (refund).
curl
curl https://dikebut.zenenta.net/api/v1/shipments -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" -d '{
    "warehouseId":"wh_xxx",
    "receiver":{"name":"Budi","phone":"0812...","address":"Jl Mawar 1, Bandung","destinationId":"12345"},
    "courier":"jne","service":"REG","weightGram":1000,"itemValue":50000 }'

πŸͺ 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 Anda, bandingkan dengan header.

⚠️ 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).

Kuota Maps/bln: Free 1.000 Β· Starter 10.000 Β· Pro 50.000 Β· Bisnis unlimited. Error selalu { statusCode, message }.