---
title: "Create Orders"
method: POST
path: "/v1/trade/orders"
---

# Create Orders

`POST /v1/trade/orders`

Create new orders.
Requires proxy signature, see [proxy signing](/http/signing#2-proxy-signing).

## Request body

- OrderRequest
  - `op` OpCreateOrders, required
    - `type` 'createOrders', required
    - `args` CreateOrder[], required
      - `iid` integer, required — Instrument ID
      - `buy` boolean, required — Is buy
      - `p` string — Price
      - `qty` string, required — Quantity in no. of contracts
      - `tif` 'gtc' | 'ioc' | 'fok' — Time in force
      - `po` boolean — Post only
      - `ro` boolean — Reduce only
      - `c` string — Client order ID
      - `tr` object — Optional trigger attached to this order.
        - `market` boolean — Whether the trigger executes as a market order
        - `trp` string — Trigger price
        - `tpsl` 'tp' | 'sl' — Trigger type
    - `grp` 'order' | 'position' — TPSL grouping
  - `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).
  - `exp` integer — Command expiry timestamp in Unix milliseconds. If provided, it must be in the future and within the gateway's default command timeout. It can shorten request validity but cannot extend it. This is not an order auto-cancel time.

## Response `200`

Order ACK response. Order result should be fetched using the get orders endpoint.

- OrderResponse[]
  - union
    - OrderAccepted
      - `status` 'ok', required
      - `oid` integer, required — Order ID
      - `coid` string — Client order ID
    - OrderRejected
      - `status` 'err', required
      - `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.)
      - `oid` integer — Order ID
      - `coid` string — Client order 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.
- `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/versions/e17c4709273e/schema)
