Twitter (X) Search Scraper - Tweets by Keyword, No Login avatar

Twitter (X) Search Scraper - Tweets by Keyword, No Login

Pricing

from $0.40 / 1,000 tweet scrapeds

Go to Apify Store
Twitter (X) Search Scraper - Tweets by Keyword, No Login

Twitter (X) Search Scraper - Tweets by Keyword, No Login

Search Twitter (X) for tweets by keyword. X only serves search results to a signed-in session, so this Actor brings its own. Advanced queries work: from:, min_faves:, filter:media and dates. Each tweet has the text, likes, retweets, replies, views, media and author. $0.40 per 1,000 tweets.

Pricing

from $0.40 / 1,000 tweet scrapeds

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

93

Total users

32

Monthly active users

6 hours ago

Last modified

Share

Twitter (X) Search Scraper: tweets by keyword, with the full advanced query syntax

Type the same search you would type into X and get one flat row per tweet: text, likes, retweets, replies, views, media links and the author's numbers. Advanced operators work, because whatever you type is passed to X as the query.

The part worth knowing first: X will not answer a search for a signed-out visitor, so this runs signed in. You do not need an account of your own for that, but you can supply one if you would rather have a rate limit nobody else is drawing on.

InputSearch terms, with X's advanced operators
OutputOne row per tweet
Ceiling5,000 tweets per run, and up to 4,000 for any one term
Account neededNone from you, unless you want to use your own
Price$0.40 per 1,000 tweets, flat on every plan

🔎 What Twitter (X) Search Scraper does

You give it search terms. Each one is run against X's search and paged through until it runs out of results, hits your cap, or reaches 100 pages.

Because the term is sent as written, everything X's advanced search understands works here: from:nasa, "web scraping" min_faves:50, filter:media, -filter:replies, lang:fr, since:2024-01-01. Several terms in one run are fine, and a tweet matching two of them is delivered once, not twice.

sort picks between the newest tweets in the window and what X ranks as most relevant. Top skews to big accounts, which is useful for finding the loudest voices and useless for measuring volume.

Turn on searchCommunities and each term is run against X Communities as well, after the normal search. Those posts land in the same dataset with the community id and link on them, at the same price per post. X searches across communities rather than inside one you pick, and it does not send the community's name back, so that is not on the row.

📥 What you give it

{
"searchTerms": ["\"web scraping\" min_faves:50", "from:nasa"],
"sort": "Latest",
"maxItems": 500
}
FieldDefaultWhat it is
searchTermsnoneRequired. Your queries, one per line, sent to X exactly as typed. The form opens with apify filled in as an example, which is a starting point rather than a default.
sortLatestLatest or Top.
searchCommunitiesfalseAlso search X Communities with each term.
since, untilnoneYYYY-MM-DD bounds. Read the note below before relying on these.
languagenoneOnly tweets X tagged with this language, picked from a list of 32. The same as adding lang: to every term.
minRepliesnoneOnly tweets with at least this many replies, going by X's count when the run reads it.
mediaTypenoneany, photos or videos. Only tweets that carry that kind of media.
maxItems100Hard cap on tweets for the whole run, up to 5,000. Since you pay per tweet, this is also the run's budget.
onlyVerifiedUsersfalseDrop rows whose author is not verified.
sessionCookiesnoneOptional. Your own X account, as auth_token=XXXX; ct0=YYYY, one account per line. Use a throwaway account: the value sits in the run input, which anyone who can open the run can read.
proxyConfigurationApify's defaultLeave it alone. It is there for people who need the run to leave through servers they already pay for.
notionConnector, notionParentIdnoneOptional. Write each tweet into a Notion database as well as the dataset.

since stops a term, until only filters. On Latest a term stops once its tweets are older than since. On Top, since also goes to X with the term. until is checked on each row, so an old window pages past newer tweets, and a tweet from the until day can fall outside. For an old window, put since: and until: in the term.

📤 What you get back

A real row from a real run, with the emoji and the author's bio cut short:

