Loam Customer API · Preview
Developer Hub
Start here to build on the Loam Customer API.
Payments you can read today
List the organisation's payments with a bearer token. An empty page is a success — nothing has been recorded yet. Sending money is a different call: it needs the money.write scope, an owner grant under step-up authentication, and an approved destination, and it stays closed in preview.
curl -H "Authorization: Bearer $LOAM_TOKEN" \ "$LOAM_API_BASE/payments"// Response
{
"ok": true,
"data": [
{
"id": "c4d8e2f0-1a3b-45cd-8e9f-0a1b2c3d4e5f",
"state": "settled",
"source_kind": "wallet_transfer",
"fiat_amount": 2500000,
"fiat_currency": "USD",
"crypto_amount": null,
"crypto_currency": null,
"trade_id": null,
"created_at": "2026-07-14T09:12:04.118Z",
"updated_at": "2026-07-14T09:14:11.004Z",
"settled_at": "2026-07-14T09:14:11.004Z",
"failed_at": null
}
],
"page": { "next_cursor": null }
}What the API covers today
Preview access is deliberately narrower than the published contract. Everything below is callable now or names the grant it is waiting on.
Open in preview
- Settled balances
GET /api/v1/balances - Payments, listed
GET /api/v1/payments - Treasury vault terms
GET /api/v1/vaults - Foreign-exchange quotes
POST /api/v1/fx/quotes
Closed in preview
- Payments to an approved destination
POST /api/v1/payments - Funds in from a bank account
POST /api/v1/onramp - Funds out to a bank account
POST /api/v1/offramp - Vault deposits and withdrawals
POST /api/v1/vaults/…
Money movement needs a human organisation owner to grant the scope under step-up authentication, set a per-transaction limit, and approve the destination in advance. Those endpoints stay closed until preview ends.
How the API behaves
OAuth 2.0
Client credentials grant
Exchange a client id and secret for a short-lived bearer token with one form-encoded request. Scopes are read from the client per request, so narrowing one applies at once.
Envelope
One shape for every route
Success is
okthendata; failure isok: falsewith a machine-readable error code.Idempotency
Retries cost nothing
Every write requires an
Idempotency-Key. The same key with the same body replays the first outcome instead of writing twice.Pagination
Cursors, not offsets
List routes return
page.next_cursor. Pass it back ascursoruntil it comes back null.
Pick a path from here: the quickstart if you want a working request in front of you first, the reference if you already know the call you need.