1. Pengenalan API
KicenPay REST API adalah gateway pembayaran QRIS berkecepatan tinggi. Setiap panggilan API wajib berformat application/json dan mengembalikan respons berformat JSON terstruktur.
2. Autentikasi: Single API Key & X-KicenPay-Signature
KicenPay menggunakan model autentikasi Single API Key yang praktis dan modern. Cukup gunakan API Key merchant Anda dan sertakan header X-KicenPay-Signature untuk validasi integritas data request.
Authorization: Bearer KII_LIVE_882190A45B72C99A
HMAC-SHA256(apiKey, JSON.stringify(body))
3. Rate Limiting & Batasan Request API
Untuk menjaga stabilitas performa sistem gateway, kecepatan verifikasi pembayaran realtime, dan perlindungan dari lonjakan traffic, KicenPay menerapkan sistem Rate Limiting per API Key berbasis algoritma Sliding Window Token Bucket.
POST /api/create-qrisGET /api/status/:trxIdSetiap respons API dari server KicenPay akan selalu menyertakan header indikator kuota berikut:
429 Too Many Requests. Menunjukkan detik wajib menunggu sebelum retry.
POST /api/create-qris
Buat Tagihan QRISMembuat tagihan transaksi baru lengkap dengan kode QRIS standar nasional Bank Indonesia, tautan pembayaran langsung, dan notifikasi callback otomatis.
Parameter Request (JSON Body):
Contoh Request & Respons JSON:
{
"amount": 50000,
"refId": "ORDER-9912",
"idempotencyKey": "IDEMP-9912-A1",
"customerName": "Kiki Faizal",
"webhookUrl": "https://websiteanda.com/webhook"
}
{
"success": true,
"trxId": "KII-M891-A42F",
"refId": "ORDER-9912",
"idempotencyKey": "IDEMP-9912-A1",
"amount": 50000,
"totalAmount": 50000,
"status": "PENDING",
"paymentUrl": "https://kicenpay.cloud/pay/KII-M891-A42F",
"qrisString": "0002010102122659...",
"qrImage": "data:image/png;base64,...",
"expiredAt": "2026-09-16T18:00:00.000Z"
}
amount: Nominal tagihan yang 100% masuk ke saldo merchant (tanpa potongan biaya).
totalAmount: Total pembayaran yang harus ditransfer oleh pembeli via scan QRIS.
GET /api/status/:trxId
Cek Status PembayaranGunakan endpoint ini untuk mengecek status mutasi pembayaran QRIS secara real-time berdasarkan trxId.
{
"success": true,
"trxId": "KII-M891-A42F",
"refId": "ORDER-9912",
"amount": 50000,
"totalAmount": 50000,
"status": "SUCCESS",
"paidAt": "2026-09-15T17:35:12.000Z",
"isSettled": 0,
"settleAt": "2026-09-16T17:35:12.000Z",
"settlementPolicy": "H+1 (Otomatis 24 Jam)"
}
POST /api/cancel
Batalkan Tagihan QRISMembatalkan tagihan transaksi QRIS yang masih berstatus PENDING jika pembeli membatalkan pesanan.
{
"trxId": "KII-M891-A42F",
"reason": "Dibatalkan oleh pembeli"
}
GET /api/transactions
Riwayat Transaksi MerchantMengambil daftar riwayat transaksi merchant Anda dengan filter status, limit, dan offset.
{
"success": true,
"data": [
{
"trxId": "KII-M891-A42F",
"refId": "ORDER-9912",
"amount": 50000,
"totalAmount": 50000,
"status": "SUCCESS",
"createdAt": "2026-09-15T17:30:00.000Z",
"paidAt": "2026-09-15T17:35:12.000Z"
}
]
}
6. Format Notifikasi Webhook & X-KicenPay-Signature
Ketika pelanggan selesai membayar QRIS, server KicenPay akan mengirimkan HTTP POST secara instan ke webhookUrl Anda dengan header X-KicenPay-Signature.
{
"event": "payment.success",
"data": {
"trxId": "KII-M891-A42F",
"refId": "ORDER-9912",
"amount": 50000,
"totalAmount": 50000,
"status": "SUCCESS",
"paymentMethod": "QRIS",
"paidAt": "2026-09-15T17:35:12.000Z",
"isSettled": 0,
"settleAt": "2026-09-16T17:35:12.000Z"
}
}
7. Contoh Integrasi Multi-Bahasa
curl -X POST https://kicenpay.cloud/api/create-qris \
-H "Content-Type: application/json" \
-H "x-api-key: KII_LIVE_882190A45B72C99A" \
-H "X-KicenPay-Signature: 8f9b4c2e..." \
-d '{
"amount": 50000,
"refId": "INV-001",
"customerName": "Kiki Faizal",
"webhookUrl": "https://serveranda.com/webhook"
}'
const axios = require('axios');
const crypto = require('crypto');
const API_KEY = 'KII_LIVE_882190A45B72C99A';
const payload = {
amount: 50000,
refId: 'INV-NODE-001',
customerName: 'Kiki Faizal',
webhookUrl: 'https://serveranda.com/webhook'
};
// Generate X-KicenPay-Signature
const signature = crypto
.createHmac('sha256', API_KEY)
.update(JSON.stringify(payload))
.digest('hex');
async function createQris() {
const res = await axios.post('https://kicenpay.cloud/api/create-qris', payload, {
headers: {
'Content-Type': 'application/json',
'x-api-key': API_KEY,
'X-KicenPay-Signature': signature
}
});
console.log('QRIS Checkout URL:', res.data.paymentUrl);
}
createQris();
import requests
import json
import hmac
import hashlib
API_KEY = "KII_LIVE_882190A45B72C99A"
url = "https://kicenpay.cloud/api/create-qris"
payload = {
"amount": 50000,
"refId": "INV-PY-001",
"customerName": "Kiki Faizal",
"webhookUrl": "https://serveranda.com/webhook"
}
body_json = json.dumps(payload, separators=(',', ':'))
# Generate X-KicenPay-Signature
signature = hmac.new(
API_KEY.encode('utf-8'),
body_json.encode('utf-8'),
hashlib.sha256
).hexdigest()
headers = {
"Content-Type": "application/json",
"x-api-key": API_KEY,
"X-KicenPay-Signature": signature
}
response = requests.post(url, data=body_json, headers=headers)
print(response.json())
<?php
$apiKey = 'KII_LIVE_882190A45B72C99A';
$payload = [
'amount' => 50000,
'refId' => 'INV-PHP-001',
'customerName' => 'Kiki Faizal',
'webhookUrl' => 'https://serveranda.com/webhook'
];
$bodyJson = json_encode($payload);
// Generate X-KicenPay-Signature
$signature = hash_hmac('sha256', $bodyJson, $apiKey);
$ch = curl_init('https://kicenpay.cloud/api/create-qris');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $bodyJson);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'x-api-key: ' . $apiKey,
'X-KicenPay-Signature: ' . $signature
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
echo "Payment URL: " . $result['paymentUrl'];
?>
8. Kode Respon HTTP & Format Error
Standard REST Responses
API KicenPay mengembalikan kode status HTTP standar untuk mengindikasikan apakah permintaan berhasil (valid) atau mengalami kendala. Setiap respons selalu mengembalikan objek JSON dengan properti boolean success beserta keterangan lengkap.
Permintaan valid dan berhasil diproses. Objek QRIS, status transaksi, atau token verifikasi dikembalikan lengkap.
{
"success": true,
"trxId": "KII-MU2YS16D-Q0EW",
"status": "PENDING",
"amount": 50000,
"paymentUrl": "https://..."
}
Payload JSON rusak, parameter wajib seperti amount tidak ada, atau nominal di bawah batas minimum (Rp 1.000).
{
"success": false,
"message": "Nominal pembayaran minimal Rp 1.000 cuy!"
}
API Key tidak ditemukan/salah di header, atau header X-KicenPay-Signature tidak cocok dengan HMAC payload body.
{
"success": false,
"message": "X-KicenPay-Signature tidak valid. Request ditolak demi keamanan!"
}
Akun merchant sedang SUSPENDED, atau tindakan dilarang oleh sistem keamanan.
{
"success": false,
"message": "Akun merchant Anda dinonaktifkan sementara. Hubungi admin KicenPay."
}
ID transaksi (trxId) atau payment link tidak ditemukan dalam database.
{
"success": false,
"message": "Transaksi tidak ditemukan!"
}
Frekuensi request melebihi batas kuota per menit untuk API Key Anda. Header Retry-After menunjukkan detik tunggu sebelum request berikutnya dapat diterima.
{
"success": false,
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit terlampaui untuk pembuatan QRIS! Maksimal 30 invoice per menit per API Key.",
"limit": 30,
"remaining": 0,
"retryAfter": 18
}
Terjadi kesalahan internal pada pemrosesan server atau database.
{
"success": false,
"message": "Terjadi kesalahan internal server. Silakan coba beberapa saat lagi."
}
10. Aturan Layanan & Ketentuan Transaksi
Ketentuan resmi operasional, kebijakan dana, dan batasan penggunaan KicenPay.
- Nominal Minimum QRIS: Rp 1.000 per transaksi tagihan.
- Nominal Maksimum QRIS: Rp 10.000.000 per transaksi (sesuai regulasi Bank Indonesia untuk merchant per QRIS).
- Bebas Biaya Transaksi: 100% bebas biaya transaksi QRIS. Seluruh dana penjualan masuk utuh ke saldo merchant tanpa potongan per transaksi.
- Saldo Tertunda: Dana transaksi sukses langsung tercatat di Saldo Tertunda (Pending Settlement) merchant masing-masing.
- Otomatis Cair ke Saldo Tersedia: Setelah masa kliring 24 jam tepat (H+1), sistem secara otomatis memindahkan dana ke Saldo Tersedia yang siap ditarik (WD).
- Alasan Keamanan: Sesuai standar industri kliring dan perbankan nasional guna mencegah penipuan, sengketa transaksi, serta menjaga keamanan saldo merchant.
KicenPay tunduk pada hukum perundang-undangan Republik Indonesia dan regulasi Bank Indonesia. Layanan gateway pembayaran KicenPay DILARANG KERAS digunakan untuk transaksi yang terkait:
Sanksi Pelanggaran: Akun merchant akan langsung diblokir permanen (BANNED/SUSPENDED), saldo dibekukan untuk penyelidikan, dan bukti log transaksi akan diserahkan kepada pihak penegak hukum dan PPATK.
11. Standar Kenyamanan & Keamanan Developer (DX)
Panduan arsitektur sistem pembayaran, perlindungan transaksi, dan integrasi yang mudah.
Gunakan header Idempotency-Key atau body parameter idempotencyKey pada setiap pemanggilan API pembuatan QRIS.
Jika bot atau server Anda mengalami timeout jaringan dan mengirimkan request ulang, gateway KicenPay mengembalikan objek transaksi yang sama persis tanpa membuat tagihan dobel atau menduplikasi saldo.
KicenPay mengirimkan header X-KicenPay-Signature (HMAC-SHA256) pada setiap callback. Validasi signature ini di server Anda sebelum memperbarui status pesanan.
- Percobaan 1: Langsung saat mutasi cocok (0ms).
- Percobaan 2: Otomatis retry +5 detik jika server Anda offline/500.
- Percobaan 3: Retry terakhir +15 detik dengan log audit lengkap.
Jangan pernah mempublikasikan atau menyematkan API Key pada frontend JavaScript (browser), aplikasi mobile React Native, Flutter, atau repositori publik GitHub.
Selalu gunakan arsitektur Server-to-Server di mana backend Anda yang berkomunikasi dengan API KicenPay. Gunakan tombol rotasi kunci instan di dashboard jika mencurigai adanya kebocoran.
KicenPay dirancang dengan target uptime 99.9% dan proses verifikasi pembayaran instan. Anda dapat memeriksa status operasional infrastruktur sistem, database, dan layanan API kami secara berkala di halaman Status Server.