Polymarket has three account types — a plain EOA, a Magic (email) proxy wallet, and a Gnosis Safe proxy wallet — and in the CLOB API they are signature_type 0, 1, and 2 respectively. Which one you have is decided by how you signed up, and passing the wrong one is the most common reason API orders fail.
If you’ve hit a cryptic signing or balance error in py-clob-client, this is almost certainly the page you needed. Let’s untangle the three types, how each one holds funds, and exactly what to pass to the client.
The key idea: signer vs. funder
Every Polymarket order needs two roles filled:
- a signer — the private key that cryptographically signs the order, and
- a funder — the address that actually holds the USDC and receives the positions.
For a plain EOA these are the same address. For both proxy types they are different: your key signs, but the money lives in a smart-contract wallet Polymarket deployed for you. Once you see the three types through this lens, everything about them makes sense.
Type 0 — EOA: your wallet, directly
An EOA (externally owned account) is a regular crypto wallet — one address, one private key, no contracts in between. You hold USDC on Polygon in that wallet and trade straight from it via the API.
- How you get it: you don’t sign up through the UI at all — you point the API client at a wallet you already control.
- Where funds live: in the EOA itself. Signer = funder.
- Who it’s for: pure API traders and bot builders who never touch the website and want the fewest moving parts.
- The catch: you manage everything yourself — including granting the token approvals (USDC and outcome tokens) that Polymarket’s exchange contracts need before your first trade. UI-created accounts get this handled for them.
from py_clob_client.client import ClobClient
client = ClobClient(
"https://clob.polymarket.com",
key=PRIVATE_KEY, # your wallet's key — it signs AND holds the funds
chain_id=137,
signature_type=0, # EOA (this is also the default)
)
Type 1 — Magic proxy: the email sign-up (POLY_PROXY)
Sign up on Polymarket with an email, and two things are created behind the scenes: a Magic wallet tied to your email (the signer), and a proxy wallet contract that holds your funds (the funder). You never see a seed phrase; logging in with email gives you access to the key.
- How you get it: email sign-up on polymarket.com — the most common path.
- Where funds live: in the proxy contract. Its address is the deposit address shown in your Polymarket profile.
- For bots: export the Magic wallet’s private key from Polymarket settings, and pass the proxy as
funder— the full walkthrough is in your first Polymarket trading bot.
client = ClobClient(
"https://clob.polymarket.com",
key=MAGIC_EXPORTED_KEY, # signs the orders
chain_id=137,
signature_type=1, # POLY_PROXY — email / Magic account
funder=DEPOSIT_ADDRESS, # the proxy that holds your USDC
)
Type 2 — Gnosis Safe proxy: the browser-wallet sign-up (POLY_GNOSIS_SAFE)
Connect MetaMask (or another browser wallet) on the Polymarket site instead of using email, and Polymarket deploys a Gnosis Safe — a battle-tested multisig-capable smart wallet — controlled by your browser wallet. Same signer/funder split as Magic, different contract underneath.
- How you get it: “connect wallet” sign-up through the Polymarket UI.
- Where funds live: in the Safe — again, the deposit address in your profile, not your MetaMask address.
- For bots: your browser wallet’s key signs; the Safe is the funder.
client = ClobClient(
"https://clob.polymarket.com",
key=BROWSER_WALLET_KEY, # e.g. your MetaMask account's key
chain_id=137,
signature_type=2, # POLY_GNOSIS_SAFE — browser-wallet account
funder=DEPOSIT_ADDRESS, # the Safe that holds your USDC
)
Side by side
| EOA (0) | Magic proxy (1) | Gnosis Safe (2) | |
|---|---|---|---|
| API name | EOA | POLY_PROXY | POLY_GNOSIS_SAFE |
| Created by | You, outside the UI | Email sign-up | Browser-wallet sign-up |
| Signer | Your wallet key | Magic key (exportable) | Your browser wallet key |
| Funds live in | The same wallet | Proxy contract | Gnosis Safe |
funder param | Not needed | Deposit address | Deposit address |
| Typical user | API-first bot builders | Most Polymarket users | Crypto-native UI users |
Who controls what
Control always follows the signing key — so ask: who holds the key?
- EOA: you, and only you. The private key is the account. Polymarket can’t move your funds, but nobody can help you either.
- Magic proxy: control follows your email login. The Magic key is generated and managed through Magic’s infrastructure and unlocked by authenticating with your email — so in practice, whoever controls the email controls the wallet. You can export the raw key from settings, at which point you also hold it directly.
- Gnosis Safe: your browser wallet’s key (i.e., your seed phrase) controls the Safe, and the Safe holds the funds. Self-custody, one contract-hop removed.
In all three cases the funds sit on-chain in an account your key controls — Polymarket the company is not holding a balance for you the way an exchange does. The types differ in what kind of key sits at the top and how you keep it.
The risks of each
Honest failure modes, per type:
- EOA — you are the single point of failure. Lose the key: funds gone, no recovery, no support ticket. Leak the key (committed to a repo, pasted in a chat): funds gone just as permanently. You also grant the exchange-contract approvals yourself — a fat-fingered approval to a wrong contract is on you.
- Magic — your risk is your email. Anyone who compromises your email account can pass the login and reach the wallet, so the account’s security equals your email’s security (use a strong password and 2FA there — that’s your seed phrase now). You also depend on Magic’s service being up to sign in. And once you export the key for a bot, you carry EOA-style key-handling risk on top.
- Gnosis Safe — your seed phrase is everything. Lose the browser wallet’s seed: you lose the Safe and everything in it. Phishing that captures your wallet signature is the classic attack. There’s nominal smart-contract risk in the Safe itself, though Safe is the most battle-tested contract wallet in crypto — this is the smallest of the three concerns in practice.
None of these are exotic risks — they’re the standard trade-off between convenience (someone helps you hold the key) and sovereignty (nobody can help you). Pick the one whose failure mode you’re best equipped to prevent.
Which should you choose?
A simple decision guide:
- “I just want to trade, minimal friction.” → Magic (email). No seed phrase, familiar login, and you can still export the key later if you decide to build a bot. Secure your email like it’s a vault, because it is.
- “I already live in MetaMask / have a hardware wallet.” → Gnosis Safe. You keep the key-management habits you already trust, and your existing wallet controls the account.
- “I’m building a bot; the API is my interface.” → EOA. Fewest moving parts, no dependency on the UI or on Magic, signer and funder are one address. Best paired with a dedicated wallet holding only your trading balance.
- Undecided? Start with Magic — it’s the path the bot tutorial follows, and nothing about it locks you in: you can always fund a fresh EOA later and switch
signature_typeto 0.
Whichever you pick, the bot-hygiene rule is the same: keep only what you’re actively trading in the account a bot can sign for, and keep keys in environment variables, never in code.
How to tell which one you have
- Log in with an email? Type 1.
- Log in by connecting a wallet on the site? Type 2.
- Never used the site, trading from a wallet you control via API only? Type 0.
And the two failure modes to check when orders are rejected: wrong signature_type for how the account was created, or funder missing / set to the signer’s address instead of the deposit address. One detail that surprises people: with proxy accounts, your positions and USDC sit at the proxy address on-chain — so when you watch the live feed, a proxy account’s trades show that wallet, not the login key’s address.
Why this matters beyond order placement
Wallet identity is half of reading the market. Every trade streaming from the mempool carries a wallet_address — the on-chain account that traded. Whether that’s someone’s EOA or their proxy, it’s a stable identity you can track, filter, and copy.
Polymarket settles everything on-chain, which is exactly what makes that visible. Connect to the Polyflux feed and you’ll see every wallet’s trades the millisecond they happen, ~3 seconds before confirmation — start with the Python guide, or grab a key and watch the wallets trade live.