Twitter Scraper API for Posts, Profiles & Trends · Apify
Twitter (X) Scraper avatar

Twitter (X) Scraper

Pricing

$1.40 / 1,000 public data

Go to Apify Store
Twitter (X) Scraper

Twitter (X) Scraper

Collect public X posts, profiles, network members, and regional trends. Filter posts by date, language, media, links, and engagement, then save structured rows to an Apify dataset without X credentials.

Pricing

$1.40 / 1,000 public data

Rating

5.0

(1)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

2

Bookmarked

378

Total users

48

Monthly active users

4 days ago

Last modified

Features

Limited permissions

Share

🔎 Twitter (X) scraper for public data

Twitter Scraper helps researchers, marketers, and developers collect public Twitter/X posts, profile matches, profile network members, and regional trends. Get text, links, authors, media, engagement counts, and source details as structured dataset rows without giving the Actor your Twitter/X login.

Post rows can include text, links, time, language, post kind, author details, engagement counts, media, quotes, replies, and conversation links. Profile rows can include identity, bio, images, public counts, verification, and source context. Trend rows include rank, region, and a search link.

The Actor saves each eligible public item on its first match. If another query, URL, handle, ID, or source finds it later, that later match is ignored. Source fields describe only the first saved match.

▶️ Run one Twitter/X collection

  1. Choose one target for the run.
  2. Add the matching search, profile, network, or trend input.
  3. Set any filters and maxNbItemsToScrape.
  4. Run the Actor and open its dataset.

Post searches can use plain text, X search syntax, public source URLs, post URLs or IDs, conversation IDs, quoted post IDs, filters, or date and place limits. Profile search finds public accounts by search phrase or direct target. Profile options also collect followers, followed accounts, or public post retweeters. Trends mode returns topics for one supported region. Leave the work limit empty to return all available results until the source is exhausted.

⚙️ Input

Input fields

Only fields for the chosen target affect that run.

FieldTypeWhat it does
targetstringRequired. Choose searchPosts, searchProfiles, or trendingTopics. The form prefills searchPosts; there is no schema default. Network members are Profiles options.
postDiscoveryMethodstringChoose searchQuery (default), directPosts, conversationIds, quotedPostIds, or sourceUrls. Other post-finding inputs are ignored.
searchQuerystring[]Uses plain text or advanced X search syntax. Each entry is one full query. The form prefills OpenAI; there is no schema default.
directPostUrlsstring[]Fetches the exact public posts at the submitted X or Twitter URLs or numeric IDs.
conversationIdsstring[]Finds public posts that belong to the submitted conversations.
quotedPostIdsstring[]Finds public posts that quote the submitted post IDs.
postSearchUrlsstring[] or object[]Uses public search, profile, list, or conversation URLs as post sources. Enter a JSON array. Each entry is a URL string or an object with url, such as ["https://x.com/Alina_with_Ai"]. Use quotedPostIds to find quotes of a post.
hashtagsstring[]Keeps posts that contain the submitted hashtags. Enter each tag without #.
fromUsersstring[]Keeps posts written by the submitted handles. Enter each handle without @.
authorVerificationstringChoose any (default), verified, or notVerified. Verification includes X Premium status.
mentionsstring[]Keeps posts that mention the submitted handles. Enter each handle without @.
toUsersstring[]Keeps posts addressed to the submitted handles. Enter each handle without @.
searchModestringChoose latest (schema default), top, or latestAndTop. The form prefills latestAndTop. The combined mode saves each post once.
startDatestringKeeps posts on or after this date. Omission uses the last 30 days for searches. Use a date or a UTC date-time. Direct post lookup ignores search filters.
endDatestringKeeps posts on or before this date or UTC date-time. A date includes its full day. Omit for no end bound.
languagestringKeeps posts with this language code, such as en, es, fr, or ja.
placeIdstringSets an X or Twitter place ID.
linksstringChoose include (default), onlyLinks, or onlyWithoutLinks.
mediastringChoose include (default), onlyMedia, onlyImages, or onlyVideos. Videos include GIFs.
postKindsstring[]Choose one or more of originalPosts, quotePosts, replies, and reposts. The first three are the default.
minLikesintegerKeeps posts with at least this many likes. Minimum 0; omit for no likes filter.
minRepliesintegerKeeps posts with at least this many replies. Minimum 0; omit for no reply filter.
minRetweetsintegerKeeps posts with at least this many reposts. Minimum 0; omit for no repost filter.
sinceIdstringKeeps posts after this X post ID.
maxIdstringKeeps posts at or before this X post ID.
includePostClientLabelbooleanAdds the app label used to publish each post in source, where available. Default false. This is charged per post that gets a label. Reposts get no label.
profileDiscoveryMethodstringChoose searchPhrases (default), directTargets, followers, following, or retweeters.
profileSearchQueriesstring[]Uses X or Twitter People search phrases to find matching public profiles.
profileLookupTargetsstring[]Sets handles, URLs, or numeric user IDs for directTargets, followers, or following. Enter handles without @.
retweeterPostUrlsOrIdsstring[]Sets public post URLs or IDs whose public retweeter profiles to collect.
includeArchivedVerificationHistorybooleanAdds available past verification details for Profiles. Default false. This is charged per profile that gets past entries. This can make the run take much longer. Current verification details and dates remain available when off.
maxPastVerificationEntriesPerProfileintegerWith past verification details on, saves up to this many past entries per profile, where available. Default 10; minimum 0. Use 0 for all available entries, which can take hours for well-known accounts. Off means no past entries, whatever the limit.
includeUsernameHistorybooleanAdds past handles and their change dates for Profiles, where available. Default false. This is charged per profile that gets history.
maxUsernameHistoryEntriesPerProfileintegerWith username history on, saves up to this many past handles per profile. Default 10; minimum 0. Use 0 for all available handles. Off means no past handles, whatever the limit.
includeAccountRegionbooleanAdds the country the account is based in and how accurate it is, for Profiles, where available. Default false. This is charged per profile that gets a region.
includeDirectMessagePermissionbooleanAdds whether each profile accepts direct messages, where available. Default false. This is charged per profile that gets an answer.
transformFunctionstringOptional JavaScript function that takes one row as item and returns one object, such as (item) => ({ ...item, label: "X" }). It applies to every result type. The returned row must keep the required fields, their types, and the same rowType, or the run stops with an input error. Leave it empty to keep rows as they are.
trendRegionIdstringChooses one of the region IDs in the input form. Default 1 means Worldwide.
maxNbItemsToScrapeintegerStops after this many saved rows across the run. Minimum 0. Omit or use 0 for all available results until the source is exhausted or the charge limit is reached. The form prefills 10; there is no schema default.

