Skip to content

Order placement returns 400 "maker address not allowed, please use the deposit wallet flow" for Magic.link proxy wallets (py-clob-client-v2 1.0.0 + 1.0.1) #56

@malyshrus

Description

@malyshrus

Order placement returns 400 "maker address not allowed, please use the deposit wallet flow" for Magic.link proxy wallets

Bug confirmed in py-clob-client-v2 versions 1.0.0 and 1.0.1.
Affects every account whose primary wallet was created via Magic.link (the default
sign-up flow on polymarket.com).

Summary

create_and_post_order consistently returns HTTP 400 with the error message "maker address not allowed, please use the deposit wallet flow" when placing an order signed by a Magic.link-derived EOA on behalf of its corresponding proxy wallet (signature_type=1, POLY_PROXY).

The order is rejected at the API gateway layer before any matching-engine logic runs. The same wallet can deposit, withdraw, and trade through the official Polymarket UI without issue — the rejection is specific to programmatic CLOB access.

This blocks all programmatic order placement for Magic.link-onboarded accounts.


Environment

Field Value
py-clob-client-v2 tested on 1.0.0 and 1.0.1 — both fail identically
Python 3.11
Endpoint https://clob.polymarket.com/order
Account type Magic.link (signed up via Polymarket web UI)
Signer EOA <MAGIC_LINK_DERIVED_EOA>
Funder / proxy wallet <MAGIC_LINK_PROXY_WALLET>
Signature type 1 (POLY_PROXY) — also tested 3 (POLY_1271), same error
Funded asset pUSD (0xC011a7E1...), confirmed non-zero balance
Network egress Tested both direct and via residential proxy — same result

Steps to reproduce

import os
from py_clob_client_v2.client import ClobClient
from py_clob_client_v2.clob_types import OrderArgs
from py_clob_client_v2.order_builder.constants import BUY

client = ClobClient(
    host="https://clob.polymarket.com",
    chain_id=137,                          # Polygon mainnet
    key=os.environ["SIGNING_KEY"],         # Magic.link EOA private key
    funder=os.environ["FUNDER_ADDRESS"],   # Magic.link proxy wallet
    signature_type=1,                      # POLY_PROXY
)
client.set_api_creds(client.create_or_derive_api_creds())

# Any liquid market's YES token works — same error on every market.
order_args = OrderArgs(
    token_id="<LIQUID_MARKET_YES_TOKEN_ID>",
    price=0.01,    # far below market — guaranteed NOT to fill
    size=100.0,
    side=BUY,
)

placed = client.create_and_post_order(order_args)   # <-- raises here

Expected behavior

Order is accepted and posted to the orderbook, or rejected with a meaningful business-logic error (e.g. insufficient balance, minimum size violation, market closed). The "deposit wallet flow" is a UI funding workflow — it is not a valid order-placement constraint.

Actual behavior

[py_clob_client_v2] request error status=400
url=https://clob.polymarket.com/order
body={"error":"maker address not allowed, please use the deposit wallet flow"}

PolyApiException:
  status_code=400
  error_message={'error': 'maker address not allowed, please use the deposit wallet flow'}

The error is identical regardless of:

  • signature_type (tried both 1 POLY_PROXY and 3 POLY_1271)
  • Order direction (BUY / SELL), price, or size
  • Network egress (direct vs residential proxy)
  • SDK version (1.0.0 and 1.0.1)
  • Whether the call is create_and_post_order or create_order + post_order separately

What we have verified ✅

  1. Wallet is funded and active. get_balance_allowance returns the correct non-zero pUSD balance.
  2. API credentials are valid. derive_api_credentials succeeds; subsequent reads (orderbook, balances) work fine.
  3. EIP-712 signature is well-formed. The order hash matches what OrderBuilder produces, and the recovered signer matches the Magic.link EOA.
  4. Same wallet works via UI. Placing the same order through polymarket.com succeeds with no warning.
  5. Bug persists on 1.0.1. Upgraded recently, no change in behavior.

Hypothesis

The Polymarket order-routing API appears to maintain a server-side allowlist of "approved maker addresses" that excludes Magic.link-managed proxy wallets — despite these wallets being the default wallet type for accounts created via the public web flow.

The error message ("please use the deposit wallet flow") suggests the API is steering users into a UI funding path rather than acknowledging the order placement. This is either:

(a) A deliberate restriction — in which case CLOB API access requires a separate self-managed wallet (e.g. user-imported MetaMask). The docs should make this explicit, and py-clob-client-v2 should surface a clearer pre-flight error (e.g. on derive_api_credentials) rather than letting the user reach create_and_post_order only to fail with this opaque 400.

(b) A bug — the maker-address allowlist needs to include Magic.link proxy wallets, since they are the wallet type the platform itself provisions for new users.

Either way the current behavior is broken from the user's perspective: the SDK accepts the wallet, signs the order, posts it — and the server rejects with a message that makes no sense in the order-placement context.


Impact

Blocks every Magic.link-onboarded user from any programmatic CLOB activity:

  • 烙 Algorithmic / quant trading
  •  Dispute monitoring and automated position closing
  •  Dashboard tools that need to place or cancel orders
  •  Integrations (e.g. portfolio rebalancers, API connectors)

The only workaround currently is to import a separate EOA into MetaMask, fund it manually, and trade from that — bypassing Magic.link entirely. This contradicts the official onboarding flow.


Suggested fix

Either:

  1. Allowlist Magic.link proxy wallets at the order-routing API.
  2. Document the restriction clearly:
    • In the SDK README under a prominent Wallet requirements section.
    • In derive_api_credentials — return / raise an error before the user signs anything.
    • In the Polymarket developer docs.
  3. Replace the error message. "Use the deposit wallet flow" implies a UI action that doesn't exist for API users. A clearer message would be:
    "Magic.link-managed wallets cannot place orders via the CLOB API. Please use a self-custody wallet (e.g. MetaMask)."

Reproducer

I'm happy to share full request/response traces (with Authorization headers redacted), order hashes, and the exact OrderArgs construction code in a sanitized form if helpful for reproduction. Just let me know what would be useful.


Related

  • Originally observed with py-clob-client-v2 1.0.0
  • No change after upgrade to 1.0.1
  • Multiple existing issues against Polymarket/py-clob-client and Polymarket/py-clob-client-v2 describing the same symptom — but no fix has been merged or root-caused publicly.

Filed by @malyshrus — an active Polymarket trader running an automated quant pipeline. Please prioritize — this is a hard-block on a fundamental SDK use case.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions