---
title: "Update Leverage for Multiple Instruments"
method: PATCH
path: "/v1/trade/leverage/batch"
---

# Update Leverage for Multiple Instruments

`PATCH /v1/trade/leverage/batch`

Update leverage for up to 100 unique instruments. Updates are processed
sequentially and are not atomic. If only some responses arrive before the
gateway deadline, missing item results use `internal_error`; whether those
updates applied is unknown. If no responses arrive, the request returns 500.
Requires proxy signature, see [Update Leverage](/perps/trading#update-leverage).

## Request body

- LeverageBatchRequest
  - `op` OpUpdateLeverages, required
    - `type` 'updateLeverages', required
    - `args` OpUpdateLeveragesArgsItem[], required
      - `iid` integer, required — Instrument ID
      - `lev` integer, required — Leverage
      - `cross` boolean, required — Whether to use cross margin mode
  - `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`

Ordered result for each requested instrument.

- LeverageBatchResponse[]
  - union
    - LeverageResponse — The instrument's effective leverage configuration after the update.
      - `status` 'ok', required
      - `instrument_id` integer, required — Instrument ID
      - `leverage` integer, required — Leverage
      - `cross` boolean, required — Whether to use cross margin mode
    - LeverageRejected
      - `status` 'err', required
      - `instrument_id` integer, required — Instrument ID
      - `error` string, required — Error identifier. For domain rejections and transport errors (`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case identifier that is part of the API contract and safe to branch on, e.g. `insufficient_margin`, `insufficient_balance`, `order_not_found`, `reduce_only_invalid`, `price_outside_bounds`, `position_not_found`, `invalid_margin_mode`, `invalid_margin_amount`, `margin_below_required_initial`, `account_liquidating`, `unauthorized`, `not_found`. For `400` it is a human-readable validation detail whose wording may change. See the Error handling guide for the domain identifiers. (Post-only / Fill-or-Kill outcomes are order statuses such as `post_only_rejected`, not rejections.)

## Other responses

- `400` — Bad request — the batch request was malformed or failed validation (unparseable body, invalid signature, or a domain pre-check). Request-level failures are returned as a single rejected item so batch endpoints always return an array. The `error` field is a human-readable validation detail.
- `429` — Too Many Requests. Request-level failures are returned as a single rejected item so batch endpoints always return an array. `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. Request-level failures are returned as a single rejected item so batch endpoints always return an array. `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/versions/e17c4709273e/schema)
