POST

/api/v1/x/search

Adaptive, high-reasoning Grok 4.5 research over X

Research X with a high-reasoning xAI Grok 4.5 agent that runs multiple targeted searches, inspects the evidence, and refines or broadens later searches within a hard three-turn ceiling. The default and maximum window is 365 days. Results may include substantive original posts, replies, quote posts, and thread entries; only content-free promotion/spam, engagement bait, duplicates, and broad-topic matches without evidentiary value are excluded. The response returns citation-grounded posts, accounts, optional Quotient market context, and Quotient expert metadata. Results are not persisted by Quotient and provider storage is disabled. A request whose X Search does not execute or does not complete the required multi-search research returns 502 upstream_search_unavailable; candidate posts that all fail citation grounding return 502 upstream_grounding_failed. These failures are not billed. A 200 with meta.result_count 0 therefore means the search ran and genuinely found no candidate posts.

Price $1.00Auth x-quotient-api-key or x402Limit 5/s · 60/min · 500/day

Parameters

None.

Request body

application/json, required

FieldTypeDescription
query
required
string

Minimum length: 1; Maximum length: 4000

market_slugsstring[]Optional cached Quotient markets to pair with X results.

Maximum items: 10

from_datestringInclusive YYYY-MM-DD. Defaults to 365 days before to_date; the maximum span is 365 days.

Format: date

to_datestringInclusive YYYY-MM-DD. Defaults to today; from_date still must be no more than 365 days earlier.

Format: date

allowed_x_handlesstring[]Optional provider-enforced account allowlist.

Maximum items: 20

limitinteger

Default: 8; Minimum: 1; Maximum: 15

Responses

200: Structured, citation-grounded X results
FieldTypeDescription
querystring
summarystring
postsXSearchPost[]
posts fields
FieldTypeDescription
post_idstring
urlstring

Format: uri

author_handlestring
author_namestring | null
published_atstring | null

Format: date-time

textstring
relevant_excerptstring
relevancestring
stance"supports_yes" | "supports_no" | "mixed" | "context" | "unknown"
linked_market_slugsstring[]
author_metadataQuotientXAccountMetadataQuotient's account classification metadata. Reviewed expert status records Quotient classification provenance.
author_metadata fields
FieldTypeDescription
handlestring
display_namestring | null
x_user_idstring | null
current_usernamestring | null
is_quotient_expertboolean
quotient_expertobject | null
quotient_expert fields
FieldTypeDescription
designation"reviewed_expert"
policy_versionstring | null
accountsobject[]
accounts fields
FieldTypeDescription
handlestring
display_namestring | null
descriptionstring | null
profile_urlstring
quotient_metadataQuotientXAccountMetadataQuotient's account classification metadata. Reviewed expert status records Quotient classification provenance.
quotient_metadata fields
FieldTypeDescription
handlestring
display_namestring | null
x_user_idstring | null
current_usernamestring | null
is_quotient_expertboolean
quotient_expertobject | null
quotient_expert fields
FieldTypeDescription
designation"reviewed_expert"
policy_versionstring | null
quotient_marketsQuotientMarketContext[]
quotient_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

market_idstring | null
questionstring
resolution_criteriastring | null
resolution_sourcestring | null
end_datestring | null

Format: date-time

condition_idstring | null
status"open" | "resolved"
resolved_yesboolean | null
venue_dataobject
venue_data fields
FieldTypeDescription
yes_oddsnumber | null
volume_24hnumber | null
quotient_urlstring | null
forecastCompactForecast | null
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
number
created_at
required
string

Format: date-time

headlinestring | null
thesis
required
string | null
resolution_pathway
required
ResolutionPathwayThe 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 | null
delta_reasoningstring | null
refresh_reasonstring | null
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
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
gapsstring[]
citationsstring[]
metaobject
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 request body
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.
502: xAI unavailable (upstream_unavailable), X Search did not execute or complete the required multi-search research (upstream_search_unavailable), or candidate posts all failed citation grounding (upstream_grounding_failed). Not billed.
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: X search is not configured
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 "content-type: application/json" \
  --data '{"query":"What evidence is changing the odds of a 2026 Ukraine ceasefire?","market_slugs":["russia-x-ukraine-ceasefire-in-2026"],"limit":15}' \
  'https://quotient-api-gateway.onrender.com/api/v1/x/search'
200 · application/json
{
  "query": "example",
  "summary": "example",
  "posts": [
    {
      "post_id": "example",
      "url": "example",
      "author_handle": "example",
      "author_name": "example",
      "published_at": "2027-01-01T00:00:00Z",
      "text": "example",
      "relevant_excerpt": "example",
      "relevance": "example",
      "stance": "supports_yes",
      "linked_market_slugs": [
        "example"
      ],
      "author_metadata": {
        "handle": "example",
        "display_name": "example",
        "x_user_id": "example",
        "current_username": "example",
        "is_quotient_expert": false,
        "quotient_expert": {
          "designation": "reviewed_expert",
          "policy_version": "example"
        }
      }
    }
  ],
  "accounts": [
    {
      "handle": "example",
      "display_name": "example",
      "description": "example",
      "profile_url": "example",
      "quotient_metadata": {
        "handle": "example",
        "display_name": "example",
        "x_user_id": "example",
        "current_username": "example",
        "is_quotient_expert": false,
        "quotient_expert": {
          "designation": "reviewed_expert",
          "policy_version": "example"
        }
      }
    }
  ],
  "quotient_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",
      "market_id": "example",
      "question": "example",
      "resolution_criteria": "example",
      "resolution_source": "example",
      "end_date": "2027-01-01T00:00:00Z",
      "condition_id": "example",
      "status": "open",
      "resolved_yes": false,
      "venue_data": {
        "yes_odds": 0,
        "volume_24h": 0
      },
      "quotient_url": "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",
        "headline": "example",
        "thesis": "example",
        "resolution_pathway": {
          "criteria": "example",
          "crux": "example",
          "deadline": "2027-01-01T00:00:00Z",
          "source": "example"
        },
        "delta_from_prior": 0,
        "delta_reasoning": "example",
        "refresh_reason": "example",
        "relationships": {
          "assets": [
            {}
          ],
          "markets": [
            {}
          ],
          "signals": [
            {}
          ],
          "truncated": {
            "assets": false,
            "markets": false,
            "signals": 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
        }
      }
    }
  ],
  "gaps": [
    "example"
  ],
  "citations": [
    "example"
  ],
  "meta": {}
}