Skip to main content
Webhooks are one of two ways to price RFQs. The maker WebSocket carries the same rounds over one outbound connection, with no public endpoint to operate and no signature to verify.
Your pricer exposes three endpoints under whatever base URL you register. Novig calls them; you respond. Every body is JSON and carries an X-Novig-Signature header. /quote and /confirm sit on the trade path and have hard timing requirements; /ping is an on-demand connectivity check (not on the trade path) but is still subject to a request timeout (currently 3 seconds).

POST {webhook_url}/quote

Novig calls /quote for every parlay RFQ that names outcomes you might quote. You return a price and a maximum wager you’re willing to back at that price.

Request body

Header: X-Novig-Signature: BLAKE3(shared_secret, body).hex() — see Signing.

Response body

There is no expiry field. Quote validity is platform-owned: Novig anchors a TTL when the auction closes (currently 30 seconds pregame, 10 seconds for live markets) — your quote simply lapses when it expires.

Hard rules

Novig’s total budget for /quote fanout is 3 seconds. A response that arrives later is silently dropped. The taker sees only the quotes that landed inside the window.
  • Non-2xx responses are dropped.
  • max_wager <= 0 is dropped.
  • Malformed/unparseable JSON is dropped.
  • A bad signature is dropped.
In every drop case the taker simply doesn’t see your quote — there is no penalty beyond losing the trade.

Declining to quote

If you don’t want to quote a particular RFQ, return HTTP 204 No Content. Any non-2xx also drops your quote, but a 204 records a deliberate pass, where an error or a timeout looks like a broken pricer.

POST {webhook_url}/confirm

If your quote is selected as the winner, Novig calls /confirm with the actual taker wager (which may be ≤ your max_wager) immediately before writing the trade. This is your last chance to back out.
You have 1 second to answer. The confirm window is a fixed 1-second last look: a pricer that hasn’t responded by the bell is rejected (the trade does not execute). The window never closes early either — an early answer is held to the bell — so there is no advantage to racing, but a hard penalty for being slow.

Request body

Header: same X-Novig-Signature scheme as /quote.

Response body

A missing confirmed field is a hard error — it aborts the trade just like false. Always include it.

POST {webhook_url}/ping

A connectivity check you trigger yourself via POST /rfq/pricer/ping. Novig sends a signed POST to <webhook_url>/ping and reports back how you answered — use it to confirm reachability and signature handling before any live quote flow. This endpoint is not on the trade path: it carries no quote content and has no latency budget.

Request body

Header: same X-Novig-Signature scheme as /quote and /confirm — verify it exactly as you would on the trade path.

Response

Return any 2xx status. There is no required body; Novig only reports whether the call reached you and what status you returned (as ok/status in the ping result). A non-2xx, a bad signature you rejected, or an unreachable host all surface as a failed ping so you can fix the wiring before going live.

Type & encoding notes

  • Decimal numbers (max_wager, wager, price on /confirm) are JSON strings, not numbers.
  • price on /quote response is a JSON number in (0, 1) decimal probability.
  • UUIDs are lowercase strings with hyphens.