Beranda / Dokumentasi

Documentation Center

Referensi API berlapis: konteks bisnis → topologi koneksi → detail teknis

Lintas Sektor

Autentikasi SNAP BI

RSA key pair tidak kedaluwarsa. Yang berumur 15 menit adalah token JWT yang dibuat otomatis oleh kode program Anda setiap request — bukan sesuatu yang dilakukan manual. RSA key didaftarkan sekali dan bertahan selama tidak dirotasi.

Spesifikasi

AlgoritmaRS256
Key size2048-bit min
Token JWT expiry900 detik (15 min)
RSA keyTidak kedaluwarsa
StandarSNAP BI v2.0
Max key aktif2 (untuk rotasi)

Alur setiap request API

1

Ambil access token (sekali per sesi)

Kirim client_id + client_secret ke POST /auth/token. Terima access_token yang berlaku 15 menit. Kode Anda melakukan ini otomatis — bukan manual.

2

Tanda tangani setiap request dengan RSA private key

Buat string yang akan ditandatangani dari HTTP method + path + timestamp + hash body. Tanda tangani dengan private_key.pem menggunakan RS256. Kirim hasilnya di header X-SIGNATURE.

3

Bank ABC memverifikasi tanda tangan

Bank ABC menggunakan public_key.pem yang sudah Anda daftarkan di Credentials untuk memverifikasi. Jika cocok, request diterima. Jika tidak, server mengembalikan 401 Unauthorized.

Contoh implementasi signing (Python)

import jwt, time, hashlib, base64
from cryptography.hazmat.primitives import serialization

# 1. Muat private key (dilakukan sekali saat startup)
with open("private_key.pem", "rb") as f:
    private_key = serialization.load_pem_private_key(f.read(), password=None)

# 2. Buat access token (auto-refresh jika kedaluwarsa)
def get_access_token(client_id, client_secret):
    payload = {
        "iss": client_id,
        "sub": client_id,
        "iat": int(time.time()),
        "exp": int(time.time()) + 900,  # 15 menit — dibuat otomatis
    }
    return jwt.encode(payload, private_key, algorithm="RS256")

# 3. Tanda tangani setiap request
def sign_request(method, path, body, timestamp):
    body_hash = base64.b64encode(
        hashlib.sha256(body.encode()).digest()
    ).decode()
    string_to_sign = f"{method}:{path}:{body_hash}:{timestamp}"
    return jwt.encode({"data": string_to_sign}, private_key, algorithm="RS256")
const jose = require('jose');
const fs   = require('fs');
const crypto = require('crypto');

// 1. Muat private key sekali saat startup
const privateKey = crypto.createPrivateKey(fs.readFileSync('private_key.pem'));

// 2. Buat access token (auto-refresh jika kedaluwarsa)
async function getAccessToken(clientId) {
  return new jose.SignJWT({ iss: clientId, sub: clientId })
    .setProtectedHeader({ alg: 'RS256' })
    .setIssuedAt()
    .setExpirationTime('15m')  // auto-dibuat tiap request
    .sign(privateKey);
}

// 3. Buat signature per request
function signRequest(method, path, body, timestamp) {
  const bodyHash = crypto.createHash('sha256').update(body).digest('base64');
  const stringToSign = `${method}:${path}:${bodyHash}:${timestamp}`;
  return crypto.sign('sha256', Buffer.from(stringToSign), privateKey).toString('base64');
}
// 1. Muat private key sekali saat startup
PrivateKey privateKey = loadPrivateKeyFromPem("private_key.pem");

// 2. Buat access token (auto-refresh jika kedaluwarsa)
String getAccessToken(String clientId) {
    long now = Instant.now().getEpochSecond();
    return Jwts.builder()
        .setIssuer(clientId).setSubject(clientId)
        .setIssuedAt(new Date(now * 1000))
        .setExpiration(new Date((now + 900) * 1000))  // 15 menit
        .signWith(privateKey, SignatureAlgorithm.RS256)
        .compact();
}

// 3. Tanda tangani setiap request
String signRequest(String method, String path, String body, String timestamp) {
    String bodyHash = Base64.getEncoder().encodeToString(
        MessageDigest.getInstance("SHA-256").digest(body.getBytes()));
    String toSign = method + ":" + path + ":" + bodyHash + ":" + timestamp;
    Signature sig = Signature.getInstance("SHA256withRSA");
    sig.initSign(privateKey);
    sig.update(toSign.getBytes());
    return Base64.getEncoder().encodeToString(sig.sign());
}

Error autentikasi yang umum

Response CodeHTTPPenyebabSolusi
4012900401Token JWT kedaluwarsa (>15 menit)Generate token baru secara otomatis dan ulangi request
4012901401Signature tidak validPeriksa format string_to_sign dan pastikan menggunakan private key yang benar
4012902401Public key belum terdaftarDaftarkan public key di Credentials > Autentikasi SNAP terlebih dahulu
4002900400Header X-TIMESTAMP tidak sesuai formatGunakan format ISO 8601: 2026-05-23T09:00:00+07:00

Siap setup? Daftarkan RSA public key Anda di halaman Credentials untuk mulai menggunakan autentikasi SNAP di sandbox.

Daftarkan Public Key
L1 Konteks Bisnis

VA Disbursement — Fintech

API VA Disbursement memungkinkan platform fintech mencairkan dana ke rekening tujuan secara otomatis menggunakan Virtual Account Bank ABC sebagai jalur distribusi. Use case utama meliputi pencairan pinjaman P2P lending, top-up saldo e-wallet, pembayaran gaji (payroll), dan distribusi reward merchant.

Alur dana berjalan dari rekening giro fintech → VA Bank ABC → rekening tujuan akhir, dengan settlement T+0 pada hari kerja sebelum pukul 15.00 WIB. Transaksi yang masuk setelah batas waktu akan diselesaikan pada hari kerja berikutnya.

Aktor Utama

Fintech OperatorPlatform yang menginisiasi permintaan disbursement melalui API. Bertanggung jawab atas validasi identitas penerima dan ketersediaan saldo.
Treasury Bank ABCMemproses instruksi transfer antar rekening internal dan memastikan kepatuhan terhadap regulasi BI untuk transaksi di atas threshold tertentu.
End-User / MerchantPenerima akhir dana. Tidak berinteraksi langsung dengan API; menerima dana di rekening terdaftar.

Alur Uang (Settlement T+0)

1Fintech operator kirim request disbursement via API dengan partnerReferenceNo unik dan jumlah yang akan dicairkan.
2Bank ABC memvalidasi saldo rekening giro fintech dan otentikasi token SNAP.
3Dana dipindahkan dari rekening giro fintech → VA Bank ABC → rekening tujuan akhir.
4Bank ABC mengirim notifikasi callback ke URL terdaftar dengan status transaksi dan timestamp settlement.
Siap lanjut ke arsitektur teknis?L2 Topologi Koneksi & Autentikasi SNAP