POST

/api/auth/forecast-requests

Request a new Quotient forecast for a market or question

Ask Quotient to research and publish a new forecast. Two kinds of request: venue_market targets one exact live binary market on a covered venue — polymarket, polymarket_us, kalshi, or limitless — by its venue-native market_id, and is also how you refresh a market Quotient already covers; question is your own free-text question with resolution rules and an end date. Resolve Kalshi event tickers and Polymarket URLs or slugs through free GET /api/public/forecast-targets, then submit one returned child identity: a Kalshi child ticker or numeric Polymarket Gamma market id. Polymarket ids are validated against Gamma before admission: unknown or non-numeric ids return 422 venue_market_not_found and closed or archived markets return 422 venue_market_closed, in both cases before any payment settles. Generation costs $1.00 (1,000 credits). Stored forecasts cost $0.01 on GET /api/v1/markets/{slug}/forecast. Use free /api/public/forecast-availability to check whether a stored forecast is available before requesting generation. The forecast is generated in the background: you get 202 with a jobId immediately, then poll GET /api/auth/forecast-requests/{jobId} until it finishes. User-requested forecast generation has no minimum resolution lead time and does not apply volume, liquidity, or activity selection floors: a question with a future end_date, or a supported venue contract that is still active, remains eligible even when less than 24 hours remain; contract-validity and topic-scope checks still apply. Every request runs Quotient's standard production pipeline with server-managed pricing, snapshots, models, workers, research providers, and publication settings. Limitless markets can be requested on demand even outside the scheduled top-five lane. Sports outcomes, mention markets, and short-horizon crypto up/down markets (fifteen-minute and hourly settles; daily-close and longer crypto horizons remain requestable) are excluded from forecasting: they are rejected up front with 422 forecast_topic_excluded and consume no quota or payment, whether given as a tracked venue market or a free-text question.

Price $1.00Auth x-quotient-api-keyLimit 1/s · 10/min · 10/day

Parameters

NameInTypeDescription
Idempotency-Keyheader, requiredstring

Minimum length: 1; Maximum length: 128

Request body

application/json, required

FieldTypeDescription
Alternative 1VenueMarketForecastRequest

Exactly one alternative

Alternative 1 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

Alternative 2QuestionForecastRequest

Exactly one alternative

Alternative 2 fields
FieldTypeDescription
kind
required
"question"
question
required
string

Minimum length: 10; Maximum length: 2000

resolution_rules
required
string

Minimum length: 20; Maximum length: 12000

category
required
string

Minimum length: 1; Maximum length: 128

start_datestring

Format: date-time

end_date
required
string

Format: date-time

Responses

202: Accepted; Location points to the owner-scoped status URL
FieldTypeDescription
jobId
required
string

Format: uuid

status
required
"accepted" | "submitted" | "running" | "succeeded" | "rejected" | "failed"
createdAt
required
string

Format: date-time

updatedAt
required
string

Format: date-time

forecastIds
required
string[]
forecasts
required
ForecastRequestForecast[]Published forecast outputs. Empty while pending or when execution fails.
forecasts fields
FieldTypeDescription
id
required
string
question
required
string | null
probability
required
numberQuotient YES probability on a 0-1 scale.

Minimum: 0; Maximum: 1

createdAt
required
string

Format: date-time

headline
required
string | null
bluf
required
string | null
thesis
required
string | null
reasoningSummary
required
string | null
citationCount
required
integer

Minimum: 0

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
errorCode
required
string | null
listing
required
CanonicalMarketRouting | null
listing 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

401: Invalid or missing Quotient API key
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: Account lacks an active Quotient API entitlement
409: Idempotency key payload conflict
422: Strict validation failed, the Kalshi identifier names an event rather than one child market (venue_event_requires_market), the market does not exist or the Polymarket id is not the numeric Gamma id (venue_market_not_found), the Polymarket market is closed or archived (venue_market_closed), or the subject is excluded (forecast_topic_excluded)
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 POST \
  --header "x-quotient-api-key: $QUOTIENT_API_KEY" \
  --header 'Idempotency-Key: example-idempotency-key' \
  --header "content-type: application/json" \
  --data '{"kind":"venue_market","venue":"polymarket","market_id":"example"}' \
  'https://quotient-api-gateway.onrender.com/api/auth/forecast-requests'
202 · application/json
{
  "jobId": "example",
  "status": "accepted",
  "createdAt": "2027-01-01T00:00:00Z",
  "updatedAt": "2027-01-01T00:00:00Z",
  "forecastIds": [
    "example"
  ],
  "forecasts": [
    {
      "id": "example",
      "question": "example",
      "probability": 0,
      "createdAt": "2027-01-01T00:00:00Z",
      "headline": "example",
      "bluf": "example",
      "thesis": "example",
      "reasoningSummary": "example",
      "citationCount": 0,
      "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
        }
      }
    }
  ],
  "errorCode": "example",
  "listing": {
    "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"
  }
}