The Bot Ledger
EN

Home / Guides

Limitless API Guide: Connect a Trading Bot in 5 Steps

Limitless Exchange API for a bot: wallet auth, markets, the book, signed orders, on-chain fills on Base, and a fee paid in tokens.

A world map with a network of connections
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.

  1. 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}"}
  2. 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 settlement
  3. Read 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 gate

    The 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.

  4. 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()
  5. 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.