Tweet Scraper - Tweets by URL or ID, No Login avatar

Tweet Scraper - Tweets by URL or ID, No Login

Pricing

from $0.40 / 1,000 tweet delivereds

Go to Apify Store
Tweet Scraper - Tweets by URL or ID, No Login

Tweet Scraper - Tweets by URL or ID, No Login

Paste tweet URLs or ids and get each tweet in full: text, exact like and reply counts, author with verification flags, hashtags, mentions, expanded links, photos and the highest-bitrate MP4, plus the quoted tweet. No login, no cookies, no proxy.

Pricing

from $0.40 / 1,000 tweet delivereds

Rating

0.0

(0)

Developer

Blackcube

Blackcube

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

14 hours ago

Last modified

Share

Tweet Scraper — Tweets by URL or ID, No Login

More from this account: YouTube Transcript Suite · Website Contact & Email Suite · Career Site & ATS Jobs Suite · Google News Suite · Keyword Research Suite · Shopify Store Intelligence Suite · eBay Data Suite · Amazon Reviews Suite · Reddit · Meta Ad Library · Vinted · Trustpilot Review Intelligence Suite · App Store & Google Play Reviews Suite · Etsy Research Suite · YouTube Comments Intelligence Suite · Telegram Channel Intelligence Suite · Business Reviews Suite · Google Trends Suite · Amazon Product Data Suite · Google Sheets Suite · TikTok Suite · Snapchat Suite · LinkedIn Public Data Suite · Instagram Suite · Contact Validation Suite · Google Maps Suite

Paste tweet URLs or numeric ids and get each tweet back in full, one flat row each. Reads X's own public embed endpoint — the same one an embedded tweet on a news site calls — so there is no account, no cookie, no API key and no proxy anywhere in the path.

What you get per tweet: text, language, posted time, exact like and reply counts, the author with verification flags, hashtags, mentions, expanded links (not t.co stubs), every photo, the highest-bitrate MP4 for video and GIFs, and the quoted tweet when there is one.

What this does and does not do

It resolves tweets you already have references to. That is the honest scope, and it is stated here rather than discovered after you have paid:

✅ Tweet URL or id → the full tweetx.com, twitter.com, mobile and vx/fx mirror links, with or without a query string
✅ Bulk, on a schedulesend ten or ten thousand; built to be called from a pipeline in a loop
✅ Quoted tweets, media, expanded linksincluding the MP4 ladder picked at highest bitrate
❌ Keyword or hashtag searchX's search surface needs an authenticated account; this Actor will not pretend otherwise
❌ Profile timelines / follower liststhe syndication timeline route answered HTTP 429 from plain exits when measured 2026-09-11
❌ Retweet and view countsX's public payload does not carry them, so there is no column that can never fill

What you pay for

$0.40 per 1,000 tweets at the GOLD tier, charged per tweet actually delivered. No run-start fee, no monthly minimum.

Free, every time:

  • a tweet that is deleted, protected or age-restricted — you get a row saying which, at no charge
  • a string that is not a tweet URL or id — a free invalid row naming the reason
  • the same tweet twice in one run — deduplicated before it can be billed twice
  • the coverage and summary rows, so you can always reconcile what you asked for against what arrived

A run that resolves nothing costs nothing.

Input

{
"tweets": [
"https://x.com/jack/status/20",
"https://x.com/elonmusk/status/1585841080431321088",
"1349129669258448897"
],
"maxItems": 1000
}

Feeding it from n8n, Make or a CSV? Send records instead: the tweet reference is found in whichever field is named tweet, url, id, link or status, and every other field comes back on the row as passthrough — so your own record ids ride along and you can join the result straight back onto your table.

{ "records": [{ "tweet_url": "https://x.com/jack/status/20", "crm_id": "A-1042", "owner": "ana" }] }

Output

One row per tweet, plus free bookkeeping rows. type tells them apart: tweet, unavailable, invalid, coverage, summary.

{
"type": "tweet",
"id": "20",
"url": "https://x.com/jack/status/20",
"text": "just setting up my twttr",
"lang": "en",
"createdAt": "2006-03-21T20:50:14.000Z",
"likeCount": 308074,
"replyCount": 18017,
"author": { "screenName": "jack", "name": "jack", "verified": false, "blueVerified": true },
"hashtags": [], "mentions": [], "links": [], "media": [],
"quotedTweetId": null,
"passthrough": null
}

Reliability

Every run ends with a coverage row: how many tweets you asked for, how many arrived, how many were unavailable and why, and whether the run finished or stopped early. Inputs the run never reached get a free row each rather than vanishing — silence about missing rows is the most common complaint on rival listings in this cluster, so it is designed out.

Each tweet carries its own wall-clock budget, clamped on the HTTP request itself rather than merely checked between retries, so one slow fetch cannot consume the run.

Live endpoint: one tweet per call, ~170 ms

If you are enriching a list rather than running a batch, call the Actor as an HTTP endpoint instead of starting a run per tweet. It stays warm between calls, so a request costs you a fraction of a container start and answers in about 170 ms instead of about three seconds.

$curl "https://vonsensey--tweet-scraper.apify.actor/?id=1349129669258448897&token=$APIFY_TOKEN"

id takes a tweet URL or a bare id (url= and tweet= work too). The reply is the same tweet object the dataset would hold:

