API reference · Markets
Get a market
GET/v1/public/markets/{ticker}
One market's public page as data, with its rules, result, latest quote and price history.
On this page
Auth. None. Without a token the call is served as Free (the Free delay and request budget, shared per IP); send Authorization: Bearer lb_… for your plan's.
Limits. Counts against your plan's API requests; anonymous callers also share 30 a minute per IP.
Parameters
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
ticker | string | yes | The venue ticker (Kalshi) or pm_<id> (Polymarket). Case-insensitive. |
Request
curl "https://api.langbot.ai/v1/public/markets/SENATETX-26-R"from langbot import LangbotClient
async with LangbotClient() as lb:
m = await lb.public_market("SENATETX-26-R")
print(m["status"], m["price"], m["series"]["source"], len(m["series"]["points"]))import { LangbotClient } from "@langbotai/sdk";
const lb = new LangbotClient();
const m = await lb.publicMarket("SENATETX-26-R");
console.log(m.status, m.price);Response
200 OK
{
"ts": 1793685853318,
"ticker": "SENATETX-26-R",
"venue": "kalshi",
"event_id": null,
"title": "Will Republicans win the Senate race in Texas?",
"subtitle": "Ken Paxton",
"status": "open",
"result": null,
"category": "elections",
"category_slug": "elections",
"close_ts": 1825254000000,
"open_ts": 1733238000000,
"volume": 47349153.8,
"price": 0.27,
"price_source": "mid",
"volume_source": "candles",
"rules_text": "If a representative of the Republican party is sworn in as a Senator of Texas for the term beginning in 2027, then the market resolves to Yes.\n\nThis market i…",
"rules_primary": "If a representative of the Republican party is sworn in as a Senator of Texas for the term beginning in 2027, then the market resolves to Yes.",
"rules_secondary": "This market is eligible for accelerated determination after a consensus of media organizations project the winner. See full rules for details.",
"rules_source": "venue",
"venue_url": "https://kalshi.com/markets/senatetx",
"phrases": [],
"outcome": null,
"quote": {"yes_bid": 0.26, "yes_ask": 0.28, "ts": 1793685848313, "source": "orderbook"},
"series": {
"source": "candles",
"period_s": 3600,
"points": [[1778061600000, 0.56], [1778126400000, 0.58]],
"max_points": 1000,
"extended": "orderbook_mid",
"settlement": null,
"price_source": null
},
"change_24h": {"from_ts": 1793505600000, "from": 0.32, "to_ts": 1793685848313, "to": 0.27, "delta": -0.05},
"moves": [
{
"from_ts": 1779210000000,
"to_ts": 1779310800000,
"from": 0.49,
"to": 0.56,
"delta": 0.07,
"facts": []
},
{
"from_ts": 1779393600000,
"to_ts": 1779552000000,
"from": 0.54,
"to": 0.6,
"delta": 0.06,
"facts": []
}
],
"hits": [],
"texts": [],
"facts_delay_ms": 60000,
"sim": {"event_id": null, "has_books": true},
"related": [],
"consolidated": null
}A real response from the API; long lists are cut to their first items.
series.points is the price history as [ms epoch, YES price] pairs (up to 1,000), and series.source names where the prices come from: the venue's candles or trades, the order book Langbot recorded (orderbook_mid), or on-chain trades for Polymarket. moves are the largest moves with the facts heard around them (timing, never cause). sim.has_books says whether the simulator can replay the event behind it.
Errors
| Status | code | When |
|---|---|---|
| 404 | not_found | No market with that ticker. |
| 401 | token_invalid | A token was sent and not recognised. Send a valid one, or none to call anonymously. |
| 422 | validation_error | A parameter failed validation; detail[].loc names it. |
| 429 | rate_limited | Over your request budget; wait Retry-After seconds. |
Every error body is {"detail": …, "code": "…"}; branch on code. All codes: Errors.