Skip to main content

Deposit Saldo (H2H)

Endpoint Host-to-Host (H2H) untuk melakukan deposit saldo ke akun Anda secara otomatis — tanpa perlu login ke dashboard. Cocok untuk sistem yang butuh top-up saldo terjadwal/otomatis (misal sebelum menjalankan batch order).

Endpoint: POST /v1/deposit

Satu endpoint ini menangani 4 perintah lewat parameter cmd: methods, create, status, dan cancel.

Notifikasi otomatis lewat webhook

Status deposit yang berubah (success / failed / expired / cancelled) dikirim otomatis ke URL webhook Anda sebagai event deposit.updated — pakai URL webhook yang sama dengan notifikasi transaksi. Lihat Event Webhook. Anda tetap bisa polling cmd=status sebagai cadangan jika perlu.

Parameter Request​

Setiap perintah tetap wajib menyertakan parameter autentikasi standar:

ParameterTipeWajibKeterangan
api_idstring✅API ID
timestampinteger✅Unix timestamp
signaturestring✅HMAC-SHA256 — lihat cara membuat signature
cmdstring✅methods, create, status, atau cancel

Parameter tambahan berbeda-beda tergantung nilai cmd:

cmdParameter tambahanKeterangan
methods(tidak ada)Menampilkan daftar metode deposit yang aktif
createcode (string, ✅), amount (integer, ✅)Membuat deposit baru
statusref_id (string, ✅)Cek status deposit
cancelref_id (string, ✅)Batalkan deposit yang masih pending
Satu deposit pending per metode

Untuk sebagian besar metode (termasuk transfer manual dan QRIS), satu akun hanya boleh punya satu deposit pending per metode dalam satu waktu. Jika Anda membuat deposit baru pada metode yang sama saat deposit sebelumnya masih pending, request ditolak dengan HTTP 409 dan code DEPOSIT_PENDING_EXISTS — ref_id deposit yang masih pending dikembalikan di errors.ref_id. Selesaikan pembayarannya, atau batalkan lewat cmd=cancel, lalu buat deposit baru. Detail ada di bagian Batasan.

1. Cek Metode Deposit — cmd: methods​

Mengambil daftar metode deposit yang aktif beserta batas nominal dan biayanya.

<?php
header('Content-Type: application/json');

$api_id = 'your_api_id';
$api_key = 'your_api_key';
$secret_key = 'your_secret_key';
$timestamp = time();

$businessParams = ['cmd' => 'methods'];
ksort($businessParams);

$canonicalBody = json_encode($businessParams, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$bodyHash = hash('sha256', $canonicalBody);
$stringToSign = implode('|', [$api_id, $api_key, $timestamp, $bodyHash]);
$signature = hash_hmac('sha256', $stringToSign, $secret_key);

$payload = array_merge($businessParams, [
'api_id' => $api_id,
'timestamp' => $timestamp,
'signature' => $signature,
]);

$ch = curl_init('https://api.isikuota.com/v1/deposit');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
]);
$response = json_decode(curl_exec($ch), true);
// print_r($response);
echo json_encode($response, JSON_PRETTY_PRINT);

Contoh Response​

{
"success": true,
"code": "SUCCESS",
"message": "Ditemukan 2 metode deposit",
"data": [
{
"code": "QRIS",
"name": "QRIS - Semua E-Wallet & Bank",
"type": "qris",
"fee": 0,
"gateway_fee": 0.7,
"gateway_fee_type": "FLAT",
"minimal": 10000,
"maximal": 10000000,
"is_auto": true,
"image_url": "https://isikuota.com/images/payment/qris.png"
},
{
"code": "BCA_VA",
"name": "BCA Virtual Account",
"type": "virtual_account",
"fee": 4000,
"gateway_fee": 0,
"gateway_fee_type": "FLAT",
"minimal": 10000,
"maximal": 50000000,
"is_auto": true,
"image_url": "https://isikuota.com/images/payment/bca.png"
}
],
"errors": null,
"meta": null
}

