Loam Customer API · Preview
Developer Hub
Start here to build on the Loam Customer API.
A first quote
One HTTPS write with a bearer token and an idempotency key. The quote locks a provider rate — 10,000 USD minor units to 9,125 EUR in the sample — and moves no funds.
curl --fail-with-body --silent --show-error \ --request POST "$LOAM_API_BASE/fx/quotes" \ --header "Authorization: Bearer $LOAM_TOKEN" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: $(uuidgen | tr '[:upper:]' '[:lower:]')" \ --data '{"from_currency":"USD","to_currency":"EUR","amount":10000}'// Response
HTTP/1.1 202 Accepted
Location: /api/v1/fx/quotes/a6bbdbeb-ed3b-42cb-85b1-af3112f2fe06
{
"ok": true,
"data": {
"id": "a6bbdbeb-ed3b-42cb-85b1-af3112f2fe06",
"from_amount": 10000,
"from_currency": "USD",
"to_amount": 9125,
"to_currency": "EUR",
"rate_decimal": "0.9125",
"fee_amount": -25,
"fee_currency": "USD",
"expires_at": "2099-08-14T16:35:00.000Z",
"state": "active"
}
}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 - 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.