GET

/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.

Price $0.01Auth x-quotient-api-key or x402Limit 20/s · 600/min · 20,000/day

Parameters

NameInTypeDescription
slugpath, requiredstringMarket slug, nativeMarketId, or marketKey
venuequery"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_ofquerystringOptional 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.
historyqueryintegerNumber 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
FieldTypeDescription
as_of
required
stringInclusive forecast-selection cutoff.

Format: date-time

historical
required
booleanTrue when the caller supplied as_of.
market
required
CanonicalMarketWithRelationships
market fields
FieldTypeDescription
venue
required
"polymarket" | "polymarket_us" | "kalshi" | "limitless"Prediction-market venue key: polymarket (Polymarket International), polymarket_us (Polymarket US), kalshi, or limitless.
nativeMarketId
required
string
nativeEventId
required
string | null
seriesTicker
required
string | null
marketKey
required
string
quotientMarketId
required
stringStable Quotient market-page id: bare numeric for legacy Polymarket rows, venue-prefixed (kalshi:TICKER, polymarket_us:123, …) elsewhere. quotientUrl is exactly https://quotient.social/markets/{quotientMarketId} (URL-encoded) — the id form the market page resolves for every venue. A market with no Quotient coverage yet may not have a page.
slug
required
string | null
marketUrl
required
string | nullConnector-owned market page URL; null when unavailable.

Format: uri

sourceUrl
required
string | nullConnector provenance or API source URL.

Format: uri

broker_channels
required
"robinhood"[]Retail brokers that carry this exact venue contract (same order book, same settlement). A broker distributes the venue contract; venue and marketKey remain the contract's identity. Today only robinhood, stamped on Kalshi rows from Robinhood's public listings; empty when no broker lists the market. Filter with topic=robinhood on /markets, /markets/mispriced and /signals, or tag=robinhood on /markets/search.
robinhood_category
required
string | nullRobinhood's own category slug for the listing (economics, politics, crypto, climate, …); null when not listed on Robinhood.
robinhood_url
required
string | nullDeep link to the Robinhood event page; null when not listed on Robinhood.

Format: uri

relationships
required
RelationshipsEnvelopeBounded, non-recursive graph references. Each category publishes at most 50 lightweight refs. These refs contain no forecast probability, venue odds, aggregate asset probability, or inferred causal AFFECTS edge.
relationships fields
FieldTypeDescription
assets
required
RelationshipAssetRef[]

Maximum items: 50

assets fields
FieldTypeDescription
relationship
required
"HAS_MARKET" | "ON_MARKET" | "ON_FORECAST" | "HAS_SIGNAL"Exact graph edge at the final hop. The API does not synthesize AFFECTS relationships.
direction
required
"incoming" | "outgoing"Direction of the final graph edge relative to the response subject for direct refs, or relative to the explicit via node for two-hop refs.
via
required
"direct" | "market" | "asset"direct is one graph hop; market or asset names the explicit intermediate node for a bounded two-hop ref.
id
required
string

Format: uuid

assetKey
required
string
name
required
string
ticker
required
string | null
asset_type
required
string
markets
required
RelationshipMarketRef[]

Maximum items: 50

markets fields
FieldTypeDescription
relationship
required
"HAS_MARKET" | "ON_MARKET" | "ON_FORECAST" | "HAS_SIGNAL"Exact graph edge at the final hop. The API does not synthesize AFFECTS relationships.
direction
required
"incoming" | "outgoing"Direction of the final graph edge relative to the response subject for direct refs, or relative to the explicit via node for two-hop refs.
via
required
"direct" | "market" | "asset"direct is one graph hop; market or asset names the explicit intermediate node for a bounded two-hop ref.
marketKey
required
string
venue
required
"polymarket" | "polymarket_us" | "kalshi" | "limitless"Prediction-market venue key: polymarket (Polymarket International), polymarket_us (Polymarket US), kalshi, or limitless.
nativeMarketId
required
string
question
required
string | null
signals
required
RelationshipSignalRef[]

Maximum items: 50

