Webhooks are one of two ways to price RFQs. The maker WebSocket carries the same rounds over one outbound connection, with no public endpoint and no signature to check.
Every request has a JSON body and an
X-Novig-Signature header.
Check the signature before you trust the body. Webhook signing shows how.
Quote an RFQ
We call/quote for every RFQ, with the outcomes the taker wants to combine.
You answer with a price and the largest wager you’ll take at that price.
Request body
We send the same
rfq_id again on /confirm.
Universe model explains outcome IDs.
GET /rfq/executions returns the same IDs sorted by outcome ID, not in request order.
We leave out min_wager when the taker didn’t set one.
We never pick a quote whose max_wager is below min_wager or below the platform minimum of 10.00, whichever is higher.
Response body
A
price of 0.45 means the taker stakes $0.45 for each $1.00 of payout.
We round price to the nearest 0.001, from 0.001 to 0.999.
The order book’s tick sizes don’t apply to RFQ quotes.
Send max_wager as a JSON string to keep its precision.
quote_id can be up to 256 bytes.
We send it back as external_flag on /confirm.
A quote has no expiry field. We set its lifetime when the auction closes: 30 seconds before the game and 10 seconds for a live market.
When we drop your quote
We also drop your quote when:- Your response has a status other than 2xx.
- The body isn’t valid JSON.
pricerounds to 0 or 1, or falls outside that range.max_wageris 0 or less.quote_idis longer than 256 bytes.
Decline an RFQ
Return204 No Content to pass on an RFQ.
We record a 204 as a deliberate pass.
An error or a timeout also drops your quote, but it looks like a broken pricer.
A 204 keeps your webhook active. After 7 days of only errors and timeouts, we stop calling it.
Confirm a trade
If your quote wins, we call/confirm just before we write the trade.
It carries the taker’s actual wager, which is never more than your max_wager.
This is your last chance to back out.
Request body
We only call the winning pricer, so
price is always yours.
We leave out external_flag when you sent no quote_id. Don’t expect a null.
Response body
When you reject, we write nothing and the parlay is rejected.
Answer a ping
We call/ping only when you call POST /rfq/pricer/ping.
It checks that we can reach you and that your signature check works.
It isn’t part of trading and carries no quote.
A 2xx answer also restarts a paused webhook.
Request body
Check the signature exactly as you do on
/quote and /confirm.
Response
Return any 2xx status. No body is required. We report your status asok and status in the ping result.
A non-2xx status, a rejected signature, or an unreachable host all show up as a failed ping.
Keep your webhook active
We stop sending RFQs to a webhook that hasn’t answered for 7 days. Your registration stays, and the WebSocket isn’t affected. Your webhook counts as active each time it answers one of these:- A
/quoterequest, with a quote or a204. - A ping, with a 2xx status.
POST /rfq/pricer/ping.
When the result has ok: true, RFQs reach your webhook again within a minute.
Types and encoding
max_wager,wager, and the/confirmpriceare JSON strings, not numbers.- The
/quoteresponsepriceis a JSON number between 0 and 1. - UUIDs are lowercase strings with hyphens.

