Developer
Pergerakan uang, pada ketinggian sebuah panggilan REST.
Lima panggilan membawa Anda dari ujung ke ujung: buat pengguna, isi dompet, cek saldo, kirim uang, baca riwayat. Sepuluh menit dengan kunci sandbox. Kunci sandbox tidak menggerakkan uang sungguhan.
Tanpa terkunci SDK
API-nya berupa HTTP + JSON biasa. Hasilkan klien bertipe dari spesifikasi OpenAPI 3.0.3 yang diterbitkan dalam bahasa Anda, atau cukup gunakan library HTTP Anda.
Idempoten secara bawaan
Setiap panggilan penggerak uang mengambil sebuah kunci idempoten. Percobaan ulang aman; ledger memutar ulang hasil tersimpan byte demi byte.
Peristiwa yang bisa Anda percaya
Webhook bertanda tangan HMAC-SHA256 dengan jendela replay, dikirim paling sedikit sekali dengan id dedupe, pada pool worker yang terisolasi dari jalur uang.
Kredensial bercakupan
Kunci API tenant untuk server-ke-server, token pengguna bertanda tangan berumur pendek untuk panggilan klien, token staf untuk operasi, diverifikasi pada setiap permintaan.
Isi sebuah dompet, lalu kirim uang
Pilih bahasa Anda.
Permintaan yang sama dalam enam bahasa. Jumlah dalam satuan minor bilangan bulat; ledger melakukan sisanya.
# Fund a wallet, then send money. Balances only move on the ledger.
curl -sS -X POST "$WALLETD_API/v1/users" \
-H "Authorization: Bearer $WALLETD_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: usr-42-create" \
-d '{"external_id":"user-42","kind":"consumer","display_name":"Ada Lovelace","handle":"ada"}'
curl -sS -X POST "$WALLETD_API/v1/transfers" \
-H "Authorization: Bearer $WALLETD_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: xfer-ada-grace-001" \
-d '{"from":"user-42","to":"@grace","amount":2500,"currency":"USD"}'client := walletd.New(os.Getenv("WALLETD_API"), os.Getenv("WALLETD_API_KEY"))
var transfer walletd.Transfer
err := client.Do(ctx, http.MethodPost, "/v1/transfers", map[string]any{
"from": "user-42",
"to": "@grace",
"amount": 2500, // minor units, $25.00, never a float
"currency": "USD",
}, &transfer, "xfer-ada-grace-001") // idempotency key
if err != nil {
return fmt.Errorf("transfer: %w", err)
}client = WalletD() # reads WALLETD_API / WALLETD_API_KEY
transfer = client.request(
"POST",
"/v1/transfers",
{
"from": "user-42",
"to": "@grace",
"amount": 2500, # minor units, $25.00
"currency": "USD",
},
idempotency_key="xfer-ada-grace-001",
)
print(transfer["status"]) # "settled"const res = await fetch(`${API}/v1/transfers`, {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": "xfer-ada-grace-001",
},
body: JSON.stringify({
from: "user-42",
to: "@grace",
amount: 2500, // minor units, $25.00
currency: "USD",
}),
});
const transfer = await res.json();$transfer = $walletd->request('POST', '/v1/transfers', [
'from' => 'user-42',
'to' => '@grace',
'amount' => 2500, // minor units, $25.00
'currency' => 'USD',
], idempotencyKey: 'xfer-ada-grace-001');
echo $transfer['status']; // "settled"var body = Map.of(
"from", "user-42",
"to", "@grace",
"amount", 2500, // minor units, $25.00
"currency", "USD");
Transfer transfer = client.post(
"/v1/transfers", body, "xfer-ada-grace-001", Transfer.class);Webhook
Verifikasi dalam beberapa baris.
Setiap peristiwa bertanda tangan. Tolak apa pun yang tidak terverifikasi dalam waktu konstan, dan dedupe pada id peristiwa. Menerima peristiwa yang sama dua kali adalah hal yang diharapkan dan aman.
Semua tipe peristiwa// Verify an incoming webhook, HMAC-SHA256, constant-time, 5-minute replay window.
const signed = `${timestamp}.${rawBody}`;
const expected = hmacSha256(endpointSecret, signed);
if (!timingSafeEqual(expected, signatureFromHeader)) {
return res.status(400).send("bad signature");
}
// Idempotent by X-Wallet-Event-Id, safe to receive the same event twice.Akses awal
Dapatkan kunci sandbox.
Mitra desain mendapat tenant sandbox, spesifikasi OpenAPI, dan saluran langsung ke para insinyur yang membangunnya.