TED Contract Expiry Radar - Recompete Leads
Find EU public contracts approaching expiry from TED award notices: incumbent, buyer, value, end date and renewal options.
datagrit › Data › Kalshi Settlement Calendar & Order Book Depth
DataKalshi markets ranked by when they settle, with the order book depth, spread and settlement source of each one.
It lists the open Kalshi prediction markets that are expected to settle inside a time window you choose, for example the next 24 hours, and returns one flat row per market: expected settlement time, hours to settle, the sources Kalshi settles on, YES bid, ask and spread, 24-hour volume, open interest and the contracts resting near the best bid and ask. It is built for traders, quants and bot builders who want a settlement calendar with liquidity attached, not a dump of every market. Export the rows as JSON, CSV or Excel, call the Actor through the Apify API, or plug it into n8n, Make and AI agents through MCP.
When Include order book depth is on, the Actor reads the order book of every returned market. yesBidDepth is the number of contracts resting within the depth window below the best YES bid, and yesAskDepth is the number of contracts you can buy within the window above the best YES ask. The window width is set in cents. The levels and totals cover the whole book. Turn the option off for a faster run without depth.
Each row contains the identifiers (ticker, eventTicker, seriesTicker), the series description (seriesTitle, category, categories, frequency; categories lists every category the series is listed under, the same membership the category filter uses), title and outcome, the timing fields (expectedSettlementTime, hoursToSettle, closeTime, latestSettlementTime, settlementTimerSeconds, canCloseEarly), the settlement sources and their URLs, the quotes (yesBid, yesAsk, noBid, noAsk, lastPrice, midPrice, spreadCents, sizes), the activity fields (volume, volume24h, openInterest), the depth fields, optional rules text, sourceUrl and scrapedAt. Fields the source does not publish are null. When no market matches you get one row with found: false, and the run status says why: the series has no open markets right now, nothing settles inside the window, the liquidity and keyword filters removed every market in the window, or Kalshi returned only combination or not-open markets. A source that stops applying its own filters (combination markets or markets that are not active in more than 1% of the scan) fails the run instead of returning rows.
Every result is one flat record, so it drops straight into a spreadsheet, a database or a CRM.
| Field | Type | Description | Example |
|---|---|---|---|
found | boolean | False only for the single status row emitted when no market matches the input. | true |
ticker | string | Unique Kalshi market ticker. Empty only on the status row. | KXBTCD-26OCT0117-T83249.99 |
eventTicker | string | Ticker of the Kalshi event the market belongs to. | KXBTCD-26OCT0117 |
seriesTicker | string | Ticker of the recurring series the event belongs to, matched to the Kalshi series catalog by the longest event ticker prefix. Null when the event matches no series in the catalog. | KXBTCD |
seriesTitle | string | Human-readable title of the series. | Bitcoin price Above/below |
category | string | Primary Kalshi category of the series, for example Sports, Crypto, Financials, Politics or Climate and Weather. A series can be listed under more than one category; all of them are in categories, and the categories filter matches any of them. | Crypto |
categories | array | Every Kalshi category the series is listed under, the same membership the categories input filter uses. Null on the status row. | ["Economics","Transportation"] |
frequency | string | How often the series repeats, as published by Kalshi (hourly, daily, weekly, custom and others). | hourly |
title | string | Question or statement the market settles on. | Bitcoin price on Oct 1, 2026? |
outcome | string | What a YES contract pays on, as written by Kalshi (for example the team or the price bracket). | Dallas |
status | string | Market status reported by Kalshi. The Actor lists markets whose status is active (open for trading) only. | active |
expectedSettlementTime | string | ISO 8601 time at which Kalshi expects the market to settle (expected_expiration_time). This is the sort and filter key of the Actor. | 2026-10-01T10:00:00.000Z |
hoursToSettle | number | Hours between the start of the run and the expected settlement time, rounded to 2 decimals. Negative means the expected time has passed and the market has not settled yet. | 18.34 |
closeTime | string | ISO 8601 time after which the market stops trading at the latest. Markets that can close early often settle long before it. | 2026-10-03T01:00:00.000Z |
latestSettlementTime | string | ISO 8601 latest time by which Kalshi will settle the market (latest_expiration_time). | 2026-10-03T01:00:00.000Z |
settlementTimerSeconds | number | Seconds Kalshi waits after the outcome is known before it pays out the market. | 90 |
canCloseEarly | boolean | True when the market closes as soon as its outcome is decided instead of waiting for the close time. | true |
settlementSources | string | Names of the sources Kalshi uses to settle the series, joined with semicolons. Null when the series lists none. | CF Benchmarks |
settlementSourceUrls | string | Links to the settlement sources, separated by single spaces, in the same order as the names. | https://www.cfbenchmarks.com/data/indices/BRTI |
yesBid | number | Best price in dollars someone is willing to pay for a YES contract. 0 means there is no bid. | 0.58 |
yesAsk | number | Best price in dollars at which a YES contract can be bought. 1 means there is no offer. | 0.59 |
noBid | number | Best price in dollars someone is willing to pay for a NO contract. | 0.41 |
noAsk | number | Best price in dollars at which a NO contract can be bought. | 0.42 |
lastPrice | number | Price of the last trade in dollars. 0 when the market has not traded. | 0.58 |
midPrice | number | Midpoint of the YES bid and ask in dollars, read as the implied probability of YES. Null unless the market has a bid of at least 1 cent and an ask of at most 99 cents. | 0.585 |
spreadCents | number | YES ask minus YES bid in cents. Null unless the market is quoted on both sides. | 1 |
yesBidSize | number | Contracts resting at the best YES bid. | 7442.21 |
yesAskSize | number | Contracts resting at the best YES ask. | 525.33 |
volume | number | Contracts traded over the lifetime of the market. | 29185.23 |
volume24h | number | Contracts traded in the last 24 hours. | 29185.23 |
openInterest | number | Contracts currently held across all traders. | 17101.47 |
yesBidDepth | number | Contracts resting on the YES bid side within the depth window below the best bid. Null when the order book was skipped or unavailable. | 16839.01 |
yesAskDepth | number | Contracts available to buy YES within the depth window above the best ask (resting NO bids, which are YES offers). Null when the order book was skipped or unavailable. | 19022.45 |
yesBidLevels | number | Number of price levels on the YES bid side of the whole book. Null when the order book was skipped or unavailable. | 31 |
yesAskLevels | number | Number of price levels on the YES ask side of the whole book. Null when the order book was skipped or unavailable. | 59 |
yesBidTotal | number | Contracts on the YES bid side across all price levels. Null when the order book was skipped or unavailable. | 101444.2 |
yesAskTotal | number | Contracts on the YES ask side across all price levels. Null when the order book was skipped or unavailable. | 150167.1 |
depthWindowCents | number | Width in cents of the window used for the two depth fields. Null when the order book was skipped or unavailable. | 5 |
rulesPrimary | string | Primary settlement rules text of the market. Present only when "Include rules text" is on. | If Bitcoin is above 83249.99 at 5pm EDT, the market resolves to Yes. |
rulesSecondary | string | Secondary settlement rules text of the market. Present only when "Include rules text" is on. | If the source is unavailable, the market settles on the next published value. |
sourceUrl | string | Kalshi API URL of the market. Empty only on the status row. | https://api.elections.kalshi.com/trade-api/v2/markets/KXBTCD-26OCT0117-T83249.99 |
scrapedAt | string | ISO 8601 time of the run. | 2026-10-01T02:44:42.436Z |
{
"found": true,
"ticker": "KXBTCD-26OCT0117-T83249.99",
"eventTicker": "KXBTCD-26OCT0117",
"seriesTicker": "KXBTCD",
"seriesTitle": "Bitcoin price Above/below",
"category": "Crypto",
"categories": [
"Economics",
"Transportation"
],
"frequency": "hourly",
"title": "Bitcoin price on Oct 1, 2026?",
"outcome": "Dallas",
"status": "active",
"expectedSettlementTime": "2026-10-01T10:00:00.000Z",
"hoursToSettle": 18.34,
"closeTime": "2026-10-03T01:00:00.000Z",
"latestSettlementTime": "2026-10-03T01:00:00.000Z",
"settlementTimerSeconds": 90,
"canCloseEarly": true,
"settlementSources": "CF Benchmarks",
"settlementSourceUrls": "https://www.cfbenchmarks.com/data/indices/BRTI",
"yesBid": 0.58,
"yesAsk": 0.59,
"noBid": 0.41,
"noAsk": 0.42,
"lastPrice": 0.58,
"midPrice": 0.585,
"spreadCents": 1,
"yesBidSize": 7442.21,
"yesAskSize": 525.33,
"volume": 29185.23,
"volume24h": 29185.23,
"openInterest": 17101.47,
"yesBidDepth": 16839.01,
"yesAskDepth": 19022.45,
"yesBidLevels": 31,
"yesAskLevels": 59,
"yesBidTotal": 101444.2,
"yesAskTotal": 150167.1,
"depthWindowCents": 5,
"rulesPrimary": "If Bitcoin is above 83249.99 at 5pm EDT, the market resolves to Yes.",
"rulesSecondary": "If the source is unavailable, the market settles on the next published value.",
"sourceUrl": "https://api.elections.kalshi.com/trade-api/v2/markets/KXBTCD-26OCT0117-T83249.99",
"scrapedAt": "2026-10-01T02:44:42.436Z"
}
| Field | Name | Type | What it does |
|---|---|---|---|
settlesWithinHours | Settles within (hours) | number | Keep markets whose expected settlement time is at most this many hours from now. 24 means everything that settles today and tonight; 168 is one week. |
settlesAfterHours | Settles after (hours) | number | Keep markets whose expected settlement time is at least this many hours from now. 0 starts at the present moment; a negative value also returns markets whose expected time has passed but which are not settled yet (for example -6). |
categories | Categories | array | Optional. Only markets of series that Kalshi lists under these categories (a series can be listed under several, so a row can show another category than the one you asked for; see the categories field), for example Sports, Crypto, Financials, Politics, Economics, Transportation, Climate and Weather, Entertainment. Case-insensitive; leave empty for all categories. |
seriesTickers | Series tickers | array | Optional. Only these Kalshi series, for example KXBTCD or KXNASDAQ100U. Scanning named series is much faster than scanning the whole exchange. |
keywords | Title keywords | array | Optional. Keep markets whose market title contains at least one of these words or phrases (case-insensitive). Only the market title is searched, not the outcome or series name. |
minVolume24h | Minimum 24h volume | integer | Keep markets with at least this many contracts traded in the last 24 hours. 0 turns the filter off. |
minOpenInterest | Minimum open interest | integer | Keep markets with at least this many contracts outstanding. 0 turns the filter off. |
requireTwoSidedQuote | Only two-sided quotes | boolean | Keep only markets with a YES bid of at least 1 cent and a YES ask of at most 99 cents, so that you can actually trade both ways. Turn off to also list markets that nobody quotes. |
maxSpreadCents | Maximum spread (cents) | number | Keep markets whose YES ask minus YES bid is at most this many cents. 100 turns the filter off; any lower value also drops markets that are not quoted on both sides. |
sortBy | Sort by | string | Order of the results before "Maximum results" is applied: soonest settlement, highest 24h volume, highest open interest or tightest spread. |
includeOrderbook | Include order book depth | boolean | Read the order book of every returned market and add the depth fields (contracts near the best bid and ask, levels, totals). Turn off for a faster run without depth. |
depthCents | Depth window (cents) | integer | Width of the window used by the depth fields: contracts resting within this many cents of the best bid, and within this many cents of the best ask. |
includeRules | Include rules text | boolean | Add the primary and secondary settlement rules text of every market. Makes the rows larger. |
maxItems | Maximum results | integer | Stop after this many markets. |
proxyConfiguration | Proxy configuration | object | Optional proxy. Leave disabled: the Kalshi public API does not need one. |
Run the Actor and get the results in one request. Replace YOUR_APIFY_TOKEN with the token from your Apify account settings.
curl -X POST "https://api.apify.com/v2/acts/datagrit~kalshi-settlement-calendar/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"settlesWithinHours":48,"maxItems":50}'import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('datagrit/kalshi-settlement-calendar').call({
"settlesWithinHours": 48,
"maxItems": 50
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]);Install with npm i apify-client.
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("datagrit/kalshi-settlement-calendar").call(run_input={
"settlesWithinHours": 48,
"maxItems": 50
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(len(items), items[0] if items else None)Install with pip install apify-client.
Find EU public contracts approaching expiry from TED award notices: incumbent, buyer, value, end date and renewal options.
French company lead lists from Sirene screened by net result and revenue, with net margin, size, matching establishment and optional directors.
Ashby job postings with normalized annual salary ranges, equity flags and new-since-last-run detection.
Open jobs from Greenhouse, Lever, Ashby, Workday, Workable, SmartRecruiters, Recruitee and Personio in one schema with normalized salaries.