Example input

Use this public input from a successful current-beta post search:

{
"maxNbItemsToScrape": 10,
"target": "searchPosts",
"postDiscoveryMethod": "searchQuery",
"searchQuery": [
"OpenAI"
],
"authorVerification": "any",
"searchMode": "latest",
"links": "include",
"media": "include",
"postKinds": [
"originalPosts",
"quotePosts",
"replies"
],
"includePostClientLabel": false,
"profileDiscoveryMethod": "searchPhrases",
"includeArchivedVerificationHistory": false,
"maxPastVerificationEntriesPerProfile": 10,
"includeUsernameHistory": false,
"maxUsernameHistoryEntriesPerProfile": 10,
"includeAccountRegion": false,
"includeDirectMessagePermission": false,
"trendRegionId": "1"
}

Post searches need at least one positive selector. Each supplied list needs at least one value. Profile searches need a search phrase or direct target. Followers and Following need profile targets; Post retweeters needs post URLs or IDs. Trends use only the chosen region. Omit unused filters to leave them off. Direct post lookup fetches the submitted posts without the search filters.

🧾 Output

Each run returns rows for one chosen target shape. Network-member runs use the profile shape. Optional fields can be absent or null when X does not provide them. With transformFunction, rows can also hold the extra fields your function adds.

Post row

