---
title: "Create Order"
method: POST
path: "/orders"
tags: ["Trading"]
---

# Create Order

`POST /orders`

Creates a buy/sell order for prediction market positions. Requires signed order data.

## Request body

- CreateOrderDto
  - `order` Order, required
    - `salt` union, required — Unique random value for signature uniqueness. Send unsafe integers as decimal strings to preserve EIP-712 bytes.
      - string
      - number
    - `maker` string, required — Ethereum address of the maker (order creator)
    - `signer` string, required — Address that signed the order
    - `taker` string — Specific taker address (optional for open orders)
    - `tokenId` string, required — Token ID being traded (YES or NO position ID from conditional token)
    - `makerAmount` number, required — Amount the maker is offering, scaled by 1e6. For GTC orders: price * size * 1e6 (BUY) or size * 1e6 (SELL). For FOK orders: USDC to spend * 1e6 (BUY) or shares to sell * 1e6 (SELL).
    - `takerAmount` number, required — Amount the maker wants in return, scaled by 1e6. For GTC orders: size * 1e6 (BUY) or price * size * 1e6 (SELL). For FOK orders: always 1.
    - `expiration` string — Order expiration. Must be "0". Non-zero expiration is not currently supported and orders signed with a non-zero value are rejected.
    - `nonce` number — Must be 0. Non-zero nonce is not currently supported and is rejected.
    - `price` number — Order price as decimal (0.01-0.99, required for limit-like GTC/FAK orders)
    - `feeRateBps` number, required — Fee rate in basis points (1% = 100)
    - `side` 0 | 1, required — Order side: 0 = BUY, 1 = SELL
    - `signature` string, required — EIP-712 signature of order details as a 0x-prefixed hex string with full-byte (even) length. Optional when using delegated signing.
    - `signatureType` 0 | 1 | 2 | 3, required — Signature type (0-3). Optional when using delegated signing.
  - `ownerId` number, required — Profile ID of the order owner
  - `orderType` 'FAK' | 'FOK' | 'GTC', required — Order type (GTC=Good Till Cancelled, FAK=Fill And Kill, FOK=Fill Or Kill)
  - `marketSlug` string, required — Market identifier slug
  - `postOnly` boolean — Reject the order if it would match immediately. Supported only for GTC orders.
  - `clientOrderId` string — Client-provided idempotency key for order placement. If a duplicate is submitted, the server returns 409 Conflict.
  - `onBehalfOf` number — Profile ID to place order on behalf of (partner flow). Requires an API token with trading scope and a partner relationship with the target profile.
  - `timestamp` number — Optional client-stamped order creation time, Unix ms epoch. Top-level request field; not part of the EIP-712 signed order payload.
  - `recvWindow` number — Optional maximum accepted order age in milliseconds. Valid range: 1 to 10000. If omitted, no receive-window check is applied. Top-level request field; not part of the EIP-712 signed order payload.
  - `stpPolicy` 'cancel_both' | 'cancel_maker' | 'cancel_taker' — Self-trade prevention policy. Top-level request field; not part of the EIP-712 signed order payload. Defaults to cancel_maker when omitted.

## Response `201`

Order successfully created and matched

- OrderResponseDto
  - `order` CreatedOrderDto, required — Created order as returned by the API. Large numeric fields (`salt`, `makerAmount`, `takerAmount`, `nonce`, `price`) are serialized as decimal strings to preserve precision.
    - `id` string, uuid, required — Internal order ID
    - `salt` string, required — Order salt as decimal string
    - `maker` string, required
    - `signer` string, required
    - `taker` string, nullable
    - `tokenId` string, required
    - `makerAmount` string, required — Maker amount as decimal string (scaled by 1e6)
    - `takerAmount` string, required — Taker amount as decimal string (scaled by 1e6)
    - `expiration` string, nullable — Always "0". Non-zero expiration is not currently supported.
    - `signatureType` 0 | 1 | 2 | 3, required
    - `nonce` string, nullable — Always "0". Non-zero nonce is not currently supported.
    - `feeRateBps` integer, nullable
    - `signature` string, required
    - `orderType` 'GTC' | 'FAK' | 'FOK', required
    - `price` string, nullable — Order price as decimal string (0.01-0.99)
    - `side` 0 | 1, required — 0 = BUY, 1 = SELL
    - `marketId` string, required — Internal market identifier
    - `ownerId` integer, required — Profile ID of the order owner
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time
    - `market` object, required — Slim market info
      - `id` integer
      - `slug` string
      - `title` string
      - `status` 'FUNDED' | 'RESOLVED' | 'LOCKED' | 'DRAFT' | 'FUNDED_FLAGGED'
      - `yesPositionId` string, nullable
      - `noPositionId` string, nullable
      - `group` object, nullable
        - `id` integer
        - `slug` string
        - `title` string
    - `owner` object, nullable — Public profile of the order owner
      - `id` integer
      - `account` string — Checksummed wallet address
      - `displayName` string, nullable
      - `username` string, nullable
      - `imageURI` string, nullable
  - `makerMatches` MakerMatch[] — Maker matches if order was matched immediately
  - `execution` OrderExecutionDto, required — Execution and settlement summary for a created order
    - `matched` boolean, required — Whether the order was matched immediately
    - `settlementStatus` 'UNMATCHED' | 'MATCHED' | 'MINED' | 'CONFIRMED' | 'RETRYING' | 'FAILED' | 'DELAYED' | 'CANCELED', required — Current settlement status of the order. DELAYED means the order was accepted but is held by a per-market taker delay before being released to the matching engine. CANCELED with reason STP_TAKER_REJECTED means self-trade prevention (cancel_taker / cancel_both) rejected the incoming order.
    - `reason` 'STP_TAKER_REJECTED', nullable — Reason the order was canceled. STP_TAKER_REJECTED when self-trade prevention rejected the incoming order. Present only when settlementStatus is CANCELED.
    - `eligibleAt` string, date-time, nullable — ISO-8601 time a delayed (taker-delay) order is released to the matching engine. Present only when settlementStatus is DELAYED.
    - `tradeEventId` string — Trade event ID (present when matched)
    - `txHash` string, nullable — On-chain transaction hash (present when mined)
    - `clientOrderId` string — Echo of client-provided idempotency key
    - `stpMakerCancels` string[] — Resting order IDs canceled by self-trade prevention (cancel_maker / cancel_both)
    - `feeRateBps` number, required — Fee rate in basis points applied to this order
    - `effectiveFeeBps` number, required — Effective fee rate in basis points after any rebates
    - `totalsRaw` OrderExecutionTotalsRawDto, required — Raw execution totals in contract units (strings to preserve precision)
      - `contractsGross` string, required
      - `contractsFee` string, required
      - `contractsNet` string, required
      - `usdGross` string, required
      - `usdFee` string, required
      - `usdNet` string, required

## Other responses

- `400` — Invalid order data, insufficient balance/allowance, or market deadline passed
- `401` — User not authenticated
- `425` — Receive-window check failed, or order creation is temporarily limited by maintenance mode. Receive-window responses do not include a trading-mode `code`; maintenance responses do.
- `500` — Server error during order creation

---

[API](https://skmtc.net/limitless-labs-group/apis/limitless-exchange-api.md) · [All operations](https://skmtc.net/limitless-labs-group/apis/limitless-exchange-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/limitless-labs-group/limitless-exchange-api/versions/f60847044e0d/schema)
