Overview
CLOB markets use a venue system where each market is associated with specific contract addresses. Before placing orders, you must fetch venue data for the market.How it works
1
Fetch market data
GET /markets/:slug returns venue information for the market.2
Use venue.exchange
This address is the
verifyingContract for EIP-712 order signing.3
Cache the venue
Venue data is static per market — fetch once and reuse.
Venue response
Required token approvals
Before trading, set up token approvals based on your order type:New trading venues
A market is on a new trading venue whenvenue.feeModuleType is "COLLATERAL". The venue then also includes a feeModule address. Legacy venues omit both fields and work as before.
Moving existing code over? Follow the migration guide, which has the checklist, fee module addresses, minimum SDK versions and common errors.
- Approve USDC to
venue.feeModulefrom the wallet that signs orders. A max approval is recommended. Approve once per fee module address. Simple CLOB and NegRisk markets use different fee modules, so always read the address from the market and never hardcode it. The approval is required for every order that is notpostOnly, both BUY and SELL. Without it, the API rejects the order withInsufficient collateral allowance for the order fee. - Keep your existing approvals. The USDC and Conditional Token approvals to
venue.exchangeandvenue.adapterremain valid, and the EIP-712 domain (verifyingContract=venue.exchange) is unchanged. - Sign
feeRateBpsas0. Any other value is rejected withFEE_RATE_MISMATCH. Orders on legacy venues keep the current fee rate rules. - Keep a little extra USDC. Buy orders need the order amount plus a fee reserve of 5% of it at the standard rate. Sells need no USDC. See how the fee is calculated.
Wallets that Limitless provisions and manages (server wallets and API-key managed wallets) get these approvals automatically. The updated TypeScript, Python, Go, and Rust SDKs handle venue detection and the fee rate for you.