Skip to content

Prediction Markets Events API

Retrieve Octagon's analyzed prediction market events over REST. The Events API exposes two endpoints:

  • List events — the latest snapshot of every analyzed event, including model/market probabilities, confidence scores, analysis summaries, and per-market outcome breakdowns.
  • Event history — the historical snapshots for a single event by ticker, for time-series analysis and backtesting.

Like the Chat Completions and Responses endpoints, these are direct REST endpoints called relative to the Octagon API base URL:

text
https://api.octagonai.co/v1

List Events

GET /predictions/events

Returns the latest snapshot of every analyzed prediction market event tracked by Octagon, ordered by most recently captured first.

Query Parameters

ParameterTypeRequiredDescription
limitintegerNoNumber of records to return. Default 10; minimum 1; maximum 200.
cursorstringNoCursor for pagination. Use the cursor returned from a previous response to continue.
has_historybooleanNoWhen true, only return events that have multiple historical snapshots available for time-series use.
includestringNoComma-separated list of optional per-row field groups. Supported: eligibility (see below).

Response Fields

Each event in the data array includes:

FieldTypeDescription
history_idintegerUnique identifier for this snapshot.
run_idstring (UUID)The export run that produced this snapshot.
captured_atstring (ISO 8601)When this snapshot was captured.
event_tickerstringTicker identifier for the event.
namestringHuman-readable event name.
slugstringURL-friendly slug.
image_urlstringEvent image URL.
series_categorystringCategory (e.g., "Politics", "Crypto", "Economics").
available_on_brokersbooleanWhether the event is available on supported brokers.
mutually_exclusivebooleanWhether the event's outcomes are mutually exclusive.
analysis_last_updatedstring (ISO 8601)When the analysis was last refreshed.
confidence_scorefloatOctagon's confidence in the model output (0–10 scale).
model_probabilityfloatOctagon model probability for the event's primary/most-liquid market (0–100 percentage scale). See outcome_probabilities for the full per-market breakdown.
market_probabilityfloatMarket-implied probability for the event's primary/most-liquid market (0–100 percentage scale). See outcome_probabilities for the full per-market breakdown.
edge_ppfloatModel edge in percentage points (model_probability - market_probability). See Interpreting the model probability.
expected_returnfloatExpected return if the model is correct.
r_scorefloatRisk-adjusted score.
total_volumefloatTotal trading volume.
total_open_interestfloatTotal open interest.
close_timestringWhen the event closes.
key_takeawaystringOne-line summary of the model's view.
current_state_summary_richtextstringRich-text summary of the current state.
short_answer_richtextstringRich-text short answer.
executive_summary_richtextstringRich-text executive summary.
outcome_probabilitiesarrayPer-market outcome breakdown (see below). null if unavailable.
has_historybooleanWhether this event has multiple historical snapshots for time-series analysis.
researchobjectThe catalyst and evidence layer, grouped (see below). Regroups content that also remains in its original fields — additive, nothing is removed or renamed. Absent on responses that carry no analysis.

The response envelope also includes next_cursor and has_more for pagination.

Eligibility fields

Present only when include=eligibility is set:

FieldTypeDescription
eligibleboolean | nullWhether a fresh report can be generated for this event.
eligibility_statusstring | nullMarket state on the marketplace: open, paused, unopened, closed, settled, or unknown.
eligibility_reasonstring | nullHuman-readable explanation for the eligible value.

Generate fresh reports with the Reports API.

Event History

GET /predictions/events/{event_ticker}/history

Returns historical snapshots for a single prediction market event by its ticker, newest first.

Finding the event ticker in a Kalshi URL. A Kalshi event URL has the form /markets/<series-ticker>/<event-slug>/<event-ticker>. In https://kalshi.com/markets/kxfeddecision/fed-meeting/kxfeddecision-26jun, the event ticker is KXFEDDECISION-26JUN. Market deeplinks end in a market ticker instead, which is the event ticker plus an outcome suffix: strip the suffix to get the event ticker (kxoaianth-40-oaiKXOAIANTH-40).

Query Parameters

