Browse all documentation

Predictions API reference

Read prediction probabilities by topic and event, with history, venue details, and streaming updates.

Narwhal returns probabilities only: no official figures and no prices of its own. See the Predictions product page for an overview.

Endpoints

The base URL is https://api.narwhalapi.com. Send Authorization: Bearer $NARWHAL_API_KEY. Each MCP tool name matches its operation id.

Operation idMethod and path
predictions_list_topicsGET /v1/predictions/topics
predictions_get_topicGET /v1/predictions/topics/{topic_id}
predictions_list_eventsGET /v1/predictions/events
predictions_get_scalarGET /v1/predictions/scalar/{event_id}
predictions_get_extremeGET /v1/predictions/extreme/{event_id}
predictions_get_timingGET /v1/predictions/timing/{event_id}
predictions_get_binaryGET /v1/predictions/binary/{event_id}
predictions_get_scalar_historyGET /v1/predictions/scalar/{event_id}/history
predictions_get_extreme_historyGET /v1/predictions/extreme/{event_id}/history
predictions_get_timing_historyGET /v1/predictions/timing/{event_id}/history
predictions_get_binary_historyGET /v1/predictions/binary/{event_id}/history
predictions_get_policy_pathGET /v1/predictions/policy-paths/{authority}
predictions_get_policy_path_historyGET /v1/predictions/policy-paths/{authority}/history
predictions_stream_ticket_createPOST /v1/predictions/stream-ticket
WebSocket/v1/predictions/stream
Example request
curl --request GET \
  --url "https://api.narwhalapi.com/v1/predictions/scalar/usa-cpi-yoy-2026-09" \
  --header "Authorization: Bearer $NARWHAL_API_KEY"

Decimals are strings. Probabilities use four decimal places, such as "0.8250". Times are UTC with Z.

Topics and events

List topics, then request a topic by topic_id to read the topic and its events. Topic ids include usa-cpi-yoy, usa-fed, and xau-monthly-extreme.

ParameterRule
groupOptional on the topic list: central_banks, us_prices, us_jobs, us_activity, global_activity, global_prices, metals, or energy.
topic, shape, status, release_idOptional filters on the event list.
from, toOptional UTC time filters on the event list.
limit, cursorOptional on the event list. limit is 1–100, default 50.

Topic fields

A topic has topic_id, group, title, shape, unit, venues, resolution_kind, calendar, and next_event_id.

venues lists venue ids such as ["kalshi","polymarket"]. resolution_kind is release, price_fix, price_window, or occurrence. calendar contains country, family, and variant, or is null.

Event fields

Every event shape uses these fields. The body depends on the shape.

FieldContents
event_id, topic_id, shape, questionThe event id, topic id, market shape, and question.
statusupcoming, trading, closed, settled, or void.
closes_at, resolves_at, as_ofClosing, resolution, and capture times.
release_idA public calendar release id or null.
resolutiondescription and resolves_with, a Narwhal API path such as /v1/economics/USA/cpi.
unit, venuesThe event unit and venue market records described below.
qualitymonotone_repairs, rows_merged, and freshness: live, stale, or no_live_quotes.
bodyThe scalar, extreme, timing, or binary body.

Odds by market shape

Request the event through its shape path. Scalar, extreme, timing, and binary requests accept an optional at for a past captured minute in UTC.

The following bodies are illustrative. Values are made up.

Scalar

scale accompanies outcomes. Each outcome has key, label, lower, upper, probability, and quotes. The summary contains median, p10, p90, method set to bucket_upper, and bounds.

Illustrative scalar body
{
  "scale": 1,
  "outcomes": [
    {"key": "le_3.0", "label": "3.0% or lower", "lower": null, "upper": "3.0",
     "probability": "0.8250", "quotes": [
       {"venue": "kalshi", "role": "blended", "probability": "0.8250",
        "market_ids": ["KXCPIYOY-26SEP-T3.0"]}
     ]},
    {"key": "3.0_3.2", "label": "Above 3.0% through 3.2%", "lower": "3.0", "upper": "3.2",
     "probability": "0.1500", "quotes": []},
    {"key": "gt_3.2", "label": "Above 3.2%", "lower": "3.2", "upper": null,
     "probability": "0.0250", "quotes": []}
  ],
  "summary": {"median": "3.0", "p10": "3.0", "p90": "3.2", "method": "bucket_upper", "bounds": {}}
}

Extreme

A price window has start and end. Its high and low probabilities appear in up and down rows with key, level, probability, and quotes. observation is any_trade, close, or any_release (any official figure published in the window).

Illustrative extreme body
{
  "window": {"start": "2026-10-01T00:00:00Z", "end": "2026-11-01T00:00:00Z"},
  "observation": "any_trade",
  "up": [{"key": "up:4200", "level": "4200", "probability": "0.3500", "quotes": []}],
  "down": [{"key": "down:3600", "level": "3600", "probability": "0.2000", "quotes": []}]
}

