---
title: "Build Order"
method: POST
path: "/api/{exchange}/buildOrder"
tags: ["Local Only"]
---

# Build Order

`POST /api/{exchange}/buildOrder`

Build an order payload without submitting it to the exchange. Returns the exchange-native signed order or request body for inspection, forwarding through a middleware layer, or deferred submission via submitOrder().

## Path parameters

- `exchange` 'polymarket' | 'kalshi' | 'kalshi-demo' | 'limitless' | 'probable' | 'baozi' | 'myriad' | 'opinion' | 'metaculus' | 'smarkets' | 'polymarket_us' | 'gemini-titan' | 'hyperliquid' | 'suibets' | 'rain' | 'hunch' | 'router', required

## Request body

- object
  - `args` CreateOrderParams[], required
    - `marketId` string, required — The market to trade on.
    - `outcomeId` string, required — The outcome to trade.
    - `side` 'buy' | 'sell', required — Order side: buy or sell.
    - `type` 'market' | 'limit', required — Order type: market (execute immediately) or limit (resting at a price).
    - `amount` number, required — Size of the order in contracts/shares.
    - `price` number — Required for limit orders
    - `denom` 'usdc' | 'shares' — Hosted mode: amount unit.
    - `slippage_pct` number — Hosted mode: maximum market-order slippage percentage.
    - `fee` number — Optional fee rate (e.g., 1000 for 0.1%)
    - `builder` string — Hyperliquid builder address to attach to the order action.
    - `builderFee` number — Hyperliquid builder fee in tenths of a basis point (e.g. 10 = 1 bp).
    - `tickSize` number — Optional override for Limitless/Polymarket
    - `negRisk` boolean — Optional override to skip neg-risk lookup (Polymarket)
    - `onBehalfOf` number — Limitless delegated signing: profile ID to trade on behalf of
  - `credentials` ExchangeCredentials — Optional authentication credentials for exchange operations.
    - `apiKey` string
    - `apiSecret` string — Standard API secret for HMAC-authenticated exchanges
    - `passphrase` string — Standard API passphrase for HMAC-authenticated exchanges
    - `apiToken` string — Metaculus: `Authorization: Token <apiToken>` for higher rate limits
    - `privateKey` string — Required for Polymarket L1 auth
    - `signatureType` union — 0 = EOA, 1 = Poly Proxy, 2 = Gnosis Safe (Can also use 'eoa', 'polyproxy', 'gnosis_safe')
      - number
      - string
    - `funderAddress` string — The address funding the trades (defaults to signer address)
    - `walletAddress` string
    - `baseUrl` string

## Response `200`

Build Order response

