GET

/api/public/forecast-availability

Check if Quotient already has a forecast for a market (free)

Free lookup for one market. Identify it with exactly one of market_key, market_id, or slug, and the response tells you what to do next. If Quotient already has a forecast, read points to where you can fetch it ($0.01). If it does not, generation is a ready-to-send request body for POST /api/auth/forecast-requests, which generates a new forecast ($1.00). If the market is a topic excluded from Quotient forecasting (sports outcomes, mention markets, short-horizon crypto up/down markets — fifteen-minute and hourly settles; daily-close and longer crypto horizons remain requestable), excluded explains why and generation is null. The response contains coverage metadata and read or generation pointers.

Auth none (free)

Parameters

NameInTypeDescription
market_keyquerystringPreferred canonical marketKey. Mutually exclusive with market_id and slug; do not also provide venue.

Minimum length: 1; Maximum length: 512

market_idquerystringVenue-native market ID. Mutually exclusive with market_key and slug; venue is required.

Minimum length: 1; Maximum length: 512

slugquerystringMarket slug. Mutually exclusive with market_key and market_id; venue defaults to polymarket.

Minimum length: 1; Maximum length: 512

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.

Responses

200: Free availability result and the next non-duplicative action
FieldTypeDescription
tracked
required
booleanWhether the market identity currently resolves to a Quotient Market row.
available
required
booleanWhether a committed stored forecast exists. This check is free.
market
required
CanonicalMarketWithRelationships | 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

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
question
required
string | null
latestForecast
required
object | nullExistence metadata only. Probability and research remain in the paid forecast response.
latestForecast fields
FieldTypeDescription
id
required
string
createdAt
required
string

Format: date-time

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
read
required
object | null
read fields
FieldTypeDescription
method
required
"GET"
endpoint
required
string
paid
required
true
generation
required
object | nullNull when a forecast already exists or when excluded is non-null.
generation fields
FieldTypeDescription
method
required
"POST"
endpoint
required
"/api/auth/forecast-requests"
authentication
required
"x-quotient-api-key"
idempotencyKeyRequired
required
true
body
required
VenueMarketForecastRequest
body fields
FieldTypeDescription
kind
required
"venue_market"
venue
required
"polymarket" | "polymarket_us" | "kalshi" | "limitless"Prediction-market venue key: polymarket (Polymarket International), polymarket_us (Polymarket US), kalshi, or limitless.
market_id
required
string

Minimum length: 1; Maximum length: 512

targetResolution
required
object | nullNon-null when the supplied Kalshi identifier names a multi-contract event. Resolve the endpoint and choose one exact child ticker before generation.
targetResolution fields
FieldTypeDescription
endpoint
required
string
reason
required
"venue_event_requires_market"
message
required
string
marketCount
required
integer

Minimum: 1

excluded
required
object | nullNon-null when Quotient will not schedule a forecast for this market. Sports outcomes, mention markets, and short-horizon crypto up/down markets (fifteen-minute and hourly settles; daily-close and longer crypto horizons stay in scope) are permanently out of scope; generation is null and POST /api/auth/forecast-requests returns 422 forecast_topic_excluded.
excluded fields
FieldTypeDescription
reason
required
"sports" | "mentions" | "crypto_up_down"
message
required
string
422: Provide exactly one supported market identifier
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.
503: Availability source temporarily unavailable
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 \
  'https://quotient-api-gateway.onrender.com/api/public/forecast-availability'
200 · application/json
{
  "tracked": false,
  "available": 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
      }
    }
  },
  "question": "example",
  "latestForecast": {
    "id": "example",
    "createdAt": "2027-01-01T00:00:00Z",
    "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
      }
    }
  },
  "read": {
    "method": "GET",
    "endpoint": "example",
    "paid": true
  },
  "generation": {
    "method": "POST",
    "endpoint": "/api/auth/forecast-requests",
    "authentication": "x-quotient-api-key",
    "idempotencyKeyRequired": true,
    "body": {
      "kind": "venue_market",
      "venue": "polymarket",
      "market_id": "example"
    }
  },
  "targetResolution": {
    "endpoint": "example",
    "reason": "venue_event_requires_market",
    "message": "example",
    "marketCount": 1
  },
  "excluded": {
    "reason": "sports",
    "message": "example"
  }
}