Skip to main content
If you’ve built bots or agents on Polymarket, this guide maps every concept, endpoint, and code pattern to the Limitless equivalents so you can port your code in minutes.
This guide reflects Polymarket’s CLOB V2. The V1 clients (py-clob-client, @polymarket/clob-client, the Rust rs-clob-client, and the Polymarket/agents framework) were archived in May 2026 and no longer work against production. If you’re still on V1 code you have to move to V2 regardless, so the mappings below target V2.

What changed

Authentication

Polymarket requires deriving API credentials (apiKey, secret, passphrase) through an L1 EIP-712 handshake, then signing every request with HMAC-SHA256 across 5 POLY_* headers. Limitless uses a scoped API token (a token ID + secret) generated in the UI. You sign each request with HMAC-SHA256 and send three headers: lmts-api-key, lmts-timestamp, and lmts-signature.
No POLY_* headers, but you do sign each request: derive the three lmts-* headers with sign_request(TOKEN_ID, SECRET, method, path, body) for every authenticated call. The timestamp must be within 30 seconds of server time. See the full Authentication guide for details, and the Programmatic API guide for partner scopes (sub-account management and delegated order signing).

Endpoint mapping

Market data

Trading

Portfolio

Fetch a market

Build and sign an order

Both sides use EIP-712 typed data, but the order field sets diverge in V2. Polymarket V2 dropped taker, nonce, feeRateBps, and expiration from the signed struct and added timestamp, metadata, and builder. Limitless keeps the classic CTF-style fields (taker, expiration, nonce, feeRateBps) and has no timestamp/metadata/builder. Key differences:
On Limitless, for markets that charge a fee the signed feeRateBps must equal your profile’s rank.feeRateBps (from GET /profiles/me) or the order is rejected. Hardcoding 0 works only on zero-fee markets — read the rate from your profile and sign with it. Polymarket V2 has no feeRateBps field at all, so this is a Limitless-specific step.
ownerId is your Limitless profile ID — a required field on every POST /orders request. Fetch it once from GET /profiles/me (the id field) and cache it. Polymarket’s SDK handles this internally; on Limitless you pass it explicitly.
If you use the Python SDK, TypeScript SDK, Go SDK, or Rust SDK, order building and signing are handled for you — similar to how Polymarket’s V2 CLOB clients (@polymarket/clob-client-v2, py_clob_client_v2) work.

Porting a Polymarket agent

If you’re adapting a Polymarket trading bot (a V2 CLOB client integration, or a port of the now-archived Polymarket/agents framework), here’s a checklist:
1

Swap credentials

Replace POLYGON_WALLET_PRIVATE_KEY with your existing private key on Base. Add your scoped API token (TOKEN_ID + SECRET) and sign each request with HMAC (lmts-api-key/lmts-timestamp/lmts-signature) instead of Polymarket’s POLY_* headers. You still drop Polymarket’s L1/L2 credential derivation — Limitless tokens are issued in the UI.
2

Collapse the three hosts into one

Replace gamma-api.polymarket.com, clob.polymarket.com, and data-api.polymarket.com all with api.limitless.exchange. Positions and history that you read from data-api move to /portfolio/*.
3

Change chain ID

Update chainId from 137 to 8453 in all EIP-712 domain definitions.
4

Update EIP-712 domain

Change the domain name from "Polymarket CTF Exchange" to "Limitless CTF Exchange", and the version from "2" to "1".
5

Swap token ID fields

Replace clobTokenIds lookups with the market’s tokens object. On Limitless the convention is fixed: tokens.yes = Yes, tokens.no = No (unlike Polymarket, where you pair clobTokenIds against outcomes).
6

Use venue addresses

Fetch venue.exchange from GET /markets/:slug and use it as verifyingContract. On Polymarket V2 you targeted the fixed CTF Exchange V2 contract — on Limitless each market can have its own venue.
7

Rework the order fields

Remove the V2 fields timestamp, metadata, and builder — Limitless doesn’t use them. Add back the classic CTF fields Limitless requires: taker, expiration, nonce, and feeRateBps. Also drop SDK-side params like tick_size and signature_type from your order construction.
8

Add ownerId to order submissions

POST /orders requires an ownerId field (your Limitless profile ID, from GET /profiles/me). Polymarket’s SDK handles this internally; on Limitless you pass it explicitly in every order payload alongside order, orderType, and marketSlug.
9

Update approvals

Approve USDC on Base (not pUSD on Polygon) to venue.exchange. For NegRisk SELL orders, also approve Conditional Tokens to venue.adapter. See venue system.

WebSocket

See WebSocket events for the full event reference.

Quick reference for agents

If you’re building an LLM-powered agent or bot, here’s the minimal flow:

Partner and platform migrations

If you’re migrating a platform that manages multiple user accounts on Polymarket (e.g., a trading desk, social trading app, or embedded prediction market), the Limitless Programmatic API provides a first-class partner flow:
Recommended setup for partners:
  • Store HMAC credentials on your backend — never expose them to frontends
  • Use the SDK server-side to sign partner-authenticated requests
  • Expose only your own app-specific endpoints to the frontend
  • Keep public market reads (orderbooks, prices) directly in the browser
Both GTC (limit) and FOK (market) order types are supported for delegated orders. See the Delegated Orders SDK pages for full examples.

Next steps

Python quick start

Full end-to-end walkthrough with error handling.

Venue system

How venue contracts and token approvals work.

Programmatic API

Partner integrations, sub-accounts, and delegated signing.

API reference

Complete endpoint documentation.

EIP-712 signing

Full order type definition and field reference.