4.7 KiB
4.7 KiB
API Contract Draft - QRIS Soundbox Platform v1
1. Prinsip API
- gunakan HTTPS
- semua endpoint device memakai auth khusus device
- semua endpoint admin/merchant memakai RBAC
- endpoint create yang sensitif wajib support idempotency key
- response harus punya request_id / trace_id
2. Admin / Merchant APIs
Merchant
POST /admin/merchantsGET /admin/merchantsGET /admin/merchants/{merchantId}PATCH /admin/merchants/{merchantId}POST /admin/merchants/{merchantId}/approvePOST /admin/merchants/{merchantId}/reject
Create Merchant
POST /admin/merchants
Request body:
{
"legal_name": "Toko Indo",
"brand_name": "Toko Indo",
"settlement_account_reference": "bank:9876543210",
"settlement_account_type": "merchant_bank_account",
"payout_mode": "merchant_direct",
"fee_profile_id": "fee_basic"
}
payout_mode:
merchant_direct(default): payout mengikuti rekening/referensi milik merchant.manual: payout dilakukan manual/offline oleh tim operasi.
Response:
{
"data": {
"id": "m_123",
"merchant_code": "m_123abc",
"legal_name": "Toko Indo",
"brand_name": "Toko Indo",
"settlement_account_reference": "bank:9876543210",
"settlement_account_type": "merchant_bank_account",
"payout_mode": "merchant_direct"
},
"request_id": "req_001",
"timestamp": "2026-05-24T00:00:00Z"
}
Catatan penting:
- Pada fase awal, settlement tidak ditarik ke rekening perusahaan.
- Pencairan merchant dilakukan via
payout_account_referencemilik merchant. - Untuk merchant yang belum punya integrasi payout otomatis, gunakan
payout_mode: manual.
Outlet
POST /admin/merchants/{merchantId}/outletsGET /admin/outletsGET /admin/outlets/{outletId}PATCH /admin/outlets/{outletId}
Terminal
POST /admin/outlets/{outletId}/terminalsGET /admin/terminalsGET /admin/terminals/{terminalId}PATCH /admin/terminals/{terminalId}
Device / TMS
POST /admin/devicesGET /admin/devicesGET /admin/devices/{deviceId}PATCH /admin/devices/{deviceId}POST /admin/devices/{deviceId}/bindPOST /admin/devices/{deviceId}/unbindPOST /admin/devices/{deviceId}/commandsGET /admin/devices/{deviceId}/commandsGET /admin/devices/{deviceId}/commands/{commandId}GET /admin/devices/{deviceId}/heartbeatsGET /admin/devices/{deviceId}/notificationsPOST /admin/seed
Transactions
GET /admin/transactionsGET /admin/transactions/{transactionId}POST /admin/transactions/{transactionId}/retry-notification
Settlements
GET /admin/settlementsGET /admin/settlements/{settlementId}POST /admin/settlements/runPOST /admin/settlements/{settlementId}/retry-payout- Catatan: endpoint ini dipakai untuk batch/reconciliation status; eksekusi payout dilakukan sesuai konfigurasi
payout_modemerchant.
3. Device APIs
Provisioning
POST /device/provision/activatePOST /device/provision/refresh-credential
Heartbeat
POST /device/heartbeat
Sample request:
{
"device_id": "sbx_001",
"timestamp": "2026-05-23T10:00:00Z",
"firmware_version": "1.0.3",
"network_strength": 78,
"battery_level": 92,
"state": "idle"
}
Config
GET /device/configPOST /device/config/ackPOST /device/commands/ack
Device command payload ack
Device mengirim:
{
"device_id": "sbx_001",
"command_id": "cmd_123",
"status": "delivered",
"reason": "ok",
"result_payload": {
"payment_result": "ok"
}
}
status untuk ACK: delivered | failed | timeout.
Dynamic QR create
POST /device/transactions/dynamic-qr
Headers:
Authorization: Bearer <device-token>Idempotency-Key: <uuid>
Request:
{
"device_id": "sbx_001",
"terminal_id": "term_001",
"amount": 50000,
"currency": "IDR",
"request_id": "req_123"
}
Response:
{
"request_id": "req_123",
"transaction_id": "tx_123",
"qr_type": "dynamic",
"qr_payload": "000201010212...",
"expires_at": "2026-05-23T10:05:00Z",
"status": "awaiting_payment"
}
4. Merchant Portal APIs
GET /merchant/meGET /merchant/dashboard/summaryGET /merchant/transactionsGET /merchant/transactions/{transactionId}GET /merchant/settlementsGET /merchant/settlements/{settlementId}GET /merchant/devicesGET /merchant/outlets
5. Webhook Receiver
POST /integrations/qris/callbackPOST /integrations/bank/payout-callback
6. Catatan Error Model
Gunakan error code yang konsisten, misalnya:
DEVICE_UNAUTHORIZEDDEVICE_NOT_BOUNDDEVICE_CAPABILITY_NOT_SUPPORTEDINVALID_AMOUNTDUPLICATE_REQUESTPARTNER_TIMEOUTTRANSACTION_NOT_FOUNDSETTLEMENT_NOT_ELIGIBLEMERCHANT_PAYOUT_NOT_CONFIGURED