GET

/api/v1/markets/search

Search covered markets by meaning, text, tags, or categories

Hybrid discovery over active Quotient-covered markets. With as_of it becomes a point-in-time search over markets having coverage at or before the cutoff, including markets that have since closed. It fuses graph text/tag matches with optional lexical and embedding recall. Each market includes Q's latest committed probability and paired thesis at or before the cutoff, forecast_at, the forecast-time venue quote, response-time market_odds, venue_quote provenance, and explicit forecast/published-signal availability. Polymarket International and Kalshi use a verified live quote or null; Polymarket US and Limitless expose a graph snapshot marked stale. For a historical spread compare latest_q_probability with market_odds_at_forecast. A published signal may be historical and is not necessarily active now. Relevance scores order only this response; they are not probabilities. Supply q, tag, or category; q defaults to '*' for filter-only searches. By default results are windowed to forecasts from the last 168 hours (markets with a published signal stay); widen or effectively disable with max_forecast_age.

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

Parameters

NameInTypeDescription
qquerystringNatural-language or keyword query. Optional when tag or category is supplied.

Minimum length: 1; Maximum length: 200

tagquerystring[]Case-insensitive Event/market tag filter. Repeat the parameter or comma-separate values; any supplied tag may match.

Maximum items: 10

categoryquerystring[]Case-insensitive category filter. Repeat the parameter or comma-separate values; any supplied category may match.

Maximum items: 10

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.
max_forecast_agequeryintegerMaximum forecast age in hours, anchored at as_of (or now). Rows whose only Q claim is a forecast older than this window are dropped; markets with a published signal stay, matching the catalog route. Default: 168 (7 days). Set a large value (e.g. 8760) to effectively disable windowing.

Default: 168; Minimum: 1

group_byquery"market" | "event"Set event to additionally group the returned matches by parent Event. The markets array is present.

Default: "market"

Responses

200: Ranked covered-market matches at the stated snapshot cutoff
FieldTypeDescription
as_of
required
stringInclusive snapshot cutoff applied to forecast and publication selection.

Format: date-time

historical
required
booleanTrue when the caller supplied as_of; false for the current view.
query
required
stringNormalized search query, or '*' for a filter-only search.
group_by
required
"market" | "event"
markets
required
MarketSearchItem[]
markets 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

question
required
stringThe market question
event
required
MarketEventContext | nullParent Event context when the market is attached to an Event.
event fields
FieldTypeDescription
id
required
string | null
title
required
string | null
slug
required
string | null
tags
required
string[]Event and venue-native market tags available for market discovery/filtering. Linkage to an underlying Asset is the graph HAS_MARKET relationship exposed by /assets/search; a tag alone is not that relationship.
categories
required
string[]Categories derived from Event tags and venue-native market metadata.
end_date
required
string | nullWhen this market closes/resolves. Null if no end date is set.

Format: date-time

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
VenueQuoteV1Provenance for market_odds, including selection method and freshness.
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
inDispute
required
booleanWhether the source venue currently reports a dispute or challenged settlement state. Legacy Polymarket rows map their UMA dispute state here.
clarifications
required
string | nullRules clarifications for the market, if provided
volume_24h
required
number | nullNullable venue-reported 24-hour activity where available. Units, refresh cadence, and comparability can differ by venue; do not rank across venues without inspecting the source context.
signal_count
required
integerNumber of analyst signals for this market
forecast_count
required
integerNumber of Q forecasts within the max_forecast_age window
latest_forecast_at
required
string | nullWhen Q's most recent forecast was created

Format: date-time

market_updated_at
required
string | nullWhen the market's odds or metadata last synced from its source venue

Format: date-time

latest_forecast_delta
required
number | nullProbability change of the latest forecast vs its prior (deltaFromPrior)
latest_forecast_refresh_reason
required
string | nullWhy the latest forecast reran (e.g. price_move). Null for scheduled runs.
forecast_statusobject | nullCoverage status against the latest forecast, priced from the same market_odds and venue_quote. Null when the required quote or forecast is unavailable.
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.
quotientUrl
required
string | nullCanonical Quotient market page: https://quotient.social/markets/{quotientMarketId} (URL-encoded). The id form resolves for every venue; a market with no Quotient coverage yet may not have a page.
polymarketUrl
required
string | nullLegacy Polymarket navigation alias. Populated only for Polymarket International rows and null for Polymarket US, Kalshi, and Limitless; use marketUrl for venue-neutral navigation.
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
has_forecast
required
booleanTrue when Quotient has at least one committed Q forecast stored for this market. Use this before requesting forecast detail.
latest_q_probability
required
number | nullQ's latest committed calibrated YES probability at or before the response as_of cutoff. Null when has_forecast is false.

Minimum: 0; Maximum: 1

thesis
required
string | nullReviewable thesis for the forecast represented by latest_q_probability. Falls back to that forecast's BLUF; null when no forecast thesis or BLUF is stored.
forecast_at
required
string | nullCreation time of the forecast represented by latest_q_probability. Null when has_forecast is false.

Format: date-time

