
- Auth
- Wallet signature; orders are signed messages that settle on Base.
- Read
- REST for markets and books; book snapshots carry the liquidity-program terms inline.
- Trade
- Signed limit orders; fills are on-chain events.
- Taker fee
- About 3 percent at 50 cents falling to under 0.5 percent near 1.00, paid in outcome tokens. Makers pay nothing.
- Settlement
- 60-second oracle average; close at or above open resolves Up.
- Geography
- Blocks the US.
- Docs
- docs.limitless.exchange
Five steps, simplified. As with Predict.fun, the exact paths change; the shape is what matters.
Sign in with the wallet
from eth_account import Account from eth_account.messages import encode_defunct import requests BASE = "https://api.limitless.exchange" # confirm in the docs acct = Account.from_key(PRIVATE_KEY) nonce = requests.get(f"{BASE}/auth/nonce", params={"address": acct.address}).json()["nonce"] sig = acct.sign_message(encode_defunct(text=nonce)).signature.hex() token = requests.post(f"{BASE}/auth/login", json={"address": acct.address, "signature": sig}).json()["token"] H = {"Authorization": f"Bearer {token}"}Find the current window
m = requests.get(f"{BASE}/markets/btc-updown-5m-1757500800", headers=H).json() print(m["resolvePrice"], m["metadata"]) # resolvePrice appears after settlementRead the book
book = requests.get(f"{BASE}/markets/{m['slug']}/orderbook", headers=H).json() best_ask, best_bid = book["asks"][0], book["bids"][0] if best_ask[0] - best_bid[0] > 0.08: pass # most late windows fail this gateThe late book is often 20 cents wide. A spread gate that works on Polymarket blocks nearly every fire here; decide in advance whether you accept the wider spread or skip the exchange.
Place a taker buy
order = {"market": m["slug"], "outcome": "UP", "side": "BUY", "price": best_ask[0], "size": 30} signed = sign_order(order, acct) # the docs show the typed-data layout r = requests.post(f"{BASE}/orders", json=signed, headers=H).json()Read fills from the chain
Every fill is an event on Base. An indexer such as HyperSync pulls a wallet's full history in minutes, which is also the cheapest way to audit a competitor.
fills = requests.get(f"{BASE}/fills", params={"address": acct.address}, headers=H).json()
Two facts that change the math
- The buy fee is a percentage of the price, not p(1-p), so cheap contracts are expensive to buy and dear contracts nearly free. The breakeven calculator on the home page uses the published curve.
- Models trained on fill prices instead of executable asks looked excellent in validation and lost on real books. Price the down side from the down book, never as one minus the up ask.