pmwallets — Python SDK for PMWallets
Official Python client for PMWallets: the Polymarket smart-money leaderboard computed from the Polygon chain, and the real-time fills of the Polymarket wallets you follow — delivered in order, exactly once, with every gap replayed.
中文说明 · Node.js SDK: pmwallets-node · Ready-to-run copy-trading bot built on it: polymarket-copy-trading-bot-python
Install
pip install pmwallets # Python ≥ 3.10
Create an API key on pmwallets.com/keys.
Usage
import asyncio
from pmwallets import AsyncClient, Client, FillStream, FileStateStore
# synchronous REST
with Client(api_key="pmw_...") as pmw:
board = pmw.leaderboard(minWinLo=0.55, minEligible=30, style="taker", status="active", limit=50)
cheap = pmw.leaderboard(bands=[0, 1], minWinLo=0.55) # address unlocks free or in the $1 band (0 = free ... 5)
pmw.subscribe(board["rows"][0]["entityId"], channels=["ws"]) # billed per entity per hour
# every fill of every entity you follow
async def main():
async with AsyncClient(api_key="pmw_...") as pmw:
stream = FillStream(
client=pmw,
store=FileStateStore("stream.json"), # a restart resumes exactly where it stopped
on_fill=lambda fill, meta: print(meta.source, fill["side"], fill["price"], fill["tokenId"]),
on_event=lambda e: e["type"] == "fatal" and print(e["error"]), # e.g. another bot already holds the stream
# takeover=True, # replace whichever API client holds this account's stream (it stops with "replaced")
)
await stream.run()
asyncio.run(main())
What is in it
Client / AsyncClient |
leaderboard, entities, address unlocks (balance or plan), your unlocked addresses (my_addresses), plan and balance, subscriptions, webhook status and deliveries, fills replay (fills, fills_since), trade-history exports |
FillStream |
asyncio WebSocket with reconnect and keep-alive; detects missed frames by session/seq and replays them from the last fill delivered; de-duplicates by eventId; anchors behind the chain head on first start; persisted cursor |
verify_webhook(raw_body, signature, secret) |
checks x-pmw-signature (HMAC-SHA256 of the raw body) |
One stream per account:
- An API-key connection takes priority over the pmwallets.com feed page (the page never takes the stream from it).
- Between two API connections the first one keeps the stream. A second one — another key of the same account, or the same bot started twice — is refused:
blocked, thenfatal, and the stream stops. Passtakeover=Trueto replace the holder instead; the holder getsreplaced, thenfatal, and stops (it does not fight back). - A
FillStreamidentifies itself with a randomclient_id, so its own reconnects after a network drop replace its own dead connection without needingtakeover. - When the server restarts it closes the socket with
1012; the stream reconnects at once (eventrestarting) and replays anything it missed.
HTTPS_PROXY is honoured.
PMWallets' servers are in the United Kingdom. A consumer that also trades on Polymarket should run from Ireland (AWS eu-west-1): Polymarket does not accept API orders from the UK, the US and several EU countries.
AI agents: command line and MCP
The package installs a pmwallets command that prints JSON — for scripts, and for AI agents (Claude Code, Codex,
Gemini CLI, Cursor, WorkBuddy, …) that act on the fills of the traders you follow.
export PMW_API_KEY=pmw_…
pmwallets leaderboard --minWinLo 0.55 --category politics --limit 20
pmwallets subscribe <handle> # billed per hour
pmwallets new-fills # fills since the previous call, each once (poll it)
pmwallets watch # live: one JSON line per fill, with its market and decimal amounts
pmwallets watch --batch-sec 30 --exec 'claude -p "Fills from traders I follow are on stdin. …"'
pmwallets mcp # the same as MCP tools
pmwallets skill # the guide to give your agent (SKILL.md)
watch --execruns the command once per batch, the fills on its stdin as JSON lines (and in$PMW_BATCH_FILE); fills that arrive while it runs make the next batch. A batch is handed over at most once: one whose command fails, times out or is interrupted is kept inpmw-watch/failed/and never re-run — the agent may already have placed an order. Restarts resume from where the stream stopped.- To trade, give the agent pmwallets-copytrade:
order buy <tokenId> --usdc 5 --key <eventId>(the same key never orders twice),market,balance,positions. - MCP config (Claude Desktop, Cursor, …):
{"command": "uvx", "args": ["pmwallets", "mcp"], "env": {"PMW_API_KEY": "pmw_…"}}. - Platforms without a shell (Dify, Coze, n8n, GPT Actions): import openapi.json.
HTTPS_PROXY/NO_PROXYare honoured by the command line.- The same pieces are importable:
Watcher,MarketLookup,serve_mcp/McpTool,pmwallets_tools.
Trade-history exports
A purchase is access to files: one zstd-compressed CSV per wallet per UTC day, downloadable at once and again later.
order = client.create_export(["0x…"], "2026-09-01", "2026-09-30")
for f in client.export_files(order["id"])["files"]:
data = client.download_export_file(f["wallet"], f["day"]) # .csv.zst
# pandas: pd.read_csv(io.BytesIO(data), compression="zstd")
export_file_url(wallet, day) returns the short-lived link instead; the API key is never sent to the storage host.
Resources
- Polymarket smart-money leaderboard — profitable Polymarket traders scored from the Polygon chain, with win-rate confidence intervals
- Polymarket copy trading guide — which wallets are worth following and how to get their fills in time
- How to learn from Polymarket smart money — reading a trader's record: confidence intervals, maker vs taker, market specialism
- PMWallets API documentation — WebSocket and webhook fill push, fills replay, trade-history exports
- Measured fill-push latency — block-to-push p50 / p95, published live
- Ways to follow Polymarket wallets, compared — official leaderboard, free trackers, SQL dashboards
- FAQ · 中文站
Guides
- PMWallets SDKs — Node.js and Python clients, side by side
- Polymarket data in Python — markets, a wallet's trades, and live fills
- How to get a Polymarket wallet's trades in real time — polling the Data API, reading OrderFilled events on Polygon, or a pushed fill stream with replay
- Polymarket WebSocket API — what the market and user channels give you, and what they don't
- Polymarket trade alerts by webhook — verify the HMAC-SHA256 signature, answer fast, deduplicate on eventId
- How to export a Polymarket wallet's full trade history — past the Data API's 10,000-trade cap: every fill from the chain, one CSV per wallet per day
- Polymarket token IDs, condition IDs and slugs — how they connect
- How to calculate a Polymarket wallet's PnL — and why sites disagree
- Polymarket leaderboards by category — sports, crypto, politics, esports and more, ranked from on-chain PnL
- Busiest Polymarket markets — the 1,000 most-traded markets of the last 30 days and how their traders did
- All guides · llms.txt
License
MIT
Metadata
Release files for pmwallets 0.6.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pmwallets-0.6.5.tar.gz | 98.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pmwallets-0.6.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 144.4 kB
Release files / pmwallets-0.6.5.tar.gz
| Download URL | pmwallets-0.6.5.tar.gz |
|---|---|
| Size | 98.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cdef933980f40741dd9b8813114e4cb55d2631d5ebccf0641ba73dca2936be60
|
|
BLAKE2b-256 checksum How to use checksums |
6386ccc8469a9c8d2826d71dec41af5ea2e9366662f8b8d29e64f30286996a8f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.3
|
Release files / pmwallets-0.6.5-py3-none-any.whl
| Download URL | pmwallets-0.6.5-py3-none-any.whl |
|---|---|
| Size | 46.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c639bf8787ee77353aa8e672952b8a9152e23cdbda0776d15911a388ea09aa4f
|
|
BLAKE2b-256 checksum How to use checksums |
7fae7a8483e3a757a892068ffd986c3804b8cb2c1238718960aa80e295a9d5d0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.3
|