Welcome to Limitless Trader Lab

Day 4 of 7 · Cohort intensive · 90 minutes

Filter + first order.

Combine yesterday’s panel with the first real order placement. Filter markets to a personal watchlist (mostly your own taste in markets), pick one from the list, place a $1–$2 order via API with EIP-712 signing, then cancel it. Watch the order event land in the panel on your phone. Visceral coupling.

90 minutes 1 deliverable #trader-lab · [D4]

Today you’ll learn

You’ll learn how to filter the firehose of Limitless markets to a personal watchlist, then sign + place + cancel + confirm a real $1–$2 limit order on a market from that list, with the order event landing in the Day 3 panel on your phone. This is the click-to-code crossover combined with the panel-on-phone moment: the rest of the cohort builds on the filter you wrote and the order flow you proved.

Section 01

Why filter + order.

Two halves of one day. The first 30 minutes: filter the firehose to a personal watchlist that reflects what you actually care about. The next 60 minutes: place + cancel + confirm a real $1–$2 order on a market from that watchlist, signed, submitted, acknowledged via API. The order event lands in the panel you built yesterday, on your phone, in seconds. That’s the visceral coupling the panel-first arc was built around.

Filter (30 min)

One Claude prompt, one focus statement, one saved watchlist.py. The same script you’ll run every morning long after the cohort ends.

First order (60 min)

EIP-712 signed, $1–$2 limit, far from the book. Place + cancel + confirm. Watch the panel update on your phone before you finish the cancel script.

Section 02

Pick your category.

Before you write a line of code, write your focus statement. One or two sentences describing what you actually care about trading. Be specific, “crypto” is too broad to filter on, “BTC threshold markets resolving in the next 24 hours” is filterable. The clearer the statement, the cleaner the filter.

1

You are now: writing your focus statement

Open a notes file. Write 1–2 sentences describing what you want to trade.

Examples:
EPL matches with high implied goal totals
BTC threshold markets resolving in the next 24 hours
US politics resolving in the next 30 days
Any market over $20K daily volume

2

You are now: asking Claude for the filter script

Modify Day 1’s first_call script. Reuse beats rewrite.

Paste into Claude
Take Day 1’s first_call.[py/ts] script and modify it to filter for: [PASTE YOUR FOCUS STATEMENT HERE]. Specifically: • [criterion 1 mapped to an API field] • [criterion 2 mapped to an API field] • [criterion 3 if applicable] Output: title, YES price, 24h volume, slug, plus one extra field relevant to my filter (resolution time, market type, whatever fits). Save as watchlist.[py/ts] alongside first_call. Print the top 5 matches.

If the filter narrows the universe to fewer than 5 markets, that’s fine. If it’s zero, your criteria are too tight; loosen one and rerun.

3

You are now: running it + picking one market

Save the script. Run it. Read the output. Pick one specific slug from the list to place your order on in section 05.

Run in terminal
$ python watchlist.py BTC > $70K by 5pm UTC | YES: $0.62 | Vol: $45,230 | btc-70k-friday BTC > $68K by EOD | YES: $0.78 | Vol: $22,100 | btc-68k-eod BTC < $66K by midnight | YES: $0.18 | Vol: $14,400 | btc-66k-midnight

Section 03

Safety rails.

Today’s order isn’t about making money, it’s about confirming the wire is alive. Three rules keep the lesson cheap: tiny size, limit only, market you understand. Skip any of them and you’re trading on Day 4 instead of practicing on Day 4.

Pre-trade safety check

$1–$2 max. Today is for proving the call works. The amount is small enough to lose entirely without it mattering.

Limit order, never market. Limits give you a price you control and won’t fill against a thin book.

A market from your watchlist. You already understand it; if the order fills (it shouldn’t at the price we’ll use), you know what to do.

Far from the book. Place the limit at $0.05 below the current bid. The point is to leave the order resting so the cancel call has something to cancel.

Section 04

Install the Trading skill.

The bonus pack ships bonus/skills/trading/, the skill that gives Claude the four trading tools (browse_markets, get_position, place_order, cancel_order) plus a hand-tested _auth_headers HMAC helper and an internal validate_order() safety rail that place_order calls before signing. Install it once today; you’ll use it every day from here. The install location depends on which Claude surface you’re using, the bonus pack’s README.md has the canonical instructions; the cheatsheet below is enough for most cohort members.

1

You are now: locating the skill folder