FieldTypeWhat it does
rowTypestringMarks this row as a post.
postIdstringGives the X post ID.
postUrlstringGives the public link to the X post.
postTextstringGives the full post text.
postDateTimestringGives the publication time as a date-time string.
languagestringGives the post language code.
postKindstring (optional)Says whether the post is original, a reply, a quote, or a repost, when available.
authorIdstring or nullGives the author profile ID, when available.
authorHandlestring or nullGives the author handle without @, when available.
authorDisplayNamestring or nullGives the author's display name, when available.
authorBiostring or nullGives the author's public profile bio, when available.
authorLocationstring or nullGives the author's public profile location, when available.
authorAvatarUrlstring or nullGives the author's avatar image link, when available.
authorFollowersCountinteger or nullGives the author's follower count, when available.
authorFollowingCountinteger or nullGives the author's following count, when available.
authorCreatedAtstring or nullGives the author account creation time, when available.
authorIsVerifiedboolean or nullSays whether the author is verified, when available.
authorIsBlueVerifiedboolean or nullSays whether the author has X Premium verification, when available.
authorVerifiedTypestring or nullGives the author's verification type, when available.
nbLikesinteger or nullGives the number of likes, when available.
nbRepostsinteger or nullGives the number of reposts, when available.
nbRepliesinteger or nullGives the number of replies, when available.
quoteCountinteger or nullGives the number of quotes, when available.
nbViewsinteger or nullGives the number of views, when available.
nbBookmarksinteger or nullGives the number of bookmarks, when available.
mediaDetailsobject[]Lists each media file and its available details.
mediaDetails.idstring or nullGives the media ID, when available.
mediaDetails.altTextstring or nullGives the media alt text, when available.
mediaDetails.typestringGives the media kind.
mediaDetails.urlstringGives the main media file link.
mediaDetails.thumbnailUrlstring or nullGives a preview image link, when available.
mediaDetails.widthinteger or nullGives the media width in pixels, when available.
mediaDetails.heightinteger or nullGives the media height in pixels, when available.
mediaDetails.durationMsinteger or nullGives the media length in milliseconds, when available.
mediaDetails.aspectRatiostring or nullGives the media shape, when available.
mediaDetails.contentTypestring or nullGives the media file type, when available.
mediaDetails.variantsobject[]Lists other video file choices, when available.
mediaDetails.variants.urlstringGives a video choice link.
mediaDetails.variants.contentTypestring or nullGives a video choice file type, when available.
mediaDetails.variants.bitrateinteger or nullGives a video choice bitrate, when available.
hashtagsstring[]Lists hashtags without #.
linkEntitiesstring[]Lists usable destination links found in the post.
quotedPostIdstring or nullGives the quoted post ID, when available.
quotedPostTextstring or nullGives the quoted post text, when available.
quotedAuthorHandlestring or nullGives the quoted post author's handle, when available.
replyToHandlestring or nullGives the handle this post replies to, when available.
replyToPostIdstring or nullGives the post ID this post replies to, when available.
conversationIdstring or nullGives the conversation ID, when available.
inReplyToUserIdstring or nullGives the replied-to user ID, when available.
isPinnedboolean or nullSays whether X marks the post as pinned, when available.
sourcestring or nullGives the posting client label when includePostClientLabel is on and a label is available. Otherwise null.
sourceInputstring or nullGives the submitted query, URL, ID, or similar value that first found the post.
resultPositioninteger or nullGives the post's place in its source results, when available.
pollobject or nullGives available poll choices and vote details.
poll.choicesobject[]Lists poll choices in their shown order.
poll.choices.labelstringGives the choice text.
poll.choices.voteCountinteger or nullGives X's vote count for the choice.
poll.countsAreFinalboolean or nullSays whether X marks the counts as final.
poll.closesAtstring or nullGives the poll closing time.
articleobject or nullGives available X article content linked to the post.
article.imageUrlsstring[]Lists image links from the X article, when available.
article.titlestring or nullGives the article title.
article.textstring or nullGives the article text.
article.urlstring or nullGives the public article link.
article.publishedAtstring or nullGives the article publication time.
article.updatedAtstring or nullGives the last change time.
repostedPostobject or nullGives the original post shared by a repost.
repostedPost.postIdstring or nullGives the original post ID.
repostedPost.postUrlstring or nullGives the original post link.
repostedPost.postTextstring or nullGives the original post text.
repostedPost.postDateTimestring or nullGives the original publication time.
repostedPost.authorIdstring or nullGives the original author's ID.
repostedPost.authorHandlestring or nullGives the original author's handle.
repostedPost.authorDisplayNamestring or nullGives the original author's display name.
mentionsobject[]Lists accounts mentioned in the post.
mentions.profileIdstring or nullGives the mentioned account ID.
mentions.handlestring or nullGives the mentioned handle without @.
mentions.displayNamestring or nullGives the mentioned account name.
placeobject or nullGives place details attached to the post by X.
place.idstring or nullGives the X place ID.
place.namestring or nullGives the place name.
place.fullNamestring or nullGives the full place name.
place.typestring or nullGives the kind of place.
place.countrystring or nullGives the country name.
place.countryCodestring or nullGives the country code.
place.boundingBoxobject or nullGives the area around the place.
place.boundingBox.typestring or nullGives the geometry type.
place.boundingBox.coordinatesnumber[][][]Gives boundary rings of longitude and latitude points.