ParameterTypeRequiredDescription
limitintegerNoNumber of records to return. Default 50; minimum 1; maximum 200.
cursorstringNoCursor for pagination. Use the cursor returned from a previous response to continue.
captured_fromdatetime (ISO 8601)NoStart timestamp filter (inclusive) for snapshot capture time.
captured_todatetime (ISO 8601)NoEnd timestamp filter (inclusive) for snapshot capture time.
includestringNoSet to analysis to include the analysis fields in the response.
daysintegerNoExclude snapshots where close_time is before now minus this many days. Snapshots with no close_time are always included. Minimum 1.
exclude_empty_modelbooleanNoWhen true, exclude snapshots where model_probability is null (incomplete analysis). Default true.

Response Fields

Each snapshot in the data array includes:

FieldTypeDescription
history_idintegerUnique identifier for this snapshot.
run_idstring (UUID)The export run that produced this snapshot.
captured_atstring (ISO 8601)When this snapshot was captured.
event_tickerstringTicker identifier for the event.
namestringHuman-readable event name.
slugstringURL-friendly slug.
series_categorystringCategory (e.g., "Politics", "Crypto", "Economics").
close_timestringWhen the event closes.
confidence_scorefloatOctagon's confidence in the model output (0–10 scale).
model_probabilityfloatOctagon model probability for the event (0–100 percentage scale).
market_probabilityfloatCurrent market-implied probability (0–100 percentage scale).
edge_ppfloatModel edge in percentage points (model_probability - market_probability). See Interpreting the model probability.
expected_returnfloatExpected return if the model is correct.
r_scorefloatRisk-adjusted score.
total_volumefloatTotal trading volume.
total_open_interestfloatTotal open interest.
outcome_probabilitiesarrayPer-market outcome breakdown (see below). null if unavailable.

When include=analysis is set, these additional fields are included:

FieldTypeDescription
key_takeawaystringOne-line summary of the model's view.
current_state_summary_richtextstringRich-text summary of the current state.
short_answer_richtextstringRich-text short answer.
executive_summary_richtextstringRich-text executive summary.

The response envelope also includes the requested event_ticker, plus next_cursor and has_more for pagination.

research object

The catalyst and evidence behind a report are spread across roughly 28 separate response fields — chart_anomalies_json, what_could_change_*, twenty q1..q5_* fields, and current_state_* — with nothing naming them as a set. research groups exactly that content under one key so a consumer can take the research layer without knowing which prefixes compose it.

This is additive. Every existing field keeps its name, type and meaning; research quotes them rather than replacing them, and is absent on responses that carry no analysis. Treat it as an optional field: read it if you want the grouped view, ignore it otherwise. Clients that validate against a strict schema (additionalProperties: false) will need the new key added to theirs — that is the one case where a change is required.

FieldTypeDescription
catalysts.observedarrayPrice moves the pipeline attributed to a cause. One entry per detected move.
catalysts.forwardobject | nullForward-looking catalysts (subtitle, narrative, sources).
evidencearrayResearch findings as a list, one entry per populated slot — up to five, not always five (slot, question, findings, table, sources).
current_stateobject | nullPresent-state summary (summary, sources).
sourcesarrayDeduped roll-up of every citation in the block, in first-appearance order.

catalysts.observed items

FieldTypeDescription
datestringISO date of the move.
date_readablestringSame date, formatted for display.
directionstringspike or drop.
change_pctfloatSize of the move in percentage points.
price_beforefloatContract price before the move (0–100 scale).
price_afterfloatContract price after the move.
market_tickerstringThe market that moved.
outcome_namestringHuman-readable outcome that moved.
descriptionstringOne-line summary of the move.
narrativestring | nullRendered HTML explaining the move, with inline citations.
sourcesarrayCitations supporting this specific move.

catalysts.forward object

Forward-looking catalysts — what could still move the outcome. null when the report carries none.

FieldTypeDescription
subtitlestring | nullSection heading as generated, e.g. "Key Catalysts".
narrativestringRendered HTML describing the catalysts, with inline citations.
sourcesarrayCitations supporting this section (see sources items below).

evidence items

One entry per research question the report answers. This groups the flat q1..q5_* fields rather than replacing them — those fields remain in the response unchanged, and slot says which one each entry came from.

FieldTypeDescription
slotstringWhich slot the finding came from: q1q5.
questionstring | nullThe research question.
findingsstring | nullRendered HTML answering it, with inline citations.
tablestring | nullSupporting table as rendered HTML, when the finding has one.
sourcesarrayCitations supporting this finding.

Entries appear only for slots the report populated, so the array may hold fewer than five.

current_state object

Present-state summary for the event. null when the report carries none.

FieldTypeDescription
summarystringRendered HTML describing the current state, with inline citations.
sourcesarrayCitations supporting the summary.

