Every contract on Kalshi has a ticker, and if you've ever opened the API or the "Timeline and Payout" section of a market page, you've seen strings like KXBTC15M-26OCT250000-00. They look like noise, but they follow a structure: a series, an event inside that series, and a market inside that event. Once you can read that structure, the API makes sense, and so does how a bot finds the right contract every 15 minutes.
This guide walks through the three levels using a real Bitcoin 15-minute market that settled at midnight Eastern time on October 25, 2026. We'll cover what each part of the ticker means, which API endpoint lists each level, where the rules and fee type live, and the mistakes people make when they write code that depends on tickers.
The three levels: series, event, market
Kalshi's API glossary defines the objects from the top down:
- Series is the top-level object: a collection of related events that use the same kind of data over different, non-overlapping time periods. Events in a series share a ticker prefix, and no event in a series logically depends on another one.
-
Event is a collection of markets. Kalshi calls it the basic unit members interact with. Each event belongs to exactly one series through its
series_tickerfield. -
Market is a single binary yes/no contract. Each market belongs to exactly one event through its
event_tickerfield.
Categories (Crypto, Economics, Sports and so on) and their subcategories, called tags in the API, are not levels above the series. They're fields on the series used for discovery and filtering.
A real example: one Bitcoin 15-minute market
Here's what Kalshi's public API returned for the Bitcoin 15-minute series and one of its settled markets, checked October 25, 2026:
| Level | Ticker | What it is |
|---|---|---|
| Series | KXBTC15M |
"Bitcoin price up down", frequency fifteen_min, category Crypto, tags Crypto, BTC, 15 min, Bitcoin |
| Event | KXBTC15M-26OCT250000 |
The 15-minute window that closed at 00:00 ET on October 25, 2026 |
| Market | KXBTC15M-26OCT250000-00 |
"BTC price up in next 15 mins?" with target price $80,828.36 |
Reading the event ticker left to right:
-
KXBTC15Mis the series prefix. -
26OCT25is the date: year 2026, October 25. -
0000is the time the window closes, in Eastern time. The API reportedclose_timeas 04:00 UTC, which is midnight EDT.
The market ticker adds a suffix, -00. The 15-minute up/down events have a single market each, so the suffix doesn't carry much meaning there. On other series the suffix identifies a strike or bracket. Kalshi's own glossary example is a monthly gas price series, KXAAAGASM, with an event KXAAAGASM-26SEP30 and a market KXAAAGASM-26SEP30-3.00 for the $3.00 strike. The Bitcoin range series works the same way, with one market per price bucket.
What the market object tells you
The market record is where the contract details live. For KXBTC15M-26OCT250000-00 the API returned, among other fields:
-
open_time03:45 UTC andclose_time04:00 UTC, a 15-minute trading window. -
strike_typegreater_or_equalandfloor_strike80,828.36. The market resolves Yes if the settlement value is at or above the target. -
expiration_value80,752.78, the settlement value Kalshi recorded. -
resultnoandsettlement_value_dollars0.0000. The settlement value came in $75.58 under the target, so Yes paid $0 and No paid $1. -
volume_fpabout 3.38 million contracts traded over the market's life. -
statusfinalized. We asked forstatus=settledand the record came backfinalized, so code that checks for an exact status string should handle both.
The market object also carries rules_primary and rules_secondary, the plain-English contract rules, and live order book fields such as yes_bid_dollars, yes_ask_dollars and their sizes. Prices come back as dollar strings like "0.5600", and sizes and volume as fixed-point strings like "10.00", so convert them on purpose rather than assuming integers in cents.
What the series object tells you
The series record carries the template every event inherits. For KXBTC15M:
- Settlement source: CF Benchmarks. (See our explainer on BRTI and how Kalshi Bitcoin markets settle for what that index is and how the settlement value is averaged.)
- Contract terms: a link to Kalshi's filed crypto product certification PDF.
-
Fee type:
quadraticwithfee_multiplier1. Quadratic means the trading fee is largest near 50¢ and shrinks toward 1¢ and 99¢. The exact arithmetic, with worked examples, is in our Kalshi fees and breakeven guide.
Because the fee type sits on the series, two markets that look alike can be priced differently for fees. If you trade more than one series, read the fee type from each series rather than hard-coding one formula.
Which API endpoint lists which level
Kalshi's docs map each level to an endpoint on its Trade API v2 (base URL https://external-api.kalshi.com/trade-api/v2). Market data endpoints like these don't need an API key.
| You want | Endpoint | Filter by |
|---|---|---|
| One series | GET /series/{series_ticker} |
the series ticker |
| Series in a category | GET /series |
category, tags
|
| Events in a series | GET /events |
series_ticker |
| Markets | GET /markets |
series_ticker, event_ticker, status
|
A short Python example that pulls the most recent settled Bitcoin 15-minute market:
The status filter takes one value at a time: unopened, open, closed or settled. Some timestamp filters can't be combined with each other or with certain statuses, and markets that settled before Kalshi's historical cutoff are only available from GET /historical/markets. If you're polling, keep it slow. Our guide to Kalshi API rate limits and WebSocket covers when to switch to streaming.
The mistake to avoid: parsing tickers
It's tempting to build the next ticker by hand. If the current event is KXBTC15M-26OCT250000, the next one should be KXBTC15M-26OCT250015, right? Usually. But Kalshi's glossary says plainly that tickers "often" follow the series, event, market pattern, that there are "occasional exceptions," and that you shouldn't parse ticker strings to infer relationships. Its recommended practice is to use the series, event, market and search endpoints and rely on the series_ticker and event_ticker fields.
In practice that means:
-
Discover, don't construct. Ask
GET /marketsfor open markets in the series and pick the one whoseclose_timeyou want. -
Use the time fields, not the ticker's time digits.
open_timeandclose_timecome back in UTC. The digits in the ticker are Eastern time, so the two disagree by four or five hours depending on daylight saving. -
Read the strike from the market. Use
floor_strikeandstrike_type(andcap_strikeon bracket markets). Don't parse the strike from a suffix or a subtitle. - Handle gaps. Some series pause at set hours, and a market can be missing or not yet open. A bot should skip the window cleanly instead of guessing a ticker and sending an order to it.
Why this matters for automation
A 15-minute series creates a new event every quarter hour, which is 96 a day. Whether you trade them by hand or with software, each trade has to land on the right market before it closes. Most automation bugs on these markets aren't strategy bugs. They're plumbing: the wrong window, a stale strike, a UTC/Eastern mix-up, or a status string the code didn't expect.
DeskBot uses proprietary trading logic with customer-selected settings. Its dashboard shows supported market views and app activity. See the current product and support pages for the features and requirements of your release.
What is a Kalshi series ticker?
It's the prefix shared by every event in a recurring series, such as KXBTC15M for Bitcoin 15-minute up/down markets. The series holds the template: settlement source, contract terms and fee type.
What's the difference between a Kalshi event and a market?
An event is one occurrence, such as one 15-minute window or one month's gas price. A market is a single yes/no contract inside it. Some events have one market, and others have one market per strike or price bracket.
What time zone is the time in a Kalshi ticker?
In the Bitcoin 15-minute example above, the ticker digits 0000 matched midnight Eastern, while the API's close_time was 04:00 UTC. Use the API's time fields in code rather than the ticker digits.
Do I need an API key to read Kalshi tickers and markets?
No. The market data endpoints shown here are public. You need an API key only to place orders or read your own account.
Where do I find a market's ticker on the website?
Kalshi says the market, event and series tickers are in the "Timeline and Payout" section of a market's page. When an event has several markets, each one has its own market ticker.
Can I build the next 15-minute ticker myself?
You can, but Kalshi advises against parsing tickers because there are exceptions. Listing open markets for the series and choosing by close_time is safer.
Risk: Trading on Kalshi involves risk, and you can lose money. Nothing here guarantees results, and past or paper results do not predict future results. DeskBot is independent software and is not affiliated with or endorsed by Kalshi. Definitions came from Kalshi's API glossary (docs.kalshi.com/getting_started/terms) and the Get Series and Get Markets reference pages. The example series and market came from Kalshi's public API. All were checked on October 25, 2026. APIs and contract rules change, so check the current documents before you rely on any detail.
Current product information: Kalshi · Robinhood · Setup and support. Check the relevant product page for current downloads, pricing, renewal and cancellation terms. Desktop and mobile products have separate availability and offers.
Educational content, not financial advice. Trading can lose money. DeskBot does not guarantee profits, returns, win rates or income and is not affiliated with or endorsed by the named exchanges or brokers.
