POST

/api/v1/x/profile

Adaptive, high-reasoning profile of one X account

Profile a single X account using a high-reasoning Grok 4.5 agent that adaptively runs targeted X searches across the requested history until the fixed evidence goals — interests and beliefs, risk and trading behaviour, and reasoning style — are supported or the hard three-turn research ceiling is exhausted. The default and maximum window is 365 days. A synthesis pass returns evidenced interests, beliefs, tendencies, risk posture, information-processing style, and hints for tailoring recommendations. Every claim cites post_ids present in the returned evidence; unsupported claims are dropped. Accounts with fewer than 15 grounded posts return 404 and are not billed. Successful results are persisted in Neo4j and reused across callers while less than 30 days old when handle, focus, and lookback match; provider storage remains disabled.

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

Parameters

None.

Request body

application/json, required

FieldTypeDescription
handle
required
stringX handle to profile, with or without a leading @.

Pattern: ^@?[A-Za-z0-9_]{1,15}$

lookback_daysintegerSize of the trailing window to study. Defaults to 365 days and cannot exceed 365 days.

Default: 365; Minimum: 14; Maximum: 365

focus"general" | "trading" | "reasoning"Reweights the same search toward speculative decision-making or toward information processing. Does not add a second search.

Default: "general"

Responses

200: Evidence-grounded psychographic profile, newly researched or served from the shared cache while less than 30 days old
FieldTypeDescription
handlestring
display_namestring | 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
windowobject
window fields
FieldTypeDescription
from_datestring

Format: date

to_datestring

Format: date

lookback_daysinteger
post_countintegerDistinct citation-grounded posts the profile is built from.
interestsobject[]
interests fields
FieldTypeDescription
post_idsstring[]
topicstring
weightnumberRelative prominence in the window, 0-1.
beliefsobject[]
beliefs fields
FieldTypeDescription
post_idsstring[]
claimstring
confidencestring
tendenciesobject[]
tendencies fields
FieldTypeDescription
post_idsstring[]
traitstring
descriptionstring
risk_profileobject | null
risk_profile fields
FieldTypeDescription
post_idsstring[]
posturestring
time_horizonstring
position_sizingstring
reaction_to_lossstring
information_processingobject | nullHow the account handles complex, ambiguous, or conflicting information.
information_processing fields
FieldTypeDescription
post_idsstring[]
stylestring
evidence_preferencestring
handles_ambiguitystring
changes_mind_whenstring
recommendation_hintsobject | nullDirect inputs for tailoring suggestions to this person.
recommendation_hints fields
FieldTypeDescription
market_categoriesstring[]
tonestring
avoidstring[]
observationsobject[]Raw retrieval findings before synthesis, tagged by angle, each citing its own post_ids.
observations fields
FieldTypeDescription
dimensionstring
statementstring
post_idsstring[]
evidenceobject[]Every grounded post the profile draws on. All post_ids resolve here.
evidence fields
FieldTypeDescription
post_idstring
urlstring
published_atstring | null
excerptstring
confidence"low" | "medium" | "high"
gapsstring[]What the window could not establish.
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.
404: The account has too little public posting in the window to profile (insufficient_post_history). The gateway does not bill or settle 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.
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 X Search unavailable or not executed. 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 profiling 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 '{"handle":"vitalikbuterin","lookback_days":365,"focus":"trading"}' \
  'https://quotient-api-gateway.onrender.com/api/v1/x/profile'
200 · application/json
{
  "handle": "example",
  "display_name": "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"
    }
  },
  "window": {
    "from_date": "2027-01-01",
    "to_date": "2027-01-01",
    "lookback_days": 0,
    "post_count": 0
  },
  "interests": [
    {
      "post_ids": [
        "example"
      ],
      "topic": "example",
      "weight": 0
    }
  ],
  "beliefs": [
    {
      "post_ids": [
        "example"
      ],
      "claim": "example",
      "confidence": "example"
    }
  ],
  "tendencies": [
    {
      "post_ids": [
        "example"
      ],
      "trait": "example",
      "description": "example"
    }
  ],
  "risk_profile": {
    "post_ids": [
      "example"
    ],
    "posture": "example",
    "time_horizon": "example",
    "position_sizing": "example",
    "reaction_to_loss": "example"
  },
  "information_processing": {
    "post_ids": [
      "example"
    ],
    "style": "example",
    "evidence_preference": "example",
    "handles_ambiguity": "example",
    "changes_mind_when": "example"
  },
  "recommendation_hints": {
    "market_categories": [
      "example"
    ],
    "tone": "example",
    "avoid": [
      "example"
    ]
  },
  "observations": [
    {
      "dimension": "example",
      "statement": "example",
      "post_ids": [
        "example"
      ]
    }
  ],
  "evidence": [
    {
      "post_id": "example",
      "url": "example",
      "published_at": "example",
      "excerpt": "example"
    }
  ],
  "confidence": "low",
  "gaps": [
    "example"
  ],
  "meta": {}
}