- A slow proxy no longer retires working X accounts. When the session check timed out
(
Operation timed out), the Actor took it as X rejecting the account, flagged it dead and
took the next one — three live accounts went that way in three minutes. Timeouts are now
retried like any other network failure, and an account whose check fails for a network
reason goes back to the pool untouched; only an actual rejection from X retires it.
- Community members went missing again — and the cause was ours. X's bundler hoists a
repeated Relay
metadata object into a variable, so the operation is written as
metadata:i instead of metadata:{…}. The manifest reader only knew the inline shape,
so membersSliceTimeline_Query vanished from the manifest overnight even though it sat
in the same bundle as always, and community members came back empty. All three shapes
are read now — inline, inline with a nested object (paginated queries carry
connection:[{…}]), and a hoisted variable — which also turned up seven more operations
in that one bundle alone.
Runs are no longer paced by a stopwatch, and a spent account no longer stops the crawl.
X hands each account a budget per operation — measured from its own headers: 50 requests per
15 minutes on search, followers and a profile's posts, 500 on most of the rest — and says in
every response how much is left. Three things followed from that:
- A spent account is swapped for a fresh one and the crawl carries on from the same
cursor. A cursor is not tied to the account that produced it (verified by handing one
account's cursor to another and getting back the identical page), so a big target no
longer ends at 3,500 rows or sits out a quarter of an hour. Only the operation whose
window is spent is parked, not the account: X counts a separate budget per endpoint
(four "followers" requests took five off that budget and nothing off search or
following), so an account out of followers keeps serving posts, lists and profiles for
other runs. The pool is asked for an account that still has room for the operation this
run needs.
- The 2-second pause between requests is gone (0.4s floor). It was pure waiting: the
budget, not a timer, is what X counts.
- The e-mail lookup no longer holds up pagination. It visits each profile's own website
— the slowest thing in a run and nothing to do with X — so a page is now enriched and
pushed while the next one is already being fetched. Those lookups also run 32 at a time
instead of 8, with an 8-second cap per site, and are skipped entirely when the bio
already gave an address. Measured on a page of 70 followers: 18.2s → 8.0s, same
addresses found.
- Five entries at a time, each on its own account. A run now opens up to five X
sessions — a separate pooled account and a separate proxy address per session — and they
take entries off one shared queue, so a list of profiles or keywords finishes about five
times sooner. The queue is shared rather than split in advance because entries differ
wildly in size; a lane that drew the short ones comes back for more instead of idling.
One session being rejected mid-run no longer ends the run: that lane stops, its entries
go back to the queue for the others, and anything left unread is named in the log.
Nothing to configure — the number is set against X's per-account limits, and one entry
or your own cookies still means one session (X ties a session to the address using it,
so a second lane on one account would log it out).
- The proxy setting is gone from the form. Proxying is ours to pay for and ours to
pick, so there is nothing left to choose there.
- Extra data is on by default: the "About this account" panel, the e-mail finder and
the search term on every row. Switch off what you do not need and the run gets shorter.
- Both language fields are now lists. "Result language" offers the 50 locales X
actually ships, and the search filter offers the languages X detects in posts, instead
of asking for a two-letter code and failing quietly on a typo.
- Community mode could not find its own GraphQL operation. X shuffles operations
between lazy bundles with every build, and
CommunityQuery and
membersSliceTimeline_Query moved out of the bundle this Actor looked in and into
bundle.Communities — so reading a community's members ended with "operation is not in
this build of X". The bundle hint is now only the first guess: when the operation is not
there, bundles whose names echo the operation's own words are opened too, the short
bundle.<Feature> ones first. The same fallback covers lists, reposters and the About
panel, which live in lazy bundles as well.
- Community members came back empty even once the operation was found. X does not
answer
membersSliceTimeline_Query with a timeline at all: the accounts sit in
communityResults.result.members_slice.items_results, with paging in
slice_info.next_cursor. The walker only understood timeline instructions, so it
stepped over every member. Both shapes are now read, and the cursor follows the slice.
- Likers of someone else's post now come back empty — X answers the likers timeline of
a post you do not own with nothing at all (checked on three posts, including ones with
30k+ likes), while reposters still work. The input form now says so, so the empty result
is not read as a broken run.
- Initial release. Nine modes in one Actor: search posts, profiles, posts from
profiles (posts / replies / media / likes / highlights / articles), post +
replies, post engagement (reposters / likers / quotes), followers and following
(plus verified followers, mutuals and paid subscribers), lists, communities and
trends.
- Advanced search as form fields: date range, language, minimum likes / reposts /
replies, verified or Premium only, media / image / video / link filters,
from / to / mentioning accounts and geo radius. Operators typed by hand are kept.
- Post rows carry full text for long posts, media with direct file URLs and video
variants, polls, link previews, Community Notes, place and community context, and
nested repost and quote originals.
- Profile rows carry bio links, counts, verification details, professional and
affiliate labels, pinned posts, and optionally the "About this account" panel.
- E-mail finder reads addresses from bios and, on request, from the site a profile
links to, including
name (at) domain (dot) com spellings.
- Cursor pagination through every timeline, with de-duplication.
- Results stream to the dataset as they arrive, so an aborted run keeps its data.