One URL in. Clean JSON out.
Give this endpoint a tweet URL and it returns that post's public engagement numbers as JSON: views, likes, replies, retweets, quotes and bookmarks, plus the text and the author handle. No X developer account, no OAuth, no paid API tier. One GET, 1 credit.
The difference
On the left, what a headless browser hands you. On the right, what the endpoint hands you.
<article data-testid="tweet" class="css-175oi2r r-1adg3ll r-1ny4l3l"><div class="css-175oi2r r-18u37iz"><div dir="ltr" class="css-901oao r-1nao33i">Shipping notes: response times are down 40% after this week's cache work.</div></div><div role="group" aria-label="90211 views, 1211 likes, 204 reposts" class="css-175oi2r r-1kbdv8c"><div data-testid="like"><span class="css-1jxf684">1,211</span></div><div data-testid="retweet"><span>204</span></div></div><time datetime="2026-07-06T08:15:00.000Z">8h</time><script>window.__INITIAL_STATE__={"entities":{"tweets":{"entities":{"186112... {"data": {"platform": "twitter","entity_id": "1861122334455667788","url": "https://x.com/XDevelopers/status/1861122334455667788","author": {"handle": "XDevelopers","name": "Example Creator"},"posted_at": "2026-06-30T14:05:00Z","metrics": {"views": 1204593,"likes": 88410,"comments": 2314,"shares": 10092}},"request_id": "req_01JZX4M8Q2TE9W"}
The payload
One object for one post. The six counters X shows under a tweet, the text body, the language X assigned it, the publish timestamp, and a small author object with the handle and display name. It also flags whether the post is a reply or a retweet, which matters more than people expect once you start aggregating.
The counters are the public figures at the moment of the call. Views in particular is X's own impression estimate and it climbs fast in the first hours after posting, so two calls minutes apart on a fresh post will disagree. Bookmarks is the quiet one: it tends to move before likes do on posts people intend to come back to.
Both x.com and twitter.com URLs are accepted. The `id` you get back is the numeric status id from the URL, and it is stable, so key your database on that rather than on the link.
Public like count.
Pricing
One tweet is 1 credit — 0.5¢ on the monthly plan, 0.45¢ on annual. $5 covers roughly 1,000 tweets, and calls that fail on deleted or protected posts are never charged.
Estimate only, on a full-year basis. 1 credits per returned tweet. Monthly: $5 per 1,000 credits with $4/1,000 top-ups. Annual: $54 per 12,000 credits with $3/1,000 top-ups. We show whichever plan is cheaper for your annual volume, divided by 12. Failed calls are never charged; cache hits cost the same as fresh calls.
Entry price, side by side
Credits are not equivalent units across vendors — each meters differently. Price your own workload on both before deciding on entry price alone. At high volume, several of these are cheaper per credit than we are.
Engineering notes
We document exactly how every endpoint behaves — nulls, caching, billing — so what you ship on day one is still running in month six. No surprises, no support tickets.
X's own interface has blurred these over the years, so a lot of tooling adds them together and calls the result shares. This endpoint keeps them apart: `shares` is plain retweets, `quotes` is quote tweets. If you are reproducing a figure you saw somewhere else and it does not match, this is usually why.
Decide once which definition your dashboard uses and write it down. Mixing the two across a dataset produces charts that are quietly wrong rather than obviously wrong.
X only started showing public view counts in late 2022, and it still does not surface them everywhere. Posts older than that, and some posts on protected-adjacent or restricted accounts, come back with views null while every other counter is populated. Treat null as absent rather than zero — averaging nulls in as zeroes will drag your numbers down.
The same applies to `bookmarks`, which X displays inconsistently.
We read public pages logged out, the same way a browser does with no session. A post from a protected account, a deleted post, or a post on a suspended account is not reachable and returns an error rather than a half-filled object. Failed calls are not charged.
This is a hard limit, not a tier you can pay past. There is no version of this endpoint that sees private accounts.
Responses sit in the fast cache class, so a repeat call for the same post inside the window comes back in milliseconds with x-cache: hit. A cache hit still costs 1 credit. Pass fresh=true when you specifically need a new read — the first call of a monitoring pass, or right after you know something happened.
The `lang` code comes from X's own classifier. It is fine on a paragraph of prose and unreliable on three words, a link, or a wall of emoji, where it frequently returns "und". Use it as a coarse filter, not as the basis for routing text to a translation pipeline.
Questions
Send a GET to /v1/twitter/stats with the post URL and your API key. There is no developer account, no app review, and no OAuth step. X's official API gates public post metrics behind paid tiers with monthly post caps, which is why most small tracking projects cannot use it. This endpoint reads the public post page and returns the counters as JSON.
1 credit. Credits are $0.005 each on the monthly plan and $0.0045 on annual, so a single call is half a cent or less, and $5 covers roughly a thousand posts. Cached responses cost the same as fresh ones. Calls that fail — deleted post, protected account, bad URL — are not charged.
Both. The two domains point at the same post and either form is accepted, so you can paste whatever your source gave you without rewriting it. The returned `id` is the numeric status id from the end of the URL, which is identical across both domains — use that as your primary key and the domain question stops mattering.
X only started publishing view counts in late 2022 and still hides them in some contexts, so older posts and certain restricted accounts return null there while likes, replies and retweets come back normally. Null means the platform is not showing the number, not that the number is zero. Handle it as missing data or your averages will be wrong.
No, one URL per call. Run them concurrently instead — calls do not depend on each other, so nothing stops you having a batch of them in flight at once. If you are starting from an account rather than a list of links, the X User Tweets API returns a batch of that account's recent posts in a single call.
Depends on the age of the post. In the first few hours, every fifteen minutes to an hour captures the shape of the spike. After the first day, most posts flatten out and daily is plenty. Keep the interval fixed, whatever you pick — uneven sampling makes a velocity chart look like the post did something it did not.
No. We fetch public post pages with no logged-in session, exactly what an anonymous browser sees. Protected accounts, deleted posts and suspended accounts return an error and the call is not billed. There is no setting or plan that changes this — if you cannot open the link in a private browser window, neither can this endpoint.
Next
100 trial credits on signup — no card, key on screen immediately.