OpenAPI Specification
openapi: 3.0.0
info:
title: Kalshi Trade API Manual Endpoints account order-groups API
version: 3.19.0
description: Manually defined OpenAPI spec for endpoints being migrated to spec-first approach
servers:
- url: https://external-api.kalshi.com/trade-api/v2
description: Production Trade API server
- url: https://api.elections.kalshi.com/trade-api/v2
description: Production shared API server, also supported
- url: https://external-api.demo.kalshi.co/trade-api/v2
description: Demo Trade API server
- url: https://demo-api.kalshi.co/trade-api/v2
description: Demo shared API server, also supported
tags:
- name: order-groups
description: Order group management endpoints
paths:
/portfolio/order_groups:
get:
operationId: GetOrderGroups
summary: Get Order Groups
description: ' Retrieves all order groups for the authenticated user.'
tags:
- order-groups
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
parameters:
- $ref: '#/components/parameters/SubaccountQuery'
responses:
'200':
description: Order groups retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/GetOrderGroupsResponse'
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/UnauthorizedError'
'500':
$ref: '#/components/responses/InternalServerError'
/portfolio/order_groups/create:
post:
operationId: CreateOrderGroup
summary: Create Order Group
description: ' Creates a new order group with a contracts limit measured over a rolling 15-second window. When the limit is hit, all orders in the group are cancelled and no new orders can be placed until reset.'
tags:
- order-groups
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateOrderGroupRequest'
responses:
'201':
description: Order group created successfully
content:
application/json:
schema:
$ref: '#/components/schemas/CreateOrderGroupResponse'
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/UnauthorizedError'
'500':
$ref: '#/components/responses/InternalServerError'
/portfolio/order_groups/{order_group_id}:
get:
operationId: GetOrderGroup
summary: Get Order Group
description: ' Retrieves details for a single order group including all order IDs and auto-cancel status.'
tags:
- order-groups
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
parameters:
- $ref: '#/components/parameters/OrderGroupIdPath'
- $ref: '#/components/parameters/SubaccountQuery'
responses:
'200':
description: Order group retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/GetOrderGroupResponse'
'401':
$ref: '#/components/responses/UnauthorizedError'
'404':
$ref: '#/components/responses/NotFoundError'
'500':
$ref: '#/components/responses/InternalServerError'
delete:
operationId: DeleteOrderGroup
summary: Delete Order Group
description: ' Deletes an order group and cancels all orders within it. This permanently removes the group.'
tags:
- order-groups
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
parameters:
- $ref: '#/components/parameters/OrderGroupIdPath'
- $ref: '#/components/parameters/SubaccountQueryDefaultPrimary'
- $ref: '#/components/parameters/ExchangeIndexQuery'
responses:
'200':
description: Order group deleted successfully
content:
application/json:
schema:
$ref: '#/components/schemas/EmptyResponse'
'401':
$ref: '#/components/responses/UnauthorizedError'
'404':
$ref: '#/components/responses/NotFoundError'
'500':
$ref: '#/components/responses/InternalServerError'
/portfolio/order_groups/{order_group_id}/reset:
put:
operationId: ResetOrderGroup
summary: Reset Order Group
description: ' Resets the order group''s matched contracts counter to zero, allowing new orders to be placed again after the limit was hit.'
tags:
- order-groups
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
parameters:
- $ref: '#/components/parameters/OrderGroupIdPath'
- $ref: '#/components/parameters/SubaccountQueryDefaultPrimary'
- $ref: '#/components/parameters/ExchangeIndexQuery'
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/EmptyResponse'
responses:
'200':
description: Order group reset successfully
content:
application/json:
schema:
$ref: '#/components/schemas/EmptyResponse'
'401':
$ref: '#/components/responses/UnauthorizedError'
'404':
$ref: '#/components/responses/NotFoundError'
'500':
$ref: '#/components/responses/InternalServerError'
/portfolio/order_groups/{order_group_id}/trigger:
put:
operationId: TriggerOrderGroup
summary: Trigger Order Group
description: ' Triggers the order group, canceling all orders in the group and preventing new orders until the group is reset.'
tags:
- order-groups
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
parameters:
- $ref: '#/components/parameters/OrderGroupIdPath'
- $ref: '#/components/parameters/SubaccountQueryDefaultPrimary'
- $ref: '#/components/parameters/ExchangeIndexQuery'
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/EmptyResponse'
responses:
'200':
description: Order group triggered successfully
content:
application/json:
schema:
$ref: '#/components/schemas/EmptyResponse'
'401':
$ref: '#/components/responses/UnauthorizedError'
'404':
$ref: '#/components/responses/NotFoundError'
'500':
$ref: '#/components/responses/InternalServerError'
/portfolio/order_groups/{order_group_id}/limit:
put:
operationId: UpdateOrderGroupLimit
summary: Update Order Group Limit
description: ' Updates the order group contracts limit (rolling 15-second window). If the updated limit would immediately trigger the group, all orders in the group are canceled and the group is triggered.'
tags:
- order-groups
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
parameters:
- $ref: '#/components/parameters/OrderGroupIdPath'
- $ref: '#/components/parameters/ExchangeIndexQuery'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateOrderGroupLimitRequest'
responses:
'200':
description: Order group limit updated successfully
content:
application/json:
schema:
$ref: '#/components/schemas/EmptyResponse'
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/UnauthorizedError'
'404':
$ref: '#/components/responses/NotFoundError'
'500':
$ref: '#/components/responses/InternalServerError'
components:
schemas:
GetOrderGroupsResponse:
type: object
properties:
order_groups:
type: array
items:
$ref: '#/components/schemas/OrderGroup'
x-go-type-skip-optional-pointer: true
CreateOrderGroupResponse:
type: object
required:
- order_group_id
- subaccount
properties:
order_group_id:
type: string
description: The unique identifier for the created order group
subaccount:
type: integer
minimum: 0
description: Subaccount number that owns the created order group (0 for primary, 1-32 for subaccounts).
x-go-type-skip-optional-pointer: true
exchange_index:
allOf:
- $ref: '#/components/schemas/ExchangeIndex'
x-go-type-skip-optional-pointer: true
FixedPointCount:
type: string
description: 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 on markets with fractional trading enabled; the minimum granularity is 0.01 contracts. Integer contract count fields are legacy and will be deprecated; when both integer and fp fields are provided, they must match.
example: '10.00'
ExchangeIndex:
type: integer
description: 'Identifier for an exchange shard. Defaults to 0 if unspecified. Note: currently only 0 supported.'
example: 0
CreateOrderGroupRequest:
type: object
properties:
subaccount:
type: integer
minimum: 0
description: Optional subaccount number to use for this order group (0 for primary, 1-32 for subaccounts)
default: 0
x-go-type-skip-optional-pointer: true
contracts_limit:
type: integer
format: int64
minimum: 1
description: 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.
x-go-type-skip-optional-pointer: true
x-oapi-codegen-extra-tags:
validate: omitempty,gte=1
contracts_limit_fp:
$ref: '#/components/schemas/FixedPointCount'
nullable: true
description: String representation of the maximum number of contracts that can be matched within this group over a rolling 15-second window. Provide contracts_limit or contracts_limit_fp; if both provided they must match.
exchange_index:
allOf:
- $ref: '#/components/schemas/ExchangeIndex'
default: 0
x-go-type-skip-optional-pointer: true
EmptyResponse:
type: object
description: An empty response body
ErrorResponse:
type: object
properties:
code:
type: string
description: Error code
message:
type: string
description: Human-readable error message
details:
type: string
description: Additional details about the error, if available
service:
type: string
description: The name of the service that generated the error
OrderGroup:
type: object
required:
- id
- is_auto_cancel_enabled
properties:
id:
type: string
description: Unique identifier for the order group
x-go-type-skip-optional-pointer: true
contracts_limit_fp:
$ref: '#/components/schemas/FixedPointCount'
description: String representation of the current maximum contracts allowed over a rolling 15-second window.
x-go-type-skip-optional-pointer: true
is_auto_cancel_enabled:
type: boolean
description: Whether auto-cancel is enabled for this order group
x-go-type-skip-optional-pointer: true
exchange_index:
allOf:
- $ref: '#/components/schemas/ExchangeIndex'
x-go-type-skip-optional-pointer: true
GetOrderGroupResponse:
type: object
required:
- is_auto_cancel_enabled
- orders
properties:
is_auto_cancel_enabled:
type: boolean
description: Whether auto-cancel is enabled for this order group
contracts_limit_fp:
$ref: '#/components/schemas/FixedPointCount'
description: String representation of the current maximum contracts allowed over a rolling 15-second window.
x-go-type-skip-optional-pointer: true
orders:
type: array
items:
type: string
description: List of order IDs that belong to this order group
x-go-type-skip-optional-pointer: true
exchange_index:
allOf:
- $ref: '#/components/schemas/ExchangeIndex'
x-go-type-skip-optional-pointer: true
UpdateOrderGroupLimitRequest:
type: object
properties:
contracts_limit:
type: integer
format: int64
minimum: 1
description: New 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.
x-go-type-skip-optional-pointer: true
x-oapi-codegen-extra-tags:
validate: omitempty,gte=1
contracts_limit_fp:
$ref: '#/components/schemas/FixedPointCount'
nullable: true
description: String representation of the new maximum number of contracts that can be matched within this group over a rolling 15-second window. Provide contracts_limit or contracts_limit_fp; if both provided they must match.
parameters:
OrderGroupIdPath:
name: order_group_id
in: path
required: true
description: Order group ID
schema:
type: string
SubaccountQuery:
name: subaccount
in: query
description: Subaccount number (0 for primary, 1-32 for subaccounts). If omitted, defaults to all subaccounts.
schema:
type: integer
SubaccountQueryDefaultPrimary:
name: subaccount
in: query
description: Subaccount number (0 for primary, 1-32 for subaccounts). Defaults to 0.
schema:
type: integer
ExchangeIndexQuery:
name: exchange_index
in: query
schema:
$ref: '#/components/schemas/ExchangeIndex'
x-go-type-skip-optional-pointer: true
responses:
UnauthorizedError:
description: Unauthorized - authentication required
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
NotFoundError:
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
BadRequestError:
description: Bad request - invalid input
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
InternalServerError:
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
securitySchemes:
kalshiAccessKey:
type: apiKey
in: header
name: KALSHI-ACCESS-KEY
description: Your API key ID
kalshiAccessSignature:
type: apiKey
in: header
name: KALSHI-ACCESS-SIGNATURE
description: RSA-PSS signature of the request
kalshiAccessTimestamp:
type: apiKey
in: header
name: KALSHI-ACCESS-TIMESTAMP
description: Request timestamp in milliseconds