Base URL: https://pay.instanlive.id/api/v1. Semua permintaan & respons memakai JSON. Setiap respons memuat field ok (boolean).
X-Api-Key. Prefix menentukan mode: sk_live_… (produksi) atau sk_test_… (sandbox).https://pay.instanlive.id/api/v1/transaction/create| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
ref_id | string | ya | ID order unik di sistem Anda |
amount | integer | ya | Nominal dalam rupiah, minimal 100 |
description | string | opsional | Keterangan singkat, tampil di halaman pembayaran |
redirect_url | string | opsional | URL tujuan pelanggan kembali setelah lunas |
curl -X POST https://pay.instanlive.id/api/v1/transaction/create \
-H 'X-Api-Key: sk_test_xxxxxxxxxxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{"ref_id":"ORDER-123","amount":25000}'{
"ok": true,
"data": {
"txn_id": 12,
"ref_id": "ORDER-123",
"mode": "sandbox",
"amount": 25000,
"unique_amount": 25017, // nominal yang HARUS dibayar
"fee": 175,
"net_amount": 24825, // yang dikreditkan ke saldo
"qris_string": "00020101021226...",
"payment_url": "https://pay.instanlive.id/pay/xxxxxxxx",
"status": "pending",
"expired_in_minutes": 15,
"simulate_url": "/api/v1/sandbox/pay/12" // hanya sandbox
}
}Cara termudah: arahkan pelanggan ke payment_url (halaman bayar siap pakai). Atau render qris_string sebagai QR sendiri; pelanggan membayar sebesar unique_amount.
create lagi dengan ref_id yang sama (mode sama) tidak membuat transaksi ganda — API mengembalikan transaksi yang sudah ada beserta idempotent: true (HTTP 200). Aman untuk retry. Notifikasi lunas dikirim ke Callback URL yang diatur di menu API Key (per-akun).https://pay.instanlive.id/api/v1/transaction/status/{txn_id}Panggil berkala dari halaman pembayaran (mis. tiap 3–5 detik). Untuk mode live, panggilan ini juga memicu pencocokan mutasi. Batas 300 permintaan/menit per API key (HTTP 429 bila terlampaui) — polling tiap 3–5 detik aman.
{
"ok": true,
"data": { "txn_id": 12, "status": "paid", "paid_at": "2026-08-17T01:29:49Z", ... }
}Nilai status: pending, paid, expired, cancelled, refunded.
https://pay.instanlive.id/api/v1/transactions| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
limit | integer | opsional | Jumlah per halaman (maks 100, default 50) |
page | integer | opsional | Halaman, mulai 1 |
status | string | opsional | Filter: pending/paid/expired/cancelled/refunded |
Mode (live/sandbox) mengikuti prefix API key. Respons: data berisi array transaksi + page, limit, count.
https://pay.instanlive.id/api/v1/transaction/cancel/{txn_id}Hanya transaksi pending yang bisa dibatalkan.
https://pay.instanlive.id/api/v1/balance{ "ok": true, "data": { "mode": "live", "balance": 1250000, "currency": "IDR" } }https://pay.instanlive.id/api/v1/transaction/refund/{txn_id}Refund transaksi berstatus paid: saldo dipotong sebesar net_amount, status berubah refunded, dan callback dikirim.
https://pay.instanlive.id/api/v1/sandbox/pay/{txn_id}Hanya dengan key sk_test_. Menandai transaksi sandbox menjadi paid dan memicu callback — untuk menguji integrasi & webhook tanpa uang nyata.
curl -X POST https://pay.instanlive.id/api/v1/sandbox/pay/12 -H 'X-Api-Key: sk_test_xxxxxxxxxxxxxxxx'
Saat transaksi lunas/refund, kami kirim POST JSON ke callback URL Anda. Bila gagal, dikirim ulang otomatis dengan jeda bertahap.
{
"txn_id": 12,
"ref_id": "ORDER-123",
"status": "paid",
"amount": 25000,
"net_amount": 24825,
"is_sandbox": false,
"paid_at": "2026-08-17T01:29:49Z",
"signature": "9f2c…"
}Hitung HMAC-SHA256 dari payload TANPA field signature, dengan key diurut menaik, memakai API key Anda (sesuai mode). Bandingkan dengan field signature.
$data = json_decode(file_get_contents('php://input'), true);
$sig = $data['signature']; unset($data['signature']);
ksort($data);
$calc = hash_hmac('sha256', json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE), $API_KEY);
if (hash_equals($calc, $sig)) { /* valid */ }const crypto = require('crypto');
const { signature, ...data } = req.body;
const sorted = Object.keys(data).sort().reduce((o,k)=>(o[k]=data[k],o),{});
const calc = crypto.createHmac('sha256', API_KEY)
.update(JSON.stringify(sorted)).digest('hex');
if (calc === signature) { /* valid */ }Balas HTTP 200 untuk menandai diterima. Non-2xx akan dicoba ulang & tercatat di log callback.
| HTTP | error | Arti |
|---|---|---|
| 401 | unauthorized | API key kosong/tidak valid |
| 403 | suspended / live_mode | Akun nonaktif, atau simulasi dipanggil dengan key live |
| 404 | not_found | Transaksi/endpoint tidak ditemukan |
| 403 | ip_not_allowed | IP pemanggil tidak ada di allowlist (khusus mode live) |
| 409 | invalid_state | Status transaksi tidak sesuai (mis. bukan pending) |
| 422 | invalid_request | Parameter kurang/salah |
| 429 | rate_limited | Melebihi 300 permintaan/menit per key — beri jeda lalu ulangi |
| 500 | server_error | Kesalahan server saat memproses |
| 503 | capacity_full | Slot nominal unik sedang penuh — coba lagi beberapa saat |
sk_test_…) dari dashboard.create.sandbox/pay untuk menandai lunas → status jadi paid, callback terkirim, saldo sandbox bertambah.sk_live_… tanpa mengubah kode.