signals fields
FieldTypeDescription
relationship
required
"HAS_MARKET" | "ON_MARKET" | "ON_FORECAST" | "HAS_SIGNAL"Exact graph edge at the final hop. The API does not synthesize AFFECTS relationships.
direction
required
"incoming" | "outgoing"Direction of the final graph edge relative to the response subject for direct refs, or relative to the explicit via node for two-hop refs.
via
required
"direct" | "market" | "asset"direct is one graph hop; market or asset names the explicit intermediate node for a bounded two-hop ref.
id
required
string
signal_type
required
"prediction_market"
canonical_endpoint
required
"/api/v1/signals"
side
required
string | null
published_at
required
string | null
truncated
required
object
truncated fields
FieldTypeDescription
assets
required
boolean
markets
required
boolean
signals
required
boolean
market_slug
required
string | null
question
required
string
market_odds
required
number | nullSource-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
FieldTypeDescription
schema_version
required
"1"
venue
required
"polymarket" | "polymarket_us" | "kalshi" | "limitless" | nullPrediction-market venue key: polymarket (Polymarket International), polymarket_us (Polymarket US), kalshi, or limitless.
market_id
required
string | null
yes_bid
required
number | null

Minimum: 0; Maximum: 1

yes_ask
required
number | null

Minimum: 0; Maximum: 1

yes_last
required
number | null

Minimum: 0; Maximum: 1

selected_probability
required
number | nullPrediction-market YES probability selected for the enclosing response. Inspect freshness and quote_method before treating it as current.

Minimum: 0; Maximum: 1

quote_method
required
string | nullmidpoint, bid, ask, fresh last, or graph_snapshot. Null when pricing is unavailable.
venue_timestamp
required
string | nullSource clock for the selected quote: book update for book methods, last-trade time for last, or catalog observation time for graph_snapshot.

Format: date-time

observed_at
required
string | nullWhen Quotient observed the live quote or stored graph snapshot.

Format: date-time

freshness
required
CapabilityState
end_datestring | null

Format: date-time

forecast_statusobject | nullThe 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
FieldTypeDescription
state
required
"warning" | "caution" | "converged" | "converging" | "sideways" | "diverging"
cents
required
integerMovement states: gap closed (+) or opened (−) over the window. converged: how far past Q the venue sits. Adverse tiers: the move from the worse anchor in position-space cents (negative).
adverse_move_pct
required
number | nullThe standing worse-of-anchors adverse move, RELATIVE % of anchor cost, positive = against Q's side. Served on every state — a 14.9% move stays visible below the caution line. Negative means the market has moved in Q's favour. Null when no anchor is priced.
basis
required
"since_publish" | "since_forecast"The window the read measured: an adverse tier stamps the anchor that fired; other states carry the surface's measurement window.
price_source
required
"live" | "graph"live = verified venue quote; graph = an explicitly stale graph_snapshot for a venue without a live adapter. Graph snapshots carry stale discovery data.
quotientUrlstring | null
polymarketUrlstring | nullLegacy 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
FieldTypeDescription
venue
required
"polymarket" | "polymarket_us" | "kalshi" | "limitless" | nullPrediction-market venue key: polymarket (Polymarket International), polymarket_us (Polymarket US), kalshi, or limitless.
market
required
CanonicalMarketRouting | null
market fields
FieldTypeDescription
venue
required
"polymarket" | "polymarket_us" | "kalshi" | "limitless"Prediction-market venue key: polymarket (Polymarket International), polymarket_us (Polymarket US), kalshi, or limitless.
nativeMarketId
required
string
nativeEventId
required
string | null
seriesTicker
required
string | null
marketKey
required
string
quotientMarketId
required
stringStable Quotient market-page id: bare numeric for legacy Polymarket rows, venue-prefixed (kalshi:TICKER, polymarket_us:123, …) elsewhere. quotientUrl is exactly https://quotient.social/markets/{quotientMarketId} (URL-encoded) — the id form the market page resolves for every venue. A market with no Quotient coverage yet may not have a page.
slug
required
string | null
marketUrl
required
string | nullConnector-owned market page URL; null when unavailable.

Format: uri

sourceUrl
required
string | nullConnector provenance or API source URL.

Format: uri

broker_channels
required
"robinhood"[]Retail brokers that carry this exact venue contract (same order book, same settlement). A broker distributes the venue contract; venue and marketKey remain the contract's identity. Today only robinhood, stamped on Kalshi rows from Robinhood's public listings; empty when no broker lists the market. Filter with topic=robinhood on /markets, /markets/mispriced and /signals, or tag=robinhood on /markets/search.
robinhood_category
required
string | nullRobinhood's own category slug for the listing (economics, politics, crypto, climate, …); null when not listed on Robinhood.
robinhood_url
required
string | nullDeep link to the Robinhood event page; null when not listed on Robinhood.

Format: uri

id
required
string
probability
required
numberCanonical Q probability (0-1)
created_at
required
string

Format: date-time

market_odds_at_forecast
required
number | nullVenue YES probability captured when this forecast was created. Use it for historical spread arithmetic.

Minimum: 0; Maximum: 1

