X Twitter Scraper - Date Filter That Works, Replies & Quotes avatar

X Twitter Scraper - Date Filter That Works, Replies & Quotes

Pricing

from $0.40 / 1,000 tweet, reply or quote rows

Go to Apify Store
X Twitter Scraper - Date Filter That Works, Replies & Quotes

X Twitter Scraper - Date Filter That Works, Replies & Quotes

X (Twitter) scraper with a date filter that holds: exact since/until windows, tweets outside the window dropped and counted. Full reply threads, quote tweets, followers, author profiles, topic, influencer, sentiment, trend and bot-signal rows. No-login profile mode. JSON, CSV, Excel.

Pricing

from $0.40 / 1,000 tweet, reply or quote rows

Rating

0.0

(0)

Developer

daehwan kim

daehwan kim

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Every tweet is checked against your date window, and the ones outside it are dropped and counted, never billed. A search that finds nothing costs one query event and no tweet rows. Reply threads and quote tweets come back as one row each.

Zero results cost $0.01, nothing more. A search term, profile or tweet URL that returns no tweets is charged only its query-completed event ($0.01). Tweet-row charges for it: 0.

This Actor is not affiliated with, endorsed by, or sponsored by X Corp. "X" and "Twitter" only describe what it works with.

Free plan vs paid plans

Free Apify plan (a preview)Any paid Apify plan
Tweets per runUp to 25Up to your maximums (20,000 per search term, 3,200 per profile)
Search (needs your own X cookies)Locked: search with your own X session is a paid feature. Pasted cookies are ignored, so your X account is never usedEvery page of every search term, exact date window, Latest or Top
Profiles and tweet URLsYes, within the 25 tweetsFull timelines
Reply threads, quote tweets, followersLockedYes, one row each
Analysis rowsOne preview row per type (5 types), marked preview: true with totalEvery row of every type
Author profile rowsUp to 5One per unique author

Every free run ends as SUCCEEDED with a free-plan-preview notice row and status message that count what a paid run would have added for the same input, for example: "Free preview: 25 tweets and 5 analysis rows (5 of 62). Paid plans get ~2,400 more tweets, 316 replies, 74 quotes and 57 more analysis rows for this input." The tweet estimate comes from X's own numbers: the profile's tweet count, or whether the timeline offered another page. If you entered search terms, the notice also says "Search with your own X session is a paid feature" and how many terms were locked. A free run with only search terms ends right away with that notice and is not charged. Preview analysis rows and notice rows are never charged.

What you get

InputWithout loginWith your own X session cookies
Profiles (NASA, @NASA, profile URL)Profile row + timeline tweets+ reply threads, quote tweets, followers
Tweet URLsThe tweet+ its reply thread and quote tweets
Search terms (any X search syntax)Not available: X only answers search to signed-in sessionsSearch with an exact date window, Latest or Top (paid plans)

Every run also adds one profile row per unique author (followers, following, account age, verification, bio) taken from tweets already fetched, so no extra requests. Each query also gets analysis rows (free plan: one preview row per type):

  • Topic clusters: the hashtags, words and link domains that group the conversation, with size, engagement and top tweet.
  • Influencer ranking: authors ranked by engagement in your sample, with engagement per follower.
  • Complaint and sentiment themes: refunds, bugs, outages, support, price, cancellations, scams and praise, each with sample tweets (English word lists).
  • Time trend: hourly or daily buckets with engagement and spike flags.
  • Bot-suspicion signals: new accounts, extreme posting rates, default avatars, copy-paste text. A signal, not a verdict.

How the date window works

  1. since (inclusive) and until (exclusive) are turned into exact UTC timestamps and sent to X as since_time: / until_time:. X's plain since: / until: date operators are read in a time zone you do not control; in our test only 4.3% of the results they returned fell inside the UTC window.
  2. Every top-level tweet is checked again on its own createdAt. Tweets outside the window are dropped before delivery.
  3. The query-summary row says what happened: window, receivedFromX, droppedOutsideWindow, droppedByFilters, duplicatesSkipped, delivered counts, and stoppedBy.

Quoted or retweeted originals inside a tweet are kept as fields (quotedTweet, retweetedTweet) and never used for the window check. Reply and quote rows belong to in-window tweets; their own dates can be later, and insideWindow shows it on every row.

Common complaints about tweet scrapers, and what this Actor does

Complaint pattern in public reviews (paraphrased)Here
Date filter ignored, results outside the requested rangeExact epoch window + a second check per tweet; drops are published on the summary row
Charged for "noResults" or demo rowsA zero-result query is one query-completed event. No placeholder rows. Notice rows are never billed
The free-plan price is about 100 times the listed priceOne price on every plan. The free plan is a capped taste: same price, fewer rows
Asked for 1,000 results, got 100Pages are walked until your maximum, the end of results, or X's limit; stoppedBy tells you which

