Conversions

Convert your balance from one currency to another. Conversions are opened per tenant: until they are opened for you, every call answers 501 not_available_yet, including the quote. That is not your key.

Pairs

GET /v1/pairs
{"pairs": [{"from_currency": "USDT_TRC20", "to_currency": "BTC",
            "rate": "0.0000127", "rate_age_seconds": 12, "minimum": "5"}]}

A pair is listed when we deal in both currencies, the custodian lists both, and we hold a fresh price. A pair whose price went stale is absent rather than listed. rate is the market, with no fee applied. minimum is the custodian's floor, or null when they do not state one.

GET /v1/currencies answers per currency whether we deal in it, whether the custodian lists it right now, whether we can price it, and whether you have a verified address to take it out to. When the custodian could not be reached, custodian_read is false and every custodian_lists is null rather than false.

Quote

POST /v1/quotes

{"product": "SWAP", "amount": {"amount": "10", "currency": "USDT_TRC20"}, "to_currency": "BTC"}

Answers id, expires_at, amount, customer_fee, amount_received, exchange_rate and rate_observed_at. Nothing is reserved and no money moves. Pass the id as quote_id on the swap and that is the price you are charged. Quotes live about two minutes.

Swap

POST /v1/swaps
Idempotency-Key: <your record id>

{"amount": {"amount": "10", "currency": "USDT_TRC20"},
 "to_currency": "BTC",
 "quote_id": "...",
 "partner_reference": "..."}
status
PENDINGCreated, not yet with the custodian
SUBMITTEDWith the custodian
SETTLEDDone. to_amount is what arrived
FAILEDDid not happen. The source is back on your balance
UNKNOWNNot yet accounted for, with unresolved: true. Do not retry

Read with GET /v1/swaps/{swap_id} or GET /v1/swaps?status=, or follow swap.* events.

Your balance

Call
GET /v1/floatPer currency: available (act on this), held (taken by an operation in flight), total
GET /v1/float/statement?currency=Every movement on one currency, oldest first, with a running balance. No cursor: when truncated is true, narrow since / until
GET /v1/registerEvery operation, newest first, with its fee and transaction hash. Pages on an opaque cursor
GET /v1/register/summaryTotals by kind, currency and status

Every balance is summed from ledger entries; there is no balance column to disagree with them.

Halts

503 temporarily_halted means an hourly check found our books and the custodian's balance disagreeing past a threshold. Conversions and withdrawals stop for everyone until a person has looked. detail.reason says what was found and detail.halted_since when. Back off and retry.