Lewati ke konten
Kontainer Indonesia
OpenAPI 3.1

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 menit

Referensi endpoint

Listing

GET/v1/listingsCari listing aktif

Pencarian full-text + filter faset. Pagination berbasis cursor (`nextCursor`). Scope: `listings:read`.

ParameterLokasiKeterangan
qqueryKata kunci (full-text).
tipequeryjual,sewa,modifikasi,jasa (dipisah koma)
ukuranquery10ft,20ft,40ft,40hc,45ft
jenisquerydry,high_cube,reefer,open_top,flat_rack,iso_tank,office,modified
kondisiquerynew,cargo_worthy,wwt,as_is
provinsiqueryKode provinsi Kemendagri, mis. 31
kotaqueryKode kab/kota, mis. 35.78
harga_minquery—
harga_maksquery—
terverifikasiquery1 = hanya vendor terverifikasi
urutquery—
tujuanqueryKode kota tujuan untuk urut=terdekat
cursorquery—
limitquery1–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
ParameterLokasiKeterangan
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`.

ParameterLokasiKeterangan
ukuran*query—
metrikqueryDefault sale
provinsiquery—
kotaquery—
dariqueryYYYY-MM-DD
sampaiqueryYYYY-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
ParameterLokasiKeterangan
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`.

ParameterLokasiKeterangan
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`.

ParameterLokasiKeterangan
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
ParameterLokasiKeterangan
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