---
title: "Create Order (V2)"
method: POST
path: "/portfolio/events/orders"
tags: ["orders"]
---

# Create Order (V2)

`POST /portfolio/events/orders`

## Request

- Base URL: `https://external-api.kalshi.com/trade-api/v2`
- URL: `https://external-api.kalshi.com/trade-api/v2/portfolio/events/orders`
- Auth: API key in header `KALSHI-ACCESS-KEY` and API key in header `KALSHI-ACCESS-SIGNATURE` and API key in header `KALSHI-ACCESS-TIMESTAMP`

Endpoint for submitting event-market orders using the V2 request/response shape (single-book `bid`/`ask` side and fixed-point dollar prices). The legacy `/portfolio/orders` endpoint will be deprecated no earlier than May 6, 2026 — clients should migrate to this path.

## Request body

- CreateOrderV2Request
  - `ticker` string, required
  - `client_order_id` string
  - `side` 'bid' | 'ask', required: Side of the book for an order or trade. For event markets, this refers to the YES leg only: `bid` means buy YES, `ask` means sell YES. (Selling YES is economically equivalent to buying NO at `1 - price`, but this endpoint quotes everything from the YES side.)
  - `count` string, required: Fixed-point contract count string (2 decimals, e.g., "10.00"; referred to as "fp" in field names). Requests accept 0-2 decimal places (e.g., "10", "10.0", "10.00"); responses always emit 2 decimals. Fractional contract values (e.g., "2.50") are supported; the minimum granularity is 0.01 contracts.
  - `price` string, required: Fixed-point US dollar string. Most request fields accept 2-4 decimal places (e.g., "0.56", "0.5600"); responses emit up to 6. Valid quote intervals for a given market are constrained by that market's price level structure.
  - `expiration_time` integer: Optional Unix timestamp in seconds for when the order expires. To place an expiring order, set `time_in_force` to `good_till_canceled` and provide this `expiration_time`. `GTT` is an internal execution type and is not a valid API value for `time_in_force`. The `immediate_or_cancel` time-in-force value cannot be combined with `expiration_time`.
  - `time_in_force` 'fill_or_kill' | 'good_till_canceled' | 'immediate_or_cancel', required: Specifies how long the order remains active. Use `good_till_canceled` with `expiration_time` for an order that should rest until a specific expiration time; without `expiration_time`, `good_till_canceled` is a true good-till-canceled order. `GTT` is not a valid API value.
  - `post_only` boolean
  - `self_trade_prevention_type` 'taker_at_cross' | 'maker', required: The self-trade prevention type for orders. `taker_at_cross` cancels the taker order when it would trade against another order from the same user; execution stops and any partial fills already matched are executed. `maker` cancels the resting maker order and continues matching.
  - `cancel_order_on_pause` boolean: If this flag is set to true, the order will be canceled if the order is open and trading on the exchange is paused for any reason.
  - `reduce_only` boolean: Specifies whether the order place count should be capped by the member's current position. Orders with reduce_only set to true will be rejected unless time_in_force is immediate_or_cancel.
  - `subaccount` integer: The subaccount number to use for this order. 0 is the primary subaccount. Subaccount-restricted API keys must omit this field or pass their locked subaccount.
  - `order_group_id` string: The order group this order is part of
  - `exchange_index` integer: Identifier for an exchange shard.

## Response `201`

Order created successfully

- CreateOrderV2Response
  - `order_id` string, required
  - `client_order_id` string
  - `fill_count` string, required: Fixed-point contract count string (2 decimals, e.g., "10.00"; referred to as "fp" in field names). Requests accept 0-2 decimal places (e.g., "10", "10.0", "10.00"); responses always emit 2 decimals. Fractional contract values (e.g., "2.50") are supported; the minimum granularity is 0.01 contracts.
  - `remaining_count` string, required: Fixed-point contract count string (2 decimals, e.g., "10.00"; referred to as "fp" in field names). Requests accept 0-2 decimal places (e.g., "10", "10.0", "10.00"); responses always emit 2 decimals. Fractional contract values (e.g., "2.50") are supported; the minimum granularity is 0.01 contracts.
  - `average_fill_price` string: Fixed-point US dollar string. Most request fields accept 2-4 decimal places (e.g., "0.56", "0.5600"); responses emit up to 6. Valid quote intervals for a given market are constrained by that market's price level structure.
  - `average_fee_paid` string: Fixed-point US dollar string. Most request fields accept 2-4 decimal places (e.g., "0.56", "0.5600"); responses emit up to 6. Valid quote intervals for a given market are constrained by that market's price level structure.
  - `ts_ms` integer, required: Matching engine timestamp at which the order was processed, as Unix epoch milliseconds.

## Other responses

- `400`: Bad request - invalid input
- `401`: Unauthorized - authentication required
- `403`: Forbidden - insufficient permissions
- `409`: Conflict - resource already exists or cannot be modified
- `429`: Rate limit exceeded. The default cost is 10 tokens per request. Use GET /trade-api/v2/account/endpoint_costs to list non-default endpoint costs.
- `500`: Internal server error
- `503`: Service temporarily unavailable

## Changes

- **2026-09-15** `75098a17c536`: 2 info
  - added the non-success response with the status `403`
  - added the non-success response with the status `503`
- **2026-08-20** `f2e3ba6d8ce6`: 1 info
  - the `exchange_index` request property default value `0` was removed
- **2026-07-31** `a07481be8bf9`: 5 warning, 1 info
  - removed the optional property `service` from the response with the `400` status
  - removed the optional property `service` from the response with the `401` status
  - removed the optional property `service` from the response with the `409` status
  - removed the optional property `service` from the response with the `429` status
  - …2 more
- **2026-06-17** `5dacc8874900`: 1 info
  - the request property `client_order_id` became optional
- **2026-05-18** `7e31fc4590e0`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/kalshi/apis/kalshi-trade-api-manual-endpoints/changes/portfolio/events/orders/post.md)

---

[API](https://skmtc.dev/kalshi/apis/kalshi-trade-api-manual-endpoints.md) - [All operations](https://skmtc.dev/kalshi/apis/kalshi-trade-api-manual-endpoints/llms.txt) - [OpenAPI document](https://skmtc.dev/kalshi/apis/kalshi-trade-api-manual-endpoints/revisions/e6691cdd1915?raw)