Example post row from a successful current-beta run

{
"rowType": "post",
"postId": "2115267961170935894",
"postUrl": "https://x.com/Tesla_Optimus_K/status/2115267961170935894",
"postText": "OpenAI's rule of thumb: Astra for quality, Terra if you're cheap\n\nTed Sanders mapped GPT-6.1 Terra onto the lineup. Size still explains most of the gap, but he won't squash size, reasoning effort, and multi-agent systems into one IQ score. A model that crushes math can still bomb at jokes. Newer small models can beat older big ones on data and architecture.\n\nTerra is probably better than the larger Astra at technical writing, about even on images and computer use, and a lot cheaper. It loses most other matchups. His cheat sheet: quality only, pick Astra. A bit price sensitive, Sol. Very price sensitive, Terra or Luna.\n\nSize isn't IQ. Pick the axis you're actually paying for.\n\n#OpenAI #GPT #AIModels",
"postDateTime": "2026-10-28T02:22:36.000Z",
"language": "en",
"postKind": "original",
"authorId": "146108201",
"authorHandle": "Tesla_Optimus_K",
"authorDisplayName": "Tesla_Optimus",
"authorBio": "테슬라, 가상화폐, 애니메이션, 게임 등에 관심을 가지고 있습니다.",
"authorAvatarUrl": "https://pbs.twimg.com/profile_images/1978753480224575488/YJ-NXDtP_normal.jpg",
"authorFollowersCount": 5747,
"authorFollowingCount": 3646,
"authorCreatedAt": "2010-05-20T16:24:16.000Z",
"authorIsVerified": true,
"authorIsBlueVerified": true,
"authorVerifiedType": null,
"nbLikes": 0,
"nbReposts": 0,
"nbReplies": 0,
"quoteCount": 0,
"nbViews": 3,
"nbBookmarks": 0,
"mediaDetails": [
{
"id": "2115267932657958912",
"altText": null,
"type": "image",
"url": "https://pbs.twimg.com/media/HVrw-kLaQAAIFQV.jpg",
"thumbnailUrl": "https://pbs.twimg.com/media/HVrw-kLaQAAIFQV.jpg",
"width": 1024,
"height": 1024,
"durationMs": null,
"aspectRatio": null,
"contentType": null,
"variants": []
}
],
"poll": null,
"hashtags": [
"OpenAI",
"GPT",
"AIModels"
],
"linkEntities": [],
"quotedPostId": null,
"quotedPostText": null,
"quotedAuthorHandle": null,
"replyToHandle": null,
"replyToPostId": null,
"conversationId": "2115267961170935894",
"inReplyToUserId": null,
"isPinned": false,
"source": null,
"mentions": [],
"place": null,
"resultPosition": 8,
"sourceInput": "OpenAI"
}

Profile and network-member row

Profile search and network-member runs use this same shape. Network rows add networkType, while sourceInput gives the first query, handle, URL, ID, or similar source value.

