Loam Customer API · Preview
Developer Hub
Start here to build on the Loam Customer API.
A first request
One HTTPS call with a bearer token. Authentication is OAuth 2.0 client credentials, so there is no redirect to handle and no SDK to install.
curl --fail-with-body --silent --show-error \ --header "Authorization: Bearer $LOAM_TOKEN" \ "$LOAM_API_BASE/balances" | jq# Response{ "ok": true, "data": [ { "account_id": "6f9619ff-8b86-d011-b42d-00c04fc964ff", "balance": 4250000, "currency": "USD", "last_settled_at": "2026-07-14T09:12:04.118Z" } ]}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
- Trades and their invoices · Marketplace capability (404 unless enabled; requires payments + invoicing)
GET /api/v1/trades - Settled balances
GET /api/v1/balances - Treasury vault terms
GET /api/v1/vaults - Marketplace listings · Marketplace capability (404 unless enabled; requires payments + invoicing)
GET /api/v1/listings - Offers, listed and created · Marketplace capability (404 unless enabled; requires payments + invoicing)
POST /api/v1/offers - 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.