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.
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.5.1
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.5.1.tar.gz | 57.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pmwallets-0.5.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 73.5 kB
Release files / pmwallets-0.5.1.tar.gz
| Download URL | pmwallets-0.5.1.tar.gz |
|---|---|
| Size | 57.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
884a1ef63e2403d29444dd8c2c1f3957d651be18846024434266298a52fbe27f
|
|
BLAKE2b-256 checksum How to use checksums |
ad5da60142d03b71bac1843bec0af26ebc56dfca43b2efcf523f0fa24bfb872d
|
| 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.5.1-py3-none-any.whl
| Download URL | pmwallets-0.5.1-py3-none-any.whl |
|---|---|
| Size | 16.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
115562b15e3d44fefe231974868f40c66a0606b9fb0e9a7f6615541f2dceb331
|
|
BLAKE2b-256 checksum How to use checksums |
00e47038616fc027bb2eaf5bdec92448455d1fdcc1512604920ae100f364b8fa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.3
|