Environment
py-clob-client-v2 version: 1.0.0 (from PyPI)
- Python: 3.11
- Chain: Polygon mainnet (chain_id 137)
- User type: V1-migrated (had a V1 Safe wallet, balance migrated to V2 automatically)
What I'm trying to do
Submit a simple GTC limit buy order on a binary BTC up/down neg-risk market
using client.create_and_post_order(...).
What happens
Every combination of signature_type × funder I've tried returns a 400 error.
API key is freshly generated via create_or_derive_api_key() after a DELETE.
| signature_type |
funder |
Polymarket error |
| 0 (EOA) |
not passed (defaults to EOA) |
maker address not allowed, please use the deposit wallet flow |
| 2 (POLY_GNOSIS_SAFE) |
V1 Safe address 0x088602b0... |
maker address not allowed, please use the deposit wallet flow |
| 2 (POLY_GNOSIS_SAFE) |
V2 deposit address from polymarket.com Deposit modal 0x7C7057b6... |
maker address not allowed, please use the deposit wallet flow |
| 3 (POLY_1271) |
V2 deposit address 0x7C7057b6... |
the order signer address has to be the address of the API KEY |
Account context
- EOA (MetaMask):
0x64B423dBe522897738d8d6cF33F10E6e9e239325
- V1 Safe (from V1 days):
0x088602b0B8fAD4B4B34a793756B91879294A3F22
- Verified via
getSafeWalletAddress(EOA) on V2 Exchange contract
- V2 deposit address (shown in polymarket.com → Deposit modal):
0x7C7057b66e13f29C8f072BB1316a2F125589dCD3
- Balance: ~$40 USD visible in polymarket.com portfolio
- API key UUID:
3bbd632f-3cb5-5eef-900c-373e423fb322 (deterministic — same after DELETE + CREATE)
Code I'm running
from py_clob_client_v2 import ApiCreds, ClobClient, OrderArgs, OrderType, Side
client = ClobClient(
host="https://clob.polymarket.com",
chain_id=137,
key=PRIVATE_KEY,
creds=ApiCreds(api_key=..., api_secret=..., api_passphrase=...),
funder="0x7C7057b66e13f29C8f072BB1316a2F125589dCD3",
signature_type=3, # tried 0, 2, 3 — all rejected with different errors
)
order_args = OrderArgs(
token_id="<binary neg-risk BTC up/down token>",
price=0.65,
size=1.5,
side=Side.BUY,
)
resp = client.create_and_post_order(
order_args=order_args,
order_type=OrderType.GTC,
)
Things I've already tried
- Upgraded from
py-clob-client (V1) to py-clob-client-v2 1.0.0
- Forced
PartialCreateOrderOptions(neg_risk=True)
- Deleted existing API key via
DELETE /auth/api-key and recreated it (UUID is deterministic so same UUID returned)
- Verified
funder addresses on-chain via getSafeWalletAddress(EOA) and confirmed the V2 deposit address against what polymarket.com shows in the Deposit modal
- Verified L1 headers send
POLY_ADDRESS = EOA per create_level_1_headers()
Questions
- What is the correct
signature_type × funder combination for V1-migrated users?
- Is there a separate onboarding/activation flow that needs to happen on polymarket.com before V2 orders work for migrated users?
- The README example uses pure EOA (no funder, no sigType) — does that flow work for users who only have V1-migrated balance in a Safe?
- The error
the order signer address has to be the address of the API KEY — what exactly does "address of the API KEY" mean if the L1 header POLY_ADDRESS is already the EOA?
Any guidance from Polymarket Engineering would be much appreciated. Happy to share more debug output, full traceback, or test against a specific combination if you can suggest one.
Environment
py-clob-client-v2version: 1.0.0 (from PyPI)What I'm trying to do
Submit a simple GTC limit buy order on a binary BTC up/down neg-risk market
using
client.create_and_post_order(...).What happens
Every combination of
signature_type×funderI've tried returns a 400 error.API key is freshly generated via
create_or_derive_api_key()after a DELETE.maker address not allowed, please use the deposit wallet flow0x088602b0...maker address not allowed, please use the deposit wallet flow0x7C7057b6...maker address not allowed, please use the deposit wallet flow0x7C7057b6...the order signer address has to be the address of the API KEYAccount context
0x64B423dBe522897738d8d6cF33F10E6e9e2393250x088602b0B8fAD4B4B34a793756B91879294A3F22getSafeWalletAddress(EOA)on V2 Exchange contract0x7C7057b66e13f29C8f072BB1316a2F125589dCD33bbd632f-3cb5-5eef-900c-373e423fb322(deterministic — same after DELETE + CREATE)Code I'm running
Things I've already tried
py-clob-client(V1) topy-clob-client-v2 1.0.0PartialCreateOrderOptions(neg_risk=True)DELETE /auth/api-keyand recreated it (UUID is deterministic so same UUID returned)funderaddresses on-chain viagetSafeWalletAddress(EOA)and confirmed the V2 deposit address against what polymarket.com shows in the Deposit modalPOLY_ADDRESS = EOApercreate_level_1_headers()Questions
signature_type×fundercombination for V1-migrated users?the order signer address has to be the address of the API KEY— what exactly does "address of the API KEY" mean if the L1 headerPOLY_ADDRESSis already the EOA?Any guidance from Polymarket Engineering would be much appreciated. Happy to share more debug output, full traceback, or test against a specific combination if you can suggest one.