~ / endpoints / Tweet API

Twitter / X Tweet Scraper API

Our Twitter tweet scraper turns any tweet URL or numeric status id into structured JSON: the full text, the author, favorite and reply counts, language, entities, and any attached media, all from one request with no login and no developer account.

Get a free API keyView endpoints
1,000
free requests / mo
2.6s
median response
JSON
structured output
1
flat charge per tweet

Quickstart

cURL
curl "https://api.twitterscraperapi.com/api/v1/xtwitter/tweet?url=https://x.com/jack/status/20&api_key=$API_KEY"
Python
import requests, os

BASE = "https://api.twitterscraperapi.com"
API_KEY = os.environ["API_KEY"]

# Pass a full tweet URL or just the numeric status id.
resp = requests.get(
    f"{BASE}/api/v1/xtwitter/tweet",
    params={
        "url": "https://x.com/jack/status/20",  # or id="20"
        "api_key": API_KEY,
    },
    timeout=30,
)
tweet = resp.json()

print(tweet["user"]["screen_name"], "-", tweet["text"])
print(tweet["favorite_count"], "favorites,", tweet["reply_count"], "replies")
print("posted", tweet["created_at"], "in", tweet["lang"])

Response

200 OK
{
  "id": "20",
  "id_str": "20",
  "url": "https://x.com/jack/status/20",
  "socialPlatform": "twitter",
  "text": "just setting up my twttr",
  "full_text": "just setting up my twttr",
  "lang": "en",
  "created_at": "2006-03-21T20:50:14.000Z",
  "favorite_count": 308537,
  "reply_count": 17947,
  "conversation_count": 17947,
  "retweet_count": null,
  "quote_count": null,
  "views": null,
  "possibly_sensitive": null,
  "is_edited": false,
  "user": {
    "screen_name": "jack",
    "name": "jack",
    "id_str": "12",
    "is_blue_verified": true,
    "verified": false,
    "profile_image_url_https": "https://pbs.twimg.com/profile_images/1661201415899951105/azNjKOSH_normal.jpg",
    "url": "https://x.com/jack"
  },
  "entities": {
    "urls": [],
    "user_mentions": [],
    "hashtags": [],
    "symbols": []
  },
  "media": [],
  "thumbnail": null
}
FieldTypeDescription
id_strstringThe tweet's numeric status id as a string, the stable identifier for the post.
urlstringCanonical tweet URL, https://x.com//status/.
textstringThe tweet body. full_text carries the same value for consistency with X's own field name.
langstringDetected language of the tweet as a BCP-47 code, e.g. en.
created_atstringISO 8601 timestamp of when the tweet was posted.
favorite_countintegerNumber of likes. Guaranteed on the response along with reply_count.
reply_countintegerNumber of replies, taken from conversation_count. Guaranteed on the response.
conversation_countintegerReply count for the conversation, equal to reply_count.

Use it for

>

Enrich saved tweet links

Resolve a list of tweet URLs into text, author, timestamp, and engagement so a spreadsheet of links becomes structured rows.
>

Track engagement over time

Poll a tweet on a schedule and store favorite_count and reply_count to build the like and reply history X does not chart for you.
>

Social listening and mentions

When a tweet URL surfaces in an alert or feed, pull its full text and author to score sentiment and route it to the right team.
>

Embed tweets in your app

Fetch the text, author handle, avatar, and media for a tweet id and render your own card without X's script or login gate.

Why it is hard

X shut its free API tier in 2023 and now starts paid access around 100 dollars a month, while a logged-out visit to a tweet returns a JavaScript shell that hides the text behind a login wall. Reading one public tweet used to be a single GET; today it is an auth-gated, rate-limited endpoint or a brittle scrape.

Pricing

PlanPriceBest for
Free1,000 requestsTesting and small jobs
Pro$0.60 / 1kProduction workloads
Pay-as-you-go$0.90 / 1kSpiky or one-off volume

Median response 2.6s. You only pay for successful requests.

FAQ

What is a Twitter tweet scraper?

A Twitter tweet scraper is a tool that reads a public tweet and returns its data in a structured format. Our tweet scraper API takes a tweet URL or a numeric status id and returns the full text, author, created_at timestamp, language, favorite and reply counts, entities, and any media as JSON from a single request, with no login required.

Do I need an X (Twitter) developer account or API key?

No. You authenticate with a single twitterscraperapi key passed as the api_key query parameter. There is no X developer account to apply for, no OAuth flow, and no paid X API tier, which as of 2023 starts at around 100 dollars a month. The free tier includes 1,000 requests so you can test first.

Can I pass a tweet URL or only the id?

Either works. Pass the full tweet URL, for example https://x.com/jack/status/20 or a twitter.com/.../status/ link, and we parse the numeric id out of it, or pass the bare id like 20 directly. One of url or id is required.

Which engagement metrics does it return?

Favorite count (likes) and reply count are guaranteed on every response. Retweet count, quote count, and view count are best-effort: X includes them on some tweets but not all, so when they are absent our API returns null for that field rather than omitting it, which keeps the JSON shape stable for your parser.

Does it return media, mentions, and hashtags?

Yes. The entities object breaks out urls, user_mentions, hashtags, and symbols as arrays, any of which can be empty. Attached photos and video thumbnails come back as URLs in the media array, and the first one is also set as thumbnail, or null when the tweet has no media.

How fast is the tweet scraper API?

Median end-to-end response is about 2.6 seconds, which includes proxy routing, anti-bot handling, retries, and parsing. One call returns the whole tweet, author, and engagement together, so you do not chain extra requests to assemble a single post.

Get tweet api as JSON
Free plan, 1,000 requests. No credit card required.
Get a free API key All endpoints