headlinestring | null
blufstring | nullBottom-line-up-front thesis
thesis
required
string | nullReviewable forecast thesis
cruxstring | null
resolution_pathwayResolutionPathwayThe market contract and forecast crux needed to review how this forecast can resolve.
resolution_pathway fields
FieldTypeDescription
criteria
required
string | null
crux
required
string | null
deadline
required
string | null

Format: date-time

source
required
string | null
delta_from_priornumber | nullSigned probability change vs the prior forecast
delta_reasoningstring | nullDeterministic sentence explaining the delta
prior_forecast_idstring | null
refresh_reasonstring | nullWhy this forecast reran (e.g. price_move); null for scheduled runs
refresh_triggered_bystring | null
conviction_tierinteger | null
draw_std_log_oddsnumber | nullEnsemble draw dispersion (log-odds sd)
draw_countinteger | null
band25number | null
band75number | null
drawdown_risk_72hobject | nullPer-side deep-drawdown flags from Quotient's risk model: a side reads true when the model puts at least a 15% probability on a position on that side losing most of its remaining value within roughly 72 hours of this forecast's created_at. The model head is trained on matured 72-hour price paths: a side counts as a deep drawdown when its price printed twice within two hours at or below a quarter of the entry price, or when the market resolved against it. The claim is anchored to the forecast — on older forecasts it is a historical reading, not current risk. Null for forecasts made before the risk model shipped (August 2026). This separate model measures path risk.
drawdown_risk_72h fields
FieldTypeDescription
yesboolean
noboolean
crash_riskobject | nullDeprecated former name for drawdown_risk_72h; same value. Emitted for one release.
crash_risk fields
FieldTypeDescription
yesboolean
noboolean
relationships
required
RelationshipsEnvelopeBounded, non-recursive graph references. Each category publishes at most 50 lightweight refs. These refs contain no forecast probability, venue odds, aggregate asset probability, or inferred causal AFFECTS edge.
relationships fields
FieldTypeDescription
assets
required
RelationshipAssetRef[]

Maximum items: 50

assets fields
FieldTypeDescription
relationship
required
"HAS_MARKET" | "ON_MARKET" | "ON_FORECAST" | "HAS_SIGNAL"Exact graph edge at the final hop. The API does not synthesize AFFECTS relationships.
direction
required
"incoming" | "outgoing"Direction of the final graph edge relative to the response subject for direct refs, or relative to the explicit via node for two-hop refs.
via
required
"direct" | "market" | "asset"direct is one graph hop; market or asset names the explicit intermediate node for a bounded two-hop ref.
id
required
string

Format: uuid

assetKey
required
string
name
required
string
ticker
required
string | null
asset_type
required
string
markets
required
RelationshipMarketRef[]

Maximum items: 50

markets fields
FieldTypeDescription
relationship
required
"HAS_MARKET" | "ON_MARKET" | "ON_FORECAST" | "HAS_SIGNAL"Exact graph edge at the final hop. The API does not synthesize AFFECTS relationships.
direction
required
"incoming" | "outgoing"Direction of the final graph edge relative to the response subject for direct refs, or relative to the explicit via node for two-hop refs.
via
required
"direct" | "market" | "asset"direct is one graph hop; market or asset names the explicit intermediate node for a bounded two-hop ref.
marketKey
required
string
venue
required
"polymarket" | "polymarket_us" | "kalshi" | "limitless"Prediction-market venue key: polymarket (Polymarket International), polymarket_us (Polymarket US), kalshi, or limitless.
nativeMarketId
required
string
question
required
string | null
signals
required
RelationshipSignalRef[]

Maximum items: 50

signals fields
FieldTypeDescription
relationship
required
"HAS_MARKET" | "ON_MARKET" | "ON_FORECAST" | "HAS_SIGNAL"Exact graph edge at the final hop. The API does not synthesize AFFECTS relationships.
direction
required
"incoming" | "outgoing"Direction of the final graph edge relative to the response subject for direct refs, or relative to the explicit via node for two-hop refs.
via
required
"direct" | "market" | "asset"direct is one graph hop; market or asset names the explicit intermediate node for a bounded two-hop ref.
id
required
string
signal_type
required
"prediction_market"
canonical_endpoint
required
"/api/v1/signals"
side
required
string | null
published_at
required
string | null
truncated
required
object
truncated fields
FieldTypeDescription
assets
required
boolean
markets
required
boolean
signals
required
boolean
history
required
ForecastRead[]Prior forecasts, newest first (per the history param)
history fields
FieldTypeDescription
venue
required
"polymarket" | "polymarket_us" | "kalshi" | "limitless" | nullPrediction-market venue key: polymarket (Polymarket International), polymarket_us (Polymarket US), kalshi, or limitless.
market
required
CanonicalMarketRouting | null
market fields
FieldTypeDescription
venue
required
"polymarket" | "polymarket_us" | "kalshi" | "limitless"Prediction-market venue key: polymarket (Polymarket International), polymarket_us (Polymarket US), kalshi, or limitless.
nativeMarketId
required
string
nativeEventId
required
string | null
seriesTicker
required
string | null
marketKey
required
string
quotientMarketId
required
stringStable Quotient market-page id: bare numeric for legacy Polymarket rows, venue-prefixed (kalshi:TICKER, polymarket_us:123, …) elsewhere. quotientUrl is exactly https://quotient.social/markets/{quotientMarketId} (URL-encoded) — the id form the market page resolves for every venue. A market with no Quotient coverage yet may not have a page.
slug
required
string | null
marketUrl
required
string | nullConnector-owned market page URL; null when unavailable.

