Skip to content

Prediction Copy Trading

Use Prediction copy trading when you want Bullpen to follow Polymarket prediction-market traders through the tracker copy command family. This is separate from Perps copy trading, which lives under hl copy.

Start read-only, preview the subscription, choose whether executions need manual confirmation, then set risk limits before unattended use.

Before You Start

Confirm the CLI can read your account:

bullpen status --output json
bullpen doctor auth --output json

Run bullpen login only when status or auth diagnostics say login is required.

Inspect current copy-trading state:

bullpen tracker copy list --output json
bullpen tracker copy risk --output json
bullpen tracker copy pending --output json

These commands do not create subscriptions, approve copied trades, or change risk settings.

Preview A Subscription

Preview the trader address before creating a subscription:

bullpen tracker copy start 0x1111111111111111111111111111111111111111 --dry-run \
  --amount 10 \
  --execution-mode confirm \
  --output json

Review the source address, sizing, execution mode, subscription-local plan fields, and any warning fields. These plan fields include values such as max_trade_size_usd, max_per_market_usd, total_budget_usd, daily_limit_usd, slippage_tolerance_pct, and mirror_percent_cap when set. --dry-run validates the plan without creating a subscription, but it does not include account-level risk limits. Run bullpen tracker copy risk --output json to inspect account limits.

Use --execution-mode confirm when copied trades should wait for explicit approval. Use automatic execution only after risk limits are configured and the subscription has been tested with small amounts.

Create Or Update

Use the subscription preview from the previous section as the lead-in for the live create example.

bullpen tracker copy start 0x1111111111111111111111111111111111111111 --dry-run \
  --amount 10 \
  --execution-mode confirm \
  --output json

Live: Create the subscription after reviewing the preview:

bullpen tracker copy start 0x1111111111111111111111111111111111111111 \
  --amount 10 \
  --execution-mode confirm \
  --yes \
  --output json

List subscriptions and use the followed trader address for lifecycle commands:

bullpen tracker copy list --output json
bullpen tracker copy status <ADDRESS> --output json

Preview editable changes before submitting them:

No immediate state-change: Run only the one confirmation-preview command for the subscription change you intend to review.

bullpen tracker copy edit <ADDRESS> --amount 8 --output json
bullpen tracker copy resume <ADDRESS> --output json

Live, immediate state-change: Submit only one lifecycle command at a time after reviewing the subscription status or command-specific confirmation preview; pause, stop, and delete have no separate preview and should be executed only for the exact subscription you intend to mutate.

Live: Submit lifecycle changes only after reviewing the subscription status or confirmation preview:

bullpen tracker copy status <ADDRESS> --output json
bullpen tracker copy edit <ADDRESS> --amount 8 --yes --output json
bullpen tracker copy pause <ADDRESS> --yes --output json
bullpen tracker copy resume <ADDRESS> --yes --output json
bullpen tracker copy stop <ADDRESS> --yes --output json
bullpen tracker copy delete <ADDRESS> --yes --output json

Use delete only when you intend to remove the subscription record rather than stop copying.

Confirmation behavior depends on the command. start without --dry-run, edit, resume, risk set, risk reset, and confirm can show a confirmation preview before mutation. In JSON or non-interactive mode, omitting --yes returns a confirmation-required response and does not mutate.

pause, stop, and delete are stricter. Without --yes, they return a Use --yes instruction before looking up the subscription. Review status <ADDRESS> --output json first, then run the exact --yes command only for the intended followed address.

Read commands such as list, status, risk, and pending use bounded retries for transient read failures, then fail without changing copy-trading state if fresh state still cannot be read.

If a mutation returns mutation_outcome_unknown or safe_to_retry: false, do not rerun the same mutation immediately. Inspect server state first with the matching read command, such as list, status <ADDRESS>, risk, or pending. Retry manually only after the current state proves the mutation did not apply and the next command output says it is safe.

Risk Limits

Set account-level risk limits before enabling unattended execution:

No immediate state-change: The no---yes form returns a confirmation-required preview in JSON or non-interactive mode; submit only after reviewing that output.

bullpen tracker copy risk set \
  --max-per-trade 25 \
  --daily-limit 100 \
  --max-open-positions 5 \
  --output json

Live, immediate state-change: After reviewing the confirmation-required preview, submit the risk update:

