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": "..."}
- The source amount, fee included, leaves your balance when the swap is created.
to_amountisnulluntil the custodian reports what the conversion produced. We never credit the estimate.- Converting into a currency needs a verified withdrawal address on that chain; otherwise
422 no_verified_destination, withdetail.payable_intolisting what you can convert into.
status | |
|---|---|
PENDING | Created, not yet with the custodian |
SUBMITTED | With the custodian |
SETTLED | Done. to_amount is what arrived |
FAILED | Did not happen. The source is back on your balance |
UNKNOWN | Not 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/float | Per 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/register | Every operation, newest first, with its fee and transaction hash. Pages on an opaque cursor |
GET /v1/register/summary | Totals 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.