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.