1. Base URL
All endpoints are served from a single base URL:
Every path below is shown with its prefix and is relative to the base URL.
2. Authentication
Send your API key on every request:3. Conventions
- Money is a decimal string, never a JSON number (e.g.
"1003.5"). This preserves exact precision. Send amounts as strings; expect them back as strings.amountDecimals(2 or 6) on order responses tells you the display precision for the asset. - Pagination: list endpoints take
page(1-indexed, default 1) andlimit(default 20, max 100). Funding endpoints wrap results as{ "data": [...], "pagination": { page, limit, total, totalPages } };GET /otc/addressesreturns the same counters flat on the envelope:{ "data": [...], "page", "limit", "total", "totalPages" }. - Timestamps are ISO-8601 strings (UTC).
- Errors — the two endpoint groups use slightly different shapes:
/otcendpoints return{ "statusCode": number, "error": string, "message": string }, whereerroris the HTTP reason phrase (e.g."Conflict") and machine-readable codes such asquote_already_usedare carried inmessage./fundingendpoints return{ "statusCode": number, "error": string, "message": string, "code": string }. Discriminate oncode(VALIDATION_ERROR,UNAUTHORIZED,FORBIDDEN,ENTITY_NOT_FOUND,AUTH_DEPENDENCY_UNAVAILABLE); theerrorfield is not meaningful on this group.
4. The partner flow at a glance
QUOTED → PENDING_FUNDING → PARTIALLY_FILLED → FULFILLED (a fully funded order may skip PARTIALLY_FILLED). After FULFILLED the payout runs: FULFILLED → PROCESSING_PAYOUT → SETTLED, with PAYOUT_FAILED reachable from PROCESSING_PAYOUT (payouts are retried, returning the order to PROCESSING_PAYOUT).
Two more terminal states can appear:
CANCELLED— reachable fromQUOTED,PENDING_FUNDING, andPARTIALLY_FILLED(the cancellable states).EXPIRED— reachable fromQUOTED,PENDING_FUNDING, andPARTIALLY_FILLEDwhen the quote/order expiry elapses.
5. Addresses
Manage the addresses an order can pay out to / be funded from.A newly registered address is reviewed and approved before it can be used on an order.
GET /otc/addresses
Query: search (substring of the address), network (address type: ERC20, Bitcoin, Liquid, or Liquid AMP — not a lowercase network name), status, asset, page, limit.
200 → { data: Address[], page, limit, total, totalPages } (flat envelope — see Conventions).
GET /otc/addresses/{id}
200 → Address. 404 if not found.
POST /otc/addresses
Register an address. One of type or network is required.
Address. 400 validation, 409 if the address already exists.
PUT /otc/addresses/{id}
notes; changing the address string or its type requires an internal grant and returns 403.
200 → Address. 409 if the address is currently used in an active request, or if the change would duplicate an existing address.
DELETE /otc/addresses/{id}
204 No Content. 409 if the address is currently used in an active request, or is bound to a trading pair (remove or update the binding first).
Address object
Fields include the address string, its type/network, asset, lifecycle status, screening result where applicable, and timestamps.
6. Orders
Quote, list, inspect, confirm, and cancel orders.POST /otc/orders/quote — create a quote (unconfirmed order)
Prices the order on a fresh rate, applies your fee, and returns a QUOTED order. The quote has an expiry (quote.expiresAt).
OrderDetail. Notable errors (the code string is carried in the error body’s message):
- 404
user_pair_not_found— no route configured for this asset pair. - 409
user_pair_inactive— the route exists but is not currently tradable. - 422
amount_below_min— the amount is below the pair’s minimum size. - 503
price_unavailable/ 503price_stale— pricing cannot value the order right now; retry later.
GET /otc/orders
List your orders. Optional repeated id filter: ?id=<a>&id=<b>.
200 → array of Order (raw shape — see below; differs from the enriched OrderDetail returned by the detail endpoint).
GET /otc/orders/{id}
Enriched detail: summary, quote info, cancellation eligibility, and resolved wallets.
200 → OrderDetail. 404 if not found.
POST /otc/orders/{id}/confirm — confirm a quoted order
Confirms a QUOTED order whose quote is still valid: QUOTED → PENDING_FUNDING.
200 → OrderSummary. Errors:
- 409
quote_already_used— the quote was already confirmed. - 409
quote_expired— the quote expired or was cancelled.
POST /otc/orders/{id}/cancel — cancel an order
Cancels the order when it is in a cancellable state (QUOTED, PENDING_FUNDING, or PARTIALLY_FILLED).
200 → OrderSummary. 409 if the order is not in a cancellable state (message: Order in status <STATUS> cannot be cancelled.).
Order response shapes
OrderSummary (returned by confirm/cancel):
wallets has exactly label, network, and address (nullable). The list carries the funding-side wallets followed by your payout wallet.
OrderDetail (returned by quote/get) = OrderSummary plus:
The funding walletaddressinwalletsis where you send the deposit for aPENDING_FUNDINGorder.
Order (raw shape returned by GET /otc/orders list): id, userPairId, status, size, rate, amountIn, amountOut, actualFee, payoutStatus, payoutId, and lifecycle timestamps (confirmationTimestamp, fulfillmentTimestamp, cancellationTimestamp, payoutStarted, payoutCompleted, expiresAt, createdAt, updatedAt). All money fields are decimal strings.
7. Funding activity & balances
After an order is confirmed and funded, track the deposit and your balance.GET /funding/funding-activity — the funding-activity feed
Paginated feed of your fundings (deposits), each annotated with the orders it is allocated to.
Query: asset, network, status, order_id (must be a UUID), date_from, date_to (ISO-8601; date_from must not be after date_to) — all optional — plus page and limit.
200 → { data: FundingActivityItem[], pagination }:
FundingStatus values: RECEIVED, DIRTY, ELIGIBLE, TRANSFER_FAILED, AVAILABLE, PARTIALLY_ALLOCATED, ALLOCATED, CONSUMED.
linked_orders includes orders linked via live (non-cancelled) allocations; a fully consumed funding still shows what it was spent on. Amounts are summed per order across the funding’s allocations.
GET /funding/balances — balances
Paginated balances at (asset, network) grain — the same asset on two networks is reported as two rows, never merged.
Query: asset, network (optional), plus page and limit.
200 → { data: BalanceRow[], pagination }:
8. Error reference
On
/otc endpoints the code strings above (quote_expired, price_unavailable, …) arrive in the error body’s message field; on /funding endpoints use the code field (see Conventions).