Maker live stream (WebSocket)
This is a WebSocket endpoint at `wss://<host>/maker/stream`. Authenticate the upgrade request with `X-API-Key`, for example with the Node `ws` package: `new WebSocket(url, { headers: { "X-API-Key": key } })`. Browser-native WebSocket cannot set upgrade headers and therefore is not a maker authentication client. A missing or unknown key closes the connection with code 4401 before any subscription. On connect the server immediately replays a SNAPSHOT of current state (`rfq.created` for every active RFQ the party is invited to, then `quote.created` + `quote.status` for the party's active quotes) and streams live events afterwards. Clients do not need separate GET bootstrap calls: a reconnect IS a resync. Every message is JSON `{type, payload}`: | type | payload | |---|---| | rfq.created | RfqDto | | rfq.closed | {rfqId} — cancelled or filled (indistinguishable to a maker) | | rfq.expired | {rfqId} | | quote.created | QuoteDto | | quote.status | {quoteId, rfqId, status: pending/won/lost/expired/revoked} | | quote.anchored | {quoteId, rfqId, proposalCid} — a passkey maker's proposal pair got signed, the quote is anchored | | trade.step | {tradeId, rfqId, step: trade_dvp/fee_dvp/allocated, refs: [cid]} — live per-phase settlement progress on the ledger | | trade.settled | TradeDto | | trade.failed | {tradeId, rfqId, reason} — settlement failed (underfunding, expired Dvp window) | | balances.updated | BalancesDto | | resync | {} — server state was reset; reconnect or wait for the snapshot |
This is a WebSocket endpoint at wss://<host>/maker/stream. Authenticate
the upgrade request with X-API-Key, for example with the Node ws
package: new WebSocket(url, { headers: { "X-API-Key": key } }).
Browser-native WebSocket cannot set upgrade headers and therefore is
not a maker authentication client. A missing or unknown key closes the
connection with code 4401 before any subscription.
On connect the server immediately replays a SNAPSHOT of current state
(rfq.created for every active RFQ the party is invited to, then
quote.created + quote.status for the party's active quotes) and
streams live events afterwards. Clients do not need separate GET
bootstrap calls: a reconnect IS a resync.
Every message is JSON {type, payload}:
| type | payload |
|---|---|
| rfq.created | RfqDto |
| rfq.closed | {rfqId} — cancelled or filled (indistinguishable to a maker) |
| rfq.expired | {rfqId} |
| quote.created | QuoteDto |
| quote.status | {quoteId, rfqId, status: pending/won/lost/expired/revoked} |
| quote.anchored | {quoteId, rfqId, proposalCid} — a passkey maker's proposal pair got signed, the quote is anchored |
| trade.step | {tradeId, rfqId, step: trade_dvp/fee_dvp/allocated, refs: [cid]} — live per-phase settlement progress on the ledger |
| trade.settled | TradeDto |
| trade.failed | {tradeId, rfqId, reason} — settlement failed (underfunding, expired Dvp window) |
| balances.updated | BalancesDto |
| resync | {} — server state was reset; reconnect or wait for the snapshot |
Authorization
ApiKeyAuth In: header
Response Body
curl -X GET "https://example.com/maker/stream"Can I trade right now? GET
The preconditions a bot can otherwise only discover by never being invited. Doubles as an API-key validity check — but it reads the ledger on every call, so poll it at a human cadence (startup, after an error burst), not in a tight loop.
Trade history of the key's party GET
Next Page