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