FieldTypeWhat it does
rowTypestringMarks this row as a profile.
profileIdstringGives the profile ID.
handlestringGives the profile handle without @.
displayNamestringGives the profile display name.
biostring or nullGives the public profile bio, when available.
createdAtstring or nullGives the account creation time, when available.
locationstring or nullGives the public profile location, when available.
avatarUrlstring or nullGives the profile avatar image link, when available.
bannerUrlstring or nullGives the profile banner image link, when available.
followersCountinteger or nullGives the public follower count, when available.
followingCountinteger or nullGives the public following count, when available.
postsCountinteger or nullGives the public post count, when available.
likesCountinteger or nullGives the public like count, when available.
isVerifiedboolean or nullSays whether X marks the profile as verified.
pinnedPostIdsstring[]Gives the shown pinned post IDs.
sourceInputstring or nullGives the submitted query, handle, URL, ID, or similar value that first found the profile.
networkTypestring or nullGives followers, following, or retweeters when a network run found the profile.
resultPositioninteger or nullGives the profile's place in the source results, when available.
websiteUrlstring or nullGives the profile website link.
mediaCountinteger or nullGives the number of media posts.
listedCountinteger or nullGives the number of public lists that include the profile.
isBlueVerifiedboolean or nullSays whether the profile has X Premium verification.
verifiedTypestring or nullGives the verification type.
professionalobject or nullGives professional account details.
professional.typestring or nullGives the professional account type.
professional.categoriesstring[]Lists professional categories.
restrictionsobject or nullGives public access limits.
restrictions.isProtectedboolean or nullSays whether posts are limited to approved followers.
restrictions.withheldCountriesstring[]Lists country codes where X withholds the account.
restrictions.withheldScopestring or nullGives the scope of the access limit.
canReceiveDirectMessagesboolean or nullSays whether the profile accepts direct messages when includeDirectMessagePermission is on. Otherwise null.
accountRegionobject (optional)Gives public account-region details when includeAccountRegion is on. Absent when it is off.
accountRegion.countrystring or nullGives the stated country or region.
accountRegion.accuracystring or nullGives X's description of region accuracy.
usernameHistoryobject[]Lists available past username details when includeUsernameHistory is on. Empty when it is off.
usernameHistory.handlestring or nullGives a past handle without @.
usernameHistory.changedAtstring or nullGives the reported username change time.
verificationHistoryobject[]Lists current verification details and any requested past entries. Past entries depend on the history switch and maxPastVerificationEntriesPerProfile.
verificationHistory.verifiedTypestring or nullGives the verification type for an entry.
verificationHistory.verifiedAtstring or nullGives the reported verification start time.

Example profile row from a successful current-beta run with all extra profile data switches on

{
"rowType": "profile",
"profileId": "14091091",
"handle": "NASAHubble",
"displayName": "Hubble",
"bio": "The official X account for the NASA Hubble Space Telescope, managed and operated by NASA's Goddard Space Flight Center.",
"createdAt": "2008-03-06T20:15:02.000Z",
"location": "Goddard Space Flight Center",
"avatarUrl": "https://pbs.twimg.com/profile_images/3468011581/efb985f24af0a814a722457a768f3cc5_normal.jpeg",
"bannerUrl": "https://pbs.twimg.com/profile_banners/14091091/1669391293",
"followersCount": 8895589,
"followingCount": 44,
"postsCount": 8495,
"likesCount": 1242,
"isVerified": true,
"pinnedPostIds": [],
"websiteUrl": "http://www.nasa.gov/mission_pages/hubble/main/index.html",
"mediaCount": 3152,
"listedCount": 15213,
"isBlueVerified": true,
"verifiedType": "Government",
"professional": null,
"restrictions": {
"isProtected": false,
"withheldCountries": [],
"withheldScope": null
},
"canReceiveDirectMessages": false,
"accountRegion": {
"country": null,
"accuracy": "accurate"
},
"usernameHistory": [
{
"handle": null,
"changedAt": "2017-03-24T15:30:06.708Z"
}
],
"verificationHistory": [
{
"verifiedType": null,
"verifiedAt": "2014-05-20T19:45:47.109Z"
},
{
"verifiedType": "blue verified badge",
"verifiedAt": null
},
{
"verifiedType": "blue verified badge",
"verifiedAt": null
},
{
"verifiedType": "blue verified badge",
"verifiedAt": null
}
],
"resultPosition": 2,
"sourceInput": "nasa"
}

Example network-member row from a successful current-beta run

{
"rowType": "profile",
"profileId": "33836629",
"handle": "karpathy",
"displayName": "Andrej Karpathy",
"bio": null,
"createdAt": "2009-04-21T06:49:15.000Z",
"location": "Earth",
"avatarUrl": "https://pbs.twimg.com/profile_images/1296667294148382721/9Pr6XrPB_normal.jpg",
"bannerUrl": "https://pbs.twimg.com/profile_banners/33836629/1407117611",
"followersCount": 4400820,
"followingCount": 1143,
"postsCount": 10163,
"likesCount": 25528,
"isVerified": true,
"pinnedPostIds": [],
"networkType": "followers",
"websiteUrl": null,
"mediaCount": 869,
"listedCount": 31481,
"isBlueVerified": true,
"verifiedType": null,
"professional": null,
"restrictions": {
"isProtected": false,
"withheldCountries": [],
"withheldScope": null
},
"canReceiveDirectMessages": null,
"usernameHistory": [],
"verificationHistory": [
{
"verifiedType": null,
"verifiedAt": "2016-08-03T06:17:36.702Z"
}
],
"resultPosition": 1,
"sourceInput": "OpenAI"
}

