{
"type": "pyth_value",
"sending_ts_ms": 1669149841234,
"sid": 1,
"seq": 42,
"msg": {
"underlying_ticker": "Commodities.Index.PYTHOIL/USD",
"value_usd": "82.12345000",
"source_ts_ms": 1710000000100,
"received_at": 1710000000123
}
}{
"type": "pyth_value_underlying_list",
"sending_ts_ms": 1669149841234,
"id": 2,
"sid": 1,
"seq": 1,
"msg": {
"underlying_tickers": [
"Commodities.Index.NATGAS/USD",
"Commodities.Index.PYTHOIL/USD",
"Metal.XAG/USD",
"Metal.XAU/USD"
]
}
}Pyth Value Feed
Real-time Pyth price and Treasury yield updates for configured underlying tickers. Requires authentication.
Access and pricing
The Pyth data feed costs $1,000/month, with the first seven days free. Subscribe to the Pyth data feed.
Connect using an authenticated Kalshi WebSocket session. See Quick Start: WebSockets for API key authentication and request signing.
Underlying tickers
The reference table below lists supported underlyings: spot metals, metal and commodity indices, an equity index, FX pairs, and Treasury yields. Index descriptions note Pyth’s publishing schedule (24/7, 24/5, or 23/5); spot metals, FX pairs, and Treasury yields follow their market sessions.
| Pyth feed ID | Pyth symbol | Description |
|---|---|---|
| 345 | Metal.XAG/USD | Silver price in USD |
| 346 | Metal.XAU/USD | Gold price in USD |
| 1780 | Metal.XPD/USD | Palladium price in USD |
| 1781 | Metal.XPT/USD | Platinum price in USD |
| 3153 | Metal.Index.GOLD/USD | Blended Gold Index in USD (24/7) |
| 3712 | Metal.Index.1OZGOLD/USD | 1-Ounce Gold Index in USD (24/7) |
| 3154 | Metal.Index.SILVER/USD | Blended Silver Index in USD (24/7) |
| 3063 | Commodities.Index.PYTHOIL/USD | Blended Oil Index in USD (24/7) |
| 3707 | Commodities.Index.WTI1M/USD | Constant 1-Month WTI Crude Index in USD (23/5) |
| 3446 | Commodities.Index.BRENT/USD | Blended Brent Crude Index in USD (24/7) |
| 3265 | Commodities.Index.NATGAS/USD | Natural Gas Index in USD (24/7) |
| 3525 | Commodities.Index.CU/USD | Copper Index in USD (24/7) |
| 3266 | Commodities.Index.COPPER/USD | Copper Index in USD (23/5) |
| 3292 | Equity.Index.US30/USD | US30 (Dow Jones Industrial Average) Index in USD (24/5) |
| 1530 | InterestRate.US2Y | US 2-year Treasury yield in percent |
| 1534 | InterestRate.US5Y | US 5-year Treasury yield in percent |
| 1527 | InterestRate.US10Y | US 10-year Treasury yield in percent |
| 1531 | InterestRate.US30Y | US 30-year Treasury yield in percent |
| 327 | FX.EUR/USD | Euro / US Dollar |
| 333 | FX.GBP/USD | British Pound / US Dollar |
| 315 | FX.AUD/USD | Australian Dollar / US Dollar |
| 337 | FX.NZD/USD | New Zealand Dollar / US Dollar |
| 340 | FX.USD/JPY | US Dollar / Japanese Yen |
| 338 | FX.USD/CAD | US Dollar / Canadian Dollar |
| 339 | FX.USD/CHF | US Dollar / Swiss Franc |
| 1514 | FX.USD/NOK | US Dollar / Norwegian Krone |
| 1517 | FX.USD/SEK | US Dollar / Swedish Krona |
| 341 | FX.USD/MXN | US Dollar / Mexican Peso |
| 1512 | FX.USD/INR | US Dollar / Indian Rupee (offshore spot) |
| 1506 | FX.USD/BRL | US Dollar / Brazilian Real |
Pass the exact Pyth symbol in underlying_tickers. The numeric Pyth feed IDs are reference information and are not subscription parameters for this channel. Kalshi market tickers are not Pyth underlying tickers.
Use underlying_list to discover recently streamed tickers on your connection. Availability can change, including as futures contracts expire; the table does not guarantee that every feed is streaming in every environment.
Treasury yields use the exact symbols above, without a /USD suffix. They are included in ["all"] subscriptions and can also be requested individually, for example with underlying_tickers: ["InterestRate.US2Y"]. These are the yield feeds behind the KX{2,5,10,30}YRRATE15M and KX{2,5,10,30}YRRATEH markets; /USD symbols identify separate bond-price feeds.
Requirements
- Authentication required
- Seed
underlying_tickersin the initial subscribe, or add them later - Use
underlying_tickers: ["all"]to receive every available underlying - Supports
update_subscriptionwithsubscribe_underlyings,unsubscribe_underlyings, andunderlying_listactions - Duplicate and out-of-order source timestamps are ignored independently per underlying ticker
Subscription workflow
Subscribe to pyth_value with the underlying tickers you want to receive. For example, request gold, oil, and natural gas prices:
{
"id": 1,
"cmd": "subscribe",
"params": {
"channels": ["pyth_value"],
"underlying_tickers": [
"Metal.XAU/USD",
"Commodities.Index.PYTHOIL/USD",
"Commodities.Index.NATGAS/USD"
]
}
}
A successful subscribe returns a subscribed response with the assigned sid. Use that subscription ID in subsequent commands; replace sid: 1 in the examples below with the returned ID.
You can also omit underlying_tickers to create an empty subscription, discover tickers, and add them later. An empty subscription sends no price updates until you add tickers or switch to ["all"].
Discover recently streamed tickers
{
"id": 2,
"cmd": "update_subscription",
"params": {
"sid": 1,
"action": "underlying_list"
}
}
Read msg.underlying_tickers in the pyth_value_underlying_list response. This lists tickers observed on the stream within the last two hours without changing your subscription. It is not a complete catalog: inactive feeds can be absent. A successful subscribe response alone does not confirm that a requested ticker is streaming.
Add or remove tickers
Add platinum to the existing subscription:
{
"id": 3,
"cmd": "update_subscription",
"params": {
"sid": 1,
"action": "subscribe_underlyings",
"underlying_tickers": ["Metal.XPT/USD"]
}
}
Remove platinum from the subscription:
{
"id": 4,
"cmd": "update_subscription",
"params": {
"sid": 1,
"action": "unsubscribe_underlyings",
"underlying_tickers": ["Metal.XPT/USD"]
}
}
Receive all available underlyings
Set underlying_tickers to ["all"] in the initial subscribe, or enable it on an existing subscription:
{
"id": 5,
"cmd": "update_subscription",
"params": {
"sid": 1,
"action": "subscribe_underlyings",
"underlying_tickers": ["all"]
}
}
While all-mode is enabled, removing an individual ticker does not exclude it. Send unsubscribe_underlyings with ["all"] to disable all-mode; any explicitly subscribed tickers remain selected.
Integration notes
sididentifies the subscription stream; use it forupdate_subscriptionandunsubscribe.- Missing or empty
underlying_tickersforsubscribe_underlyingsorunsubscribe_underlyingsreturns anerrorwithcode: 28(“Underlying tickers required”). value_usdis formatted to eight decimal places. The field name is retained for compatibility: for Treasury yield symbols it contains the yield in percent, so"4.25000000"means 4.25%, not a dollar price or a decimal fraction. Other symbols retain their quoted price units.source_ts_msis the source timestamp in Unix milliseconds;received_atis when Kalshi received the update, also in Unix milliseconds.
{
"type": "pyth_value",
"sending_ts_ms": 1669149841234,
"sid": 1,
"seq": 42,
"msg": {
"underlying_ticker": "Commodities.Index.PYTHOIL/USD",
"value_usd": "82.12345000",
"source_ts_ms": 1710000000100,
"received_at": 1710000000123
}
}{
"type": "pyth_value_underlying_list",
"sending_ts_ms": 1669149841234,
"id": 2,
"sid": 1,
"seq": 1,
"msg": {
"underlying_tickers": [
"Commodities.Index.NATGAS/USD",
"Commodities.Index.PYTHOIL/USD",
"Metal.XAG/USD",
"Metal.XAU/USD"
]
}
}API key authentication required for WebSocket connections. The API key should be provided during the WebSocket handshake.
Deduplicated real-time Pyth price or Treasury yield for an underlying ticker
Recently streamed Pyth underlying tickers