Order Engine
Fills settle through the Order Engine program on mainnet:61DFfeTKM7trxYcPQCM78bJ794ddZprZpAwAnLiwTpYH.
- Source code: programs/order-engine
- IDL: idls directory
- Audit: Offside Labs audit report
Squads multisig takers
When the taker is a Squads V5 multisig, the RFQ API wraps the fill instructions into a singleexecuteTransactionSyncV2 CPI before delivering the transaction to POST /swap. Your webhook needs extra handling for this case:
- Detect the wrap with the toolkit’s
squads-sdk(is_squads_transaction, no RPC required). - Resolve Address Lookup Tables and unwrap the transaction to recover the inner fill instructions.
- Validate the inner fill against the quote by comparing pubkeys. The recovered
is_signerandis_writableflags are not faithful, so do not trust them. - Sign the maker slot: look up your maker key’s position in the outer signers by pubkey.
Fill circuit breaker
Jupiter runs a per-webhook circuit breaker over your fill outcomes to protect the system from unreliable fills:- What counts: confirmed swaps record success; rejected, dropped, and failed swaps record failure. Rejections caused by a slow user (more than 20 seconds of user delay) are not counted against you. Successes decay your accumulated failure count.
- Suspension: accumulating failures past a threshold trips the breaker and suspends the webhook, with an exponentially increasing timeout (from around 5 minutes up to 30 minutes) between recovery attempts. A successful fill after the timeout restores normal operation.
- Disable: repeated trips permanently disable the webhook. Recovery from disabled state is manual: contact Jupiter through the support channels on the overview page.
Testing
The toolkit ships two test suites: acceptance tests that simulate Jupiter calling your webhook (run locally, no registration needed), and integration tests that run against Edge and perform real swaps on mainnet. See the tests directory for commands and the troubleshooting guide for common failures. The most common issue: your webhook quotes, but the RFQ system returns 404. The quote failed simulation, usually because of insufficient maker inventory, insufficient SOL for fees, or a missing ATA for an advertised token.FAQ
Does RFQ support native SOL?
Does RFQ support native SOL?
Yes, native SOL is fully supported in the order-engine program for both the taker (user) and the maker. However, makers should use wSOL (Wrapped SOL) in their systems; the program handles wrapping and unwrapping for users.
Do faster quotes receive priority?
Do faster quotes receive priority?
No. The RFQ system dispatches the quote request to all registered webhooks simultaneously, and all quotes received within the timeout are compared on value. Speed is only a tiebreaker between identical values.
Shall a webhook verify swap requests?
Shall a webhook verify swap requests?
Yes. The RFQ system verifies swap requests before forwarding them, but webhooks should verify as well. The checks the RFQ system performs are in the validate_similar_fill_sanitized_message function of the order-engine-sdk.
Is there a penalty for not providing a quote (status code 404)?
Is there a penalty for not providing a quote (status code 404)?
No. It is up to the webhook to respond with a quote (200) or decline (404), for example when the amount is outside your quoting range or you only quote one direction of a pair.
