Diperbarui 12 Sep 2026. Halaman ini sengaja dibuat pendek. Kalau ada bagian yang belum jelas, itu kekurangan kami, bukan kekurangan Anda.
Daftar atau masuk, lalu buat Proyek. Proyek adalah identitas aplikasi/website Anda — dengan satu akun Anda bisa mengintegrasikan banyak aplikasi.
Catat tiga hal dari halaman proyek Anda:
API Key — ditampilkan sekali saja, simpan di tempat amanWebhook Secret — untuk memverifikasi notifikasi yang kami kirimslug proyek — dipakai bila Anda memakai integrasi lewat URLPenting: API Key terikat pada satu proyek. Tagihan tidak akan pernah masuk ke proyek lain, dan mencabut key satu proyek tidak mempengaruhi proyek lain.
Arahkan pelanggan ke halaman pembayaran:
https://app.invoiceku.net/pay/{slug}/{amount}?order_id={order_id}| Bagian | Keterangan |
|---|---|
slug | slug proyek Anda |
amount | nominal angka bulat tanpa titik dan spasi. Contoh: 100000 atau 25000 |
order_id | ID transaksi di sistem Anda. Opsional. Contoh: BAYAR-97dasa7d |
https://app.invoiceku.net/pay/depodomain/22000?order_id=BAYAR-97dasa7d
Setelah pembayaran berhasil, tambahkan tujuan tombol kembali:
&redirect=https://situsanda.com/tujuan
Pembeli langsung melihat QR dan tidak bisa memilih metode lain:
&qris_only=1
Sertakan API Key di header Authorization dengan skema Bearer. Jangan menaruh key di body atau query string — keduanya mudah tersimpan di log.
Authorization: Bearer ik_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
POST /api/v2/charges
Content-Type: application/json
Authorization: Bearer ik_live_...
Idempotency-Key: 9f2b1c7e-... (opsional, sangat disarankan)
{
"amount": 25000,
"order_id": "BAYAR-97dasa7d"
}Hanya amount yang wajib. Tidak perlu nama atau email pembeli. Tidak ada project_slug — proyek sudah ditentukan oleh API Key.
Contoh:
curl -X POST https://app.invoiceku.net/api/v2/charges \
-H "Authorization: Bearer ik_live_..." \
-H "Content-Type: application/json" \
-d '{"amount":25000,"order_id":"BAYAR-97dasa7d"}'Respons (HTTP 201):
{
"status": "success",
"data": {
"id": "INV-7698-YU98",
"order_id": "BAYAR-97dasa7d",
"amount": 25000,
"fee": 375,
"total_payment": 25375,
"status": "pending",
"is_paid": false,
"payment_method": "qris",
"qris_string": "00020101021226...",
"qr_url": "https://api.qrserver.com/v1/create-qr-code/?...",
"payment_url": "https://app.invoiceku.net/pay/INV-7698-YU98",
"expires_at": "2026-09-12 21:15:00"
}
}Simpan id dan order_id. id adalah kunci dari kami, order_id adalah kunci dari Anda.
qris_string menjadi gambar QR memakai library apa pun di sisi Anda, atauqr_url, ataupayment_url.GET /api/v2/charges/INV-7698-YU98 Authorization: Bearer ik_live_...
Bisa juga dicari memakai order_id Anda. Pengecekan selalu dibatasi pada proyek pemilik key — key proyek lain akan menerima 404.
POST /api/v2/charges/INV-7698-YU98/cancel Authorization: Bearer ik_live_...
Hanya tagihan berstatus pending yang bisa dibatalkan.
Key berawalan ik_test_ boleh memakai endpoint simulasi. Simulasi menandai tagihan lunas tanpa mengubah saldo dan tanpa mengirim webhook.
POST /api/v2/simulate
{ "id": "INV-7698-YU98" }Kirim header Idempotency-Key berisi UUID unik per order. Kalau jaringan terputus dan Anda mengirim ulang permintaan yang sama, kami mengembalikan tagihan yang sama — bukan membuat QRIS kedua.
Isi Webhook URL di pengaturan proyek. Kami mengirim POST saat dana masuk.
Header:
X-InvoiceKu-Signature: t=1789123456,v1=9a8b7c6d...
Body:
{
"event": "charge.paid",
"id": "INV-7698-YU98",
"order_id": "BAYAR-97dasa7d",
"amount": 25000,
"fee": 375,
"net_amount": 25000,
"status": "paid",
"payment_method": "qris",
"paid_at": "2026-09-12T20:15:00+07:00"
}Verifikasi tanda tangan sebelum memproses (PHP):
$raw = file_get_contents('php://input');
$header = $_SERVER['HTTP_X_INVOICEKU_SIGNATURE'] ?? '';
preg_match('/t=(\d+),v1=([a-f0-9]+)/', $header, $m);
$t = (int)($m[1] ?? 0); $v1 = $m[2] ?? '';
if (abs(time() - $t) > 300) { http_response_code(400); exit('stale'); }
$expect = hash_hmac('sha256', $t . '.' . $raw, $WEBHOOK_SECRET);
if (!hash_equals($expect, $v1)) { http_response_code(401); exit('bad signature'); }Node.js:
const crypto = require('crypto');
const [tPart, vPart] = (req.headers['x-invoiceku-signature'] || '').split(',');
const t = tPart.replace('t=', '');
const expect = crypto.createHmac('sha256', WEBHOOK_SECRET)
.update(`${t}.${rawBody}`).digest('hex');
if (expect !== vPart.replace('v1=', '')) return res.status(401).end();Balas HTTP 200. Kalau gagal, kami mengirim ulang dengan jeda bertambah. Webhook hanyalah pemicu — sumber kebenaran tetap C.4. Cocokkan amount dan order_id dengan catatan Anda.
| HTTP | code | Artinya |
|---|---|---|
| 400 | INVALID_AMOUNT | amount bukan bilangan bulat minimal 1000 |
| 400 | INVALID_ORDER_ID | order_id mengandung karakter yang tidak diizinkan |
| 400 | INVALID_JSON | body bukan JSON yang sah |
| 401 | UNAUTHORIZED | API key salah, tidak aktif, atau tidak dikirim |
| 403 | PROJECT_INACTIVE | proyek sedang dinonaktifkan |
| 404 | NOT_FOUND | tagihan tidak ada di proyek pemilik key ini |
| 409 | ORDER_ID_CONFLICT | order_id sudah dipakai tagihan lain yang masih aktif |
| 409 | INVALID_STATE | status tidak memungkinkan aksi tersebut |
| 429 | RATE_LIMITED | terlalu banyak permintaan |
| 503 | PROVIDER_ERROR | gateway pembayaran sedang bermasalah; tidak ada tagihan dibuat |
503 berarti tidak ada tagihan yang dibuat. Silakan ulangi permintaan. Kami tidak pernah membuat tagihan dengan QR lama atau QR contoh.
Pertanyaan: detail support ada di dashboard. Sertakan id tagihan agar pengecekan cepat.