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

# Submit Order

`POST /api/{exchange}/submitOrder`

Submit a pre-built order returned by buildOrder().

## 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` BuiltOrder[], required
    - `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.
  - `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`

Submit 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` Order
    - `id` string, required — The exchange-assigned order identifier.
    - `marketId` string, required — The market this order was placed on.
    - `outcomeId` string, required — The outcome this order was placed on.
    - `side` 'buy' | 'sell', required — Order side: buy or sell.
    - `type` 'market' | 'limit', required — Order type: market (execute immediately) or limit (resting at a price).
    - `price` number — For limit orders
    - `amount` number, required — Size in contracts/shares
    - `status` 'pending' | 'open' | 'filled' | 'canceled' | 'rejected', required — Lifecycle status of the order.
    - `filled` number, required — Amount filled (USDC cost for buys, shares for sells)
    - `filledShares` number — Amount filled in shares/contracts (if different from USDC-denominated `filled`).
    - `remaining` number, required — Amount remaining
    - `timestamp` number, required — Unix timestamp in milliseconds when the order was created.
    - `fee` number — Fee paid for this order, if known.
    - `feeRateBps` number — Fee rate in basis points applied to this order (e.g. 100 = 1%).
    - `txHash` string, nullable — Populated in hosted mode after on-chain settlement; null for local-mode and for non-on-chain venues.
    - `chain` string, nullable — Populated in hosted mode after on-chain settlement; null for local-mode and for non-on-chain venues.
    - `blockNumber` number, nullable — Populated in hosted mode after on-chain settlement; null for local-mode and for non-on-chain venues.

## Changes

> 56 revisions in range; 5 could not be searched.

- **2026-07-10** `2bd757f65a2b` — 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-06-24** `32dbe12155be` — 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-06-23** `858d8634282a` — 9 breaking, 2 info
  - 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`
  - …7 more
- …earlier changes not shown

[Full history](https://skmtc.dev/pmxt-dev/apis/pmxt-hosted-api/changes/api/:exchange/submitOrder/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)
