Sinkronkan stok ke sistem internal
Panduan ini menggambarkan alur menyinkronkan stok dari sistem gudang Anda ke OneSeller memakai rancangan API. Karena API belum tersedia, anggap langkah-langkah ini sebagai gambaran alur, bukan petunjuk yang bisa dijalankan hari ini.
Dokumentasi rencana — kontrak API belum final dan belum tersedia sebagai layanan.
Semua schema berlabel Draft. Alamat https://api.example.com adalah placeholder, bukan server nyata, dan tidak ada token yang dapat diterbitkan.
Prasyarat
- Pemahaman dasar HTTP dan JSON.
- Sistem internal (ERP atau gudang) yang dapat mengekspor stok per SKU.
- Token dengan scope
inventory:readdaninventory:write(belum dapat diterbitkan).
Langkah 1: Siapkan token dan konfigurasi
Simpan token di environment variable agar tidak ikut ter-commit. Pada tahap rancangan ini, isi dengan nilai placeholder
TOKEN_CONTOH.- Beri token scope
inventory:readdaninventory:writesaja. - Jangan menaruh token di kode sumber atau di aplikasi sisi klien.
Membaca token dari environmentDraft# Simpan token di environment, bukan di kode atau repositori export ONESELLER_TOKEN="TOKEN_CONTOH" curl "https://api.example.com/v1/stores" \ -H "Authorization: Bearer $ONESELLER_TOKEN"Contoh respons (Draft){ "data": [ { "id": "sto_example_001", "name": "Toko Contoh", "channel": "marketplace", "connection_status": "connected" } ], "pagination": { "limit": 20, "has_more": false, "next_cursor": null } }- Beri token scope
Langkah 2: Ambil stok dari OneSeller
Panggil
GET /inventoryuntuk membaca stok. Setiap item memuaton_hand(fisik),reserved(tertahan pesanan), danavailable(tersedia untuk dijual).Ambil daftar stokDraftcurl -X GET "https://api.example.com/v1/inventory?limit=100" \ -H "Authorization: Bearer TOKEN_CONTOH" \ -H "Accept: application/json"Contoh respons 200 (Draft){ "data": [ { "sku": "SKU-CONTOH-001", "warehouse_id": "wh_example_001", "on_hand": 120, "reserved": 8, "available": 112, "updated_at": "2025-01-15T08:00:00Z" } ], "pagination": { "limit": 100, "has_more": true, "next_cursor": "CURSOR_CONTOH" } }Langkah 3: Telusuri semua halaman
Respons berisi
pagination.next_cursor. Kirim nilai itu pada request berikutnya sampaihas_morebernilaifalse. Konsepnya dijelaskan di Pagination.Menelusuri semua halamanDraft# Halaman pertama curl "https://api.example.com/v1/orders?limit=50" \ -H "Authorization: Bearer TOKEN_CONTOH" # Halaman berikutnya: pakai pagination.next_cursor dari respons sebelumnya curl "https://api.example.com/v1/orders?limit=50&cursor=CURSOR_CONTOH" \ -H "Authorization: Bearer TOKEN_CONTOH"Contoh respons (Draft){ "data": [ { "id": "ord_example_001", "store_id": "sto_example_001", "status": "processing", "total": 250000, "currency": "IDR", "items": [ { "sku": "SKU-CONTOH-001", "quantity": 1, "price": 250000 } ], "created_at": "2025-01-15T08:00:00Z" } ], "pagination": { "limit": 50, "has_more": true, "next_cursor": "CURSOR_CONTOH" } }Langkah 4: Bandingkan dengan data internal
Anggap sistem gudang Anda sebagai sumber kebenaran stok fisik. Bandingkan jumlahnya dengan
on_handdari OneSeller dan kumpulkan SKU yang berbeda.Hitung selisih stokDraft# Ringkas respons: hanya sku, gudang, dan stok fisik (butuh jq) curl -s "https://api.example.com/v1/inventory?limit=100" \ -H "Authorization: Bearer TOKEN_CONTOH" \ | jq '[.data[] | {sku, warehouse_id, on_hand}]'Langkah 5: Kirim penyesuaian secara idempoten
Untuk tiap selisih, kirim penyesuaian dengan
mode: "set". SusunIdempotency-Keydari SKU dan nomor proses sinkronisasi supaya percobaan ulang tidak menggandakan penyesuaian.Hormati rate limit
Kirim penyesuaian secara berurutan atau dalam batch kecil, dan tangani
429dengan backoff. Lihat Rate limit.Kirim penyesuaian stokDraftcurl -X POST "https://api.example.com/v1/inventory/adjustments" \ -H "Authorization: Bearer TOKEN_CONTOH" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: sinkron-SKU-CONTOH-001-0001" \ -d '{ "sku": "SKU-CONTOH-001", "warehouse_id": "wh_example_001", "mode": "set", "quantity": 112, "reason": "sinkronisasi dari sistem gudang" }'Contoh respons 201 (Draft){ "id": "adj_example_002", "sku": "SKU-CONTOH-001", "warehouse_id": "wh_example_001", "previous": 120, "current": 112, "reason": "sinkronisasi dari sistem gudang" }Langkah 6: Dengarkan webhook untuk pembaruan langsung
Daftarkan URL penerima dengan
POST /webhooksuntuk eventinventory.adjusteddaninventory.low_stock. Verifikasi signature setiap pengiriman sebelum memprosesnya; rancangannya ada di Webhook.Verifikasi signature webhook (rancangan)Draft# Simulasi: hitung signature untuk payload contoh SECRET="SECRET_CONTOH_TIDAK_NYATA" TS=$(date +%s) BODY='{"id":"evt_example_001","type":"inventory.low_stock"}' SIG=$(printf '%s.%s' "$TS" "$BODY" | openssl dgst -sha256 -hmac "$SECRET" | sed 's/^.* //') # Kirim ke penerima lokal Anda untuk menguji kode verifikasi curl -X POST "http://localhost:3000/webhooks/oneseller" \ -H "Content-Type: application/json" \ -H "X-OneSeller-Signature: t=$TS,v1=$SIG" \ -d "$BODY"Langkah 7: Uji dan siapkan penanganan error
- Tangani
401,403,404,422,429, dan5xxsesuai tabel di Error Codes. - Catat
request_iddari setiap error. - Pastikan setiap operasi tulis memakai
Idempotency-Key. - Jalankan sinkronisasi pertama pada data uji sebelum data sungguhan.
Belum bisa dijalankan
Karena API belum tersedia, langkah uji di atas baru dapat dilakukan setelah API dirilis dan akses sandbox disediakan.
- Tangani