Field Response​

FieldTipeKeterangan
codestringKode metode deposit, dipakai sebagai parameter code saat cmd=create
namestringNama metode
typestringJenis metode (qris, virtual_account, bank_transfer, dll)
feeintegerBiaya admin tetap (Rp)
gateway_feenumberBiaya tambahan dari payment gateway (persen atau flat, lihat gateway_fee_type)
gateway_fee_typestringFLAT atau PERCENT
minimalintegerNominal deposit minimum (Rp)
maximalintegerNominal deposit maksimum (Rp)
is_autobooleantrue jika diproses otomatis via payment gateway, false jika transfer manual
image_urlstring/nullURL logo metode pembayaran

2. Membuat Deposit — cmd: create​

<?php
header('Content-Type: application/json');

$api_id = 'your_api_id';
$api_key = 'your_api_key';
$secret_key = 'your_secret_key';
$timestamp = time();

// Business params
$businessParams = [
'cmd' => 'create',
'code' => 'QRIS',
'amount' => 100000,
];

// Urutkan A ke Z (ksort)
ksort($businessParams);

$canonicalBody = json_encode($businessParams, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$bodyHash = hash('sha256', $canonicalBody);
$stringToSign = implode('|', [$api_id, $api_key, $timestamp, $bodyHash]);
$signature = hash_hmac('sha256', $stringToSign, $secret_key);

$payload = array_merge($businessParams, [
'api_id' => $api_id,
'timestamp' => $timestamp,
'signature' => $signature,
]);

$ch = curl_init('https://api.isikuota.com/v1/deposit');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
]);
$response = json_decode(curl_exec($ch), true);
// print_r($response);
echo json_encode($response, JSON_PRETTY_PRINT);

Contoh Response​

{
"success": true,
"code": "CREATED",
"message": "Deposit berhasil dibuat",
"data": {
"ref_id": "DP20260818103055AB12CD",
"status": "pending",
"status_label": "Menunggu Pembayaran",
"payment_method": "QRIS - Semua E-Wallet & Bank",
"amount": 100000,
"fee": 0,
"unique_code": 8,
"pay_amount": 100008,
"get_amount": 100008,
"destination_number": null,
"destination_name": null,
"qr_string": "00020101021226610014ID.CO.QRIS.WWW...",
"payment_url": null,
"note": null,
"expired_at": "2026-08-19 10:30:55",
"created_at": "2026-08-18 10:30:55"
},
"errors": null,
"meta": null
}

Field Response data​

FieldTipeKeterangan
ref_idstringID referensi deposit — simpan untuk cek status/pembatalan
statusstringpending / success / failed / expired / cancelled
status_labelstringLabel status dalam Bahasa Indonesia
payment_methodstringNama metode pembayaran yang dipilih
amountintegerNominal deposit yang Anda minta (Rp) — sama dengan amount yang Anda kirim di request, belum termasuk biaya admin (fee) atau kode unik
feeintegerBiaya admin tetap metode ini (Rp)
unique_codeintegerKode unik yang ditambahkan ke nominal transfer untuk rekonsiliasi otomatis (Rp) — 0 jika metode ini tidak memakai kode unik
pay_amountintegerNominal final yang harus dibayar/ditransfer (Rp) = amount + fee + unique_code. Gunakan field ini, bukan amount, sebagai nominal yang harus dibayar
get_amountintegerNominal yang akan dikreditkan ke saldo Anda setelah deposit sukses (= amount + unique_code, tidak termasuk fee)
destination_numberstring/nullNomor rekening/VA tujuan (metode transfer manual/VA)
destination_namestring/nullNama pemilik rekening tujuan
qr_stringstring/nullString QRIS untuk ditampilkan sebagai kode QR (metode QRIS)
payment_urlstring/nullURL halaman pembayaran dari payment gateway, jika ada
notestring/nullCatatan tambahan
expired_atstring/nullBatas waktu pembayaran (Y-m-d H:i:s) — deposit otomatis kedaluwarsa setelah 24 jam
created_atstringWaktu deposit dibuat
Auto vs Manual

