Dokumentasi API

REST · JSON · autentikasi API key
← Beranda

Ikhtisar

Base URL: https://pay.instanlive.id/api/v1. Semua permintaan & respons memakai JSON. Setiap respons memuat field ok (boolean).

Autentikasi. Kirim header X-Api-Key. Prefix menentukan mode: sk_live_… (produksi) atau sk_test_… (sandbox).
Mode. Sandbox & live sepenuhnya terpisah (saldo, transaksi, key). Pindah ke live cukup ganti API key — kode tetap sama.

Buat Transaksi

POSThttps://pay.instanlive.id/api/v1/transaction/create
ParameterTipeWajibKeterangan
ref_idstringyaID order unik di sistem Anda
amountintegeryaNominal dalam rupiah, minimal 100
descriptionstringopsionalKeterangan singkat, tampil di halaman pembayaran
redirect_urlstringopsionalURL tujuan pelanggan kembali setelah lunas

Contoh

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}'

Respons

{
  "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.

Idempoten. Memanggil 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).

Cek Status

GEThttps://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.

Daftar Transaksi

GEThttps://pay.instanlive.id/api/v1/transactions
ParameterTipeWajibKeterangan
limitintegeropsionalJumlah per halaman (maks 100, default 50)
pageintegeropsionalHalaman, mulai 1
statusstringopsionalFilter: pending/paid/expired/cancelled/refunded

Mode (live/sandbox) mengikuti prefix API key. Respons: data berisi array transaksi + page, limit, count.

Batalkan Transaksi

POSThttps://pay.instanlive.id/api/v1/transaction/cancel/{txn_id}

Hanya transaksi pending yang bisa dibatalkan.

Cek Saldo

GEThttps://pay.instanlive.id/api/v1/balance
{ "ok": true, "data": { "mode": "live", "balance": 1250000, "currency": "IDR" } }

Refund

POSThttps://pay.instanlive.id/api/v1/transaction/refund/{txn_id}

Refund transaksi berstatus paid: saldo dipotong sebesar net_amount, status berubah refunded, dan callback dikirim.

Simulasi Pembayaran SANDBOX

POSThttps://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'

Callback (Webhook)

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…"
}

Verifikasi signature

Hitung HMAC-SHA256 dari payload TANPA field signature, dengan key diurut menaik, memakai API key Anda (sesuai mode). Bandingkan dengan field signature.

PHP
$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 */ }
Node.js
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.

Kode Error

HTTPerrorArti
401unauthorizedAPI key kosong/tidak valid
403suspended / live_modeAkun nonaktif, atau simulasi dipanggil dengan key live
404not_foundTransaksi/endpoint tidak ditemukan
403ip_not_allowedIP pemanggil tidak ada di allowlist (khusus mode live)
409invalid_stateStatus transaksi tidak sesuai (mis. bukan pending)
422invalid_requestParameter kurang/salah
429rate_limitedMelebihi 300 permintaan/menit per key — beri jeda lalu ulangi
500server_errorKesalahan server saat memproses
503capacity_fullSlot nominal unik sedang penuh — coba lagi beberapa saat

Panduan Uji Sandbox

  1. Gunakan sandbox key (sk_test_…) dari dashboard.
  2. Buat transaksi via create.
  3. Panggil sandbox/pay untuk menandai lunas → status jadi paid, callback terkirim, saldo sandbox bertambah.
  4. Setelah cocok, ganti key ke sk_live_… tanpa mengubah kode.