Before you start
You need Windows x64, macOS, or Linux, plus Git and uv. The commands below install a compatible Python version through uv.
Keep the checkout, configuration, and order ledger on one local filesystem, outside OneDrive or other synchronized folders. Use one active setup per wallet; separate computers or ledger copies cannot prevent each other from buying the same pick.
1. Install the trader
Use v0.3.6 to verify your account’s Pro or Max allowance before buying. Pro includes up to 5 daily picks; Max includes up to 15. Stop older watchers before upgrading, because they do not enforce this additional pick limit. On Windows, install uv and Git in PowerShell:Set-Location $env:USERPROFILE to work in your local user folder. Windows runs the CLI directly; WSL is optional.
Run these commands in PowerShell or your macOS/Linux terminal:
v0.3.6 with its locked dependencies. Use its release page to verify the source commit and package checksums.
2. Enter your keys and spending limits
init creates a potd-trader/ configuration folder inside the checkout. It asks for 5 values:
- Your 0xinsider API key.
- Your Polymarket signer key.
- Your Polymarket account address.
- The amount to buy per pick.
- Your daily spending cap.
700, and .env has mode 600. On Windows, the new folder allows access to your user account and administrators. Check the permissions yourself if you use an existing or manually created folder.
3. Check your account and a dry run
Enter the configuration folder and run:status reports regional eligibility, wallet balance, trading approvals, reserved spending, and unresolved orders. The dry run reports your Pro or Max allowance, reserved picks, and which released picks it would buy or skip. A skipped pick includes a reason; no order is sent.
If status reports missing approvals, create a Relayer API key in Polymarket Settings > API Keys. Add POLYMARKET_RELAYER_API_KEY and its POLYMARKET_RELAYER_API_KEY_ADDRESS to your local .env, then run:
setup sends approval transactions for your wallet. It does not buy picks. Run status and the dry run again afterward.
4. Start buying when you are ready
From the same configuration folder, run:live on asks you to type spend real money. watch then checks for released picks and later releases, and reports each purchase or skip. Keep this process running if you want it to check future releases.
For a single check of the picks already released, use uv run --locked potd-trader run. Add --dry-run to either run or watch whenever you want to prohibit orders.
Stop buying
Run these commands from the configuration folder, using another terminal if the watcher is running:live off writes a persistent HALT file, then waits for any submission already in progress. After it acknowledges the stop, watchers using that folder cannot submit a new order. An order already sent can still fill; this command does not cancel it.
A stuck network request can delay acknowledgment. live on clears HALT after confirmation; a watcher that started in live mode can resume, while a watcher that started dry must be restarted.
Set an amount per pick and a daily cap
Every eligible released pick uses the same amount. With the defaults, the trader buys up to 5 pUSD per pick and reserves at most 25 pUSD of order principal per UTC day. That cap covers 5 full-sized picks, matching Pro’s daily allowance. Max needs a cap of 75 pUSD to fund 15 picks at that amount; a day can publish fewer picks. Fees are additional. A partial fill still counts the full requested amount against the cap. If the cap cannot cover every pick, earlier releases are considered first, with token ID breaking ties, and the trader reports the skips. To change these limits in an existing setup:- Run
live offand stop every watcher. - Run
uv run --locked potd-trader sizefrom the configuration folder. - Enter the new amount and daily cap.
- Check
statusand a dry run, then enable live mode and restart the watcher yourself.
size command preserves your keys. Old MIN_RANKS and MAX_RANKS settings are ignored; the trader has no rank filter or rank-based stake.
Your Pro or Max allowance
Your API key determines access; there is no local tier setting. Pro includes the designated free selection plus the first 4 nonfree selections, for up to 5 daily picks. Max includes every eligible published selection, up to 15. The trader reads the authenticated feed response’sX-Monthly-Quota-Limit header. The current included request allowance of 500,000 identifies Pro, and 2,000,000 identifies Max; the optional pay-as-you-go ceiling does not change your pick allowance. Missing or unrecognized values stop trading, and a future allowance change requires a compatible trader release.
The daily pick limit follows the America/New_York calendar used by the picks. Accepted, submitting, and unknown entries for that date count toward the limit, including entries created by older releases. Known rejections release their reservation; the independent spending cap still follows UTC.
A watcher checks this allowance on every successful feed response, including 304. When it changes, the watcher discards its cached picks and requests a fresh slate. Locked selections never become purchases or requests for hidden game details.
Why a pick may be skipped
The trader requires a released, unsettled pick with a positive published price and a validentry_authorization for its token. Polymarket must also confirm the market, outcome, trading status, kickoff time, price increment, and minimum order size.
A purchase must fit all 3 price limits: your MAX_PRICE, your MAX_SLIPPAGE_PCT, and the pick’s entry_authorization.max_entry_price. The trader checks the current order book price needed for your full stake against each limit. The authorization limits price movement; it is not a forecast of profit.
Before submitting, the trader checks the current order book and market again, then checks the stop flag and quote deadline. The quote is valid for at most 30 seconds, and less near kickoff or authorization expiry.
The trader records its spending reservation before submitting one Fill-and-Kill BUY order. This order can fill partly or completely; any unfilled portion is cancelled. If the submission result is uncertain, the trader blocks another attempt instead of risking a duplicate purchase.
watch follows Retry-After, release times, and proof_pending_picks[].retry_at. Temporary read failures produce a warning and a bounded wait before another check.
How slippage and fill prices work
Slippage protection limits the share price before an order is sent. It compares a current book quote for your stake with 3 independent ceilings:
The lowest ceiling wins. The reference ask is recorded when authorization is first issued, which can be earlier than publication;
backed_price is the midpoint recorded at publication. A 5-cent API allowance does not increase your local percentage limit.
For example, a 64-cent reference ask gives a new API ceiling of 69 cents. If the published pick price is 66.5 cents, the default 3% limit is 68.495 cents before rounding to the market’s price increment. The trader still skips a quote above 68.495 cents.
Resolve an uncertain order
Inspect the local order ledger:submitting or unknown keep their spending reservation, including across midnight. A confirmed order counts toward the UTC day when it was submitted. A known rejection releases the reservation.
If an order’s result is uncertain:
- Stop every trader instance for the wallet.
- Inspect Polymarket Activity and the order’s fill state.
- Back up the configuration folder and
ledger.json. - Reconcile the entry only after proving whether an order was accepted or can still execute.
On Windows, a hard power loss can lose the latest reservation or stop flag. Check Polymarket Activity and reconcile the ledger before restarting live mode. Do not run Windows and WSL instances for the same wallet at the same time.
Settings
Edit.env locally and restart the watcher after changing settings. A .env in the current folder takes precedence over the fallback in POTD_TRADER_HOME.
An environment variable cannot enable orders when the active
.env says LIVE=no. A missing control file also prevents live orders, even if secrets come from the environment.
Upgrade an existing setup
- Run
live offand stop every old watcher, including any in WSL. - Back up the complete configuration folder and ledger.
- Install v0.3.6 in a separate checkout using the installation commands above.
- Use the same configuration and ledger on a local filesystem.
- Run
statusandrun --dry-runbefore enabling live mode again.
LEDGER_PATH and POTD_TRADER_HOME values to their Windows paths. Existing v1 JSON ledgers need no migration.
If you are upgrading from 0.2.0, close every old process: its live off cannot stop a binary that is already running. Set a positive DAILY_CAP_USD; 0 is rejected.
For Docker setup, follow the repository’s Docker instructions. Mount the configuration folder at /app/data so the container sees the same .env, HALT, and ledger.
Where your data goes
The private key stays in the local signing process. The trader uses the following services; package installation also contacts package hosts.
The release pins
polymarket-client==0.10.0. The application has no withdrawal command, the builder code is optional, and OXINSIDER_API_BASE accepts only https://api.0xinsider.com. The client refuses redirects.
Anyone who can read .env can use its credentials. For manual setup, copy .env.example to .env inside the checkout and restrict its permissions before adding keys. Use chmod 600 .env on macOS/Linux; on Windows, restrict the folder to your account and administrators.