Pricing (pay per event, same price on every plan)

EventPriceWhen
run-started$0.005Once per run, after the X web client started. Not charged if it could not start
query-completed$0.01Once per search term, profile or tweet URL whose lookup completed, including zero results or a missing profile
tweet-row$0.0004Per unique tweet, reply or quote row delivered
profile-row$0.002Per profile or follower row delivered
analysis-row$0.02Per analysis row delivered on paid plans. Free-plan preview rows are not charged

Example: one search term, 500 tweets, 10 threads with 400 replies and quotes, 150 author profiles, 20 analysis rows costs about $0.005 + $0.01 + 900 × $0.0004 + 150 × $0.002 + 20 × $0.02 = $1.08. Set "Maximum cost per run" in Apify to cap any run; the Actor stops cleanly at that cap.

Free plan

Up to 25 tweet rows and 5 profile rows per run from profiles and tweet URLs, which work without login. Search, reply threads, quote tweets and followers are locked, and pasted cookies are ignored, so a free run never acts as your X account. Each analysis type shows its first row as a preview (preview: true, shown: 1, total: rows a paid run gets), not charged. The run ends as SUCCEEDED with a free-plan-preview notice row and status message listing what a paid run would have added: estimated more tweets, the reply and quote counts on the tweets you got, locked analysis rows and, with "Search with your own X session is a paid feature", the number of locked search terms.

Your X session cookies

X answers search, reply threads, quotes and followers only to signed-in sessions. On a paid plan, paste your own x.com cookies into cookies: a cookie-editor JSON export, or a header like auth_token=…; ct0=… (both are required). The free plan ignores cookies.

  • The run acts as your X account. You accept the risk of X limiting or locking that account, and you are responsible for complying with X's terms.
  • Requests follow X's own per-account limits (search: 50 requests per 15 minutes). When a limit is reached the run waits for the reset (up to maxRateLimitWaitSeconds) or skips that step with a notice row.
  • A query that hits the search limit keeps its partial results and a reason row (stoppedBy: "rate-limit" on its query-summary row), and the run still ends as SUCCEEDED.
  • The value is stored encrypted by Apify (secret input) and is never written to the log, the dataset or the key-value store.

Input example

{
"searchTerms": ["\"customer support\" (acme OR acmeapp) -filter:retweets"],
"since": "2026-09-01",
"until": "2026-09-08",
"searchMode": "Latest",
"maxTweetsPerQuery": 500,
"threadsPerQuery": 10,
"maxRepliesPerTweet": 100,
"minLikes": 2,
"cookies": "auth_token=…; ct0=…"
}

Output example (tweet row)

{
"rowType": "tweet",
"id": "2102882545427714266",
"url": "https://x.com/NASA/status/2102882545427714266",
"text": "Welcome to the Artemis Accords, Croatia 🇭🇷 …",
"createdAt": "2026-09-23T22:07:23.000Z",
"lang": "en",
"conversationId": "2102882545427714266",
"isReply": false,
"isQuote": false,
"isRetweet": false,
"likeCount": 2219,
"replyCount": 57,
"retweetCount": 227,
"quoteCount": 29,
"bookmarkCount": 167,
"viewCount": 291797,
"totalEngagement": 2699,
"urls": ["https://go.nasa.gov/3VcvAQn"],
"media": [{ "type": "photo", "url": "https://pbs.twimg.com/media/HS7wh0rXMAA61bq.jpg", "width": 2000, "height": 1125 }],
"author": { "userName": "NASA", "followers": 92373166, "isBlueVerified": true, "verifiedType": "Government" },
"matchedQuery": "@NASA",
"insideWindow": null,
"collectedAt": "2026-09-24T01:20:00.000Z"
}

Reply rows add parentTweetId, threadRootId and isDirectReply; quote rows add parentTweetId. Row types: tweet, reply, quote, profile, follower, topic-cluster, influencer-rank, sentiment-theme, time-trend, bot-signal, query-summary, notice. The dataset has table views for tweets, profiles, summaries and analysis. Export as JSON, CSV or Excel.

Responsible use

The data is public X content collected at your request. You are responsible for lawful use of it (GDPR, CCPA and other law), for the terms of the sites involved, and for any use of your own X session. Do not use it for harassment, stalking or spam.

Leave a review

If this Actor saved you time, a short review on its Apify Store page helps other people find it. If something breaks, open an issue on the Actor's Issues tab and include the run ID; we fix scrapers quickly when X changes.