Format: uri

sourceUrl
required
string | nullConnector provenance or API source URL.

Format: uri

broker_channels
required
"robinhood"[]Retail brokers that carry this exact venue contract (same order book, same settlement). A broker distributes the venue contract; venue and marketKey remain the contract's identity. Today only robinhood, stamped on Kalshi rows from Robinhood's public listings; empty when no broker lists the market. Filter with topic=robinhood on /markets, /markets/mispriced and /signals, or tag=robinhood on /markets/search.
robinhood_category
required
string | nullRobinhood's own category slug for the listing (economics, politics, crypto, climate, …); null when not listed on Robinhood.
robinhood_url
required
string | nullDeep link to the Robinhood event page; null when not listed on Robinhood.

Format: uri

id
required
string
probability
required
numberCanonical Q probability (0-1)
created_at
required
string

Format: date-time

market_odds_at_forecast
required
number | nullVenue YES probability captured when this forecast was created. Use it for historical spread arithmetic.

Minimum: 0; Maximum: 1

headlinestring | null
blufstring | nullBottom-line-up-front thesis
thesis
required
string | nullReviewable forecast thesis
cruxstring | null
resolution_pathwayResolutionPathwayThe market contract and forecast crux needed to review how this forecast can resolve.
resolution_pathway fields
FieldTypeDescription
criteria
required
string | null
crux
required
string | null
deadline
required
string | null

Format: date-time

source
required
string | null
delta_from_priornumber | nullSigned probability change vs the prior forecast
delta_reasoningstring | nullDeterministic sentence explaining the delta
prior_forecast_idstring | null
refresh_reasonstring | nullWhy this forecast reran (e.g. price_move); null for scheduled runs
refresh_triggered_bystring | null
conviction_tierinteger | null
draw_std_log_oddsnumber | nullEnsemble draw dispersion (log-odds sd)
draw_countinteger | null
band25number | null
band75number | null
drawdown_risk_72hobject | nullPer-side deep-drawdown flags from Quotient's risk model: a side reads true when the model puts at least a 15% probability on a position on that side losing most of its remaining value within roughly 72 hours of this forecast's created_at. The model head is trained on matured 72-hour price paths: a side counts as a deep drawdown when its price printed twice within two hours at or below a quarter of the entry price, or when the market resolved against it. The claim is anchored to the forecast — on older forecasts it is a historical reading, not current risk. Null for forecasts made before the risk model shipped (August 2026). This separate model measures path risk.
drawdown_risk_72h fields
FieldTypeDescription
yesboolean
noboolean
crash_riskobject | nullDeprecated former name for drawdown_risk_72h; same value. Emitted for one release.
crash_risk fields
FieldTypeDescription
yesboolean
noboolean
relationships
required
RelationshipsEnvelopeBounded, non-recursive graph references. Each category publishes at most 50 lightweight refs. These refs contain no forecast probability, venue odds, aggregate asset probability, or inferred causal AFFECTS edge.
relationships fields
FieldTypeDescription
assets
required
RelationshipAssetRef[]

Maximum items: 50

assets fields
FieldTypeDescription
relationship
required
"HAS_MARKET" | "ON_MARKET" | "ON_FORECAST" | "HAS_SIGNAL"Exact graph edge at the final hop. The API does not synthesize AFFECTS relationships.
direction
required
"incoming" | "outgoing"Direction of the final graph edge relative to the response subject for direct refs, or relative to the explicit via node for two-hop refs.
via
required
"direct" | "market" | "asset"direct is one graph hop; market or asset names the explicit intermediate node for a bounded two-hop ref.
id
required
string

Format: uuid

assetKey
required
string
name
required
string
ticker
required
string | null
asset_type
required
string
markets
required
RelationshipMarketRef[]