sources items

Citations are carried inline in the prose as anchors, which renders well and parses badly. Each entry lifts one out:

FieldTypeDescription
urlstringAn absolute http(s) URL. Relative paths, bare hosts, fragments, protocol-relative links and non-http schemes are dropped rather than returned. Absolute form is a syntax guarantee, not an availability one — a source may still 404 or move.
titlestring | nullSource title as cited.
lanesarrayWhich retrieval lanes surfaced it (e.g. traditional, curated).

outcome_probabilities items

Each item in the outcome_probabilities array represents one market/outcome within the event:

FieldTypeDescription
market_tickerstringTicker for this specific market/outcome.
outcome_namestringHuman-readable name for the outcome.
model_probabilityfloatOctagon model probability for this outcome (0–100 percentage scale).
model_probability_sourcestringProvenance of model_probability — see Interpreting the model probability. null on rows written before this field existed.
evidence_gradestringEvidence quality behind model_probability (AD), which bounds how far it may deviate from the market-derived anchor. null when unavailable.
market_probabilityfloatMarket-implied probability for this outcome (0–100 percentage scale).

Interpreting the model probability

model_probability is market-anchored: it starts from the contract's own market price and is adjusted for the research evidence on that outcome. It is a calibrated read on the price, not a second estimate derived independently of it — treat it as correlated with market_probability rather than as an independent opinion.

For a second opinion to weigh against your own model, use rows where model_probability_source is recalibrated and evidence_grade is A or B. Those are the rows where research evidence moved the value furthest from the market-derived anchor. Other combinations track the market price closely by construction.

ladder_model answers a narrower question. Its fitted parameters come from the ladder's own prices, so a rung is independent of its own quote but not of the market as a whole. Use it to compare rungs within a ladder — relative levels and ordering — rather than as an independent read on whether the ladder is priced correctly. The two fields:

model_probability_sourceMeaning
ladder_modelA threshold ladder priced from barrier-touch geometry. The value follows from the contract's own threshold, not its own quote — see Ladder-priced rows.
recalibratedResearch evidence moved the value away from the market-derived anchor.
market_baselineThe market price re-expressed. Carries no signal beyond the price.
unmodeled / out_of_scopeNot modelled; do not read as a forecast.
determinedThe market has settled; the outcome is known.

evidence_grade bounds the maximum deviation from the anchor, so a low grade means the value is close to the market price by construction regardless of what the research said:

GradeMaximum deviation from anchor
A±20pp
B±12pp
C±7pp
D±3pp

Ladder-priced rows

On a threshold ladder — a set of contracts on the same underlying at different levels ("above $95,000", "above $120,000") — rows marked ladder_model are derived differently from every other source. One spot and one volatility are fitted to the ladder as a whole, and each rung's probability is then the first-passage probability of reaching its own threshold under that single view.

Two consequences that matter when you consume these:

  • Two rungs quoted at the same price receive different probabilities, because the value follows from the threshold rather than from the quote. Contrast market_baseline, where equal prices give equal model probabilities by construction. (recalibrated rows may differ at equal prices when their evidence differs, but nothing guarantees it — only ladder_model separates them structurally.)
  • Ordering is guaranteed. P(above $95k) >= P(above $120k) holds as an identity, not as a best effort, so you can rely on monotonicity across a ladder without re-sorting.

One limit, stated plainly: the fitted spot and volatility come from the ladder's own prices. A rung's value is independent of its own quote, but the ladder's overall level is still market-derived, so this will not tell you that an entire ladder is mispriced. Rows fall back to recalibrated or market_baseline whenever the fit does not describe the book.

Use Cases

  • Discover all events currently tracked and analyzed by Octagon, or build a catalog/dashboard of active events.
  • Monitor the latest model probabilities, confidence scores, and analysis across all events.
  • Filter to events with historical data (has_history=true), then drill into each event's time-series via the history endpoint.
  • Build time-series views of model vs. market probability for a specific event ticker.
  • Backtest signal quality (for example, edge_pp and expected_return) across historical snapshots.
  • Backtest multi-outcome events using outcome_probabilities per snapshot.
  • Track how confidence and liquidity metrics evolve as an event approaches resolution.

Notes

  • On Event History, prefer bounded time windows (captured_from and captured_to) for predictable page sizes.
  • Probability and score scales follow the Kalshi Search API conventions.