Skip to main content
End-to-end reference for the partner integration flow: manage payout/funding addresses, create and manage orders (quote → confirm → cancel), and read your funding activity and balances.

1. Base URL

All endpoints are served from a single base URL:
Endpoints are grouped under two prefixes: Every path below is shown with its prefix and is relative to the base URL.

2. Authentication

Send your API key on every request:
A missing credential returns 401; a valid credential without access to the requested resource returns 403. Your key is scoped to your own data: list and feed endpoints are automatically filtered to you, and you cannot read another partner’s records. You never need to pass your own identifier as a filter — the API applies it for you.

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) and limit (default 20, max 100). Funding endpoints wrap results as { "data": [...], "pagination": { page, limit, total, totalPages } }; GET /otc/addresses returns 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:
    • /otc endpoints return { "statusCode": number, "error": string, "message": string }, where error is the HTTP reason phrase (e.g. "Conflict") and machine-readable codes such as quote_already_used are carried in message.
    • /funding endpoints return { "statusCode": number, "error": string, "message": string, "code": string }. Discriminate on code (VALIDATION_ERROR, UNAUTHORIZED, FORBIDDEN, ENTITY_NOT_FOUND, AUTH_DEPENDENCY_UNAVAILABLE); the error field is not meaningful on this group.

4. The partner flow at a glance

Order status lifecycle: 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 from QUOTED, PENDING_FUNDING, and PARTIALLY_FILLED (the cancellable states).
  • EXPIRED — reachable from QUOTED, PENDING_FUNDING, and PARTIALLY_FILLED when 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}

200Address. 404 if not found.

POST /otc/addresses

Register an address. One of type or network is required.
201Address. 400 validation, 409 if the address already exists.

PUT /otc/addresses/{id}

Partner keys may only update notes; changing the address string or its type requires an internal grant and returns 403. 200Address. 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).
201OrderDetail. 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 / 503 price_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. 200OrderDetail. 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. 200OrderSummary. 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). 200OrderSummary. 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):
Each entry in 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 wallet address in wallets is where you send the deposit for a PENDING_FUNDING order.
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 }:
All balance figures are decimal strings.

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).