Timing

Each step gives the chance that something has happened by by. Steps have key, by, kind (meeting for a decision meeting, date for the end of that day), label, probability, and quotes. The body also includes not_within_window.

Illustrative timing body
{
  "steps": [
    {"key": "2026-10-28", "by": "2026-10-28T18:00:00Z", "kind": "meeting", "label": "28 Oct 2026 meeting",
     "probability": "0.6000", "quotes": []}
  ],
  "not_within_window": "0.4000"
}

Binary

The body contains labels with yes and no, a deadline, probability, and quotes.

Illustrative binary body
{
  "labels": {"yes": "Yes", "no": "No"},
  "deadline": "2026-12-31T23:59:00Z",
  "probability": "0.8250",
  "quotes": []
}

Policy path

Request authority as federal-reserve, european-central-bank, bank-of-england, bank-of-japan, bank-of-canada, reserve-bank-of-australia, or bank-indonesia.

The response contains authority, unit set to bps, as_of, method, and meetings. It returns changes only, never the current rate.

Illustrative policy path response
{
  "authority": "federal-reserve",
  "unit": "bps",
  "as_of": "2026-10-08T12:00:00Z",
  "method": "Probability-weighted decision rows; cut 50+ and hike 50+ count as 50 bps; meetings add up.",
  "meetings": [
    {"event_id": "usa-fed-2026-10-28", "resolves_at": "2026-10-28T18:00:00Z",
     "p_cut": "0.6000", "p_hold": "0.4000", "p_hike": "0.0000",
     "expected_change_bps": "-15.00", "cumulative_change_bps": "-15.00"}
  ]
}

History

Use /v1/predictions/{shape}/{event_id}/history for scalar, extreme, timing, and binary events.

ParameterRule
interval1m, 5m, 1h (default), or 1d.
start, endUTC times. The window is at most 2 days for 1m, 7 days for 5m, 92 days for 1h, or 3,660 days for 1d.

The response contains event_id, interval, and series. Each series has key, active_from, active_to, and bars. Bars contain start, end, open, high, low, and close. They record closing probabilities per interval.

Illustrative history response, one series shown
{
  "event_id": "usa-cpi-yoy-2026-09",
  "interval": "1h",
  "series": [
    {"key": "le_3.0", "active_from": "2026-10-01T00:00:00Z", "active_to": null,
     "bars": [
       {"start": "2026-10-08T11:00:00Z", "end": "2026-10-08T12:00:00Z",
        "open": "0.8000", "high": "0.8400", "low": "0.7900", "close": "0.8250"}
     ]}
  ]
}

Policy path history is available at /v1/predictions/policy-paths/{authority}/history.

Venues and blending

Kalshi and Polymarket venue markets appear in venues, one record per venue market found for the question. A blended role means the market is in the numbers. An excluded role means it is shown for reference.

Each quotes entry contains venue, role (blended or excluded), probability, and market_ids.

Venue fieldContents
venue, role, venue_event_idVenue id, blending role, and venue event id.
url, rules_url, rules_text, settlement_sourceThe market link, rules link and text, and settlement source.
weight, depth_usd, volume_24h_usd, open_interest_usd, fetched_atWeight, depth, volume, open interest, and fetch time.
matchdifferences and note.
excluded_reasonFor the current minute: stale (no quote in 3 minutes), thin (depth below the topic minimum), or a differences value below.
settlementstatus only: pending, settled, void, or disputed. Never a winning outcome.
DifferenceTreatment
outcome_setRows do not line up one to one. Blend on the shared rows; exclude if fewer than 3 remain.
timingResolves at a different moment; excluded.
sourceSettles on a different source; excluded.
rulesUses a different condition; excluded.

Freshness and plans

Every venue is read every 60 seconds. REST returns the latest minute with as_of. Use at to read any captured minute, subject to the plan delay.

Free sees everything 15 minutes delayed, including latest views, history ends, and policy paths. An at newer than that cutoff returns 403 plan_upgrade_required. Basic and Pro are live.

The stream and prediction webhooks are available on Basic and Pro only. See the Webhooks API reference for prediction webhooks.

Stream

Send POST /v1/predictions/stream-ticket to get a short-lived ticket. Connect to /v1/predictions/stream, then send a subscription:

Subscription message
{"action":"subscribe","topics":["usa-fed"],"event_ids":[]}
MessageContents or cadence
subscribedThe matched event ids.
snapshotThe full event.
updateThe full event on change, at most once a minute per event.
statusA status message.
heartbeatEvery 30 seconds.

A connection supports up to 200 events. Reconnecting gives fresh snapshots with no replay.

Errors

Errors use NarwhalProblem: 400 invalid_query, 403 plan_upgrade_required, or 404 event_not_found.

Requesting an event under the wrong shape returns 404 event_not_found. The detail gives the right path.