Skip to content

Prediction Markets Reports API

Retrieve Octagon's research reports for prediction markets directly over REST — list the report versions available for an event, pull the markdown for one of them, check the status of a generation run, or trigger fresh report generation without going through the Prediction Markets Agent.

The report body is the same markdown research memo the agent produces.

Field style, timestamps, and probability scales follow the Conventions. Base URL:

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

Endpoints

Each marketplace has its own endpoints, addressed by that marketplace's native event key.

MethodPathDescriptionCredits
GET/predictions/reports/kalshi/{event_ticker}Report versions for a Kalshi eventFree
GET/predictions/reports/polymarket/{event_slug}Report versions for a Polymarket eventFree
GET/predictions/reports/status/{run_id}Status of a generation run (no report body)Free
POST/predictions/reports/kalshi/{event_ticker}Generate a fresh Kalshi report (asynchronous)3
POST/predictions/reports/polymarket/{event_slug}Generate a fresh Polymarket report (asynchronous)3

Credits per call are listed above. See the Prediction Markets Agent for plan eligibility.

Event Keys

EndpointsKeyExample
/reports/kalshi/…Event tickerKXBTC-25DEC31
/reports/polymarket/…Event slugfed-decision-in-september

Address markets by event key. The Prediction Markets Agent also accepts market URLs.

Retrieve Report Versions

text
GET /predictions/reports/kalshi/{event_ticker}
GET /predictions/reports/polymarket/{event_slug}

Returns the report version snapshots for the event, newest first — up to the 6 most recent. The version list is always returned; the markdown body is opt-in via the version query parameter.

Query Parameters

ParameterTypeRequiredDescription
versionstringNolatest for the newest version, or a run_id to pin an exact version. Include it to get markdown_report.

Response Fields

FieldTypeDescription
event_tickerstringThe resolved event key.
venuestringkalshi or polymarket, matching the endpoint called.
requested_urlstring | nullThe resolved market URL on the marketplace.
versionsarrayReport version snapshots, newest first (up to 6). Empty when nothing has been generated yet.
markdown_reportstring | nullThe full report as markdown. Populated only when version is supplied and resolves to a version.
run_idstring | nullThe run that markdown_report corresponds to; null when no body was requested.

Each entry in versions is a lightweight snapshot of the report at that run:

FieldTypeDescription
run_idstring (UUID)The run that produced this version. Pass it back as ?version=.
event_tickerstringThe event key for the snapshot.
namestringHuman-readable event name.
captured_atstringWhen the snapshot was captured.
analysis_last_updatedstringWhen the underlying analysis was last refreshed.
market_probabilityfloatMarket-implied probability.
model_probabilityfloatOctagon model probability.
confidence_scorefloatOctagon's confidence in the model output.
total_volumefloatTotal trading volume at capture time.
key_takeawaystringOne-line summary of the analysis.
outcome_probabilitiesarray | nullPer-market probability breakdown for the event.

Status Codes

StatusMeaning
200The event key resolved. versions may be empty when nothing has been generated for it yet.
400Malformed event key, or an unknown query parameter (invalid_value).
404The event key matches nothing (not_found), or ?version=<run_id> is not one of the event's versions.

Check a Run's Status

GET /predictions/reports/status/{run_id}

Returns the status of a generation run. Poll it after triggering fresh generation. When status is "completed", fetch the markdown from the marketplace endpoint using the returned venue and event_ticker, with ?version=latest or ?version=<run_id>.

ParameterTypeRequiredDescription
run_idstring (UUID)YesThe run ID returned by a POST to /reports.

Response Fields

FieldTypeDescription
run_idstring (UUID)The requested run.
statusstring"processing", "completed", or "failed".
venuestringkalshi or polymarket — which marketplace endpoint to fetch from.
event_tickerstring | nullThe resolved event key for the run.
requested_urlstring | nullThe resolved market URL for the run.

A known run always returns 200 — poll until status leaves "processing". A "failed" run means generation did not complete. 404 (not_found) means the run_id is unknown.

TIP

If you only need the report body as soon as it's ready, you can skip this endpoint and poll the marketplace endpoint with ?version=latest directly — markdown_report stays null until the new version lands.

Generate a Fresh Report

text
POST /predictions/reports/kalshi/{event_ticker}
POST /predictions/reports/polymarket/{event_slug}

Triggers fresh report generation for a market. There is no request body — the market is identified entirely by the path. Generation is asynchronous. The request returns 202 Accepted immediately with a run_id.

Response Fields (202 Accepted)

FieldTypeDescription
run_idstring (UUID)The generation run. Poll GET /predictions/reports/status/{run_id} with it.
statusstringAlways "processing" on acceptance.
event_tickerstringThe resolved event key.
venuestringkalshi or polymarket, matching the endpoint called.

The 3-credit charge is applied when the 202 is returned. If generation subsequently fails, the credits are automatically refunded.

Requirements

  • Market status: the market must be open on the marketplace.

Errors

StatusCodeMeaning
400invalid_valueMalformed event key.
400kalshi_url_requiredNo event matches the key.
400kalshi_reference_ambiguousThe key matches multiple events.
401no_subscriptionNo active subscription on the API key.
403insufficient_planFresh generation requires a Plus, Pro, or Enterprise plan.
404kalshi_market_not_foundThe market could not be found on the marketplace.
409kalshi_market_not_openThe market is not open on the marketplace (expired).
429insufficient_creditsNot enough credits for the 3-credit charge.
503service_unavailableThe generation service could not be reached.

Errors use the envelope {"error": {"message", "type", "param", "code"}}.

Notes

  • Poll every 30–60 seconds; fresh generation typically takes several minutes.
  • The run_id returned by a POST is the single join key: use it to check run status, to pin a version on retrieval (?version=<run_id>), and to reconcile the credit charge.