bullpen tracker copy risk set \
  --max-per-trade 25 \
  --daily-limit 100 \
  --max-open-positions 5 \
  --yes \
  --output json

Review risk state and preview reset before submitting a reset:

No immediate state-change: Inspect current risk state and the reset confirmation before any live reset.

bullpen tracker copy risk --output json
bullpen tracker copy risk reset --output json

Live, immediate state-change: Reset only after the preview matches the intended account-level risk state:

bullpen tracker copy risk reset --yes --output json

tracker copy risk set uses --max-per-trade. The similarly named --max-trade-size flag belongs to subscription start/edit, not the risk config command.

risk reset clears the server's numeric USD and integer limits. It does not clear restricted categories. To change restricted categories, run risk set --restrict-categories <CATEGORY>[,<CATEGORY>...] --yes; omitting --restrict-categories leaves categories unchanged. The current CLI does not document a supported command to clear the category list to empty.

Manual Confirmations

If a subscription uses confirmation mode, review pending executions and preview the selected action before approving or rejecting it.

No immediate state-change: Run only the one confirm or reject preview matching the pending execution you intend to decide.

bullpen tracker copy pending --output json
bullpen tracker copy confirm <EXECUTION_ID> --output json
bullpen tracker copy reject <EXECUTION_ID> --output json

Live, immediate state-change: Confirm or reject only after checking the execution ID and market identity:

bullpen tracker copy confirm <EXECUTION_ID> --yes --output json
bullpen tracker copy reject <EXECUTION_ID> --yes --output json

confirm <EXECUTION_ID> --yes validates the ID against pending executions and checks the pending execution identity, but it suppresses the pending-execution preview before approval. In JSON or non-interactive mode, confirm without --yes returns a confirmation-required preview and does not approve the execution.

reject also supports --yes. Without --yes, JSON or non-interactive mode returns a confirmation-required response and does not reject. Submit reject <EXECUTION_ID> --yes only after reviewing pending --output json and verifying the execution ID and market identity.

For a bounded interactive terminal monitor:

Interactive watch, no immediate state-change: This terminal monitor does not approve or reject executions. Run it only when you intend to open a temporary live watch stream and stop it after the timeout.

bullpen tracker copy watch &
WATCH_PID=$!
sleep 30
kill "$WATCH_PID" 2>/dev/null || true
wait "$WATCH_PID" 2>/dev/null || true

tracker copy watch is for a human terminal session, does not support JSON output, and has no native duration flag. The shell sequence above stops the example after 30 seconds. Agents should use bounded polling of pending --output json, then explicit confirm or reject calls.

Before confirming, inspect the market identity in the pending execution. When market metadata is sparse, the CLI still exposes lower-level source_condition_id and source_token_id fields in JSON and shows them in the confirmation preview.

Agent-Safe Workflow

Agents should use this sequence:

  1. Run bullpen tracker copy list --output json.
  2. Run bullpen tracker copy risk --output json.
  3. Preview new subscriptions with bullpen tracker copy start <ADDRESS> ... --dry-run --output json.
  4. For edits, inspect bullpen tracker copy status <ADDRESS> --output json or bullpen tracker copy list --output json, then show the proposed changed fields with bullpen tracker copy edit <ADDRESS> ... --output json before submitting bullpen tracker copy edit <ADDRESS> ... --yes.
  5. Show the trader address, sizing, execution mode, subscription-local plan fields, and account limits from bullpen tracker copy risk --output json.
  6. Use --yes only for mutations that accept it: start without --dry-run, edit, pause, resume, stop, delete, risk set, risk reset, confirm, and reject.
  7. Use followed trader addresses from JSON output for edit, pause, resume, stop, delete, and status.
  8. If confirmation mode is enabled, inspect pending --output json before running confirm or reject; use --yes only after checking the execution ID and market identity.
  9. After mutation_outcome_unknown or safe_to_retry: false, inspect current state with the matching read command before any manual retry.

Boundaries

  • tracker copy is Prediction (Polymarket)-only.
  • Perps copy trading uses hl copy.
  • --non-interactive suppresses prompts. It does not imply --yes.
  • Turnkey policy denials such as ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2 require account-policy repair by support; repeated login does not grant missing policy permissions.

Generated References

Use generated references for exact flags: tracker copy, start, edit, status, list, pause, resume, stop, delete, pending, confirm, reject, risk, risk set, risk reset, and stats.