Desenvolvedores

Movimentacao financeira, na altitude de uma chamada REST.

Cinco chamadas levam voce de ponta a ponta: criar um usuario, financiar uma carteira, consultar o saldo, enviar dinheiro, ler o historico. Dez minutos com uma chave de sandbox. Chaves de sandbox nao movem dinheiro real.

Sem aprisionamento a SDK

A API e HTTP + JSON puro. Gere um cliente tipado a partir da especificacao OpenAPI 3.0.3 publicada na sua linguagem, ou use apenas sua biblioteca HTTP.

Idempotente por padrao

Cada chamada de movimentacao financeira recebe uma chave de idempotencia. Novas tentativas sao seguras; o livro-razao repete o resultado armazenado byte a byte.

Eventos em que voce pode confiar

Os webhooks sao assinados com HMAC-SHA256 com uma janela de repeticao, entregues ao menos uma vez com ids de deduplicacao, em um pool de workers isolado dos fluxos financeiros.

Credenciais com escopo

Chaves de API de inquilino para servidor a servidor, tokens de usuario assinados de curta duracao para chamadas de cliente, tokens de equipe para operacoes, verificados a cada requisicao.

Financie uma carteira e depois envie dinheiro

Escolha sua linguagem.

A mesma requisicao em seis linguagens. Os valores sao em unidades minimas inteiras; o livro-razao faz o resto.

# 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);

Webhooks

Verifique em poucas linhas.

Cada evento e assinado. Rejeite qualquer coisa que nao verifique em tempo constante, e deduplique pelo id do evento. Receber o mesmo evento duas vezes e esperado e seguro.

Todos os tipos de evento
// 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.

Acesso antecipado

Obtenha uma chave de sandbox.

Parceiros de design recebem um inquilino de sandbox, a especificacao OpenAPI e uma linha direta com os engenheiros que a construiram.