Bankable Bankable DOCS
v1.0 Request access
Getting started

Bankable API

The Bankable API lets you move value in real time. Create settlements, manage stablecoin treasury and embed institutional wallets — over one REST interface, running 24/7/365.

Your account is live. Sandbox and production keys are already provisioned in your dashboard — no waiting on approval. Start in the sandbox, then flip one variable to go live.
BASE URL
productionhttps://api.trybankable.xyz/v1
sandboxhttps://sandbox.trybankable.xyz/v1

Quickstart

Make your first authenticated call in under a minute. Grab your sk_test key from the dashboard and ping the API.

Request Copy
curl https://sandbox.trybankable.xyz/v1/ping \
  -H "Authorization: Bearer sk_test_your_key"
200 · Response Copy
{ "status": "ok", "environment": "sandbox", "version": "v1" }

Authentication

Bankable uses bearer tokens. Send your secret key in the Authorization header on every request. All traffic must be over HTTPS. Never expose a sk_live key in client-side code.

Header Copy
Authorization: Bearer sk_live_51H8xQ...c0dE

Sandbox

The sandbox mirrors production exactly — same endpoints, same payloads — but settles simulated stablecoin with no real funds. It's already enabled on your account.

Sandbox base URL
https://sandbox.trybankable.xyz/v1
Test key
sk_test_51H8xQ...t3sT

Pre-seeded test counterparties are ready to receive settlements. When you're ready to go live, swap the base URL to production and use your sk_live key — nothing else changes.

Make a payment

Create a settlement to move stablecoin to a counterparty. Settlement is instant and final — the response returns with a settled status.

cURL Node
cURL · POST /settlements Copy
curl https://sandbox.trybankable.xyz/v1/settlements \
  -H "Authorization: Bearer sk_test_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": "25000.00",
    "currency": "USDC",
    "counterparty": "cp_9f2a4c",
    "reference": "invoice-4821"
  }'
Node · @bankable/node Copy
import { Bankable } from "@bankable/node";
const bankable = new Bankable("sk_test_your_key");

const settlement = await bankable.settlements.create({
  amount: "25000.00",
  currency: "USDC",
  counterparty: "cp_9f2a4c",
  reference: "invoice-4821",
});

console.log(settlement.status); // "settled"
201 · Response Copy
{
  "id": "stl_3b8c1d",
  "status": "settled",
  "amount": "25000.00",
  "currency": "USDC",
  "counterparty": "cp_9f2a4c",
  "reference": "invoice-4821",
  "settled_at": "2026-07-03T09:12:04Z"
}

Webhooks

Subscribe to events to stay in sync. Bankable signs every delivery with the X-Bankable-Signature header — verify it against your webhook secret before trusting a payload.

settlement.settled settlement.failed counterparty.created treasury.balance.updated
Event payload Copy
{
  "type": "settlement.settled",
  "created": "2026-07-03T09:12:04Z",
  "data": { "id": "stl_3b8c1d", "status": "settled", "amount": "25000.00" }
}

Errors

Bankable uses conventional HTTP status codes and returns a structured error body.

Error body Copy
{
  "error": {
    "type": "invalid_request",
    "code": "insufficient_liquidity",
    "message": "Treasury balance is below the requested amount."
  }
}
STATUSMEANING
400Invalid request — a parameter is missing or malformed
401Authentication failed — check your API key
402Insufficient liquidity in the settlement account
429Too many requests — back off and retry
500Something went wrong on our end

SDKs

Official libraries handle auth, retries and typing for you.

Install Copy
# Node
npm install @bankable/node

# Python
pip install bankable

API reference

The core endpoints. Every route is available in both sandbox and production.

POST/settlementsCreate a settlement
GET/settlements/:idRetrieve a settlement
GET/settlementsList settlements
POST/counterpartiesAdd a counterparty
GET/treasury/balancesList treasury balances
POST/webhooksCreate a webhook endpoint
Ready to build?
Request access and your sandbox keys are waiting.
Request access