Skip to content

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

m = client.milestones.get("ms_abc")
print(m.title, m.milestone_type, m.scheduled_start)

Reference

kalshi.resources.milestones.MilestonesResource

MilestonesResource(transport: SyncTransport)

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

AsyncMilestonesResource(transport: AsyncTransport)

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.