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 id | Method and path |
|---|---|
predictions_list_topics | GET /v1/predictions/topics |
predictions_get_topic | GET /v1/predictions/topics/{topic_id} |
predictions_list_events | GET /v1/predictions/events |
predictions_get_scalar | GET /v1/predictions/scalar/{event_id} |
predictions_get_extreme | GET /v1/predictions/extreme/{event_id} |
predictions_get_timing | GET /v1/predictions/timing/{event_id} |
predictions_get_binary | GET /v1/predictions/binary/{event_id} |
predictions_get_scalar_history | GET /v1/predictions/scalar/{event_id}/history |
predictions_get_extreme_history | GET /v1/predictions/extreme/{event_id}/history |
predictions_get_timing_history | GET /v1/predictions/timing/{event_id}/history |
predictions_get_binary_history | GET /v1/predictions/binary/{event_id}/history |
predictions_get_policy_path | GET /v1/predictions/policy-paths/{authority} |
predictions_get_policy_path_history | GET /v1/predictions/policy-paths/{authority}/history |
predictions_stream_ticket_create | POST /v1/predictions/stream-ticket |
| WebSocket | /v1/predictions/stream |
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.
| Parameter | Rule |
|---|---|
group | Optional on the topic list: central_banks, us_prices, us_jobs, us_activity, global_activity, global_prices, metals, or energy. |
topic, shape, status, release_id | Optional filters on the event list. |
from, to | Optional UTC time filters on the event list. |
limit, cursor | Optional 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.
| Field | Contents |
|---|---|
event_id, topic_id, shape, question | The event id, topic id, market shape, and question. |
status | upcoming, trading, closed, settled, or void. |
closes_at, resolves_at, as_of | Closing, resolution, and capture times. |
release_id | A public calendar release id or null. |
resolution | description and resolves_with, a Narwhal API path such as /v1/economics/USA/cpi. |
unit, venues | The event unit and venue market records described below. |
quality | monotone_repairs, rows_merged, and freshness: live, stale, or no_live_quotes. |
body | The 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.
{
"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).
{
"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.
{
"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.
{
"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.
{
"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.
| Parameter | Rule |
|---|---|
interval | 1m, 5m, 1h (default), or 1d. |
start, end | UTC 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.
{
"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 field | Contents |
|---|---|
venue, role, venue_event_id | Venue id, blending role, and venue event id. |
url, rules_url, rules_text, settlement_source | The market link, rules link and text, and settlement source. |
weight, depth_usd, volume_24h_usd, open_interest_usd, fetched_at | Weight, depth, volume, open interest, and fetch time. |
match | differences and note. |
excluded_reason | For the current minute: stale (no quote in 3 minutes), thin (depth below the topic minimum), or a differences value below. |
settlement | status only: pending, settled, void, or disputed. Never a winning outcome. |
| Difference | Treatment |
|---|---|
outcome_set | Rows do not line up one to one. Blend on the shared rows; exclude if fewer than 3 remain. |
timing | Resolves at a different moment; excluded. |
source | Settles on a different source; excluded. |
rules | Uses 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:
{"action":"subscribe","topics":["usa-fed"],"event_ids":[]}| Message | Contents or cadence |
|---|---|
subscribed | The matched event ids. |
snapshot | The full event. |
update | The full event on change, at most once a minute per event. |
status | A status message. |
heartbeat | Every 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.
Docs