{ "ok": true, "charged": true, "tweet": { "id": "...", "text": "...", "likeCount": 507849, "...": "..." } }
import os, requests
BASE = "https://vonsensey--tweet-scraper.apify.actor/"
tok = os.environ["APIFY_TOKEN"]
for tweet_id in my_list: # your CRM rows, your spreadsheet, your queue
r = requests.get(BASE, params={"id": tweet_id, "token": tok}).json()
if r["ok"]:
print(r["tweet"]["likeCount"], r["tweet"]["text"])

Same billing as a batch run, per tweet delivered. A tweet that is deleted, protected or age-restricted answers {"ok": false, "charged": false} and costs nothing, and input that is not a tweet reference returns 400 and costs nothing. Each call is billed on its own, so asking for the same tweet twice is two deliveries — unlike a batch run, which de-duplicates its input list.

Use the batch input above when you have the whole list up front: one run over 1,000 ids is cheaper than 1,000 calls.

Use it from n8n, MCP, the API or a schedule

Built to be called by a workflow, not only from the Store form. The Actor is vonsensey/tweet-scraper; every snippet below sends {}, which runs the defaults shown on the form — replace it with your own input.

n8n

Install the Apify community node (@apify/n8n-nodes-apify under Settings → Community Nodes, or search "Apify" on n8n Cloud). Add Apify → Run Actor with Actor vonsensey/tweet-scraper and your input JSON, then Apify → Get Dataset Items on the run's defaultDatasetId and pipe the rows anywhere. For scheduled runs, the On new Apify Event trigger fires when a run of this Actor finishes.

MCP (Claude, Cursor, VS Code, any MCP client)

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=vonsensey/tweet-scraper",
"headers": {
"Authorization": "Bearer <YOUR_APIFY_TOKEN>"
}
}
}
}

Your agent then calls vonsensey/tweet-scraper as a tool with the same input the form takes and reads the dataset back.

REST API (one call, rows in the response)

curl -X POST "https://api.apify.com/v2/acts/vonsensey~tweet-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" -d '{}'

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("vonsensey/tweet-scraper").call(run_input={})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row)

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('vonsensey/tweet-scraper').call({});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Make, Zapier, LangChain, CrewAI

The Apify app in Make and Zapier has a Run an Actor module: pick vonsensey/tweet-scraper. In LangChain and CrewAI the Apify tool wrappers take the same Actor id. A daily schedule needs nothing but the Console: Schedules → Create → this Actor → cron, and the dataset fills on its own.

Run it without configuring anythingScrape tweets by URL or ID: text, likes, author, media, a ready-made example you can start as-is or copy.

Use cases

  • Enrich a list of tweet links. Tweet URLs or ids from a CRM, a spreadsheet or a monitoring tool come back as one flat row each: text, language, posted time, exact like and reply counts, the author with verification flags, hashtags, mentions and expanded links.
  • Archive media before it disappears. Every photo URL and the highest-bitrate MP4 for video and GIFs, so a tweet you cite in a report or a dataset still exists tomorrow.
  • Track engagement on tweets you already know. Re-run the same ids on a schedule and diff the like and reply counts; each run bills only the tweets it delivers.
  • Resolve quoted tweets in one hop. The quoted tweet rides along on the row, so a chain of quote-tweets does not need a second run.
  • Feed it from n8n, Make or a CSV. Send records and every extra field comes back on the row as passthrough, or call it as a warm HTTP endpoint (Standby) that answers one tweet per call.

Run it on a schedule

A one-off pull answers a question; a schedule answers it every day without you. Open Schedules in the Apify Console, point a cron at this Actor, and the dataset keeps filling on its own — no server, no cron box, no babysitting. Everything here is built to be re-run: you are billed per tweet delivered, and a run that resolves nothing costs nothing — there is no start fee.

FAQ

Do I need an X/Twitter API key, a login or a proxy?

No. It reads X’s public embed endpoint — the one an embedded tweet on any news site calls — from Apify’s own exit. No account, no cookie, no API key, no proxy, nothing to configure.

Can it search by keyword or hashtag, or read a profile timeline?

No, and the listing says so up front. X’s search surface needs an authenticated account, and the public timeline route answered HTTP 429 from plain exits when measured (2026-09-11). This Actor resolves tweets you already have references to: URLs or ids from x.com, twitter.com, mobile and vx/fx mirror links.

What does a deleted or protected tweet cost?

Nothing. A tweet that is deleted, protected or age-restricted comes back as a free unavailable row that says which; a string that is not a tweet reference is a free invalid row naming the reason; the same tweet twice in one run is de-duplicated before it can be billed twice.

Are retweet and view counts included?

No. X’s public payload does not carry them, so there is no column for them rather than a column that never fills. Like and reply counts are exact.

What do I pay for a run that finds nothing?

Nothing. There is no start fee and no monthly minimum: $0.40 per 1,000 tweets at the GOLD tier, charged per tweet actually delivered, so a run that resolves nothing costs nothing.

Is this an official X product?

No. Unofficial — not affiliated with, endorsed by, or sponsored by X Corp. It reads only the public embed data X serves to any website and never signs in.


Something wrong, or a field you need that is missing? Open an issue on the Issues tab — it is read and it gets fixed. If this saved you time, a rating on the Store page helps the next person find it.