1. Filter before you quote
Let the price feed do your screening./rfq/quotes should fire only after the stream has already told you the trade clears your bar.
The stream costs LPs nothing and refreshes continuously; a firm quote is a commitment a desk must stand behind, which is exactly why it’s metered per key.
2. Execute what you quote
A quote captures the market at a single instant. Sitting on it, letting the market move, and firing only once the frozen price has drifted into your favour is adverse selection by design - and desks see it immediately. Do it this way: the streamed prices power every upstream decision; the firm quote is requested at the instant of execution, never before.3. One intent, one quote
Slicing - splitting a single fill intent into several smaller quote requests - comes in two flavours, and LPs detect both:- Fragmenting one fill: asking four times for
2M USDC → WETHwhen the real intent is a single8Mfill. - Doubling one execution: pulling two
20M USDC → WETHquotes at once and executing both, whether bundled or in back-to-back blocks. Both were priced against the same full inventory; only one can survive its draw-down. A few seconds between blocks replenishes nothing - the moment both quotes were requested together, it was slicing.
8M with partialFill: true and settle at 6.5M on unchanged terms - a supported pattern, not a hostile one.
Partial fills also solve the AMM top-up case: when part of a trade routes through an AMM, its true output isn’t known until execution. Quote the maximum you might need, let the order partially fill down to what the AMM leg actually produced, and skip a second round trip on the critical path.
4. Quote only what’s tradable
Firing quotes at corridors nobody serves wastes desk compute and tells everyone your pipeline has no filter. Gate on the pair list instead:5. Firm means firm
An RFQ quote is executable at its stated terms untilvalidUntil, enforced by the escrow. When your router compares a TetraFi quote against AMM routes, don’t haircut it with the “expected slippage” you’d apply to a pool price:
Treat those two numbers as the same kind of thing and your router will systematically send flow away from its genuinely best price.
6. Show us whose flow it is
Attribution fields tell TetraFi and the LPs who is really behind a request. They feed abuse prevention and per-source reputation, so accuracy directly shapes the pricing you receive:
Direct integrator -
user is the end-user’s own wallet, nothing in between: the required field is all you need.
Broker flows - your users onboard through your workspace; send directUserId so screening and reputation attach to the actual person, not your whole integration.
Aggregated flows - tag each upstream source consistently in metadata. Reputation then accrues per sub-source, so one bad downstream partner can’t taint the rest of your flow.
Pre-launch checklist
Before going live, confirm:- Streamed prices, not firm quotes, do the pre-trade screening
- Quotes go straight from issuance to execution, never through a cache
- Each intended fill maps to exactly one quote, with
partialFillabsorbing size uncertainty - No fill ever executes more than one quote
/api/v1/pairsvouches for every pair you quote- Pool estimates get their slippage haircut; firm quotes don’t
- Attribution fields name the flow’s true origin