Maximum items: 50

markets fields
FieldTypeDescription
relationship
required
"HAS_MARKET" | "ON_MARKET" | "ON_FORECAST" | "HAS_SIGNAL"Exact graph edge at the final hop. The API does not synthesize AFFECTS relationships.
direction
required
"incoming" | "outgoing"Direction of the final graph edge relative to the response subject for direct refs, or relative to the explicit via node for two-hop refs.
via
required
"direct" | "market" | "asset"direct is one graph hop; market or asset names the explicit intermediate node for a bounded two-hop ref.
marketKey
required
string
venue
required
"polymarket" | "polymarket_us" | "kalshi" | "limitless"Prediction-market venue key: polymarket (Polymarket International), polymarket_us (Polymarket US), kalshi, or limitless.
nativeMarketId
required
string
question
required
string | null
signals
required
RelationshipSignalRef[]

Maximum items: 50

signals fields
FieldTypeDescription
relationship
required
"HAS_MARKET" | "ON_MARKET" | "ON_FORECAST" | "HAS_SIGNAL"Exact graph edge at the final hop. The API does not synthesize AFFECTS relationships.
direction
required
"incoming" | "outgoing"Direction of the final graph edge relative to the response subject for direct refs, or relative to the explicit via node for two-hop refs.
via
required
"direct" | "market" | "asset"direct is one graph hop; market or asset names the explicit intermediate node for a bounded two-hop ref.
id
required
string
signal_type
required
"prediction_market"
canonical_endpoint
required
"/api/v1/signals"
side
required
string | null
published_at
required
string | null
truncated
required
object
truncated fields
FieldTypeDescription
assets
required
boolean
markets
required
boolean
signals
required
boolean
401: Unauthorized
FieldTypeDescription
error
required
stringError code
message
required
stringHuman-readable message
retry_afterintegerSeconds to wait (only on 429)
retryAfterintegerSeconds to wait for owner-scoped forecast-request quota errors.
limit_scopestringQuota scope that rejected the request, such as standard or x_research.
quotaScopestringStable forecast-request quota scope, such as venue_market_daily.
limitintegerConfigured bound for the forecast-request quota that was exceeded.
402: Payment Required
FieldTypeDescription
error
required
stringError code
message
required
stringHuman-readable message
retry_afterintegerSeconds to wait (only on 429)
retryAfterintegerSeconds to wait for owner-scoped forecast-request quota errors.
limit_scopestringQuota scope that rejected the request, such as standard or x_research.
quotaScopestringStable forecast-request quota scope, such as venue_market_daily.
limitintegerConfigured bound for the forecast-request quota that was exceeded.
403: Insufficient credits for the requested route
FieldTypeDescription
error
required
stringError code
message
required
stringHuman-readable message
retry_afterintegerSeconds to wait (only on 429)
retryAfterintegerSeconds to wait for owner-scoped forecast-request quota errors.
limit_scopestringQuota scope that rejected the request, such as standard or x_research.
quotaScopestringStable forecast-request quota scope, such as venue_market_daily.
limitintegerConfigured 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
FieldTypeDescription
error
required
stringError code
message
required
stringHuman-readable message
retry_afterintegerSeconds to wait (only on 429)
retryAfterintegerSeconds to wait for owner-scoped forecast-request quota errors.
limit_scopestringQuota scope that rejected the request, such as standard or x_research.
quotaScopestringStable forecast-request quota scope, such as venue_market_daily.
limitintegerConfigured bound for the forecast-request quota that was exceeded.
422: Invalid request parameters
FieldTypeDescription
error
required
stringError code
message
required
stringHuman-readable message
retry_afterintegerSeconds to wait (only on 429)
retryAfterintegerSeconds to wait for owner-scoped forecast-request quota errors.
limit_scopestringQuota scope that rejected the request, such as standard or x_research.
quotaScopestringStable forecast-request quota scope, such as venue_market_daily.
limitintegerConfigured 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.
FieldTypeDescription
error
required
stringError code
message
required
stringHuman-readable message
retry_afterintegerSeconds to wait (only on 429)
retryAfterintegerSeconds to wait for owner-scoped forecast-request quota errors.
limit_scopestringQuota scope that rejected the request, such as standard or x_research.
quotaScopestringStable forecast-request quota scope, such as venue_market_daily.
limitintegerConfigured 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
curl --request GET \
  --header "x-quotient-api-key: $QUOTIENT_API_KEY" \
  'https://quotient-api-gateway.onrender.com/api/v1/markets/example-slug/forecast'
200 · application/json
{
  "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
        }
      }
    }
  ]
}