Untuk metode dengan is_auto: true (QRIS, Virtual Account, dll), qr_string/payment_url/destination_number diisi oleh payment gateway dan status akan otomatis berubah menjadi success setelah pembayaran diverifikasi. Untuk metode manual (is_auto: false), Anda akan menerima destination_number untuk transfer manual dan status dikonfirmasi oleh admin.


3. Cek Status Deposit — cmd: status​

<?php
header('Content-Type: application/json');

$api_id = 'your_api_id';
$api_key = 'your_api_key';
$secret_key = 'your_secret_key';
$timestamp = time();

$businessParams = ['cmd' => 'status', 'ref_id' => 'DP20260818103055AB12CD'];
ksort($businessParams);

$canonicalBody = json_encode($businessParams, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$bodyHash = hash('sha256', $canonicalBody);
$stringToSign = implode('|', [$api_id, $api_key, $timestamp, $bodyHash]);
$signature = hash_hmac('sha256', $stringToSign, $secret_key);

$payload = array_merge($businessParams, [
'api_id' => $api_id,
'timestamp' => $timestamp,
'signature' => $signature,
]);

$ch = curl_init('https://api.isikuota.com/v1/deposit');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
]);
$response = json_decode(curl_exec($ch), true);
// print_r($response);
echo json_encode($response, JSON_PRETTY_PRINT);

Contoh Response​

{
"success": true,
"code": "SUCCESS",
"message": "Deposit ditemukan",
"data": {
"ref_id": "DP20260818103055AB12CD",
"status": "success",
"status_label": "Berhasil",
"payment_method": "QRIS - Semua E-Wallet & Bank",
"amount": 100000,
"fee": 0,
"unique_code": 8,
"pay_amount": 100008,
"get_amount": 100008,
"destination_number": null,
"destination_name": null,
"qr_string": "00020101021226610014ID.CO.QRIS.WWW...",
"payment_url": null,
"note": null,
"expired_at": "2026-08-19 10:30:55",
"created_at": "2026-08-18 10:30:55"
},
"errors": null,
"meta": null
}

Struktur data sama persis dengan response cmd=create di atas.


4. Membatalkan Deposit — cmd: cancel​

Hanya bisa membatalkan deposit dengan status pending.

<?php
header('Content-Type: application/json');

$api_id = 'your_api_id';
$api_key = 'your_api_key';
$secret_key = 'your_secret_key';
$timestamp = time();

$businessParams = ['cmd' => 'cancel', 'ref_id' => 'DP20260818103055AB12CD'];
ksort($businessParams);

$canonicalBody = json_encode($businessParams, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$bodyHash = hash('sha256', $canonicalBody);
$stringToSign = implode('|', [$api_id, $api_key, $timestamp, $bodyHash]);
$signature = hash_hmac('sha256', $stringToSign, $secret_key);

$payload = array_merge($businessParams, [
'api_id' => $api_id,
'timestamp' => $timestamp,
'signature' => $signature,
]);

$ch = curl_init('https://api.isikuota.com/v1/deposit');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
]);
$response = json_decode(curl_exec($ch), true);
// print_r($response);
echo json_encode($response, JSON_PRETTY_PRINT);

Contoh Response​

{
"success": true,
"code": "SUCCESS",
"message": "Deposit berhasil dibatalkan",
"data": {
"ref_id": "DP20260818103055AB12CD",
"status": "cancelled",
"status_label": "Dibatalkan",
"payment_method": "QRIS - Semua E-Wallet & Bank",
"amount": 100000,
"fee": 0,
"unique_code": 8,
"pay_amount": 100008,
"get_amount": 100008,
"destination_number": null,
"destination_name": null,
"qr_string": null,
"payment_url": null,
"note": null,
"expired_at": "2026-08-19 10:30:55",
"created_at": "2026-08-18 10:30:55"
},
"errors": null,
"meta": null
}