Trend row

FieldTypeWhat it does
rowTypestringMarks this row as a trend.
trendNamestringGives the topic name.
trendRankintegerGives its rank in the region.
trendQuerystring or nullGives the search query, when available.
trendSearchUrlstring or nullGives an X search link for the trend, when available.
regionIdstringGives the selected trend region ID.
regionNamestringGives the selected trend region name.
regionCountrystring or nullGives the country or global label for the region.
regionCountryCodestring or nullGives the ISO country code, or null for Worldwide.

Example trend row from a successful current-beta run

{
"rowType": "trend",
"trendName": "#dwts",
"trendRank": 1,
"trendQuery": "#dwts",
"trendSearchUrl": "https://twitter.com/search?q=%23dwts",
"regionId": "23424977",
"regionName": "United States",
"regionCountry": "United States",
"regionCountryCode": "US"
}

💳 Pricing

This Actor uses pay-per-event pricing. Each saved public post, profile, network member, or trend is one billable event. Set a small work limit for a first test, then raise it when you need more rows.

Extra data switches are off by default and add their own small charges. Each one is charged at most once per row, and only when that row gets the extra data:

  • Client app: one post gets its publishing app label from includePostClientLabel.
  • Verification history: one profile gets past verification entries from includeArchivedVerificationHistory.
  • Username history: one profile gets past handles from includeUsernameHistory.
  • Account region: one profile gets its country and accuracy from includeAccountRegion.
  • Message permission: one profile gets its direct message setting from includeDirectMessagePermission.

See the Pricing tab for the current price of each event.

🔌 Integrations

Use the Apify API, schedules, webhooks, and dataset exports such as JSON, CSV, Excel, XML, or RSS.

❓ FAQ

What happens when the same post or profile matches twice?

The Actor saves the first eligible match. It ignores later matches and keeps the first sourceInput value for that row.

Can one run use more than one result type?

No. Choose posts, profiles, network members, or trends for each run. Inputs for other result types are ignored.

What happens if X stops returning pages during a run?

The Actor keeps valid saved rows and continues with other submitted values. It warns when a value cannot finish. If source access fails and no submitted value completes, the run fails. Each saved row is billed once. A successful empty run can mean no matches, unavailable public content, or a handled input problem. Read the run warnings for the reason.

How do I fetch one post without fetching its thread?

Use directPostUrls for an exact public post URL or numeric ID. Use quotedPostIds to find posts that quote a post. Use conversationIds when you want posts from a conversation.

How do I search profiles or collect a network?

Choose searchProfiles. Set profileDiscoveryMethod to searchPhrases with profileSearchQueries, or directTargets with profileLookupTargets. For networks, choose followers or following with profileLookupTargets, or retweeters with retweeterPostUrlsOrIds.

Can I collect a full historical archive?

No. The Actor returns public data that X exposes for the selected source. It does not promise complete historical coverage.

Why is a field null?

The source may not provide that value for the post, profile, network member, or trend. Private, protected, deleted, suspended, and otherwise unavailable data is outside the product boundary.

Does leaving the work limit empty return everything?

It returns all available results until the source is exhausted. It does not promise every historical post or every profile that X does not expose.

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

No. You do not provide Twitter/X cookies, sessions, credentials, or an API key.

Is this the official Twitter/X API?

No. This is an Apify Actor for public X data and structured dataset rows. Use the official API when you need its own contract.

📝 Changelog

v5.0 (28-10-2026)

  • Profile region, past handles, and direct message permission are now off by default. Each one is charged per profile that gets it. To keep them, set includeAccountRegion, includeUsernameHistory, or includeDirectMessagePermission to true. When off, accountRegion is absent, usernameHistory is empty, and canReceiveDirectMessages is null.
  • The post client app label in source is now off by default. It is charged per post that gets a label. To keep it, set includePostClientLabel to true. When off, source is null.
  • Added maxUsernameHistoryEntriesPerProfile to limit past handles per profile. The default is 10. Use 0 for all available handles.
  • Past verification details from includeArchivedVerificationHistory are now charged per profile that gets past entries.
  • A handle with no public profile is now reported as no match, and the run goes on instead of failing.
  • Runs now use 512 MB of memory by default when maxNbItemsToScrape is 1 to 1024 and includeArchivedVerificationHistory is off. Other runs still use 1024 MB. The range is now 512 to 2048 MB.
  • Reliability improvements.

