Kontainer.id Enterprise API
Hubungkan ERP, aplikasi procurement, atau sistem logistik Anda dengan data listing, Indeks Harga Kontainer, RFQ, status order, dan tracking pengiriman.
Autentikasi
Kirim API key organisasi di header Authorization: Bearer kid_live_…. Key hanya untuk server-ke-server — jangan disematkan di aplikasi browser atau mobile.
curl https://api.kontainer.id/v1/listings?ukuran=20ft&kota=35.78 \ -H "Authorization: Bearer $KONTAINER_API_KEY"
Base URL: https://api.kontainer.id/v1
Batas & format
Rate limit per key sesuai paket (60 atau 600 request/menit) → 429 rate_limited dengan Retry-After.
Kuota bulanan per organisasi → header X-Quota-Limit & X-Quota-Used; paket Enterprise dapat melebihi kuota dan ditagih per 1.000 request.
Error selalu berbentuk { "error": { "code", "message", "details" } }. Uang dalam rupiah (integer), waktu dalam unix milidetik, pagination dengan cursor.
Verifikasi webhook
Setiap pengiriman ditandatangani dengan secret webhook Anda.
// Node.js
import crypto from "node:crypto";
const ts = req.headers["x-kontainer-timestamp"];
const expected = "sha256=" + crypto.createHmac("sha256", process.env.KONTAINER_WEBHOOK_SECRET).update(ts + "." + rawBody).digest("hex");
const valid = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers["x-kontainer-signature"]))
&& Math.abs(Date.now() / 1000 - Number(ts)) < 300; // tolak replay > 5 menitReferensi endpoint
Listing
GET/v1/listingsCari listing aktif
Pencarian full-text + filter faset. Pagination berbasis cursor (`nextCursor`). Scope: `listings:read`.
| Parameter | Lokasi | Keterangan |
|---|---|---|
| q | query | Kata kunci (full-text). |
| tipe | query | jual,sewa,modifikasi,jasa (dipisah koma) |
| ukuran | query | 10ft,20ft,40ft,40hc,45ft |
| jenis | query | dry,high_cube,reefer,open_top,flat_rack,iso_tank,office,modified |
| kondisi | query | new,cargo_worthy,wwt,as_is |
| provinsi | query | Kode provinsi Kemendagri, mis. 31 |
| kota | query | Kode kab/kota, mis. 35.78 |
| harga_min | query | — |
| harga_maks | query | — |
| terverifikasi | query | 1 = hanya vendor terverifikasi |
| urut | query | — |
| tujuan | query | Kode kota tujuan untuk urut=terdekat |
| cursor | query | — |
| limit | query | 1–48, default 24 |
Respons: 200 Halaman hasil · 400 Permintaan tidak valid · 401 API key tidak valid · 403 Scope/paket tidak mengizinkan · 404 Tidak ditemukan · 422 Validasi gagal · 429 Rate limit atau kuota terlampaui
GET/v1/listings/{id}Detail listing
| Parameter | Lokasi | Keterangan |
|---|---|---|
| id* | path | — |
Respons: 200 Listing · 400 Permintaan tidak valid · 401 API key tidak valid · 403 Scope/paket tidak mengizinkan · 404 Tidak ditemukan · 422 Validasi gagal · 429 Rate limit atau kuota terlampaui
Data
GET/v1/price-indexIndeks Harga Kontainer harian
Median, persentil, dan rentang harga harian (agregat & anonim). Tanpa `provinsi`/`kota` = nasional. Scope: `price_index:read`.
| Parameter | Lokasi | Keterangan |
|---|---|---|
| ukuran* | query | — |
| metrik | query | Default sale |
| provinsi | query | — |
| kota | query | — |
| dari | query | YYYY-MM-DD |
| sampai | query | YYYY-MM-DD |
Respons: 200 Deret harian · 400 Permintaan tidak valid · 401 API key tidak valid · 403 Scope/paket tidak mengizinkan · 404 Tidak ditemukan · 422 Validasi gagal · 429 Rate limit atau kuota terlampaui
RFQ
POST/v1/rfqsBuat RFQ
Membuat RFQ atas nama organisasi pemilik API key; RFQ langsung didistribusikan ke vendor relevan. Scope: `rfq:write`.
{
"title": "Kebutuhan 10 unit kontainer 20ft untuk gudang proyek",
"needType": "buy",
"description": "Kontainer 20ft kondisi cargo worthy, dikirim ke lokasi proyek di Surabaya minggu depan.",
"provinceId": "35",
"cityId": "35.78",
"deadlineDays": 7,
"items": [
{
"sizeCode": "20ft",
"typeCode": "dry",
"conditionCode": "cargo_worthy",
"quantity": 10
}
]
}Respons: 201 RFQ dibuat · 400 Permintaan tidak valid · 401 API key tidak valid · 403 Scope/paket tidak mengizinkan · 404 Tidak ditemukan · 422 Validasi gagal · 429 Rate limit atau kuota terlampaui
GET/v1/rfqs/{id}Status RFQ & ringkasan penawaran
| Parameter | Lokasi | Keterangan |
|---|---|---|
| id* | path | — |
Respons: 200 RFQ · 400 Permintaan tidak valid · 401 API key tidak valid · 403 Scope/paket tidak mengizinkan · 404 Tidak ditemukan · 422 Validasi gagal · 429 Rate limit atau kuota terlampaui
Order
GET/v1/orders/{id}Status order
Order tempat organisasi Anda menjadi pembeli atau vendor. Menerima ID atau kode order. Scope: `orders:read`.
| Parameter | Lokasi | Keterangan |
|---|---|---|
| id* | path | — |
Respons: 200 Order · 400 Permintaan tidak valid · 401 API key tidak valid · 403 Scope/paket tidak mengizinkan · 404 Tidak ditemukan · 422 Validasi gagal · 429 Rate limit atau kuota terlampaui
Tracking
GET/v1/shipments/{code}Tracking pengiriman
Timeline status pengiriman (dieksekusi oleh Logistikku.id). Scope: `shipments:read`.
| Parameter | Lokasi | Keterangan |
|---|---|---|
| code* | path | — |
Respons: 200 Shipment · 400 Permintaan tidak valid · 401 API key tidak valid · 403 Scope/paket tidak mengizinkan · 404 Tidak ditemukan · 422 Validasi gagal · 429 Rate limit atau kuota terlampaui
Webhook
POST/v1/webhooksDaftarkan webhook
Kontainer.id mengirim POST JSON ke URL Anda untuk event terpilih. Verifikasi header `X-Kontainer-Signature: sha256=HMAC_SHA256(secret, timestamp + '.' + body)` dengan `X-Kontainer-Timestamp`. `secret` hanya ditampilkan sekali. Scope: `webhooks:manage`.
{
"url": "https://erp.perusahaan.co.id/hooks/kontainer",
"events": [
"shipment.updated",
"order.updated"
]
}Respons: 201 Webhook dibuat · 400 Permintaan tidak valid · 401 API key tidak valid · 403 Scope/paket tidak mengizinkan · 404 Tidak ditemukan · 422 Validasi gagal · 429 Rate limit atau kuota terlampaui
GET/v1/webhooksDaftar webhook
Respons: 200 Webhook · 400 Permintaan tidak valid · 401 API key tidak valid · 403 Scope/paket tidak mengizinkan · 404 Tidak ditemukan · 422 Validasi gagal · 429 Rate limit atau kuota terlampaui
DELETE/v1/webhooks/{id}Nonaktifkan webhook
| Parameter | Lokasi | Keterangan |
|---|---|---|
| id* | path | — |
Respons: 204 Dinonaktifkan · 400 Permintaan tidak valid · 401 API key tidak valid · 403 Scope/paket tidak mengizinkan · 404 Tidak ditemukan · 422 Validasi gagal · 429 Rate limit atau kuota terlampaui
Akun
GET/v1/usagePemakaian bulan berjalan
Respons: 200 Pemakaian · 400 Permintaan tidak valid · 401 API key tidak valid · 403 Scope/paket tidak mengizinkan · 404 Tidak ditemukan · 422 Validasi gagal · 429 Rate limit atau kuota terlampaui
Coba langsung
Request dikirim dari browser Anda ke API dengan key yang Anda masukkan. Pemakaian dihitung ke kuota organisasi.
Tidak disimpan di browser. Buat key di Dasbor → Enterprise API.
Kata kunci (full-text).
jual,sewa,modifikasi,jasa (dipisah koma)
10ft,20ft,40ft,40hc,45ft
dry,high_cube,reefer,open_top,flat_rack,iso_tank,office,modified
new,cargo_worthy,wwt,as_is
Kode provinsi Kemendagri, mis. 31
Kode kab/kota, mis. 35.78
1 = hanya vendor terverifikasi
Kode kota tujuan untuk urut=terdekat
1–48, default 24