openapi: 3.0.0
info:
title: Kalshi Trade API Manual Endpoints account communications 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: communications
description: Request-for-quote (RFQ) endpoints
paths:
/communications/id:
get:
operationId: GetCommunicationsID
summary: Get Communications ID
description: ' Endpoint for getting the communications ID of the logged-in user.'
tags:
- communications
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
responses:
'200':
description: Communications ID retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/GetCommunicationsIDResponse'
'401':
$ref: '#/components/responses/UnauthorizedError'
'500':
$ref: '#/components/responses/InternalServerError'
/communications/rfqs:
get:
operationId: GetRFQs
summary: Get RFQs
description: ' Endpoint for getting RFQs'
tags:
- communications
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
parameters:
- $ref: '#/components/parameters/CursorQuery'
- $ref: '#/components/parameters/SingleEventTickerQuery'
- $ref: '#/components/parameters/MarketTickerQuery'
- $ref: '#/components/parameters/SubaccountQuery'
- name: limit
in: query
description: Parameter to specify the number of results per page. Defaults to 100.
schema:
type: integer
format: int32
minimum: 1
maximum: 100
default: 100
- name: status
in: query
description: Filter RFQs by status
schema:
type: string
- name: creator_user_id
in: query
description: Filter RFQs by creator user ID
deprecated: true
schema:
type: string
- name: user_filter
in: query
required: false
schema:
$ref: '#/components/schemas/UserFilter'
x-go-type-skip-optional-pointer: true
x-oapi-codegen-extra-tags:
validate: omitempty,oneof=self
responses:
'200':
description: RFQs retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/GetRFQsResponse'
'401':
$ref: '#/components/responses/UnauthorizedError'
'500':
$ref: '#/components/responses/InternalServerError'
post:
operationId: CreateRFQ
summary: Create RFQ
description: ' Endpoint for creating a new RFQ. You can have a maximum of 100 open RFQs at a time.'
tags:
- communications
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateRFQRequest'
responses:
'201':
description: RFQ created successfully
content:
application/json:
schema:
$ref: '#/components/schemas/CreateRFQResponse'
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/UnauthorizedError'
'409':
$ref: '#/components/responses/ConflictError'
'500':
$ref: '#/components/responses/InternalServerError'
/communications/rfqs/{rfq_id}:
get:
operationId: GetRFQ
summary: Get RFQ
description: ' Endpoint for getting a single RFQ by id'
tags:
- communications
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
parameters:
- $ref: '#/components/parameters/RfqIdPath'
responses:
'200':
description: RFQ retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/GetRFQResponse'
'401':
$ref: '#/components/responses/UnauthorizedError'
'404':
$ref: '#/components/responses/NotFoundError'
'500':
$ref: '#/components/responses/InternalServerError'
delete:
operationId: DeleteRFQ
summary: Delete RFQ
description: ' Endpoint for deleting an RFQ by ID'
tags:
- communications
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
parameters:
- $ref: '#/components/parameters/RfqIdPath'
responses:
'204':
description: RFQ deleted successfully
'401':
$ref: '#/components/responses/UnauthorizedError'
'404':
$ref: '#/components/responses/NotFoundError'
'500':
$ref: '#/components/responses/InternalServerError'
/communications/quotes:
get:
operationId: GetQuotes
summary: Get Quotes
description: ' Endpoint for getting quotes'
tags:
- communications
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
parameters:
- $ref: '#/components/parameters/CursorQuery'
- $ref: '#/components/parameters/SingleEventTickerQuery'
- $ref: '#/components/parameters/MarketTickerQuery'
- name: limit
in: query
description: Parameter to specify the number of results per page. Defaults to 500.
schema:
type: integer
format: int32
minimum: 1
maximum: 500
default: 500
- name: status
in: query
description: Filter quotes by status
schema:
type: string
x-go-type-skip-optional-pointer: true
- name: quote_creator_user_id
in: query
description: Filter quotes by quote creator user ID
deprecated: true
schema:
type: string
x-go-type-skip-optional-pointer: true
- name: user_filter
in: query
required: false
description: Filter for quotes created by the authenticated user.
schema:
$ref: '#/components/schemas/UserFilter'
x-go-type-skip-optional-pointer: true
x-oapi-codegen-extra-tags:
validate: omitempty,oneof=self
- name: rfq_user_filter
in: query
required: false
description: Filter for quotes responding to RFQs created by the authenticated user.
schema:
$ref: '#/components/schemas/UserFilter'
x-go-type-skip-optional-pointer: true
x-oapi-codegen-extra-tags:
validate: omitempty,oneof=self
- name: rfq_creator_user_id
in: query
description: Filter quotes by RFQ creator user ID
deprecated: true
schema:
type: string
x-go-type-skip-optional-pointer: true
- name: rfq_creator_subtrader_id
in: query
description: Filter quotes by RFQ creator subtrader ID (FCM members only)
schema:
type: string
x-go-type-skip-optional-pointer: true
- name: rfq_id
in: query
description: Filter quotes by RFQ ID
schema:
type: string
x-go-type-skip-optional-pointer: true
responses:
'200':
description: Quotes retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/GetQuotesResponse'
'401':
$ref: '#/components/responses/UnauthorizedError'
'500':
$ref: '#/components/responses/InternalServerError'
post:
operationId: CreateQuote
summary: Create Quote
description: ' Endpoint for creating a quote in response to an RFQ'
x-mint:
content: '
**Rate limit:** 2 tokens per request. Other endpoints use the default cost of 10 tokens per request unless noted on their own page. See [Rate Limits and Tiers](/getting_started/rate_limits).
'
tags:
- communications
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateQuoteRequest'
responses:
'201':
description: Quote created successfully
content:
application/json:
schema:
$ref: '#/components/schemas/CreateQuoteResponse'
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/UnauthorizedError'
'500':
$ref: '#/components/responses/InternalServerError'
/communications/quotes/{quote_id}:
get:
operationId: GetQuote
summary: Get Quote
description: ' Endpoint for getting a particular quote'
tags:
- communications
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
parameters:
- $ref: '#/components/parameters/QuoteIdPath'
responses:
'200':
description: Quote retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/GetQuoteResponse'
'401':
$ref: '#/components/responses/UnauthorizedError'
'404':
$ref: '#/components/responses/NotFoundError'
'500':
$ref: '#/components/responses/InternalServerError'
delete:
operationId: DeleteQuote
summary: Delete Quote
description: ' Endpoint for deleting a quote, which means it can no longer be accepted.'
x-mint:
content: '
**Rate limit:** 2 tokens per request. Other endpoints use the default cost of 10 tokens per request unless noted on their own page. See [Rate Limits and Tiers](/getting_started/rate_limits).
'
tags:
- communications
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
parameters:
- $ref: '#/components/parameters/QuoteIdPath'
responses:
'204':
description: Quote deleted successfully
'401':
$ref: '#/components/responses/UnauthorizedError'
'404':
$ref: '#/components/responses/NotFoundError'
'500':
$ref: '#/components/responses/InternalServerError'
/communications/quotes/{quote_id}/accept:
put:
operationId: AcceptQuote
summary: Accept Quote
description: ' Endpoint for accepting a quote. This will require the quoter to confirm'
tags:
- communications
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
parameters:
- $ref: '#/components/parameters/QuoteIdPath'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AcceptQuoteRequest'
responses:
'204':
description: Quote accepted successfully
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/UnauthorizedError'
'404':
$ref: '#/components/responses/NotFoundError'
'500':
$ref: '#/components/responses/InternalServerError'
/communications/quotes/{quote_id}/confirm:
put:
operationId: ConfirmQuote
summary: Confirm Quote
description: ' Endpoint for confirming a quote. This will start a timer for order execution'
tags:
- communications
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
parameters:
- $ref: '#/components/parameters/QuoteIdPath'
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/EmptyResponse'
responses:
'204':
description: Quote confirmed successfully
'401':
$ref: '#/components/responses/UnauthorizedError'
'404':
$ref: '#/components/responses/NotFoundError'
'500':
$ref: '#/components/responses/InternalServerError'
components:
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'
ConflictError:
description: Conflict - resource already exists or cannot be modified
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
InternalServerError:
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
schemas:
CreateQuoteRequest:
type: object
required:
- rfq_id
- yes_bid
- no_bid
- rest_remainder
properties:
rfq_id:
type: string
description: The ID of the RFQ to quote on
yes_bid:
type: string
$ref: '#/components/schemas/FixedPointDollars'
description: The bid price for YES contracts, in dollars
no_bid:
type: string
$ref: '#/components/schemas/FixedPointDollars'
description: The bid price for NO contracts, in dollars
rest_remainder:
type: boolean
description: Whether to rest the remainder of the quote after execution
post_only:
type: boolean
description: If true, the quote creator's resting order will be cancelled rather than crossed if it would take liquidity. Defaults to false.
subaccount:
type: integer
description: Optional subaccount number to place the quote under (0 for primary, 1-32 for subaccounts)
GetRFQResponse:
type: object
required:
- rfq
properties:
rfq:
$ref: '#/components/schemas/RFQ'
description: The details of the requested RFQ
Quote:
type: object
required:
- id
- rfq_id
- creator_id
- rfq_creator_id
- market_ticker
- contracts_fp
- yes_bid_dollars
- no_bid_dollars
- created_ts
- updated_ts
- status
properties:
id:
type: string
description: Unique identifier for the quote
rfq_id:
type: string
description: ID of the RFQ this quote is responding to
creator_id:
type: string
description: Public communications ID of the quote creator
rfq_creator_id:
type: string
description: Public communications ID of the RFQ creator
x-go-type-skip-optional-pointer: true
market_ticker:
type: string
description: The ticker of the market this quote is for
contracts_fp:
$ref: '#/components/schemas/FixedPointCount'
description: String representation of the number of contracts in the quote
yes_bid_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: Bid price for YES contracts, in dollars
no_bid_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: Bid price for NO contracts, in dollars
created_ts:
type: string
format: date-time
description: Timestamp when the quote was created
updated_ts:
type: string
format: date-time
description: Timestamp when the quote was last updated
status:
type: string
description: Current status of the quote
enum:
- open
- accepted
- confirmed
- executed
- cancelled
accepted_side:
type: string
description: The side that was accepted (yes or no)
enum:
- 'yes'
- 'no'
accepted_ts:
type: string
format: date-time
description: Timestamp when the quote was accepted
confirmed_ts:
type: string
format: date-time
description: Timestamp when the quote was confirmed
executed_ts:
type: string
format: date-time
description: Timestamp when the quote was executed
cancelled_ts:
type: string
format: date-time
description: Timestamp when the quote was cancelled
rest_remainder:
type: boolean
description: Whether to rest the remainder of the quote after execution
post_only:
type: boolean
description: Whether the quote creator's order is post-only (visible when the caller is the quote creator)
cancellation_reason:
type: string
description: Reason for quote cancellation if cancelled
x-go-type-skip-optional-pointer: true
creator_user_id:
type: string
description: User ID of the quote creator (private field)
x-go-type-skip-optional-pointer: true
rfq_creator_user_id:
type: string
description: User ID of the RFQ creator (private field)
x-go-type-skip-optional-pointer: true
rfq_target_cost_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: Total value requested in the RFQ in dollars
rfq_creator_order_id:
type: string
description: Order ID for the RFQ creator (private field)
x-go-type-skip-optional-pointer: true
creator_order_id:
type: string
description: Order ID for the quote creator (private field)
x-go-type-skip-optional-pointer: true
creator_subaccount:
type: integer
description: Subaccount number of the quote creator (visible when the caller is the quote creator)
rfq_creator_subaccount:
type: integer
description: Subaccount number of the RFQ creator (visible when the caller is the RFQ creator)
yes_contracts_fp:
$ref: '#/components/schemas/FixedPointCount'
description: Number of YES contracts offered in the quote (fixed-point)
no_contracts_fp:
$ref: '#/components/schemas/FixedPointCount'
description: Number of NO contracts offered in the quote (fixed-point)
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
CreateRFQRequest:
type: object
required:
- market_ticker
- rest_remainder
properties:
market_ticker:
type: string
description: The ticker of the market for which to create an RFQ
contracts:
type: integer
description: The number of contracts for the RFQ. Whole contracts only. Contracts may be provided via contracts or contracts_fp; if both provided they must match.
x-go-type-skip-optional-pointer: true
contracts_fp:
$ref: '#/components/schemas/FixedPointCount'
nullable: true
description: String representation of the number of contracts for the RFQ. Contracts may be provided via contracts or contracts_fp; if both provided they must match.
target_cost_centi_cents:
type: integer
format: int64
description: 'DEPRECATED: The target cost for the RFQ in centi-cents. Use target_cost_dollars instead.'
deprecated: true
x-go-type-skip-optional-pointer: true
target_cost_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: The target cost for the RFQ in dollars
x-go-type-skip-optional-pointer: true
rest_remainder:
type: boolean
description: Whether to rest the remainder of the RFQ after execution
replace_existing:
type: boolean
description: Whether to delete existing RFQs as part of this RFQ's creation
default: false
x-go-type-skip-optional-pointer: true
subtrader_id:
type: string
description: The subtrader to create the RFQ for (FCM members only)
x-go-type-skip-optional-pointer: true
subaccount:
type: integer
description: The subaccount number to create the RFQ for (direct members only; 0 for primary, 1-32 for subaccounts)
x-go-type-skip-optional-pointer: true
GetRFQsResponse:
type: object
required:
- rfqs
properties:
rfqs:
type: array
items:
$ref: '#/components/schemas/RFQ'
description: List of RFQs matching the query criteria
cursor:
type: string
description: Cursor for pagination to get the next page of results
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'
UserFilter:
type: string
enum:
- self
x-enum-varnames:
- UserFilterSelf
description: Omit or leave empty to return all results. Use `self` to filter by the authenticated user.
CreateRFQResponse:
type: object
required:
- id
properties:
id:
type: string
description: The ID of the newly created RFQ
CreateQuoteResponse:
type: object
required:
- id
properties:
id:
type: string
description: The ID of the newly created quote
RFQ:
type: object
required:
- id
- creator_id
- contracts_fp
- market_ticker
- status
- created_ts
properties:
id:
type: string
description: Unique identifier for the RFQ
creator_id:
type: string
description: Public communications ID of the RFQ creator.
market_ticker:
type: string
description: The ticker of the market this RFQ is for
contracts_fp:
$ref: '#/components/schemas/FixedPointCount'
description: String representation of the number of contracts requested in the RFQ
target_cost_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: Total value of the RFQ in dollars
status:
type: string
description: Current status of the RFQ (open, closed)
enum:
- open
- closed
created_ts:
type: string
format: date-time
description: Timestamp when the RFQ was created
mve_collection_ticker:
type: string
description: Ticker of the MVE collection this market belongs to
x-go-type-skip-optional-pointer: true
mve_selected_legs:
type: array
x-omitempty: true
items:
$ref: '#/components/schemas/MveSelectedLeg'
description: Selected legs for the MVE collection
x-go-type-skip-optional-pointer: true
rest_remainder:
type: boolean
description: Whether to rest the remainder of the RFQ after execution
cancellation_reason:
type: string
description: Reason for RFQ cancellation if cancelled
x-go-type-skip-optional-pointer: true
creator_user_id:
type: string
description: User ID of the RFQ creator (private field)
x-go-type-skip-optional-pointer: true
creator_subaccount:
type: integer
description: Subaccount number of the RFQ creator (visible when the caller is the RFQ creator)
cancelled_ts:
type: string
format: date-time
description: Timestamp when the RFQ was cancelled
updated_ts:
type: string
format: date-time
description: Timestamp when the RFQ was last updated
FixedPointDollars:
type: string
description: US dollar amount as a fixed-point decimal string with up to 6 decimal places of precision. This is the maximum supported precision; valid quote intervals for a given market are constrained by that market's price level structure.
example: '0.5600'
GetCommunicationsIDResponse:
type: object
required:
- communications_id
properties:
communications_id:
type: string
description: A public communications ID which is used to identify the user
AcceptQuoteRequest:
type: object
required:
- accepted_side
properties:
accepted_side:
type: string
description: The side of the quote to accept (yes or no)
enum:
- 'yes'
- 'no'
GetQuotesResponse:
type: object
required:
- quotes
properties:
quotes:
type: array
items:
$ref: '#/components/schemas/Quote'
description: List of quotes matching the query criteria
cursor:
type: string
description: Cursor for pagination to get the next page of results
x-go-type-skip-optional-pointer: true
MveSelectedLeg:
type: object
properties:
event_ticker:
type: string
description: Unique identifier for the selected event
x-go-type-skip-optional-pointer: true
market_ticker:
type: string
description: Unique identifier for the selected market
x-go-type-skip-optional-pointer: true
side:
type: string
description: The side of the selected market
x-go-type-skip-optional-pointer: true
yes_settlement_value_dollars:
$ref: '#/components/schemas/FixedPointDollars'
nullable: true
x-omitempty: true
description: The settlement value of the YES/LONG side of the contract in dollars. Only filled after determination
GetQuoteResponse:
type: object
required:
- quote
properties:
quote:
$ref: '#/components/schemas/Quote'
description: The details of the requested quote
parameters:
SubaccountQuery:
name: subaccount
in: query
description: Subaccount number (0 for primary, 1-32 for subaccounts). If omitted, defaults to all subaccounts.
schema:
type: integer
CursorQuery:
name: cursor
in: query
description: Pagination cursor. Use the cursor value returned from the previous response to get the next page of results. Leave empty for the first page.
schema:
type: string
x-go-type-skip-optional-pointer: true
SingleEventTickerQuery:
name: event_ticker
in: query
description: Event ticker to filter by. Only a single event ticker is supported.
schema:
type: string
x-go-type-skip-optional-pointer: true
QuoteIdPath:
name: quote_id
in: path
required: true
description: Quote ID
schema:
type: string
RfqIdPath:
name: rfq_id
in: path
required: true
description: RFQ ID
schema:
type: string
MarketTickerQuery:
name: market_ticker
in: query
description: Filter by market ticker
schema:
type: string
x-go-type-skip-optional-pointer: true
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