market_odds_at_forecast
required
number | nullVenue YES probability captured at forecast_at. Use this with latest_q_probability for a historical spread; market_odds is the response-time value described by venue_quote.

Minimum: 0; Maximum: 1

has_published_signal
required
booleanTrue when Quotient has published at least one non-backfill QuotientSignal for this market. Current state is reported by is_active.
published_signal_count
required
integerNumber of stored non-backfill QuotientSignal publications for this market. This is separate from the legacy analyst signal_count field.

Minimum: 0

relevance
required
MarketSearchRelevance
relevance fields
FieldTypeDescription
score
required
numberReciprocal-rank-fusion ordering score. Compare only within this response.
matched_by
required
"graph" | "typesense" | "semantic"[]Retrieval lanes that contributed this candidate.
matched_fields
required
string[]Known lexical fields that matched; semantic-only matches may leave this empty.
events
required
MarketSearchEventGroup[] | nullReturned matches grouped by Event when group_by=event; otherwise null.
events fields
FieldTypeDescription
event
required
MarketEventContext | null
event fields
FieldTypeDescription
id
required
string | null
title
required
string | null
slug
required
string | null
tags
required
string[]
categories
required
string[]
relevance
required
MarketSearchRelevance
relevance fields
FieldTypeDescription
score
required
numberReciprocal-rank-fusion ordering score. Compare only within this response.
matched_by
required
"graph" | "typesense" | "semantic"[]Retrieval lanes that contributed this candidate.
matched_fields
required
string[]Known lexical fields that matched; semantic-only matches may leave this empty.
markets
required
MarketSearchItem[]
markets 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

question
required
stringThe market question
event
required
MarketEventContext | nullParent Event context when the market is attached to an Event.
event fields
FieldTypeDescription
id
required
string | null
title
required
string | null
slug
required
string | null
tags
required
string[]Event and venue-native market tags available for market discovery/filtering. Linkage to an underlying Asset is the graph HAS_MARKET relationship exposed by /assets/search; a tag alone is not that relationship.
categories
required
string[]Categories derived from Event tags and venue-native market metadata.
end_date
required
string | nullWhen this market closes/resolves. Null if no end date is set.

Format: date-time

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
VenueQuoteV1Provenance for market_odds, including selection method and freshness.
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
inDispute
required
booleanWhether the source venue currently reports a dispute or challenged settlement state. Legacy Polymarket rows map their UMA dispute state here.
clarifications
required
string | nullRules clarifications for the market, if provided
volume_24h
required
number | nullNullable venue-reported 24-hour activity where available. Units, refresh cadence, and comparability can differ by venue; do not rank across venues without inspecting the source context.
signal_count
required
integerNumber of analyst signals for this market
forecast_count
required
integerNumber of Q forecasts within the max_forecast_age window
latest_forecast_at
required
string | nullWhen Q's most recent forecast was created

Format: date-time

market_updated_at
required
string | nullWhen the market's odds or metadata last synced from its source venue

Format: date-time

latest_forecast_delta
required
number | nullProbability change of the latest forecast vs its prior (deltaFromPrior)
latest_forecast_refresh_reason
required
string | nullWhy the latest forecast reran (e.g. price_move). Null for scheduled runs.
forecast_statusobject | nullCoverage status against the latest forecast, priced from the same market_odds and venue_quote. Null when the required quote or forecast is unavailable.
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.
quotientUrl
required
string | nullCanonical Quotient market page: https://quotient.social/markets/{quotientMarketId} (URL-encoded). The id form resolves for every venue; a market with no Quotient coverage yet may not have a page.
polymarketUrl
required
string | nullLegacy Polymarket navigation alias. Populated only for Polymarket International rows and null for Polymarket US, Kalshi, and Limitless; use marketUrl for venue-neutral navigation.
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
has_forecast
required
booleanTrue when Quotient has at least one committed Q forecast stored for this market. Use this before requesting forecast detail.
latest_q_probability
required
number | nullQ's latest committed calibrated YES probability at or before the response as_of cutoff. Null when has_forecast is false.

Minimum: 0; Maximum: 1

thesis
required
string | nullReviewable thesis for the forecast represented by latest_q_probability. Falls back to that forecast's BLUF; null when no forecast thesis or BLUF is stored.
forecast_at
required
string | nullCreation time of the forecast represented by latest_q_probability. Null when has_forecast is false.

Format: date-time

market_odds_at_forecast
required
number | nullVenue YES probability captured at forecast_at. Use this with latest_q_probability for a historical spread; market_odds is the response-time value described by venue_quote.

Minimum: 0; Maximum: 1

has_published_signal
required
booleanTrue when Quotient has published at least one non-backfill QuotientSignal for this market. Current state is reported by is_active.
published_signal_count
required
integerNumber of stored non-backfill QuotientSignal publications for this market. This is separate from the legacy analyst signal_count field.

Minimum: 0

