Skip to main content

API surface

The complete machine-readable OpenAPI 3.1 contract is available on request; this page is the map. Statuses are literal: Live endpoints are served today in sandbox and production.

Set 1 — On-ramp

EndpointStatusWhat it does
POST /v1/accounts · GET /v1/accountsLiveMint/read accounts keyed by your externalId; KYC is a signed attestation — no PII documents cross.
POST /v1/deposits · GET /v1/deposits[?accountId=] · GET /v1/deposits/{id}LiveDeclared deposits: funding instructions out, matched arrival in, available credited at finality. Under/over-delivery completes with amountMatch and the received amount authoritative; unmatched arrivals never credit silently.
POST /v1/accounts/{id}/deposit-addresses · GET same pathLivePer-user deposit addresses (USDC on Sui, USDT on Tron). Idempotent per (account, asset, network); arrivals credit automatically with source: deposit_address; retired addresses stay watched forever.
POST /v1/quotesLive (withdrawal kind)An all-in, itemized, executable-once commitment with an expiry.
POST /v1/holds · capture/releaseLiveTwo-phase reserve/capture matching an authorization switch.

Set 2 — Movement

EndpointStatusWhat it does
POST /v1/transfers · GET /v1/transfers/{id}LiveLedger-internal account-to-account movement, usually synchronous completed, optional holdId, inclusive/additive fee models.
GET /v1/accounts/{id}/balancesLivetotal = available + held + inFlight + Σ allocated.value — the invariant is part of the contract.

Set 3 — Off-ramp

EndpointStatusWhat it does
Allowlist endpointsLiveDestinations are pre-registered and screened; a withdrawal can only name an allowlisted destination.
POST /v1/withdrawals · GET /v1/withdrawals/{id}LiveQuote-referenced, screened, chain-settled with deterministic terminal states and chainEvidence on completion.
Conversions & fiat payout handoffPhase 2Contract designed; activates with the licensed payout partner.

Set 4 — Spend

EndpointStatusWhat it does
POST /v1/payments/authorizeLiveSynchronous, p99 ≤ 300 ms, hard 500 ms budget, fail-closed: inside-budget decline is 201 {state: "declined", failureCode} — never a 5xx to interpret; your cascade falls back to fiat and the POS never stalls.
POST /v1/payments/{id}/capture · …/voidLiveSingle capture ≤ authorized (remainder returns in the same commit); uncaptured authorizations lapse after 24 h with payment.expired.

Set 5 — Earning (Save)

EndpointStatusWhat it does
GET /v1/vaults · /{id} · /{id}/priceLiveCatalog, terms (minimums, cycles, instant-redemption fee), daily share price.
POST /v1/subscriptionsLiveSubscribe at the settlement-time execution price (quoted values advisory); shares accrue once settled.
POST /v1/redemptionsLivequeued (standard cycle) or instant (buffer-backed, fee explicit via an instant_redeem quote — never silently deducted).
PUT /v1/accounts/{id}/save-policyLiveAuto-invest daily above a configurable spend buffer, so day-to-day liquidity never touches redemption latency.
GET /v1/accounts/{id}/accruals · GET /v1/yield-reportsLivePer account × vault × day: time-weighted shares, share price open/close, gross yield, platform fee, net yield.

Earning runs against the yield venue's sandbox today; production activation follows the venue's own production readiness — the API contract does not change when it does.

Statements & events

EndpointStatusWhat it does
StatementsLiveSealed, immutable daily statements — opening, ordered lines with balanceAfter, closing, invariantOk — at the agreed business-date cut-off.
Webhook subscriptionsLiveExact-string event matching; see Webhooks.

Error taxonomy

invalid_request · unauthorized · permission_denied · not_found · conflict · idempotency_conflict · idempotency_in_progress · rate_limited · insufficient_available · min_amount · limit_exceeded · hold_not_active · hold_expired · quote_expired · quote_consumed · account_frozen · screening_rejected · unsupported_asset · stale_price · partner_unavailable · internal