Cek Nama Pemilik Akun
Endpoint untuk mengecek nama pemilik rekening bank atau e-wallet sebelum melakukan transfer — mencegah salah kirim ke nomor tujuan yang salah. Cek nama tidak memotong saldo, tetapi dibatasi oleh kuota (slot) — lihat Kuota Cek Nama.
Endpoint: POST /v1/account-inquiry
Fitur ini hanya tersedia untuk brand tertentu (mis. DANA, BCA, Free Fire) — dikelola oleh IsiKuota, bisa bertambah sewaktu-waktu. Cek field has_account_inquiry pada respons Daftar Produk untuk tahu produk mana yang mendukung fitur ini sebelum menampilkan tombol/alur "Cek Nama" ke pengguna Anda. Mengirim code yang has_account_inquiry-nya false akan menghasilkan ACCOUNT_INQUIRY_FAILED.
Endpoint ini bisa memakan waktu hingga 20 detik untuk merespons. Set timeout HTTP client Anda ke minimal 25 detik khusus untuk endpoint ini.
Kuota Cek Nama
Cek nama dibatasi agar tidak dipakai terus-menerus tanpa transaksi. Setiap akun punya slot cek nama dengan aturan berikut:
| Aturan | Keterangan |
|---|---|
| Slot awal & batas atas | Member 20 slot, Reseller 500 slot (angka dapat berubah sewaktu-waktu) |
| Setiap cek nama | Memakai 1 slot |
| Setiap transaksi sukses | Mengembalikan 1 slot (1:1), tidak melebihi batas atas. Hanya transaksi dengan harga jual minimal Rp 1.000 yang dihitung |
| Cek gagal karena gangguan provider | Slot dikembalikan otomatis |
| Nomor tidak valid / nama tidak ditemukan | Slot tetap terpakai |
| Syarat saldo | Saldo Anda harus sama dengan atau lebih besar dari harga produk yang dicek. |
| Batas request | Maksimal 500 request per menit per akun untuk endpoint ini |
Slot melekat pada akun Anda dan aturan kuota ini berlaku untuk cek nama lewat API. Transaksi sukses dari channel mana pun (API, website, aplikasi) tetap mengembalikan slot. Sisa slot ditampilkan di field remaining_quota pada respons sukses, sehingga Anda dapat memantau pemakaiannya.
Lakukan cek nama hanya saat pengguna Anda benar-benar akan melakukan transfer, lalu lanjutkan dengan order. Dengan pola cek nama → order, slot kembali setiap transaksi sukses sehingga kuota tidak pernah habis. Hindari mengecek nomor yang sama berulang kali atau mengecek tanpa niat bertransaksi.
Alur yang benar dan yang salah
✅ Alur yang benar — setiap cek nama diikuti transaksi sukses, sehingga slot kembali:
cek nama
↓
order
↓
transaksi
↓
sukses
❌ Alur yang salah — cek nama berulang tanpa transaksi, sehingga slot terus berkurang sampai habis:
cek nama
↓
cek nama
↓
cek nama
↓
cek nama
↓
cek nama
↓
cek nama
Parameter Request
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
api_id | string | ✅ | API ID |
timestamp | integer | ✅ | Unix timestamp |
signature | string | ✅ | HMAC-SHA256 — lihat cara membuat signature |
code | string | ✅ | Kode produk transfer/e-wallet dari Daftar Produk (mis. produk transfer DANA/BCA) |
customer_no | string | ✅ | Nomor rekening/e-wallet tujuan yang ingin dicek namanya |
Contoh Request
- PHP
- JavaScript
- Python
- Java
- C#
- cURL
<?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 = [
'code' => 'SGBDANA1',
'customer_no' => '081234567890',
];
// 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/account-inquiry');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 25, // penting — endpoint ini bisa menunggu hingga 20 detik
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
]);
$response = json_decode(curl_exec($ch), true);
$customer_name = $response['data']['customer_name'] ?? null;
// print_r($response);
echo json_encode($response, JSON_PRETTY_PRINT);
const crypto = require('crypto');
const api_id = 'your_api_id';
const api_key = 'your_api_key';
const secret_key = 'your_secret_key';
const timestamp = Math.floor(Date.now() / 1000);
// Business params — urutkan A ke Z
const businessParams = {
code: 'SGBDANA1',
customer_no: '081234567890',
};
const sorted = Object.fromEntries(
Object.keys(businessParams).sort().map(k => [k, businessParams[k]])
);
const canonicalBody = JSON.stringify(sorted);
const bodyHash = crypto.createHash('sha256').update(canonicalBody).digest('hex');
const stringToSign = `${api_id}|${api_key}|${timestamp}|${bodyHash}`;
const signature = crypto.createHmac('sha256', secret_key).update(stringToSign).digest('hex');
// timeout 25s — endpoint ini bisa menunggu hingga 20 detik
const controller = new AbortController();
setTimeout(() => controller.abort(), 25000);
const response = await fetch('https://api.isikuota.com/v1/account-inquiry', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ ...sorted, api_id, timestamp, signature }),
signal: controller.signal,
});
const data = await response.json();
const customerName = data.data?.customer_name ?? null;
import hmac, hashlib, time, json, requests
api_id = 'your_api_id'
api_key = 'your_api_key'
secret_key = 'your_secret_key'
timestamp = int(time.time())
# Business params — urutkan A ke Z
business_params = {
'code': 'SGBDANA1',
'customer_no': '081234567890',
}
sorted_params = dict(sorted(business_params.items()))
canonical_body = json.dumps(sorted_params, ensure_ascii=False, separators=(',', ':'))
body_hash = hashlib.sha256(canonical_body.encode()).hexdigest()
string_to_sign = f'{api_id}|{api_key}|{timestamp}|{body_hash}'
signature = hmac.new(secret_key.encode(), string_to_sign.encode(), hashlib.sha256).hexdigest()
payload = {**sorted_params, 'api_id': api_id, 'timestamp': timestamp, 'signature': signature}
# timeout 25s — endpoint ini bisa menunggu hingga 20 detik
response = requests.post('https://api.isikuota.com/v1/account-inquiry', json=payload, timeout=25)
data = response.json()
customer_name = (data.get('data') or {}).get('customer_name')
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.time.Duration;
import java.time.Instant;
import java.util.*;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.http.*;
import java.net.URI;
public class AccountInquiryExample {
static String sha256(String input) throws Exception {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
for (byte b : hash) sb.append(String.format("%02x", b));
return sb.toString();
}
static String hmacSha256(String data, String key) throws Exception {
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
byte[] hash = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
for (byte b : hash) sb.append(String.format("%02x", b));
return sb.toString();
}
public static void main(String[] args) throws Exception {
String apiId = "your_api_id";
String apiKey = "your_api_key";
String secretKey = "your_secret_key";
long timestamp = Instant.now().getEpochSecond();
// Business params — TreeMap otomatis urut A ke Z
TreeMap<String, String> businessParams = new TreeMap<>();
businessParams.put("code", "SGBDANA1");
businessParams.put("customer_no", "081234567890");
ObjectMapper mapper = new ObjectMapper();
String canonicalBody = mapper.writeValueAsString(businessParams);
String bodyHash = sha256(canonicalBody);
String stringToSign = apiId + "|" + apiKey + "|" + timestamp + "|" + bodyHash;
String signature = hmacSha256(stringToSign, secretKey);
Map<String, Object> payload = new LinkedHashMap<>(businessParams);
payload.put("api_id", apiId);
payload.put("timestamp", timestamp);
payload.put("signature", signature);
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(25)) // endpoint ini bisa menunggu hingga 20 detik
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.isikuota.com/v1/account-inquiry"))
.header("Content-Type", "application/json")
.timeout(Duration.ofSeconds(25))
.POST(HttpRequest.BodyPublishers.ofString(mapper.writeValueAsString(payload)))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
var result = mapper.readTree(response.body());
String customerName = result.at("/data/customer_name").asText(null);
System.out.println("customer_name: " + customerName);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class AccountInquiryExample
{
static string Sha256(string input)
{
using var sha = SHA256.Create();
var bytes = sha.ComputeHash(Encoding.UTF8.GetBytes(input));
return BitConverter.ToString(bytes).Replace("-", "").ToLower();
}
static string HmacSha256(string data, string key)
{
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key));
var bytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(data));
return BitConverter.ToString(bytes).Replace("-", "").ToLower();
}
static async Task Main()
{
var apiId = "your_api_id";
var apiKey = "your_api_key";
var secretKey = "your_secret_key";
var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
// Business params — SortedDictionary otomatis urut A ke Z
var businessParams = new SortedDictionary<string, string>
{
{ "code", "SGBDANA1" },
{ "customer_no", "081234567890" },
};
var canonicalBody = JsonSerializer.Serialize(businessParams);
var bodyHash = Sha256(canonicalBody);
var stringToSign = $"{apiId}|{apiKey}|{timestamp}|{bodyHash}";
var signature = HmacSha256(stringToSign, secretKey);
var payload = new Dictionary<string, object>(
businessParams.Select(x => new KeyValuePair<string, object>(x.Key, x.Value)))
{
{ "api_id", apiId },
{ "timestamp", timestamp },
{ "signature", signature },
};
// timeout 25s — endpoint ini bisa menunggu hingga 20 detik
using var client = new HttpClient { Timeout = TimeSpan.FromSeconds(25) };
var json = JsonSerializer.Serialize(payload);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://api.isikuota.com/v1/account-inquiry", content);
var result = await response.Content.ReadAsStringAsync();
var doc = JsonDocument.Parse(result);
var customerName = doc.RootElement.GetProperty("data").GetProperty("customer_name").GetString();
Console.WriteLine($"customer_name: {customerName}");
}
}
API_ID="your_api_id"
API_KEY="your_api_key"
SECRET="your_secret_key"
TIMESTAMP=$(date +%s)
# Business params — key wajib urut A ke Z
CANONICAL_BODY='{"code":"SGBDANA1","customer_no":"081234567890"}'
BODY_HASH=$(echo -n "$CANONICAL_BODY" | sha256sum | awk '{print $1}')
STRING_TO_SIGN="${API_ID}|${API_KEY}|${TIMESTAMP}|${BODY_HASH}"
SIGNATURE=$(echo -n "$STRING_TO_SIGN" | openssl dgst -sha256 -hmac "$SECRET" | awk '{print $2}')
# --max-time 25 — endpoint ini bisa menunggu hingga 20 detik
curl -X POST https://api.isikuota.com/v1/account-inquiry \
--max-time 25 \
-H "Content-Type: application/json" \
-d "{
\"api_id\": \"$API_ID\",
\"timestamp\": $TIMESTAMP,
\"signature\": \"$SIGNATURE\",
\"code\": \"SGBDANA1\",
\"customer_no\": \"081234567890\"
}"
Contoh Response
- ✅ Berhasil
- ❌ Tidak Ditemukan
- 🚫 Kuota Habis
- 💰 Saldo Kurang
- ⏱️ Timeout
{
"success": true,
"code": "ACCOUNT_INQUIRY_SUCCESS",
"message": "Nama pemilik akun ditemukan",
"data": {
"ref_id": "INQ20260926125705OHEWAW",
"code": "SGBDANA1",
"customer_no": "081234567890",
"customer_name": "BUDI SANTOSO",
"remaining_quota": 19
},
"errors": null,
"meta": null
}
{
"success": false,
"code": "ACCOUNT_INQUIRY_FAILED",
"message": "Nama pemilik akun tidak ditemukan",
"data": null,
"errors": null,
"meta": null
}
HTTP 429
{
"success": false,
"code": "ACCOUNT_INQUIRY_QUOTA_EXCEEDED",
"message": "Kuota cek nama Anda habis. Selesaikan transaksi untuk menambah kuota.",
"data": null,
"errors": null,
"meta": null
}
HTTP 400
{
"success": false,
"code": "ACCOUNT_INQUIRY_INSUFFICIENT_BALANCE",
"message": "Syarat cek nama: saldo minimal sebesar harga produk (Rp 10.000). Saldo Anda belum mencukupi.",
"data": null,
"errors": null,
"meta": null
}
{
"success": false,
"code": "PROVIDER_TIMEOUT",
"message": "Provider belum membalas dalam batas waktu, silakan coba lagi beberapa saat",
"data": null,
"errors": null,
"meta": null
}
Field Response
| Field | Tipe | Keterangan |
|---|---|---|
ref_id | string | ID referensi internal untuk permintaan cek nama ini |
code | string | Kode produk yang dikirim |
customer_no | string | Nomor rekening/e-wallet yang dicek |
customer_name | string | Nama pemilik akun sesuai data provider |
remaining_quota | integer | Sisa slot cek nama setelah request ini. Hanya ada pada respons sukses — lihat Kuota Cek Nama |
Ini bukan berarti gagal permanen: provider mungkin masih memproses. Anda boleh mengulang request setelah beberapa saat (tidak ada saldo yang terpotong), tetapi slot untuk request yang timeout tidak dikembalikan, jadi jangan mengulang terlalu agresif.
ACCOUNT_INQUIRY_QUOTA_EXCEEDED (HTTP 429) berarti slot habis, dan ACCOUNT_INQUIRY_INSUFFICIENT_BALANCE (HTTP 400) berarti saldo lebih kecil dari harga produk. Melewati batas 30 request per menit menghasilkan TOO_MANY_REQUESTS. Daftar lengkap ada di Kode Error.
Fitur ini membantu mengurangi risiko salah transfer, tapi selalu tampilkan customer_name ke pengguna untuk konfirmasi akhir sebelum transfer benar-benar diproses.