/api/v1/markets/{slug}/forecast
Q's forecast for a market
Paid forecast-only read for a known market. Omit as_of for the latest committed forecast, or supply an inclusive historical cutoff. Each forecast carries stored market_odds_at_forecast. Response-time market_odds exactly matches venue_quote.selected_probability: Polymarket International and Kalshi use a verified live quote or null; other venues label graph snapshots stale. The path accepts a slug, nativeMarketId, or marketKey within the selected venue.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| slug | path, required | string | Market slug, nativeMarketId, or marketKey |
| venue | query | "polymarket" | "polymarket_us" | "kalshi" | "limitless" | Optional prediction-market venue filter. Omit it on catalog/feed routes to include every covered venue. On legacy slug or condition-ID lookups, omission retains the Polymarket namespace; prefer marketKey for collision-safe cross-venue lookup. |
| as_of | query | string | Optional inclusive historical cutoff. Accepts YYYY-MM-DD (expanded to 23:59:59.999 UTC that day) or an RFC 3339 date-time with Z or an explicit offset. Omit for the current view. |
| history | query | integer | Number of prior forecasts to include for intraforecast diffing (0-10) Default: 0; Minimum: 0; Maximum: 10 |
Responses
200: The market's latest forecast at or before the stated cutoff
| Field | Type | Description | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| as_of required | string | Inclusive forecast-selection cutoff. Format: date-time | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| historical required | boolean | True when the caller supplied as_of. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| market required | CanonicalMarketWithRelationships | market fields
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| market_slug required | string | null | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| question required | string | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| market_odds required | number | null | Source-venue YES probability (0-1), exactly matching venue_quote.selected_probability. Polymarket International and Kalshi use a verified live quote or null. Polymarket US and Limitless currently expose a graph snapshot marked quote_method=graph_snapshot and freshness=stale. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| venue_quote required | VenueQuoteV1 | venue_quote fields
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| end_date | string | null | Format: date-time | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| forecast_status | object | null | The market's status against the latest forecast, priced from market_odds and venue_quote; dual-anchored at the newest live signal's entry when one exists. Null on historical (as_of) reads.forecast_status fields
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| quotientUrl | string | null | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| polymarketUrl | string | null | Legacy Polymarket navigation alias. Populated only for Polymarket International rows and null for Polymarket US, Kalshi, and Limitless; use marketUrl for venue-neutral navigation. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| forecast required | ForecastRead | forecast fields
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| history required | ForecastRead[] | Prior forecasts, newest first (per the history param)history fields
|
401: Unauthorized
| Field | Type | Description |
|---|---|---|
| error required | string | Error code |
| message required | string | Human-readable message |
| retry_after | integer | Seconds to wait (only on 429) |
| retryAfter | integer | Seconds to wait for owner-scoped forecast-request quota errors. |
| limit_scope | string | Quota scope that rejected the request, such as standard or x_research. |
| quotaScope | string | Stable forecast-request quota scope, such as venue_market_daily. |
| limit | integer | Configured bound for the forecast-request quota that was exceeded. |
402: Payment Required
| Field | Type | Description |
|---|---|---|
| error required | string | Error code |
| message required | string | Human-readable message |
| retry_after | integer | Seconds to wait (only on 429) |
| retryAfter | integer | Seconds to wait for owner-scoped forecast-request quota errors. |
| limit_scope | string | Quota scope that rejected the request, such as standard or x_research. |
| quotaScope | string | Stable forecast-request quota scope, such as venue_market_daily. |
| limit | integer | Configured bound for the forecast-request quota that was exceeded. |
403: Insufficient credits for the requested route
| Field | Type | Description |
|---|---|---|
| error required | string | Error code |
| message required | string | Human-readable message |
| retry_after | integer | Seconds to wait (only on 429) |
| retryAfter | integer | Seconds to wait for owner-scoped forecast-request quota errors. |
| limit_scope | string | Quota scope that rejected the request, such as standard or x_research. |
| quotaScope | string | Stable forecast-request quota scope, such as venue_market_daily. |
| limit | integer | Configured bound for the forecast-request quota that was exceeded. |
404: Unknown market, no stored forecast, or no committed forecast at/before as_of; no x402 settlement and API-key debit is refunded
| Field | Type | Description |
|---|---|---|
| error required | string | Error code |
| message required | string | Human-readable message |
| retry_after | integer | Seconds to wait (only on 429) |
| retryAfter | integer | Seconds to wait for owner-scoped forecast-request quota errors. |
| limit_scope | string | Quota scope that rejected the request, such as standard or x_research. |
| quotaScope | string | Stable forecast-request quota scope, such as venue_market_daily. |
| limit | integer | Configured bound for the forecast-request quota that was exceeded. |
422: Invalid request parameters
| Field | Type | Description |
|---|---|---|
| error required | string | Error code |
| message required | string | Human-readable message |
| retry_after | integer | Seconds to wait (only on 429) |
| retryAfter | integer | Seconds to wait for owner-scoped forecast-request quota errors. |
| limit_scope | string | Quota scope that rejected the request, such as standard or x_research. |
| quotaScope | string | Stable forecast-request quota scope, such as venue_market_daily. |
| limit | integer | Configured bound for the forecast-request quota that was exceeded. |
429: The caller exceeded a per-second, per-minute, daily, or concurrency limit. No credits are debited and no x402 payment is settled for this response.
| Field | Type | Description |
|---|---|---|
| error required | string | Error code |
| message required | string | Human-readable message |
| retry_after | integer | Seconds to wait (only on 429) |
| retryAfter | integer | Seconds to wait for owner-scoped forecast-request quota errors. |
| limit_scope | string | Quota scope that rejected the request, such as standard or x_research. |
| quotaScope | string | Stable forecast-request quota scope, such as venue_market_daily. |
| limit | integer | Configured bound for the forecast-request quota that was exceeded. |
Set QUOTIENT_API_KEY in your shell and replace example identifiers with returned IDs before running a request.
curl --request GET \
--header "x-quotient-api-key: $QUOTIENT_API_KEY" \
'https://quotient-api-gateway.onrender.com/api/v1/markets/example-slug/forecast'{
"as_of": "2027-01-01T00:00:00Z",
"historical": false,
"market": {
"venue": "polymarket",
"nativeMarketId": "example",
"nativeEventId": "example",
"seriesTicker": "example",
"marketKey": "example",
"quotientMarketId": "example",
"slug": "example",
"marketUrl": "example",
"sourceUrl": "example",
"broker_channels": [
"robinhood"
],
"robinhood_category": "example",
"robinhood_url": "example",
"relationships": {
"assets": [
{
"relationship": "HAS_MARKET",
"direction": "incoming",
"via": "direct",
"id": "example",
"assetKey": "example",
"name": "example",
"ticker": "example",
"asset_type": "example"
}
],
"markets": [
{
"relationship": "HAS_MARKET",
"direction": "incoming",
"via": "direct",
"marketKey": "example",
"venue": "polymarket",
"nativeMarketId": "example",
"question": "example"
}
],
"signals": [
{
"relationship": "HAS_MARKET",
"direction": "incoming",
"via": "direct",
"id": "example",
"signal_type": "prediction_market",
"canonical_endpoint": "/api/v1/signals",
"side": "example",
"published_at": "example"
}
],
"truncated": {
"assets": false,
"markets": false,
"signals": false
}
}
},
"market_slug": "example",
"question": "example",
"market_odds": 0,
"venue_quote": {
"schema_version": "1",
"venue": "polymarket",
"market_id": "example",
"yes_bid": 0,
"yes_ask": 0,
"yes_last": 0,
"selected_probability": 0,
"quote_method": "example",
"venue_timestamp": "2027-01-01T00:00:00Z",
"observed_at": "2027-01-01T00:00:00Z",
"freshness": "verified"
},
"end_date": "2027-01-01T00:00:00Z",
"forecast_status": {
"state": "warning",
"cents": 0,
"adverse_move_pct": 0,
"basis": "since_publish",
"price_source": "live"
},
"quotientUrl": "example",
"polymarketUrl": "example",
"forecast": {
"venue": "polymarket",
"market": {
"venue": "polymarket",
"nativeMarketId": "example",
"nativeEventId": "example",
"seriesTicker": "example",
"marketKey": "example",
"quotientMarketId": "example",
"slug": "example",
"marketUrl": "example",
"sourceUrl": "example",
"broker_channels": [
"robinhood"
],
"robinhood_category": "example",
"robinhood_url": "example"
},
"id": "example",
"probability": 0,
"created_at": "2027-01-01T00:00:00Z",
"market_odds_at_forecast": 0,
"headline": "example",
"bluf": "example",
"thesis": "example",
"crux": "example",
"resolution_pathway": {
"criteria": "example",
"crux": "example",
"deadline": "2027-01-01T00:00:00Z",
"source": "example"
},
"delta_from_prior": 0,
"delta_reasoning": "example",
"prior_forecast_id": "example",
"refresh_reason": "example",
"refresh_triggered_by": "example",
"conviction_tier": 0,
"draw_std_log_odds": 0,
"draw_count": 0,
"band25": 0,
"band75": 0,
"drawdown_risk_72h": {
"yes": false,
"no": false
},
"crash_risk": {
"yes": false,
"no": false
},
"relationships": {
"assets": [
{
"relationship": "HAS_MARKET",
"direction": "incoming",
"via": "direct",
"id": "example",
"assetKey": "example",
"name": "example",
"ticker": "example",
"asset_type": "example"
}
],
"markets": [
{
"relationship": "HAS_MARKET",
"direction": "incoming",
"via": "direct",
"marketKey": "example",
"venue": "polymarket",
"nativeMarketId": "example",
"question": "example"
}
],
"signals": [
{
"relationship": "HAS_MARKET",
"direction": "incoming",
"via": "direct",
"id": "example",
"signal_type": "prediction_market",
"canonical_endpoint": "/api/v1/signals",
"side": "example",
"published_at": "example"
}
],
"truncated": {
"assets": false,
"markets": false,
"signals": false
}
}
},
"history": [
{
"venue": "polymarket",
"market": {
"venue": "polymarket",
"nativeMarketId": "example",
"nativeEventId": "example",
"seriesTicker": "example",
"marketKey": "example",
"quotientMarketId": "example",
"slug": "example",
"marketUrl": "example",
"sourceUrl": "example",
"broker_channels": [
"robinhood"
],
"robinhood_category": "example",
"robinhood_url": "example"
},
"id": "example",
"probability": 0,
"created_at": "2027-01-01T00:00:00Z",
"market_odds_at_forecast": 0,
"headline": "example",
"bluf": "example",
"thesis": "example",
"crux": "example",
"resolution_pathway": {
"criteria": "example",
"crux": "example",
"deadline": "2027-01-01T00:00:00Z",
"source": "example"
},
"delta_from_prior": 0,
"delta_reasoning": "example",
"prior_forecast_id": "example",
"refresh_reason": "example",
"refresh_triggered_by": "example",
"conviction_tier": 0,
"draw_std_log_odds": 0,
"draw_count": 0,
"band25": 0,
"band75": 0,
"drawdown_risk_72h": {
"yes": false,
"no": false
},
"crash_risk": {
"yes": false,
"no": false
},
"relationships": {
"assets": [
{
"relationship": null,
"direction": null,
"via": null,
"id": null,
"assetKey": null,
"name": null,
"ticker": null,
"asset_type": null
}
],
"markets": [
{
"relationship": null,
"direction": null,
"via": null,
"marketKey": null,
"venue": null,
"nativeMarketId": null,
"question": null
}
],
"signals": [
{
"relationship": null,
"direction": null,
"via": null,
"id": null,
"signal_type": null,
"canonical_endpoint": null,
"side": null,
"published_at": null
}
],
"truncated": {
"assets": false,
"markets": false,
"signals": false
}
}
}
]
}