Connect
Register a pricer first
The handshake refuses the upgrade when your trader has no pricer registration. Register once with an empty body: a socket pricer needs no webhook and gets no shared secret. Your registration outlives every connection, so reconnecting does not re-register. Register on QA while the socket is in preview. See Registration.Handshake failures
Authentication fails before the upgrade, as a plain HTTP status code.Message envelope
Client messages, acks, and channel events share one envelope.code field, not by event.
price, max_wager, and wager are JSON strings in both directions. This differs from the webhook /quote response,
where price is a JSON number.Channels
Subscriptions are per-connection. A reconnect carries none of them.Round lifecycle
Novig opens a round
rfq_created arrives on the rfq channel with the legs and the deadline.You answer
create_quote with your price and maximum wager, or decline to pass. Answer before expires_at.Novig closes the auction
rfq_closed arrives. Stop pricing that round.You win, and confirm
quote_accepted arrives on the quotes channel. Answer with confirm inside 1 second.Client messages
Messages you send to Novig. Novig acks every one.subscribe
Start receiving a channel's events
subscribe
Start receiving a channel's events
data is a bare channel string, not an object. Acked with subscribed."rfq" or "quotes".unsubscribe
Stop receiving a channel's events
unsubscribe
Stop receiving a channel's events
create_quote
Answer an open round
create_quote
Answer an open round
quote_submitted.rfq_created.(0, 1). "0.45" means $0.45 stake per $1.00 payout. Resolved on a 0.001 grid.external_flag. Omit it when you don’t need one.decline
Pass on an open round
decline
Pass on an open round
quote_declined.rfq_created.confirm
Answer the last look on your accepted quote
confirm
Answer the last look on your accepted quote
confirm_recorded.quote_accepted.quote_accepted. Novig’s UUID, not your external_flag.true fills the trade at your quoted price. false rejects it.CONFIRM_ALREADY_DECIDED, or NO_CONFIRM_WINDOW once the window is gone.Server events
Events Novig sends you. Subscribe to a channel to receive its events.rfq_created
A round opened (rfq channel)
rfq_created
A round opened (rfq channel)
expires_at.rfq_closed
The auction closed (rfq channel)
rfq_closed
The auction closed (rfq channel)
create_quote that arrives after this is rejected with RFQ_CLOSED.rfq_executed
A trade filled, with no counterparty named (rfq channel)
rfq_executed
A trade filled, with no counterparty named (rfq channel)
quote_created
Your quote was recorded (quotes channel)
quote_created
Your quote was recorded (quotes channel)
quote_accepted
You won. Confirm within 1 second (quotes channel)
quote_accepted
You won. Confirm within 1 second (quotes channel)
confirm.max_wager you quoted.quote_id you sent on create_quote. null when you sent none.quote_executed
Your quote filled (quotes channel)
quote_executed
Your quote filled (quotes channel)
quote_dropped
Your quote was dropped for a fixable reason (quotes channel)
quote_dropped
Your quote was dropped for a fixable reason (quotes channel)
Acks
Novig answers every client message with an ack. An ack uses the standard envelope.subscribed
The subscription is active
subscribed
The subscription is active
unsubscribed
The subscription is removed
unsubscribed
The subscription is removed
quote_submitted
Your quote entered the auction
quote_submitted
Your quote entered the auction
quote_superseded
Your first quote stands. This one was dropped
quote_superseded
Your first quote stands. This one was dropped
quote_declined
Your pass was recorded
quote_declined
Your pass was recorded
Errors
Error frame
Your message failed. Sent bare, with no envelope
Error frame
Your message failed. Sent bare, with no envelope
create_quote, as a FORBIDDEN frame.
Timing and limits
Keepalive
The server sends a WebSocket protocol Ping every 15 seconds. Answer with a protocol Pong; standard clients do this automatically. A client that misses a ping interval is disconnected. There is no JSON ping message and no idle timeout. A socket that answers its Pings stays open indefinitely.Reconnecting
The socket has no replay and no backfill. It starts at the live edge, so anything sent while you were disconnected is lost. Recover missed executions from the executions feed. Novig closes a socket without a status code, so do not read meaning into a close frame. Reconnect with backoff, then re-subscribe. Event frames drop when your client cannot keep up, rather than blocking the server. Read promptly: a slow consumer silently misses quote rounds.Running both transports
The webhook is a capability, not a mode. Registering awebhookUrl and connecting the socket are independent choices, and you may do both.
quote_accepted. Implement both confirm paths, or run one transport.
Register with no webhookUrl to make the socket your only path. See Registration.