In the unzipped bonus pack, find bonus/skills/trading/. It contains a SKILL.md file plus a scripts/ folder. Keep the whole directory together; the SKILL.md references files in scripts/ by relative path.

2

You are now: installing for your Claude surface

Pick the row that matches the Claude you’re using (the one you locked in on Day 1). If you’re unsure which surface you have, ask Claude: “Which Claude surface am I talking to right now (web, Desktop, or Code)?”

Install paths by surface
# Claude Code (CLI) -- copy the folder into ~/.claude/skills/ # macOS / Linux: $ mkdir -p ~/.claude/skills $ cp -r bonus/skills/trading ~/.claude/skills/trading # Windows PowerShell: PS> New-Item -ItemType Directory -Force $HOME\.claude\skills PS> Copy-Item -Recurse bonus\skills\trading $HOME\.claude\skills\trading # Claude Desktop -- open Settings, Skills, click "Add skill from folder", select bonus/skills/trading/ # Claude on claude.ai (web) -- open the side panel, Skills, "Upload skill", zip bonus/skills/trading first

If your install path doesn’t look like any of the rows above, the bonus pack README.md documents edge cases (custom CLAUDE_HOME, MCP-only setups, team workspaces). Don’t paste the skill contents into a chat as a workaround, the skill’s scripts need to live on disk so Claude can execute them.

3

You are now: confirming the skill loaded

Restart your Claude session (close + reopen the app, or refresh the web tab, or start a new conversation in Code). Then ask:

Paste into Claude
Do you have a Trading skill loaded? If yes, list the tools it provides and confirm you can read `_common.py` for the HMAC helper.

You should see four tools listed: browse_markets, get_position, place_order, cancel_order. Claude should also confirm it can read _common.py (which holds _auth_headers and the internal validate_order() safety rail). If Claude doesn’t see the skill, the install path is wrong, re-check the row for your surface above. Don’t skip this step; sections 05 and 06 assume the skill is live.

Section 05

Place the order.

EIP-712 signing is the only mechanically new part of today, and it’s in one Claude prompt. The script Claude writes is short: read env vars (LIMITLESS_API_KEY, LIMITLESS_API_SECRET, PRIVATE_KEY, OWNER_ID), fetch market metadata, build the order body, sign with eth-account, POST /orders with HMAC-signed headers (per docs.limitless.exchange/developers/authentication), print the order ID.

1

You are now: confirming your secrets are wired

Four env vars. LIMITLESS_API_KEY + LIMITLESS_API_SECRET from Day 1 (the token id and the base64 HMAC secret, both required for signed requests). PRIVATE_KEY = the 0x… key for your Limitless wallet. OWNER_ID = your numeric profile ID (in any auth response).

Read bonus/SECRETS.md if you haven’t. The private key is far more dangerous than the API key/secret, leaking it = wallet drained, no recovery. The bonus pack’s SECRETS.md covers rotation, leak response, and pre-commit hooks.

2

You are now: asking Claude for place_order

Pick one slug from your watchlist. Decide YES or NO. Paste the prompt with the bracketed parts filled in.

Paste into Claude
Write me a Python script called place_order.py that follows the official Limitless quick-start at https://docs.limitless.exchange/developers/quickstart/python. Specifically: 1. Reads four env vars: LIMITLESS_API_KEY (token id), LIMITLESS_API_SECRET (base64 HMAC secret), PRIVATE_KEY (0x... wallet key for EIP-712 signing), and OWNER_ID (numeric profile ID). Authenticate every API request with the three HMAC headers (lmts-api-key, lmts-timestamp, lmts-signature) per https://docs.limitless.exchange/developers/authentication. Prefer importing `_auth_headers` from `bonus/skills/trading/scripts/_common.py` over hand-rolling HMAC, hand-rolled signing has many off-by-one bugs. 2. Calls GET /markets/{slug} for slug = [PASTE A SLUG FROM YOUR WATCHLIST] to retrieve venue.exchange + positionIds. 3. Builds a GTC limit order: outcome=[YES or NO], side=BUY (0), price=$0.05 BELOW the current best bid, shares=1. 4. Computes makerAmount and takerAmount with USDC’s 6-decimal scaling (multiply by 1_000_000). 5. Signs with eth-account using EIP-712 domain {name: "Limitless CTF Exchange", version: "1", chainId: 8453, verifyingContract: venue.exchange}. 6. POSTs to /orders with body {order, ownerId, orderType: "GTC", marketSlug}. 7. Prints the order ID + writes a single-line NDJSON record to /app/data/fills.ndjson via a railway run "echo >>" (so it lands in the deployed panel). Use the flat panel shape so the row renders in full: {"ts": "<iso8601>", "slug": "<slug>", "side": "YES|NO", "shares": <n>, "price": <n>, "order_id": "<id>"}. pip-install eth-account, web3, requests if missing. Error handling: missing env vars, market not found, insufficient balance, signature mismatch, API rejection. Show me the script + the run command + the expected printout.
3

