Skip to main content
Read endpoints return your current state on demand. Use them to backfill, reconcile, and display. For events as they happen, use webhooks or the WebSocket. Real time and data channels compares all four channels. Authenticated reads take a scoped API key and live under /v1. Market data at /markets is public and needs no key.

What to read

Filtering parlays

GET /v1/rfqs takes two query parameters:

P&L windows

GET /v1/pnl returns realized P&L per day. Pick the window with ?period=1D, 1W, 1M, or ALL. The default is 1W.
Everything on the read surface is realized. portfolio.summary.portfolio_value is your deposited USDC. It does not mark open positions to market, and there is no unrealized P&L field anywhere in the API. To value open positions, price each leg yourself against live /markets data.

Balances

GET /v1/wallet returns every balance in one call. Each field is defined in the Glossary.
Do not subtract /v1/vault’s locked_collateral on top of locked_amount. It is already counted inside locked_amount. Subtracting both understates your available balance and makes a bot refuse trades it can afford.

Settlement outcomes

GET /v1/rfqs/{id} is the source of truth for how a parlay resolved. Once it is terminal, the response carries the full settlement detail: A parlay id you do not own returns 404.

Reconciling

1

Enumerate terminal parlays

Page through GET /v1/rfqs?status=settled, following meta.cursor until has_more is false.
2

Fetch detail for anything new

For each parlay you have not recorded, fetch GET /v1/rfqs/{id} for the settlement detail and transaction signatures.
3

Cross-check the totals

Compare realized P&L against GET /v1/pnl and current balances against GET /v1/vault.
Cursors are opaque. Pass the meta.cursor value from the previous response as ?cursor=.... Never parse or construct one.

What reconciliation is the only way to catch

Cashout bids that acquire a position you did not back. See the acquisition gap.