curl --request POST \
--url https://external-api.kalshi.com/trade-api/v2/concert_cancellation_markets \
--header 'Content-Type: application/json' \
--header 'KALSHI-ACCESS-KEY: <api-key>' \
--header 'KALSHI-ACCESS-SIGNATURE: <api-key>' \
--header 'KALSHI-ACCESS-TIMESTAMP: <api-key>' \
--data '
{
"jambase_event_id": "jambase:16543035",
"scheduled_date": "2026-11-20"
}
'import requests
url = "https://external-api.kalshi.com/trade-api/v2/concert_cancellation_markets"
payload = {
"jambase_event_id": "jambase:16543035",
"scheduled_date": "2026-11-20"
}
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({jambase_event_id: 'jambase:16543035', scheduled_date: '2026-11-20'})
};
fetch('https://external-api.kalshi.com/trade-api/v2/concert_cancellation_markets', 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/concert_cancellation_markets",
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([
'jambase_event_id' => 'jambase:16543035',
'scheduled_date' => '2026-11-20'
]),
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/concert_cancellation_markets"
payload := strings.NewReader("{\n \"jambase_event_id\": \"jambase:16543035\",\n \"scheduled_date\": \"2026-11-20\"\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/concert_cancellation_markets")
.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 \"jambase_event_id\": \"jambase:16543035\",\n \"scheduled_date\": \"2026-11-20\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://external-api.kalshi.com/trade-api/v2/concert_cancellation_markets")
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 \"jambase_event_id\": \"jambase:16543035\",\n \"scheduled_date\": \"2026-11-20\"\n}"
response = http.request(request)
puts response.read_body{
"cover": "postponed",
"event_ticker": "KXRFQCONCERTP-JB16543035-26NOV20",
"market_ticker": "KXRFQCONCERTP-JB16543035-26NOV20-PPD",
"created": true
}{
"code": "<string>",
"message": "<string>",
"details": "<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>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}{
"code": "<string>",
"message": "<string>",
"details": "<string>"
}Create Concert Cancellation Market
Returns the on-request market on whether a concert is called off,
creating it if it doesn’t exist yet. A market is defined by the show
(jambase_event_id), the date it is scheduled for and the cover:
postponed, cancelled or either. The same request always returns
the same market, so call this before sending an RFQ for a market you
haven’t seen. created tells you whether the market is new.
Take jambase_event_id and scheduled_date from
GET /concert_cancellation_markets/concerts or
GET /concert_cancellation_markets/concerts/search. A new market is
created from the show’s listing as it stands now, so the request is
refused when the show has moved to another date or has already been
canceled or postponed.
An existing market is returned until it closes, even when new markets
are no longer offered. A new market’s show must start more than an
hour from now and within the max_days_ahead that
GET /concert_cancellation_markets/availability reports.
A market is traded through RFQs: pass the returned market_ticker to
POST /communications/rfqs. These markets are in series starting with
KXRFQ and are left out of unscoped market listings.
A market created a moment ago may not be readable yet: if
GET /markets/{ticker} returns 404 right after creation, retry.
Errors carry the specific reason in details:
| Status | code | When |
|---|---|---|
| 400 | bad_request | The body isn’t valid JSON, or a field has the wrong type. |
| 400 | missing_parameters | A required field is missing or empty. |
| 400 | invalid_parameters | A field is present but unusable: an unknown cover, a jambase_event_id that isn’t jambase:<id>, a scheduled_date that isn’t YYYY-MM-DD, or a show scheduled further ahead than max_days_ahead. |
| 404 | not_found | The listing source has no show with that id. |
| 409 | concert_cancellation_market_unavailable | The request is valid but the market isn’t offered: concert markets or the cover are switched off, the show is now listed on another date, has already been canceled or postponed, starts too soon, isn’t a concert, or its market has closed. |
| 429 | concert_cancellation_market_limit_exceeded | The daily limit on new concert markets across all users was reached. Retrying at once doesn’t help. |
| 429 | too_many_requests | Your API rate limit. This endpoint is charged against your write budget. |
curl --request POST \
--url https://external-api.kalshi.com/trade-api/v2/concert_cancellation_markets \
--header 'Content-Type: application/json' \
--header 'KALSHI-ACCESS-KEY: <api-key>' \
--header 'KALSHI-ACCESS-SIGNATURE: <api-key>' \
--header 'KALSHI-ACCESS-TIMESTAMP: <api-key>' \
--data '
{
"jambase_event_id": "jambase:16543035",
"scheduled_date": "2026-11-20"
}
'import requests
url = "https://external-api.kalshi.com/trade-api/v2/concert_cancellation_markets"
payload = {
"jambase_event_id": "jambase:16543035",
"scheduled_date": "2026-11-20"
}
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({jambase_event_id: 'jambase:16543035', scheduled_date: '2026-11-20'})
};
fetch('https://external-api.kalshi.com/trade-api/v2/concert_cancellation_markets', 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/concert_cancellation_markets",
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([
'jambase_event_id' => 'jambase:16543035',
'scheduled_date' => '2026-11-20'
]),
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/concert_cancellation_markets"
payload := strings.NewReader("{\n \"jambase_event_id\": \"jambase:16543035\",\n \"scheduled_date\": \"2026-11-20\"\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/concert_cancellation_markets")
.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 \"jambase_event_id\": \"jambase:16543035\",\n \"scheduled_date\": \"2026-11-20\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://external-api.kalshi.com/trade-api/v2/concert_cancellation_markets")
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 \"jambase_event_id\": \"jambase:16543035\",\n \"scheduled_date\": \"2026-11-20\"\n}"
response = http.request(request)
puts response.read_body{
"cover": "postponed",
"event_ticker": "KXRFQCONCERTP-JB16543035-26NOV20",
"market_ticker": "KXRFQCONCERTP-JB16543035-26NOV20-PPD",
"created": true
}{
"code": "<string>",
"message": "<string>",
"details": "<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>"
}{
"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 show, as jambase:<id>, from the concert listing or search.
"jambase:16543035"
The venue-local date the show is scheduled for, as YYYY-MM-DD. It must match the show's current listing.
"2026-11-20"
What a concert cancellation market pays on, read from the show's listing after its scheduled date has ended:
postponed: Yes when the show is listed as postponed, or as taking place on any other date. A show listed as canceled resolves to No.cancelled: Yes when the show is listed as canceled.either: Yes in both of those cases.
postponed, cancelled, either Response
Market returned or created successfully
What a concert cancellation market pays on, read from the show's listing after its scheduled date has ended:
postponed: Yes when the show is listed as postponed, or as taking place on any other date. A show listed as canceled resolves to No.cancelled: Yes when the show is listed as canceled.either: Yes in both of those cases.
postponed, cancelled, either Event ticker of the market.
"KXRFQCONCERTP-JB16543035-26NOV20"
Market ticker of the market.
"KXRFQCONCERTP-JB16543035-26NOV20-PPD"
False when a market for the same request already existed.