Status Deposit​

StatusKeteranganFinal?
pendingMenunggu pembayaranTidak
successDeposit berhasil, saldo sudah ditambahkanYa
failedDeposit gagalYa
expiredBatas waktu pembayaran (24 jam) terlewatiYa
cancelledDibatalkan lewat cmd=cancel atau oleh adminYa

Hanya status pending yang bisa berubah ke status lain. Keempat status lainnya bersifat final.

Kode Error Khusus Deposit​

HTTPCodeKeterangan
201CREATEDDeposit berhasil dibuat
400INVALID_PARAMETERParameter cmd/code/amount/ref_id tidak lengkap
400INVALID_COMMANDNilai cmd tidak dikenal
400DEPOSIT_FAILEDGagal membuat/membatalkan deposit (metode tidak aktif, nominal di luar batas, limit harian/jam terlampaui, dll)
409DEPOSIT_PENDING_EXISTSMasih ada deposit pending pada metode yang sama — ref_id-nya ada di errors.ref_id
404DATA_NOT_FOUNDref_id tidak ditemukan atau bukan milik akun Anda
500SERVER_ERRORKesalahan internal server

Lihat juga daftar lengkap error codes untuk error autentikasi (INVALID_SIGNATURE, SESSION_EXPIRED, IP_NOT_ALLOWED, dll) yang berlaku untuk semua endpoint.

Batasan​

  • Satu deposit pending per metode. Pada sebagian besar metode (termasuk transfer manual dan QRIS), Anda tidak bisa membuat deposit baru selama deposit sebelumnya pada metode yang sama masih pending dan belum kedaluwarsa. Request ditolak dengan DEPOSIT_PENDING_EXISTS (HTTP 409), apa pun nominalnya. Metode yang berbeda tidak saling membatasi, dan sebagian metode (mis. Virtual Account dari payment gateway) tidak dibatasi sama sekali.
  • Untuk mengganti nominal pada metode yang sama, batalkan dulu deposit lama dengan cmd=cancel, lalu buat yang baru.
  • Jangan batalkan deposit yang sudah Anda transfer. Pembayaran dicocokkan dengan deposit yang masih pending; jika deposit dibatalkan lalu Anda tetap mentransfer nominalnya, dana tidak otomatis menambah saldo dan harus ditindaklanjuti manual oleh admin.
  • Batas nominal deposit harian per akun mengikuti kebijakan platform (hubungi admin jika butuh limit lebih tinggi).
  • amount harus berada di antara minimal dan maximal metode yang dipilih (lihat cmd=methods).
  • Deposit otomatis (is_auto: true) yang tidak dibayar akan kedaluwarsa dalam 24 jam sejak dibuat.
Webhook tersedia untuk deposit

Setelah membuat deposit dengan cmd=create, Anda tidak wajib polling — status final (success/failed/expired/cancelled) dikirim otomatis ke URL webhook Anda sebagai event deposit.updated. Lihat struktur payload & contoh tiap status. Polling cmd=status tetap bisa dipakai sebagai cadangan (mis. saat pertama kali setup webhook, atau untuk audit berkala).

Rekonsiliasi nominal

Sistem dapat menambahkan biaya admin (fee) dan/atau kode unik (unique_code) pada nominal transfer agar mudah direkonsiliasi — baik untuk metode manual maupun otomatis (QRIS/VA). Selalu gunakan nilai pay_amount dari response sebagai nominal yang harus dibayar/ditransfer — bukan amount (nominal yang Anda minta, belum termasuk fee/kode unik) dan bukan pula nilai amount yang Anda kirim di request. Nilai get_amount hanya untuk referensi saldo yang akan Anda terima, bukan nominal yang harus dibayar.