curl --request POST \
--url https://external-api.kalshi.com/trade-api/v2/communications/rfqs \
--header 'Content-Type: application/json' \
--header 'KALSHI-ACCESS-KEY: <api-key>' \
--header 'KALSHI-ACCESS-SIGNATURE: <api-key>' \
--header 'KALSHI-ACCESS-TIMESTAMP: <api-key>' \
--data '
{
"market_ticker": "<string>",
"rest_remainder": true,
"contracts": 123,
"contracts_fp": "10.00",
"target_cost_centi_cents": 123,
"target_cost_dollars": "0.5600",
"target_cost_excludes_fees": true,
"obscure_creator_id": false,
"replace_existing": false,
"subtrader_id": "<string>",
"subaccount": 123
}
'import requests
url = "https://external-api.kalshi.com/trade-api/v2/communications/rfqs"
payload = {
"market_ticker": "<string>",
"rest_remainder": True,
"contracts": 123,
"contracts_fp": "10.00",
"target_cost_centi_cents": 123,
"target_cost_dollars": "0.5600",
"target_cost_excludes_fees": True,
"obscure_creator_id": False,
"replace_existing": False,
"subtrader_id": "<string>",
"subaccount": 123
}
headers = {
"KALSHI-ACCESS-KEY": "<api-key>",
"KALSHI-ACCESS-SIGNATURE": "<api-key>",
"KALSHI-ACCESS-TIMESTAMP": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'KALSHI-ACCESS-KEY': '<api-key>',
'KALSHI-ACCESS-SIGNATURE': '<api-key>',
'KALSHI-ACCESS-TIMESTAMP': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
market_ticker: '<string>',
rest_remainder: true,
contracts: 123,
contracts_fp: '10.00',
target_cost_centi_cents: 123,
target_cost_dollars: '0.5600',
target_cost_excludes_fees: true,
obscure_creator_id: false,
replace_existing: false,
subtrader_id: '<string>',
subaccount: 123
})
};
fetch('https://external-api.kalshi.com/trade-api/v2/communications/rfqs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://external-api.kalshi.com/trade-api/v2/communications/rfqs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'market_ticker' => '<string>',
'rest_remainder' => true,
'contracts' => 123,
'contracts_fp' => '10.00',
'target_cost_centi_cents' => 123,
'target_cost_dollars' => '0.5600',
'target_cost_excludes_fees' => true,
'obscure_creator_id' => false,
'replace_existing' => false,
'subtrader_id' => '<string>',
'subaccount' => 123
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"KALSHI-ACCESS-KEY: <api-key>",
"KALSHI-ACCESS-SIGNATURE: <api-key>",
"KALSHI-ACCESS-TIMESTAMP: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://external-api.kalshi.com/trade-api/v2/communications/rfqs"
payload := strings.NewReader("{\n \"market_ticker\": \"<string>\",\n \"rest_remainder\": true,\n \"contracts\": 123,\n \"contracts_fp\": \"10.00\",\n \"target_cost_centi_cents\": 123,\n \"target_cost_dollars\": \"0.5600\",\n \"target_cost_excludes_fees\": true,\n \"obscure_creator_id\": false,\n \"replace_existing\": false,\n \"subtrader_id\": \"<string>\",\n \"subaccount\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("KALSHI-ACCESS-KEY", "<api-key>")
req.Header.Add("KALSHI-ACCESS-SIGNATURE", "<api-key>")
req.Header.Add("KALSHI-ACCESS-TIMESTAMP", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://external-api.kalshi.com/trade-api/v2/communications/rfqs")
.header("KALSHI-ACCESS-KEY", "<api-key>")
.header("KALSHI-ACCESS-SIGNATURE", "<api-key>")
.header("KALSHI-ACCESS-TIMESTAMP", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"market_ticker\": \"<string>\",\n \"rest_remainder\": true,\n \"contracts\": 123,\n \"contracts_fp\": \"10.00\",\n \"target_cost_centi_cents\": 123,\n \"target_cost_dollars\": \"0.5600\",\n \"target_cost_excludes_fees\": true,\n \"obscure_creator_id\": false,\n \"replace_existing\": false,\n \"subtrader_id\": \"<string>\",\n \"subaccount\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://external-api.kalshi.com/trade-api/v2/communications/rfqs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["KALSHI-ACCESS-KEY"] = '<api-key>'
request["KALSHI-ACCESS-SIGNATURE"] = '<api-key>'
request["KALSHI-ACCESS-TIMESTAMP"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"market_ticker\": \"<string>\",\n \"rest_remainder\": true,\n \"contracts\": 123,\n \"contracts_fp\": \"10.00\",\n \"target_cost_centi_cents\": 123,\n \"target_cost_dollars\": \"0.5600\",\n \"target_cost_excludes_fees\": true,\n \"obscure_creator_id\": false,\n \"replace_existing\": false,\n \"subtrader_id\": \"<string>\",\n \"subaccount\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}Create RFQ
Endpoint for creating a new RFQ. You can have a maximum of 100 open RFQs at a time.
curl --request POST \
--url https://external-api.kalshi.com/trade-api/v2/communications/rfqs \
--header 'Content-Type: application/json' \
--header 'KALSHI-ACCESS-KEY: <api-key>' \
--header 'KALSHI-ACCESS-SIGNATURE: <api-key>' \
--header 'KALSHI-ACCESS-TIMESTAMP: <api-key>' \
--data '
{
"market_ticker": "<string>",
"rest_remainder": true,
"contracts": 123,
"contracts_fp": "10.00",
"target_cost_centi_cents": 123,
"target_cost_dollars": "0.5600",
"target_cost_excludes_fees": true,
"obscure_creator_id": false,
"replace_existing": false,
"subtrader_id": "<string>",
"subaccount": 123
}
'import requests
url = "https://external-api.kalshi.com/trade-api/v2/communications/rfqs"
payload = {
"market_ticker": "<string>",
"rest_remainder": True,
"contracts": 123,
"contracts_fp": "10.00",
"target_cost_centi_cents": 123,
"target_cost_dollars": "0.5600",
"target_cost_excludes_fees": True,
"obscure_creator_id": False,
"replace_existing": False,
"subtrader_id": "<string>",
"subaccount": 123
}
headers = {
"KALSHI-ACCESS-KEY": "<api-key>",
"KALSHI-ACCESS-SIGNATURE": "<api-key>",
"KALSHI-ACCESS-TIMESTAMP": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'KALSHI-ACCESS-KEY': '<api-key>',
'KALSHI-ACCESS-SIGNATURE': '<api-key>',
'KALSHI-ACCESS-TIMESTAMP': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
market_ticker: '<string>',
rest_remainder: true,
contracts: 123,
contracts_fp: '10.00',
target_cost_centi_cents: 123,
target_cost_dollars: '0.5600',
target_cost_excludes_fees: true,
obscure_creator_id: false,
replace_existing: false,
subtrader_id: '<string>',
subaccount: 123
})
};
fetch('https://external-api.kalshi.com/trade-api/v2/communications/rfqs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://external-api.kalshi.com/trade-api/v2/communications/rfqs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'market_ticker' => '<string>',
'rest_remainder' => true,
'contracts' => 123,
'contracts_fp' => '10.00',
'target_cost_centi_cents' => 123,
'target_cost_dollars' => '0.5600',
'target_cost_excludes_fees' => true,
'obscure_creator_id' => false,
'replace_existing' => false,
'subtrader_id' => '<string>',
'subaccount' => 123
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"KALSHI-ACCESS-KEY: <api-key>",
"KALSHI-ACCESS-SIGNATURE: <api-key>",
"KALSHI-ACCESS-TIMESTAMP: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://external-api.kalshi.com/trade-api/v2/communications/rfqs"
payload := strings.NewReader("{\n \"market_ticker\": \"<string>\",\n \"rest_remainder\": true,\n \"contracts\": 123,\n \"contracts_fp\": \"10.00\",\n \"target_cost_centi_cents\": 123,\n \"target_cost_dollars\": \"0.5600\",\n \"target_cost_excludes_fees\": true,\n \"obscure_creator_id\": false,\n \"replace_existing\": false,\n \"subtrader_id\": \"<string>\",\n \"subaccount\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("KALSHI-ACCESS-KEY", "<api-key>")
req.Header.Add("KALSHI-ACCESS-SIGNATURE", "<api-key>")
req.Header.Add("KALSHI-ACCESS-TIMESTAMP", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://external-api.kalshi.com/trade-api/v2/communications/rfqs")
.header("KALSHI-ACCESS-KEY", "<api-key>")
.header("KALSHI-ACCESS-SIGNATURE", "<api-key>")
.header("KALSHI-ACCESS-TIMESTAMP", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"market_ticker\": \"<string>\",\n \"rest_remainder\": true,\n \"contracts\": 123,\n \"contracts_fp\": \"10.00\",\n \"target_cost_centi_cents\": 123,\n \"target_cost_dollars\": \"0.5600\",\n \"target_cost_excludes_fees\": true,\n \"obscure_creator_id\": false,\n \"replace_existing\": false,\n \"subtrader_id\": \"<string>\",\n \"subaccount\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://external-api.kalshi.com/trade-api/v2/communications/rfqs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["KALSHI-ACCESS-KEY"] = '<api-key>'
request["KALSHI-ACCESS-SIGNATURE"] = '<api-key>'
request["KALSHI-ACCESS-TIMESTAMP"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"market_ticker\": \"<string>\",\n \"rest_remainder\": true,\n \"contracts\": 123,\n \"contracts_fp\": \"10.00\",\n \"target_cost_centi_cents\": 123,\n \"target_cost_dollars\": \"0.5600\",\n \"target_cost_excludes_fees\": true,\n \"obscure_creator_id\": false,\n \"replace_existing\": false,\n \"subtrader_id\": \"<string>\",\n \"subaccount\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}Authorizations
Your API key ID
Base64 signature of the pre-sign text (timestamp + method + path) made with the API key's algorithm - RSA-PSS with SHA-256 for RSA keys, Ed25519 for Ed25519 keys
Request timestamp in milliseconds
Body
The ticker of the market for which to create an RFQ
Whether to rest the remainder of the RFQ after execution
Whole-contract count for the RFQ. Use contracts_fp for partial contract values; if both are provided, they must match.
Fixed-point number of contracts for the RFQ. Supports partial contracts in 0.01-contract increments; if contracts is also provided, both values must match.
"10.00"
DEPRECATED: The target cost for the RFQ in centi-cents. Use target_cost_dollars instead.
The target cost for the RFQ in dollars
"0.5600"
Sizes quotes against the target cost as principal only (contracts = target cost / price), with your taker fees charged on top of the target cost. By default (false) the target cost caps principal plus Kalshi fees, and quote sizes are reduced to make room for the fees. Only valid together with a target cost.
Replace the RFQ creator's public communications ID with a shared empty-input SHA-256 hash for other users. Applies to RFQ responses and broadcasts, and to quotes before successful execution. Successful execution reveals the normal ID in subsequent RFQ responses and in the executed quote. Accepting or confirming a quote does not reveal the ID. The creator always sees their normal ID. See the RFQ guide for the placeholder and visibility rules.
Whether to delete existing RFQs as part of this RFQ's creation
The subtrader to create the RFQ for (FCM members only)
The subaccount number to create the RFQ for (direct members only; 0 for primary, 1-63 for subaccounts)
Response
RFQ created successfully
UUID of the newly created RFQ. Pass it unchanged in subsequent requests.