Analysis
Twitter stock & crypto signals API for cashtags
Read bullish and bearish stock and crypto stances in X posts with AI. Get content type, conviction, relevance, and cashtag totals. 2 credits per analyzed post.
- 200
- 400
- 401
- 402
- 403
- 424
- 429
- 502
- 503
POST
Twitter stock & crypto signals API for cashtags
2 credits per analyzed post · All plans from $0.00012/credit · Supports guest paid reads
POST /api/v1/x/analysis/market-signals.
The summary counts bullish and bearish posts per cashtag. Name the asset in
analysis.targets.
Name the asset
Put the asset inanalysis.targets, with its ticker and other names as
aliases. A post mentions the target when its text contains the name or an
alias, in any letter case.
relevance says whether a post discusses the target as an asset, a position,
or a price. Posts about the wider market, competitors, or suppliers do not
count. Neither does a ticker in a list of tags.
Filter rows on relevance before you count stances. The snippets keep posts
from 0.5.
Read the market answers
results[].answers holds each decision by question ID.
stance classifies the author’s own view, not quoted views or ads.
conviction judges how firmly the text states the stance, not engagement or
follower counts. A post with no stance on the target scores 0. It can have
decimals, such as 1.6 between a reasoned view and a firm call.
The answers describe what posts say, not whether claims are true. They are not
investment advice.
Read the signal per cashtag
analysisSummary.cashtags lists up to 20 cashtags, most posts first. Each entry
has rows, the category counts in choices, and signal.
signal holds bullish and bearish post counts and a score from -1 to
1. The score is bullish minus bearish posts, divided by the cashtag’s posts.
results[].cashtags lists the cashtags in each post’s text, in upper case. A
post with 2 cashtags counts toward both.
analysisSummary.targets counts the posts that mention each target, with their
category counts.
Pick the posts to analyze
SendtweetIds, texts, or a search, never more than 1. Sending none, or more
than 1, returns 400 invalid_input.
A search combines every search field you send into 1 X search.
queryType sets the order, Latest or Top. For more posts than 1 call
returns, send the same search again with cursor set to next_cursor. Stop
when has_next_page is false.
query takes cashtags and operators, such as $NVDA lang:en. Send username
to read 1 trader’s or analyst’s posts.
Compare with an earlier answer
Send theresults of an earlier call as baseline to see what changed. Each
row in the new results gets monitor, and analysisSummary.monitor counts
the posts per status. The comparison costs nothing extra.
id, or tweet.id, and its answers. Send
whole result rows when you have them. Their monitor carries the settings’
fingerprint, so rows from other settings show as not_comparable.
A decision counts as changed only when the new answer clearly leaves the old
one, so near ties between calls stay
unchanged. Keep analysis the same
between calls for comparable answers.
Budget the analysis
Each analyzed post costs 2 credits. Each text intexts costs the same. Posts
in unanalyzed cost nothing.
When credits cover fewer posts than you asked for, fewer come back. The posts
left over appear in unanalyzed with insufficient_credits. If credits cover
no post, the call returns 402 insufficient_credits.
Body
string[]
Up to 100 post IDs or post URLs, such as
x.com/nasa/status/20. A post named
twice is analyzed once. Send tweetIds, texts, or a search, not more than 1.string
X search to analyze, with the operators of Search Tweets.
string
Analyze 1 account’s posts. Send a handle, with or without
@, or a profile URL.string
Analyze a public List’s posts. Send its ID or URL.
string
Analyze the quotes of 1 post. Send its ID or URL.
string
Analyze the replies in 1 post’s conversation. Send its ID or URL.
string
Inclusive start of the search, such as
2026-09-25T00:00:00Z. Unix seconds
also work. A time without an offset is UTC.string
Exclusive end of the search. Unix seconds also work. A time without an offset
is UTC.
string
Search order:
Latest or Top. Defaults to Latest.integer
Maximum posts to analyze from the search. Range:
1-100. Defaults to 20.
Credits can return fewer.string
The
next_cursor of the page before. Send the same search with it.string[]
Up to 100 texts of your own, such as drafts. Each must contain words. Reads
nothing from X.
object[]
Rows of an earlier answer to compare with, up to 10,000, such as its
results. Each needs the post’s id, or tweet.id, and its answers. Each
new result’s monitor says whether the post is new, changed, or unchanged.
The comparison costs nothing extra.object
Optional settings. Leave it out to ask the route’s own questions.
Headers
string
Full account API key. An OAuth bearer token also works.
string
Send
Bearer xq_your_guest_key_here for an active paid_reads guest key.string
required
Must be
application/json. The body can be up to 256 KB.Response
200 OK
object[]
Each analyzed post with its answers. Each row costs 2 credits.
object[]
Each post without an analysis. These cost nothing.
object
Totals of the answers across the analyzed posts.
boolean
Whether the search has more posts. Always
false for tweetIds and texts.string
Send it as
cursor with the same search for the next page. Empty when there is none.400 Invalid input
401 Unauthenticated
Anonymous requests getWWW-Authenticate: Bearer and a guest wallet checkout action. This is not a Payment challenge.
x-api-key header value.
402 Payment required
Full account keys can receiveno_subscription, subscription_inactive, no_credits, or insufficient_credits with account payment options. Guest keys receive only the guest top-up action.
The failed request creates no checkout. Ask the user to confirm before calling any checkout or top-up route.
403 Protected account
502 X API unavailable
503 Service busy
Retry-After header, then send the request again.
The request costs nothing.
429 Rate limit exceeded
Retry-After header before retrying.
424 Dependency failed
Stock & crypto sentiment API questions
How do I get the sentiment of a stock or coin on X?
Search its cashtag inquery and name it in analysis.targets. Each row in
results holds the post’s stance, and analysisSummary.cashtags counts
bullish and bearish posts.
What does the cashtag score mean?
signal.score is bullish minus bearish posts, divided by the cashtag’s posts.
1 means every post is bullish, and -1 means every post is bearish.
How do I drop spam and shilling?
Skip rows whosecontent is promotion, and keep rows with high relevance.
That drops signal groups, ads, and tickers used as tags.
Does it work for crypto?
Yes. Name the coin inanalysis.targets, such as Bitcoin with the alias
BTC. Cashtags like $BTC count in analysisSummary.cashtags.
How much do market signals cost?
Each analyzed post costs 2 credits. Posts inunanalyzed and refused requests
cost nothing.
Does this replace X’s official API?
No. This page documents Xquik, an independent third-party service. It does not document X’s official API.Next steps. Sentiment analysis reads the general attitude of posts, or Search Tweets previews the posts a query returns.