All notable changes to X Tweet Scraper are documented here. Dates in UTC.
- Pagination now continues through duplicate-only cursor pages before later
unique tweets, preventing under-returned datasets in overlap-heavy searches.
- Combined Latest + Top search now backfills unused Top capacity from later
Latest pages, preventing under-returned datasets when Top has fewer matches.
- Structured
content.anyWords now compiles with X OR syntax instead of
requiring every word, preventing under-returned structured searches.
from and to search filters now strip a leading @, so agent-generated
structured filters such as @openai compile to valid X operators.
- Structured-only search inputs now count as valid input, so agents can run
nested content, user, media, time, geo, engagement, card, and source filters
without also supplying a raw query string.
- Raw output mode now attaches the
raw object consistently across search,
profile media, timelines, page modes, and server-side pagination paths.
- Dataset schema metadata now includes examples and array item types for rich
optional fields, improving Apify tables, MCP tools, and AI-agent discovery.
- Structured content filter arrays now declare string item types for clearer
Apify MCP and AI-agent input generation.
- Media filter descriptions now clarify that these fields apply X search
operators, because X can match card or link media that is not always attached
as tweet media.
- README pricing copy now labels the paid-plan row price while keeping Apify's
account-tier pricing box authoritative for each run.
- Input schema arrays now declare item shapes for URL lists, handle lists, tweet
ID lists, and search term lists, improving Apify MCP and AI-agent discovery.
- README URL examples now use Apify-native
{ "url": "..." } objects to match
the Store input schema.
- Store and README copy now clarify that users do not need an X API key.
- Store and README pricing copy now points to Apify's authoritative pricing box,
while run reports use the live pay-per-event price exposed to the Actor.
- Explicit-mode run reports now name the selected route, such as
thread,
replies, quotes, or retweeters, instead of the generic search fallback.
- Zero-output run reports now include diagnostic dataset rows in
totalPushed
and expose diagnosticRows for AI agents and API clients.
- Pagination status messages now update only after new rows are written,
reducing Apify status API chatter during empty-cursor tails.
- Explicit
mode routing for replies, quotes, thread context, retweeters,
favoriters, articles, profile media, profile likes, profile tweets, profile
replies, list tweets, tweet lookup, and search.
- Apify Store input aliases for common automation patterns:
urls, tweetUrls,
postUrls, profileUrls, usernames, query, searchQuery, tweetId,
tweetIDs, tweets, postIds, lookupPostIds, route-specific tweet ID
arrays, count aliases, and structured search groups.
- Richer dataset fields for
contentDisclosure, displayTextRange,
isLimitedReply, resultType, sourceTweetId, sourceTarget,
engagementMode, article, and nested metadata objects.
- Budget-aware result limiting from Apify max-total-charge settings. The Actor
now returns as many rows as the user budget allows and stops before exceeding
that cap.
- Clearer input, output, dataset, and key-value store schema descriptions for
users and AI agent tools.
- Public listing metadata now reflects the current route coverage,
pay-per-result model, no start fee, no query fee, and no API-key requirement.
- README examples now match the live schemas, including X native timestamp
strings and the current
resultType wording.
- Empty runs still write at most 1 diagnostic row so users can see why a run
produced no tweet rows.
- Tweet lookup and explicit modes now share the same global result-budget
behavior instead of treating each target independently.
- Account date-window search terms such as
from:user since:2026-05-01 until:2026-05-02 now route through timeline mode
and apply the date window after fetching timeline pages. This avoids missed
results from empty or relevance-ranked generic search pages.
- Multi-list and multi-search runs now enforce
maxItems as a global cap across
the whole run instead of letting each later target receive the full limit
again.
- Timed search windows now keep paging through live empty cursors when X returns
a temporary empty page before later results.
- Timeline fallback logic now preserves the requested account and date window
instead of broadening the search unexpectedly.
- High-parallel runs now wait longer on temporary 429 responses before moving on
to the next page or search term.
- Search terms and handle inputs now normalize accidental
_HH:MM:SS_UTC
suffixes on from:/to: handles and convert since:/until: UTC date-time
values to since_time:/until_time:.
- Custom validation error messages on
maxItems, lang, within, and
geocode for human-readable feedback.
type field enum in dataset schema for MCP agent discovery.
- Nested
properties on quoted_tweet and retweeted_tweet so AI agents can
chain on sub-fields.
/with_replies, /media, /likes, /highlights, /articles,
/superfollows accepted as profile URLs.
- Soft-cap truncation now emits a status message so users see when inputs were
capped.
- CHANGELOG linked from Apify Information tab.
- Dataset schema
required relaxed from ["id", "text"] to ["id"]. Protects
against X returning withheld or deleted tweets without text, which
previously caused entire batch pushes to fail with 400.
- Empty runs write at most 1 diagnostic row to the default dataset so users can
see what happened. This row is billed like 1 result row.
- Tweet-ID description corrected from "up to 100" to "up to 10,000 per run"
(chunked transparently).
maxItems default and prefill aligned at 100 to prevent 20x billing surprise.
- Default input prefills only
startUrls (previously also prefilled
twitterHandles, listIds, twitterContent, which were silently ignored by
routing).
createdAt.example in dataset schema corrected to X native format
(Tue Jun 02 20:12:29 +0000 2009).
- README drops "cheapest" claim; title raised to "50+ filters" matching actual
count.
- Redundant
required: ["maxItems"] removed from input schema (field has
default: 200).
Initial release on Apify Store.