- object
  - `success` boolean
  - `error` ErrorDetail — Structured error envelope returned inside `BaseResponse.error` and `ErrorResponse.error`. Hosted-mode endpoints populate `code`, `retryable`, and optionally `exchange` / `detail`; legacy local-mode endpoints may still return only `message`.
    - `message` string — Human-readable error message.
    - `code` 'HOSTED_TRADING_ERROR' | 'INSUFFICIENT_ESCROW_BALANCE' | 'ORDER_SIZE_TOO_SMALL' | 'INVALID_API_KEY' | 'OUTCOME_NOT_FOUND' | 'CATALOG_UNAVAILABLE' | 'BUILT_ORDER_EXPIRED' | 'INVALID_SIGNATURE' | 'NO_LIQUIDITY' | 'MISSING_WALLET_ADDRESS' | 'BAD_REQUEST' | 'AUTHENTICATION_ERROR' | 'PERMISSION_DENIED' | 'NOT_FOUND' | 'ORDER_NOT_FOUND' | 'MARKET_NOT_FOUND' | 'EVENT_NOT_FOUND' | 'RATE_LIMIT_EXCEEDED' | 'INVALID_ORDER' | 'INSUFFICIENT_FUNDS' | 'VALIDATION_ERROR' | 'NETWORK_ERROR' | 'EXCHANGE_NOT_AVAILABLE' | 'NOT_SUPPORTED' — Stable machine-readable error code. Hosted-mode errors use the `HostedTradingError` family (e.g. `INSUFFICIENT_ESCROW_BALANCE`, `BUILT_ORDER_EXPIRED`); pre-hosted local errors use the legacy family (e.g. `BAD_REQUEST`, `NOT_FOUND`).
    - `retryable` boolean — Hint for clients: when `true`, the same request may succeed on retry (e.g. transient network or rate-limit conditions); when `false`, the caller should not retry without modifying the request.
    - `exchange` string, nullable — Venue the error originated from, when known (e.g. 'polymarket', 'kalshi').
    - `detail` object, nullable — Free-form hosted-mode detail blob. Shape depends on `code` — e.g. for `INSUFFICIENT_ESCROW_BALANCE` it may include `{ requested, available }`; for `ORDER_SIZE_TOO_SMALL` it may include `{ min }`; for `BUILT_ORDER_EXPIRED` it may include `{ expiry }`.
  - `data` BuiltOrder
    - `exchange` string, required — The exchange name this order was built for.
    - `params` CreateOrderParams, required
      - `marketId` string, required — The market to trade on.
      - `outcomeId` string, required — The outcome to trade.
      - `side` 'buy' | 'sell', required — Order side: buy or sell.
      - `type` 'market' | 'limit', required — Order type: market (execute immediately) or limit (resting at a price).
      - `amount` number, required — Size of the order in contracts/shares.
      - `price` number — Required for limit orders
      - `denom` 'usdc' | 'shares' — Hosted mode: amount unit.
      - `slippage_pct` number — Hosted mode: maximum market-order slippage percentage.
      - `fee` number — Optional fee rate (e.g., 1000 for 0.1%)
      - `builder` string — Hyperliquid builder address to attach to the order action.
      - `builderFee` number — Hyperliquid builder fee in tenths of a basis point (e.g. 10 = 1 bp).
      - `tickSize` number — Optional override for Limitless/Polymarket
      - `negRisk` boolean — Optional override to skip neg-risk lookup (Polymarket)
      - `onBehalfOf` number — Limitless delegated signing: profile ID to trade on behalf of
    - `signedOrder` object — For CLOB exchanges (Polymarket): the EIP-712 signed order ready to POST to the exchange's order endpoint.
    - `tx` object — For on-chain AMM exchanges: the EVM transaction payload. Reserved for future exchanges; no current exchange populates this.
      - `to` string, required
      - `data` string, required
      - `value` string, required
      - `chainId` number, required
    - `raw` unknown, required
    - `expiry` number, nullable — Unix epoch (ms) when this built order expires server-side. Submitting after expiry returns BUILT_ORDER_EXPIRED.

## Changes

- **2026-07-18** `da5293255d19` — 8 info
  - added the new enum value `baozi` to the `path` request parameter `exchange`
  - added the new enum value `hunch` to the `path` request parameter `exchange`
  - added the new enum value `limitless` to the `path` request parameter `exchange`
  - added the new enum value `metaculus` to the `path` request parameter `exchange`
  - …4 more
- **2026-07-18** `a98fefb8161d` — 8 breaking
  - removed the enum value `baozi` from the `path` request parameter `exchange`
  - removed the enum value `hunch` from the `path` request parameter `exchange`
  - removed the enum value `limitless` from the `path` request parameter `exchange`
  - removed the enum value `metaculus` from the `path` request parameter `exchange`
  - …4 more
- **2026-07-18** `62d8f63af36e` — 8 info
  - added the new enum value `baozi` to the `path` request parameter `exchange`
  - added the new enum value `hunch` to the `path` request parameter `exchange`
  - added the new enum value `limitless` to the `path` request parameter `exchange`
  - added the new enum value `metaculus` to the `path` request parameter `exchange`
  - …4 more
- …earlier changes not shown

[Full history](https://skmtc.dev/pmxt-dev/apis/pmxt-hosted-api/changes/api/:exchange/buildOrder/post.md)

---

[API](https://skmtc.dev/pmxt-dev/apis/pmxt-hosted-api.md) · [All operations](https://skmtc.dev/pmxt-dev/apis/pmxt-hosted-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/pmxt-dev/pmxt-hosted-api/revisions/da5293255d19/schema)