{
"ok": true,
"charged": true,
"id": "2102017699974987896",
"url": "https://x.com/apify/status/2102017699974987896",
"text": "Apify is on the front page of @bot's plugins. Thank you, @grok team and the alphabet ... https://t.co/yGXsw3Vicc",
"createdAt": "Mon Sep 21 12:50:47 +0000 2026",
"lang": "en",
"replyCount": 1,
"retweetCount": 0,
"likeCount": 0,
"quoteCount": 0,
"bookmarkCount": 0,
"viewCount": 29,
"isReply": false,
"isRetweet": false,
"isQuote": false,
"conversationId": "2102017699974987896",
"inReplyToId": null,
"inReplyToUser": null,
"hashtags": [],
"mentions": ["bot", "grok"],
"urls": [],
"media": [{ "type": "photo", "url": "https://pbs.twimg.com/media/HSvdyfaW8AAwwNs.png" }],
"author": {
"id": "3510729917",
"userName": "apify",
"name": "Apify",
"description": "Thousands of Actors to automate your business, get real-time web data, ...",
"followersCount": 16181,
"friendsCount": 300,
"statusesCount": 4897,
"verified": false,
"isBlueVerified": false,
"location": "The Interwebz",
"profileImageUrl": "https://pbs.twimg.com/profile_images/2036008913192316928/yuW3cobE_normal.png",
"createdAt": "Tue Sep 01 08:38:01 +0000 2015"
}
}
FieldWhat it is
text, createdAt, langThe tweet as posted, X's own timestamp format, and the language X tagged it with.
viewCountImpressions. Often the most useful number on the row, and it is null on older tweets X no longer reports it for.
isReply, isRetweet, isQuoteWhat kind of tweet it is, so you can filter the noise out yourself.
conversationId, inReplyToId, inReplyToUserEnough to rebuild a thread from a set of rows.
hashtags, mentions, urlsPulled out of the text as arrays.
mediaOne entry per photo or video, with a direct link.
authorThe posting account: handle, name, bio and follower counts, as X reported them at read time.

🧾 Reading the output

Three kinds of row can land in your dataset.

RowHow to spot itBilled
A tweetok: true and an idyes
The sample row_sample: trueno
A diagnosticok: false and an errorCodeno

Filter on ok == true and you have your data. The charged field is there to separate real rows from sample and diagnostic rows, not as a receipt.

The sample row appears when the run could not sign in at all. Its text says so in as many words, but the numbers beside it are made up, so filter on _sample rather than trusting a table scan.

NO_RESULTS means a term genuinely matched nothing. BLOCKED means a term could not be read this run, which is worth retrying. BAD_INPUT means no usable search terms were supplied. If every term fails, an X_SEARCH_FAILED row says so and the run still finishes.

The Overview table shows text, likeCount, retweetCount, createdAt and url. Open a row or the JSON for the author block and viewCount.

▶️ How to run it

  1. Open Twitter (X) Search Scraper and click Try for free.
  2. Type your queries into Search terms, one per line.
  3. Set Max tweets. It is both the cap and the budget.
  4. Click Start.
  5. Download the dataset as JSON, CSV or Excel, or pull it from the Apify API.

💰 How much does it cost?

$0.40 per 1,000 tweets. Flat on every Apify plan, no volume tiers.

You pay per tweet delivered. The sample row, diagnostic rows, and the second copy of a tweet that matched two of your search terms are not charged. maxItems is the ceiling on what a run can spend, so set it deliberately.

💡 What people use it for

  • Watching a brand, a product name or a hashtag on a schedule and diffing the results week to week.
  • Pulling everything one account posted in a date range with from:handle and date operators.
  • Building a sentiment or topic set, where min_faves: keeps the noise out.
  • Finding people talking about a problem you solve, then working the author fields into a list.

🚧 What it does not do

  • X search is not an archive. It returns what its index will serve, which thins out the further back you go. A missing tweet usually means X did not return it, not that it was missed.
  • No replies under a tweet, and no follower lists. Siblings below cover those.
  • No private or protected accounts, ever.
  • viewCount is null on plenty of older tweets, because X stopped reporting it for them.
  • urls and the author's statusesCount can be empty on some rows, when X's rate limit runs out mid-run. Links stay in text as t.co addresses.
  • Up to 100 pages per term, which works out at about 4,000 tweets for any single query.
  • Community search is across communities, not inside a specific one. X gives no way to scope it.
  • No location filter. X no longer filters search by place, geocode: included.
  • Counts are a snapshot at the moment of reading, not a history.

🧭 Which X scraper do you need?

If you wantUse
Tweets matching a searchThis one
Specific tweets or a profile's timeline by URLTweet Scraper
Profile records for handles you already haveTwitter Profile Scraper
Who follows an accountX Followers Scraper
Everything posted into a curated X listTwitter List Scraper

❓ Questions people ask

Do I need an X account or an API key? Neither. The cookie field is optional and only worth filling in if you want a rate limit of your own.

Do advanced operators really work? Yes. The term goes to X as you typed it, so anything X's advanced search understands is available.

Why did I get fewer tweets than maxItems? Either the search ran out of results, or a term hit the 100-page limit. Diagnostic rows will say if something went wrong.

Can I search inside one community? No. X only offers a search across communities.

Is scraping X legal? This reads public tweets only, never private accounts or messages. Results can still contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.

Can I run it on a schedule? Yes. Use Apify's scheduler, or start it from the API and read the dataset when it finishes.

🆘 If something breaks

Open the Issues tab on the actor page. Include the search terms you used and the run ID, and paste any errorCode you got back, since that usually says what happened straight away.