Milestones¶
A milestone is a real-world reference event (a baseball game, an election, an economic release) that Kalshi markets and live-data feeds anchor to. The milestone id is the join key between a market and its live state.
Public — no auth required.
Quick reference¶
| Method | Endpoint |
|---|---|
list(*, limit, ...) |
GET /milestones |
list_all(*, limit=None, max_pages=None, ...) |
walks list |
get(milestone_id) |
GET /milestones/{milestone_id} |
List milestones¶
from datetime import datetime, timezone
page = client.milestones.list(
limit=100, # required, 1–500
milestone_type="sports_game", # spec field name "type"; renamed
competition="NFL",
minimum_start_date=datetime(2026, 5, 17, tzinfo=timezone.utc),
min_updated_ts=1_700_000_000, # Unix seconds, for incremental polling
)
for m in page:
print(m.milestone_id, m.title, m.scheduled_start)
limit is required
Unlike most list endpoints, milestones.list requires limit (1–500).
list_all handles this internally; pass limit= if you want a non-default
page size.
Datetime handling
minimum_start_date accepts a datetime. Naive datetimes are coerced to
UTC. If you pass an RFC3339 string instead, it's forwarded unchanged — you
own format correctness.
milestone_type is the SDK's name for spec type
The OpenAPI spec calls this query parameter type. The SDK renames it to
milestone_type to avoid shadowing the Python builtin. The wire still
sends type=.
Get one milestone¶
Reference¶
kalshi.resources.milestones.MilestonesResource ¶
Bases: SyncResource
Sync milestones API — list + single get.
Unlike most resources limit is REQUIRED on list (spec) — range
1-500. The type spec query param is exposed as the
milestone_type kwarg to avoid shadowing the Python built-in.
minimum_start_date accepts a datetime (naive → UTC) or a
pre-formatted RFC3339 string. RFC3339 compliance on the string path
is the caller's responsibility — pass datetime if you want the
SDK to guarantee a timezone offset.
kalshi.resources.milestones.AsyncMilestonesResource ¶
Bases: AsyncResource
Async milestones API.
list_all ¶
list_all(
*,
limit: int,
minimum_start_date: datetime | str | None = None,
category: str | None = None,
competition: str | None = None,
source_id: str | None = None,
milestone_type: str | None = None,
related_event_ticker: str | None = None,
min_updated_ts: int | None = None,
max_pages: int | None = None
) -> AsyncIterator[Milestone]
Returns an async iterator — use async for.