Overview
Most copy trading bots pick a leader off a leaderboard and mirror everything they do. That works right up until the wallet you copied turns out to have made its entire return on one correct bet, and you are now mirroring a trader with no repeatable edge into markets they know nothing about. The hard part of copy trading is not the mirroring. Bravado already does that: it watches the leader, detects fills, sizes your order, and executes. The hard part is selection, deciding who is worth following, in which markets, at what size, and knowing when to stop. This guide builds a follower service that treats selection as the product.Read time: about 15 minutes. Working knowledge of Python and REST APIs assumed. No Polymarket experience needed.
TL;DR
- Bravado’s Copytrade API handles fill detection, sizing, and execution. You build the layer that chooses leaders and supervises them.
- Rank candidates with
GET /leaderboard, then reject most of them using trade count and win rate, because a 30-day PnL board is full of one-lucky-bet wallets. - Narrow each subscription to the category where the leader actually has an edge, using
GET /traders/{address}/categories. - Run in
simulation: trueuntil the numbers are boring. Only then go live. - Copytrade costs 25 bips per side, so a high-frequency leader is expensive. Check fill counts before committing.
What you will do
- Pull a leaderboard of Polymarket traders and inspect their real records
- Filter out wallets whose track record is a single outsized win
- Identify the market category where a leader is genuinely profitable
- Create a copytrade subscription with proportional sizing and category filters
- Paper trade the whole thing against live prices without spending anything
- Add a supervisor that pauses a subscription when it drifts past your tolerance
- Switch to live trading once the simulation holds up
What you will need
Knowledge- Python 3.9 or later, and comfort with REST APIs
- No prior Polymarket or prediction market experience required
- A Bravado API key from the Bravado Portal
- Scopes:
trade.readandtrade.execute pip install requests- USDC collateral in your Bravado wallet, but only for the live step at the end
Every read in this guide works on any public wallet with no funded account, so you can complete the entire selection and simulation flow before depositing anything.
How the bot is built
Three layers, deliberately independent so each can be tested on its own:
The decision layer is pure logic with no side effects, which means you can run it against historical wallets and see what it would have picked without touching an order. That is the layer worth iterating on.
Set up the client
Two helpers cover everything: a plain reader, and a writer that attaches an idempotency key to every mutating call.Discover candidates
Start with traders ranked by realized PnL over a rolling window:Screen them properly
Three checks, each rejecting a different kind of bad candidate. Did they trade enough for the record to mean anything?Expect this to reject most of the board. That is the point. If it keeps twenty out of twenty-five, your thresholds are too loose to be doing any work.
Subscribe
Mirror the leader, but only where they have shown an edge, and start in simulation:Choosing a sizing mode
proportional at 0.10 means a $10,000 position from the leader becomes $1,000 for you. It scales with their conviction, which is usually what you want, provided you trust the conviction.
The leader needs no Bravado account and is never notified. Any public wallet can be followed.
Run a dry cycle
Nothing so far has spent money. Run the selection end to end and look at what it picked:min_trades and min_win_rate until it does not.
Watch the simulation
Simulation runs the entire subscription against live prices without touching the chain:Your return diverging from the leader's
Your return diverging from the leader's
Compare simulated return against the leader’s own PnL over the same period with
GET /traders/{address}/pnl. Large divergence usually means your sizing mode or category filter is doing something you did not intend, not that the leader changed.Fill counts higher than expected
Fill counts higher than expected
Copytrade is charged at 25 bips per side, against 10 bips on the Trade API. A leader who trades constantly can turn a profitable strategy into a break-even one purely through fees. Count fills over a week before committing.
Insufficient funds events
Insufficient funds events
If your collateral cannot keep pace with the leader’s cadence, some fills will be skipped, and the ones that get skipped are not random. Either raise collateral or lower the proportional fraction.
Supervise
A leader who was good for six months can stop being good, and nothing about a subscription notices that for you. Add a check that runs on a schedule:DELETE discards it. Prefer pausing while you work out whether the drawdown is noise or a broken thesis.
Going live
Once the simulation is dull rather than exciting:Wrapping up
The bot is three layers, and only one of them is yours. Bravado detects the leader’s fills, sizes your order, applies your risk controls, and executes. What you built is the judgement: which wallets pass, in which categories, at what fraction, and when to stop. Two design choices carry most of the value. Simulation defaults to on, so the expensive mistake requires a deliberate act to make. And the screening functions are pure, taking an address and returning a boolean, so you can run them over historical wallets and see what they would have chosen without placing a single order.Frequently asked questions
Why filter by category instead of just copying everything?
Why filter by category instead of just copying everything?
Because edges are usually narrow. A trader with a strong record in politics markets may be no better than random in sports, and copying them everywhere means paying 25 bips a side to mirror guesses. The category endpoint tells you where their PnL actually came from.
Does the leader know I am copying them?
Does the leader know I am copying them?
No. They need no Bravado account and receive no notification. Any public wallet can be followed.
What happens if I run out of collateral mid-subscription?
What happens if I run out of collateral mid-subscription?
Fills that cannot be funded are skipped, and skipped fills are not randomly distributed, so your mirrored performance will diverge from the leader’s in ways that are hard to reason about. Watch for these in simulation and size accordingly.
Why does creating a subscription sometimes return 409?
Why does creating a subscription sometimes return 409?
You already have one for that leader. Treat
409 Conflict as already-done rather than an error, and fetch the existing subscription instead of retrying.Can I copy more than one leader at once?
Can I copy more than one leader at once?
Yes, each is a separate subscription with its own sizing and filters. Bear in mind that two leaders trading the same market both consume the same collateral pool.
Why parse numbers with Decimal rather than float?
Why parse numbers with Decimal rather than float?
Every numeric field is returned as a JSON string to preserve precision. Parsing as a float reintroduces rounding error, and a size that fails validation at the venue is an unpleasant way to discover it. See Numeric conventions.
Resources
- Copytrade API reference, endpoints, sizing modes, filters, and risk controls
- Track a whale wallet, the manual version of the selection process
- Safe retries, idempotency keys in depth
- Data API, the wallet analytics used for screening
- Simulation endpoints, paper trading reference
- Rate limits, polling budgets and backoff