relevance
required
MarketSearchRelevance
relevance fields
FieldTypeDescription
score
required
numberReciprocal-rank-fusion ordering score. Compare only within this response.
matched_by
required
"graph" | "typesense" | "semantic"[]Retrieval lanes that contributed this candidate.
matched_fields
required
string[]Known lexical fields that matched; semantic-only matches may leave this empty.
facets
required
objectTaxonomy counts across the returned hydrated candidate set.
facets fields
FieldTypeDescription
tags
required
MarketSearchFacetValue[]
tags fields
FieldTypeDescription
value
required
string
count
required
integer

Minimum: 1

categories
required
MarketSearchFacetValue[]
categories fields
FieldTypeDescription
value
required
string
count
required
integer

Minimum: 1

retrieval
required
objectPer-lane health. Graph retrieval is required; optional lanes fail open to graph results.
retrieval fields
FieldTypeDescription
graph
required
"ok"
typesense
required
"ok" | "unconfigured" | "error"
semantic
required
"ok" | "unconfigured" | "error"
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.
422: Invalid query, filters, grouping, or venue
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/search'
200 · application/json
{
  "as_of": "2027-01-01T00:00:00Z",
  "historical": false,
  "query": "example",
  "group_by": "market",
  "markets": [
    {
      "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",
      "question": "example",
      "event": {
        "id": "example",
        "title": "example",
        "slug": "example"
      },
      "tags": [
        "example"
      ],
      "categories": [
        "example"
      ],
      "end_date": "2027-01-01T00:00:00Z",
      "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"
      },
      "inDispute": false,
      "clarifications": "example",
      "volume_24h": 0,
      "signal_count": 0,
      "forecast_count": 0,
      "latest_forecast_at": "2027-01-01T00:00:00Z",
      "market_updated_at": "2027-01-01T00:00:00Z",
      "latest_forecast_delta": 0,
      "latest_forecast_refresh_reason": "example",
      "forecast_status": {
        "state": "warning",
        "cents": 0,
        "adverse_move_pct": 0,
        "basis": "since_publish",
        "price_source": "live"
      },
      "quotientUrl": "example",
      "polymarketUrl": "example",
      "relationships": {
        "assets": [
          {}
        ],
        "markets": [
          {}
        ],
        "signals": [
          {}
        ],
        "truncated": {
          "assets": false,
          "markets": false,
          "signals": false
        }
      },
      "has_forecast": false,
      "latest_q_probability": 0,
      "thesis": "example",
      "forecast_at": "2027-01-01T00:00:00Z",
      "market_odds_at_forecast": 0,
      "has_published_signal": false,
      "published_signal_count": 0,
      "relevance": {
        "score": 0,
        "matched_by": [
          "graph"
        ],
        "matched_fields": [
          "example"
        ]
      }
    }
  ],
  "events": [
    {
      "event": {
        "id": "example",
        "title": "example",
        "slug": "example"
      },
      "tags": [
        "example"
      ],
      "categories": [
        "example"
      ],
      "relevance": {
        "score": 0,
        "matched_by": [
          "graph"
        ],
        "matched_fields": [
          "example"
        ]
      },
      "markets": [
        {
          "venue": "polymarket",
          "nativeMarketId": "example",
          "nativeEventId": "example",
          "seriesTicker": "example",
          "marketKey": "example",
          "quotientMarketId": "example",
          "slug": "example",
          "marketUrl": "example",
          "sourceUrl": "example",
          "broker_channels": [
            null
          ],
          "robinhood_category": "example",
          "robinhood_url": "example",
          "question": "example",
          "event": {
            "id": null,
            "title": null,
            "slug": null
          },
          "tags": [
            null
          ],
          "categories": [
            null
          ],
          "end_date": "2027-01-01T00:00:00Z",
          "market_odds": 0,
          "venue_quote": {
            "schema_version": null,
            "venue": null,
            "market_id": null,
            "yes_bid": null,
            "yes_ask": null,
            "yes_last": null,
            "selected_probability": null,
            "quote_method": null,
            "venue_timestamp": null,
            "observed_at": null,
            "freshness": null
          },
          "inDispute": false,
          "clarifications": "example",
          "volume_24h": 0,
          "signal_count": 0,
          "forecast_count": 0,
          "latest_forecast_at": "2027-01-01T00:00:00Z",
          "market_updated_at": "2027-01-01T00:00:00Z",
          "latest_forecast_delta": 0,
          "latest_forecast_refresh_reason": "example",
          "forecast_status": {},
          "quotientUrl": "example",
          "polymarketUrl": "example",
          "relationships": {
            "assets": null,
            "markets": null,
            "signals": null,
            "truncated": null
          },
          "has_forecast": false,
          "latest_q_probability": 0,
          "thesis": "example",
          "forecast_at": "2027-01-01T00:00:00Z",
          "market_odds_at_forecast": 0,
          "has_published_signal": false,
          "published_signal_count": 0,
          "relevance": {
            "score": null,
            "matched_by": null,
            "matched_fields": null
          }
        }
      ]
    }
  ],
  "facets": {
    "tags": [
      {
        "value": "example",
        "count": 1
      }
    ],
    "categories": [
      {
        "value": "example",
        "count": 1
      }
    ]
  },
  "retrieval": {
    "graph": "ok",
    "typesense": "ok",
    "semantic": "ok"
  }
}