Developers

Withdrawals

Withdraw available USDC.e to any Polygon address with a signed WithdrawalIntent.

Request a withdrawal

POST /polymarket/withdrawals
{
  "userAddress":        "0x…",
  "destinationAddress": "0x…",     // optional; defaults to userAddress
  "usdcAmount":         "50.00",   // dollars; will be capped at availableBalance
  "signature": "0x…",              // WithdrawalIntent — REQUIRED (no session shortcut)
  "nonce": 8,
  "deadline": 1700000000
}
→ { "withdrawalId": 555, "amount": "499500", "amountFormatted": "0.4995", "destinationAddress": "0x…", "status": "PENDING" }

amount in the response is the user payout in base units (the protocol withdraw fee has been deducted; check withdrawFee from GET /polymarket/balance/{user}). The withdrawal goes through PENDING → VENUE_WITHDRAW_INITIATED → LANDED → COMPLETED.

Hard-block conditions

The endpoint rejects when any of the following are true:

  • A position is actively being liquidated for this user (409).
  • The user's available balance is not fresh — e.g. recently restarted backend, unsettled liquidation (503, retry after a few seconds).
  • Requested amount minus the protocol fee is non-positive.

Destination

Withdrawals are USDC.e on Polygon. There is no bridge step — the user receives USDC.e in the destination address, period.

List the user's withdrawals

GET /polymarket/withdrawals/{userAddress}