v4.0 (27-10-2026)

  • Renamed input archivedVerificationHistoryLimit to maxPastVerificationEntriesPerProfile to match its form label. The old key no longer works. Move your value to the new key. When it is left empty, the default is now 10 entries per profile instead of 3. Use 0 for all available entries.
  • Added transformFunction to change every result row with your own JavaScript function.
  • Added article.imageUrls with image links from X articles.
  • Removed authorProfileUrl and profileUrl from the result schema and the Overview table, because runs did not fill them. There is no replacement field. Use authorHandle or handle to build the profile link.
  • Runs now use 1024 MB of memory by default, with a range of 1024 to 2048 MB.
  • Missing or deleted posts are now skipped as unavailable instead of failing the run.
  • Profile runs now say at the start that the first profile can take a few minutes.
  • Reliability improvements.

v3.0 (25-10-2026)

  • searchQuery now takes a list so one run can search several queries. Change a string such as "OpenAI" to ["OpenAI"].
  • Network collection is now part of Profiles. Replace target: "networkMembers" with target: "searchProfiles". Replace the input key networkType with profileDiscoveryMethod, using followers, following, or retweeters. Replace networkProfileHandles with profileLookupTargets for followers and following. Keep retweeterPostUrlsOrIds for retweeters.
  • Removed near and geocode because matching locations could not be confirmed. Remove these keys from saved inputs. There is no place-name or radius replacement. placeId filters posts with an attached X place ID; it does not search a radius.
  • Added available poll results, article text, mentions, attached places, and original-post details for reposts to post rows.
  • Added available profile region, website, message settings, professional details, restrictions, and verification and username history. Past badge details are off by default. Set includeArchivedVerificationHistory to true to collect them. archivedVerificationHistoryLimit defaults to 3 per profile; use 0 for all available entries. Current verification details are still collected with past badge details off.
  • Direct post lookup now also accepts numeric post IDs in directPostUrls.
  • maxNbItemsToScrape now accepts 0 to collect all available matches.
  • Runs now use 256 MB of memory by default, with a range of 256 to 512 MB.
  • Reliability improvements.

v2.0 (01-09-2026)

  • Added direct public profile lookup by handle, profile URL, or ID.
  • Added public post retweeter collection as a profile network option.
  • Added author-verification filters for post searches.
  • Changed post fields searchQuery and sourceUrl, and profile field searchQuery, to sourceInput to show the value that found each row. Update exports to read sourceInput.
  • Removed post field sourceType and profile field networkOwnerHandle as result details were simplified. These fields have no direct replacement. sourceInput gives the submitted value, not its type or a separate network owner. Update exports that use the removed fields.
  • Removed trend field tweetVolume, with no replacement. Remove it from exports.
  • Replaced input directPostIds with directPostUrls for direct post lookup. Set postDiscoveryMethod to directPosts. Convert each ID to a full X post URL and put the URLs in directPostUrls.
  • Improved handling of X source failures by preserving valid rows and clearly reporting when a run cannot finish.

v1.0

  • Made each run explicitly choose posts, profiles, network members, or trending topics.
  • Added author locations and structured media details to post rows, with clearer profile and trend result views.
  • Moved post media links from imageUrls, videoUrls, and gifUrls into mediaDetails. Update exports to read the media type and URL there.
  • Removed profile field twitterUrl; use profileUrl for the public profile link. Removed scrapedAt from profile and trend rows, with no replacement. Update exports that use these fields.
  • Removed inputs within and shouldIncludePromotedPosts, with no replacement. Remove these keys from saved inputs.
  • Improved recovery when public X posts or responses are unavailable.

v0.4

  • Added direct post collection by URL or ID.
  • Added conversation and quote discovery.
  • Added follower and following network collection.
  • Improved handling when Twitter/X returns incomplete responses.

v0.3

  • Added post search URLs and advanced search syntax.
  • Added Latest + Top search and link, media, and location filters.
  • Added richer flat post fields.
  • Added clearer handling for unsupported X URLs.

v0.2

  • Added Search Profiles for query-based Twitter/X profile discovery with flat profile rows and search provenance.

v0.1

  • Added Trending Topics and supported trend regions.
  • Added grouped target inputs and pay-per-event pricing.

v0.0

  • Initial release.

🆘 Support

For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡

Made with ❤️ by Maxime Dupré