---
title: "Withdraw"
method: POST
path: "/v1/account/withdraw"
---

# Withdraw

`POST /v1/account/withdraw`

Submit a signed withdrawal request.
Requires EOA signature, see [EOA signing](/http/signing#1-eoa-signing).

The `amount` field is the raw token amount including decimals (e.g. `"100000000"` for 100 USDC).
This must match the `uint256 amount` value used in the EIP-712 `Withdraw` signature.

The `ts` field is Unix seconds (not milliseconds) because the on-chain contract validates it
against `block.timestamp`. It must also match the `uint64 ts` in the signed EIP-712 struct.

## Request body

- WithdrawRequest
  - `op` OpWithdraw, required
    - `type` 'withdraw', required
    - `args` object, required
      - `account` string, required — Account address in hex format
      - `token` string, required — Token contract address in hex format
      - `amount` string, required — Raw token amount in base units, matching the uint256 amount in the EIP-712 signature (e.g. "100000000" for 100 USDC with 6 decimals).
      - `to` string, required — Destination address in hex format
  - `sig` string, required — Signature in hex format
  - `salt` integer, required — Salt
  - `ts` integer, required — Request timestamp. Unix milliseconds for most operations; Unix seconds for withdrawals (must match the on-chain EIP-712 struct verified against block.timestamp).

## Response `200`

The accepted withdrawal, carrying its `withdraw_id`.

- WithdrawAccepted
  - `status` 'ok', required
  - `withdraw_id` integer, required — Withdraw ID

## Other responses

- `400` — Bad request — the request was malformed or failed validation (bad query parameters, unparseable body, invalid signature, or a domain pre-check). The `error` field is a human-readable validation detail.
- `422` — The withdrawal was rejected on its merits (e.g. insufficient balance). The body carries `withdraw_id` and `error`.
- `429` — Too Many Requests. `error` distinguishes the limit that was hit: `ip_rate_limited` (per-IP token bucket), `action_rate_limited` (per-account action rate), or `open_orders_limit` (resting open-order cap).
- `500` — Internal server error. `error` is `internal_error`.

---

[API](https://skmtc.net/polymarket/apis/polymarket-perps-http-api.md) · [All operations](https://skmtc.net/polymarket/apis/polymarket-perps-http-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/polymarket/polymarket-perps-http-api/revisions/76e4e47cf3aa/schema)
