---
title: "Create Order Group"
method: POST
path: "/portfolio/order_groups/create"
tags: ["order-groups"]
---

# Create Order Group

`POST /portfolio/order_groups/create`

## Request

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

Creates a new order group with a contracts limit measured over a rolling 15-second window. Users can have up to 100,000 order groups at a time. When the limit is hit, all orders in the group are cancelled and no new orders can be placed until reset.

## Request body

- CreateOrderGroupRequest
  - `subaccount` integer: Optional subaccount number to use for this order group (0 for primary, 1-63 for subaccounts). Subaccount-restricted API keys must omit this field or pass their locked subaccount.
  - `contracts_limit` integer: Specifies the maximum number of contracts that can be matched within this group over a rolling 15-second window. Whole contracts only. Provide contracts_limit or contracts_limit_fp; if both provided they must match.
  - `contracts_limit_fp` string: 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.
  - `exchange_index` integer: Identifier for an exchange shard.

## Response `201`

Order group created successfully

- CreateOrderGroupResponse
  - `order_group_id` string, required: The unique identifier for the created order group
  - `subaccount` integer, required: Subaccount number that owns the created order group (0 for primary, 1-63 for subaccounts).
  - `exchange_index` integer: Identifier for an exchange shard.

## Other responses

- `400`: Bad request - invalid input
- `401`: Unauthorized - authentication required
- `500`: Internal server error

## Changes

- **2026-07-31** `a07481be8bf9`: 3 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 `500` status
  - the `subaccount` request property default value `0` was removed
- **2026-05-18** `7e31fc4590e0`: 3 info
  - added the new optional request property `exchange_index`
  - added the optional property `exchange_index` to the response with the `201` status
  - added the required property `subaccount` to the response with the `201` status
- **2026-01-30** `c2d717743574`: 1 info
  - added the new optional request property `subaccount`
- **2026-01-26** `ea5437268cb9`: 2 info
  - added the new optional request property `contracts_limit_fp`
  - the request property `contracts_limit` became optional
- **2025-12-02** `02c9ca7d135f`: 3 info
  - api tag `order-groups` added
  - api tag `portfolio` removed
  - the response property `order_group_id` became required for the status `201`

[Operation history](https://skmtc.dev/kalshi/apis/kalshi-trade-api-manual-endpoints/changes/portfolio/order_groups/create/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)