You are now: saving + running the script

Save Claude’s code as place_order.py in limitless-lab/. Run it.

Run in terminal
$ python place_order.py Order placed: ID: ord_8f3a2c1e9b... Side: YES Price: $0.57 Size: 1 share ($0.57 notional) Status: open

Copy the order ID now, you need it for the cancel in section 06.

4

You are now: glancing at your panel on your phone

Pull out your phone. Open the panel from yesterday. The new order event should appear in the recent-fills feed within 3 seconds (the panel polls every 3s).

If the order event doesn’t appear, your place_order.py isn’t writing to /app/data/fills.ndjson. Have Claude add the railway run "echo >>" step or a direct write via the panel’s admin endpoint.

Section 06

Cancel + confirm.

The cancel is as important as the place. Every order you place from here on, you should know how to unplace. Cancel doesn’t need EIP-712 signing, just the API key and the order ID.

1

You are now: asking Claude for the cancel script

Paste into Claude
Write me cancel_order.py that: 1. Reads LIMITLESS_API_KEY (token id) and LIMITLESS_API_SECRET (base64 HMAC secret). Send the three HMAC headers (lmts-api-key, lmts-timestamp, lmts-signature) per https://docs.limitless.exchange/developers/authentication. Prefer importing `_auth_headers` from `bonus/skills/trading/scripts/_common.py` over hand-rolling HMAC. 2. Takes the order ID as a CLI argument. 3. DELETEs https://api.limitless.exchange/orders/{order_id}. 4. Prints the cancel ack + new status. 5. Error handling: missing key/secret, missing arg, already-filled, already-canceled, not-found. Cancels do NOT need EIP-712 signing, just the HMAC-signed headers. Also write my_orders.py that GETs /markets/{slug}/user-orders for the slug I just used (same HMAC auth), prints id + side + price + size + status. We’ll use it all week as the “what did my bot just do?” debug script. Show both scripts + run commands.
2

You are now: running cancel + my_orders

Run in terminal
$ python cancel_order.py ord_8f3a2c1e9b... Cancel acknowledged: ID: ord_8f3a2c1e9b... Status: canceled $ python my_orders.py ord_8f3a2c1e9b... | YES | $0.57 | 1 share | canceled

Independent confirmation. The cancel ack from cancel_order.py is one source of truth; my_orders.py hitting the API directly is another. Trust both.

Section 07

Today’s deliverable.

Two pieces of evidence in one screenshot: the panel showing the fill, and the terminal showing what placed it. Click-to-code crossover plus panel-on-phone, in one frame.

Day 4 · Deliverable

Post in #trader-lab.

Phone screenshot of your panel showing the filled order in the recent-fills feed.

Terminal output that placed it (place_order.py printout with order ID).

Post both in #trader-lab with a [D4] tag at the start of the caption.

Caption: “[D4] Day 4 done. Filter: [your statement]. First order: [slug] at $[price]. Place + cancel + confirm green. Fill landed in panel in [N] seconds. Snags: [none / brief].”

If you got stuck on EIP-712 signing or the panel didn’t pick up the fill, post that too, lead with [help].

Day 4 complete

Order in the panel.

A real $1–$2 order placed and canceled via API on a market from your watchlist, with the fill landing in the panel you built yesterday, on your phone, in seconds. The panel-first arc just paid off.

01

A saved watchlist.py + place_order.py + cancel_order.py + my_orders.py trio that filters, signs EIP-712, submits to /orders, and cancels by ID.

02

One real order ID on Limitless that went through the full place → rest → cancel lifecycle, and a fills.ndjson line on the deployed volume that the panel renders.

03

A two-up screenshot in #trader-lab with a [D4] tag, phone panel + terminal output, that proves your PRIVATE_KEY + LIMITLESS_API_KEY + LIMITLESS_API_SECRET + OWNER_ID setup is ready for tomorrow’s skill install.

Tomorrow: Add the Monitor + Strategy skills from the bonus pack. Your first complete agent loop runs in dry-run, with every decision surfacing in the panel within five seconds.

Day 5 unlocks tomorrow at 9am local