# Twitter Scraper Unlimited: tweets with no result cap

Twitter Scraper Unlimited pulls tweets from X searches, profiles and Lists with no cap on how many a single query returns, using X’s own advanced-search syntax.

[Run this scraper free](https://apify.com/apidojo/twitter-scraper-lite)

[See the three jobs](#jobs)

apidojo/twitter-scraper-lite

**Search, profile or List**

**Single tweet URL**

**Queries**

**Tweets returned**

Estimated run cost

$0.00

Free Apify plan: 5 runs a month, 10 items a run. No credit card.

**$0.016** per query, 40 tweets in

**$0.0004** per tweet at tier 1

**33.9K** users · 4.8 from 101 reviews

**99.94%** run success, last 30 days

Read on 21 September 2026.

## What sets the price of a run?

Three things, and only one of them is obvious. How many queries you send sets the query fee. What kind of query it is sets whether 40 tweets come free. And the query count also picks the per-item tier, which is where runs get expensive without warning.

-   `searchTerms`

    $0.016per query

    ~40 tweets included

    The cheapest way in. One advanced-search string can stand in for many handles, and it counts as one query.

    `from:NASA since:2026-01-01`

-   `twitterHandles · startUrls`

    $0.016per entry

    ~40 tweets included

    Handles, profile URLs and List URLs. Each entry is its own query at the same price.

    `x.com/i/lists/78783491`

-   `a single tweet or article URL`

    $0.05per URL

    No tweets included

    One tweet costs three times a search and brings no free pages. Article URLs return the article body as content blocks.

    `x.com/thedankoe/article/2023779299367809063`

-   The one nobody expects

    `queries per run`

    5× swing$0.0004 → $0.002

    Batching costs more here

    The per-item price is tiered on this number. Five queries bill items at $0.0004; six bill at $0.0008, for the same tweets.

    `≤5 · 6–10 · 11–30 · 31–100 · >100`

This is the opposite of how the rest of the catalogue bills, where putting more work in one run saves money. Here a run is cheapest when it carries few queries that each return a lot, which is exactly what X’s query language is good at.

**Apify actor:** apidojo/twitter-scraper-lite

**Inputs in the form:** searchTerms · twitterHandles · startUrls · sort · start · end · maxItems · includeSearchTerms

**Inputs documented but not in the form:** conversationIds · tweetLanguage · author · inReplyTo · mentioning · onlyVerifiedUsers · onlyTwitterBlue · onlyImage · onlyVideo · onlyQuote · minimumRetweets · minimumFavorites · minimumReplies · geotaggedNear · withinRadius · geocode · placeObjectId

**Query language:** X advanced search, from:, to:, conversation_id:, since:, until:, filter:

**URL types:** Tweet, Article, Profile, Search and List URLs in startUrls

**start and end:** Work with searchTerms only. They do not apply to startUrls or twitterHandles

**Sort:** Latest · Top · Latest + Top, which runs both at once

**Included per query:** The first 2 pages, roughly 40 tweets

**Single tweet URLs:** $0.05 a URL, and no free pages come with it

**Item price:** Tiered by how many queries the run carries. $0.0004 up to 5, $0.002 past 100

**Concurrency:** One run at a time, per the actor’s usage policy

**Reliability:** 99.94% of 1,409,066 runs succeeded in the last 30 days

Listed on Apify as Twitter (X.com) Scraper Unlimited. Apidojo uses the short name.

## Three ways to ask for tweets

The same actor answers three quite different questions: what is being said about something, what one account has published, and what a curated List is carrying. All three bill at $0.016 a query with roughly 40 tweets inside it.

**01 Search X $0.016 / query · ~40 free**

**02 A profile’s tweets No per-query result cap**

**03 A List Billed as a standard query**

### How do you scrape tweets from an X search?

Put an advanced-search string in searchTerms. One query costs $0.016 and includes the first two pages, roughly 40 tweets, then items bill at the tier your query count lands in. A thousand tweets from one search cost $0.40.

Input

```
{
  "searchTerms": ["from:NASA since:2026-01-01 filter:media"],
  "sort": "Latest",
  "maxItems": 1000
}
```

$0.016 + 960 × $0.0004 \= **$0.40**

What comes back

The **tweet record**, One object per tweet, with its author, engagement and any media attached.

```
{
  "type": "tweet",
  "id": "1981345445986402472",
  "url": "https://x.com/NASA/status/1981345445986402472",
  "text": "Artemis II crew completed their final…",
  "createdAt": "2026-01-14T18:02:11.000Z",
  "retweetCount": 4821,
  "replyCount": 318,
  "likeCount": 39104,
  "author": { "userName": "NASA", "isVerified": true }
}
```

One clever query beats ten plain ones, twice over

A single string like \`from:NASA OR from:ESA since:2026-01-01\` is one query at one fee, and keeps the run in tier 1. Ten handles is ten fees and pushes every item into tier 2 at double the rate. The query language is a cost control, not just a filter.

### How do you scrape all the tweets from one X account?

Use from: inside a search term rather than twitterHandles if you want a date range, because start and end apply to searchTerms only. There is no cap on what one query returns here, which is the difference between this scraper and the flat-rate one.

Input

```
{
  "searchTerms": ["from:NASA since:2026-01-01 until:2026-06-30"],
  "sort": "Latest",
  "maxItems": 5000
}
```

$0.016 + 4,960 × $0.0004 \= **$2.00**

What comes back

The **tweet record**, Identical to a search result. includeSearchTerms adds the term that found each one.

```
{
  "type": "tweet",
  "text": "Watch the launch live from Kennedy…",
  "createdAt": "Mon Mar 02 09:14:55 +0000 2026",
  "isReply": false,
  "isRetweet": false,
  "isQuote": false,
  "author": {
    "userName": "NASA",
    "followers": 68204113,
    "isVerified": true,
    "isBlueVerified": true,
    "verifiedType": "business"
  }
}
```

start and end do not apply to handles

The listing is explicit: start and end work with searchTerms and are ignored on startUrls and twitterHandles. Its own recommendation is to put the range inside the query with since: and until:. Each window is then a query, so keep the count under six and items stay at the tier 1 rate.

### How do you scrape tweets from an X List?

A List URL goes in startUrls like any other. It bills as a standard query, $0.016 with the first two pages included, and returns whatever the List is carrying without a separate members step.

Input

```
{
  "startUrls": ["https://x.com/i/lists/78783491"],
  "sort": "Top",
  "maxItems": 2000
}
```

$0.016 + 1,960 × $0.0004 \= **$0.80**

What comes back

The **tweet record**, The same shape again, the source changes, the record does not.

```
{
  "type": "tweet",
  "text": "Quarterly numbers are out and the story…",
  "createdAt": "2026-05-21T13:30:02.000Z",
  "quoteCount": 44,
  "bookmarkCount": 903,
  "author": { "userName": "example_analyst", "isVerified": false }
}
```

Try Top when Latest comes back thin

The actor’s own note: result counts have been lower on Latest, especially with until: in the query. Switching sort to Top, or dropping until:, usually recovers them. Latest + Top runs both at once when you would rather not choose.

## What a tweet record carries

Every query type returns the same object: the tweet, the six engagement counters X exposes, the author, and flags for what kind of tweet it is.

-   7

    The tweet

    Always present

    -   id, url, twitterUrl
    -   text
    -   createdAt
    -   lang
    -   source, the posting client
-   5

    Engagement

    Five counters, no view count

    -   likeCount, retweetCount
    -   replyCount
    -   quoteCount
    -   bookmarkCount
-   8

    The author

    author, on every tweet

    -   author.userName, id, name
    -   author.url, twitterUrl
    -   author.followers, following
    -   author.isVerified, isBlueVerified
    -   author.verifiedType
    -   author.profilePicture
-   7

    Kind, context and articles

    Some conditional

    -   isReply, isRetweet, isQuote
    -   quoteId, what it quoted
    -   card, place
    -   article{ title, coverImage, contentState }

**type:** Always "tweet" on a tweet record

**id · url · twitterUrl:** Tweet ID and both the x.com and twitter.com links

**text:** The tweet body as posted

**createdAt:** X’s own date string, e.g. "Fri Nov 24 17:49:36 +0000 2023"

**lang:** Language X detected

**source:** Posting client. The listing’s sample mistypes the key as "source:"

**likeCount · retweetCount:** The two headline counters

**replyCount · quoteCount:** Conversation volume, and quote-tweets separately

**bookmarkCount:** Saves. A quieter intent signal than likes

**isReply · isRetweet · isQuote:** What kind of tweet this is

**quoteId:** On a quote-tweet, the ID of the tweet it quotes

**card · place:** Link preview card and attached place, where present

**author.userName · id · name:** Handle, numeric ID and display name

**author.followers · following:** Both counts at the time of the run

**author.isVerified · isBlueVerified:** Legacy verification and X Premium, kept apart

**author.verifiedType:** "business" and similar, where X exposes it

**article:** On an article URL: id, title, previewText, coverImage, dates and contentState blocks

includeSearchTerms is worth turning on for any multi-term run: the listing says it adds a field carrying the term that found each tweet, though it does not name that field, so check one record before writing a parser against it. There is no view count in this actor’s output, the sibling Twitter Profile Scraper has one, this does not.

## What to know before the first run

Six things shape a run here, and the first two are the ones that cost money if you learn them late.

-   01

    The item tier is set by query count, not volume

    Six queries put every item at $0.0008 where five put them at $0.0004. The same 2,000 tweets cost $0.80 or $1.50 depending on which side of that line the run falls.

-   02

    A single tweet URL costs $0.05 and includes nothing

    Three times a search query, with no free pages. For one tweet that is the price; for many, a conversation\_id: search is far cheaper.

-   03

    The form shows eight inputs; nineteen more are documented

    The input schema declares searchTerms, twitterHandles, startUrls, sort, start, end, maxItems and includeSearchTerms. The listing documents seventeen more, including geo search (geotaggedNear, withinRadius, geocode, placeObjectId), engagement floors (minimumRetweets, minimumFavorites, minimumReplies), author filters (author, inReplyTo, mentioning), tweetLanguage and conversationIds. They are not in the form, so send them as JSON.

-   04

    start and end only apply to searchTerms

    The listing is explicit that they are ignored on startUrls and twitterHandles, and recommends putting the range inside the query with since: and until: instead. A date range set beside a list of handles does nothing.

-   05

    Latest can under-return, especially with until:

    The actor flags this itself. Switch sort to Top, drop until:, or use Latest + Top, which runs both searches at once.

-   06

    One run at a time

    The usage policy is a single concurrent run. Schedule sequentially rather than firing parallel runs.

-   07

    Tiered pricing applies to paid plans

    The actor states that this pricing is for paid Apify plans, and that free-plan pricing differs. Check the pricing tab on the listing if you are on the free plan.

-   08

    Public tweets only

    No login and no cookies, so protected accounts and deleted tweets return nothing.

Demo mode on a free Apify account allows 5 runs a month, 10 items in each.

## Where the tier cliff bites

A run costs $0.016 a query plus the tier rate for every tweet past the roughly 40 each query includes. The rows below are ordered to show the cliff: rows four and five are the same 2,000 tweets, one query apart.

| Run | Method | Calculation | Cost |
| --- | --- | --- | --- |
| 40 tweets | 1 query | $0.016 | $0.016 |
| 100 tweets | 1 query | $0.016 + 60 × $0.0004 | $0.04 |
| 1,000 tweets | 1 query | $0.016 + 960 × $0.0004 | $0.40 |
| 2,000 tweets | 5 queries · tier 1 | 5 × $0.016 + 1,800 × $0.0004 | $0.80 |
| 2,000 tweets | 6 queries · tier 2 | 6 × $0.016 + 1,760 × $0.0008 | $1.50 |
| 1,000 tweets | 10 queries · tier 2 | 10 × $0.016 + 600 × $0.0008 | $0.64 |
| 5,000 tweets | 30 queries · tier 3 | 30 × $0.016 + 3,800 × $0.0012 | $5.04 |
| 1 tweet | 1 tweet URL | $0.05 + 1 × $0.0004 | $0.05 |

Computed from the two query events and the five item tiers the Apify Store API reports. Rows four and five are the argument for writing one good query instead of six plain ones: the same tweets, 88% more money.

## Who needs tweets without a result cap?

Five kinds of work reach for this one over the flat-rate Tweet Scraper: social listening, crisis monitoring, academic research, finance and competitive intelligence. All of them want a whole conversation rather than a sample of it.

-   Social listening teams

    Search X, one broad query

    Track a brand or campaign term across X and keep the whole result set, not the first page of it

    $0.40 per 1,000 tweets

-   Crisis and reputation monitoring

    Search X, scheduled hourly

    Watch a term as it moves, where missing the tail of a spike is the whole risk

    $0.016 per check at 40 tweets

-   Academic researchers

    A profile’s tweets, by date window

    Build complete account histories split into since:/until: windows, staying inside tier 1

    $2.00 per 5,000 tweets

-   Finance and market research

    A List

    Read a curated List of analysts or tickers without maintaining the member list separately

    $0.80 per 2,000 tweets

-   Competitive intelligence

    Search X with from: OR from:

    Follow several competitor accounts in one query, which keeps the run in the cheapest tier

    $0.40 per 1,000 tweets

## Driving it from code

The actor is apidojo/twitter-scraper-lite. The one thing worth building into your code is the tier: because the per-item price depends on the number of queries, a batch loop that grows past five queries silently doubles its own item cost.

**Python**

**JavaScript**

**cURL**

```
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

HANDLES = ["NASA", "ESA", "JAXA_en"]

# One query, not three: OR keeps the run in tier 1 at $0.0004 an item.
term = " OR ".join(f"from:{h}" for h in HANDLES) + " since:2026-01-01"

run = client.actor("apidojo/twitter-scraper-lite").call(run_input={
    "searchTerms": [term],
    "sort": "Latest",
    "includeSearchTerms": True,
    "maxItems": 5000,
})

for tweet in client.dataset(run.default_dataset_id).iterate_items():
    print(tweet["createdAt"], tweet["author"]["userName"], tweet["likeCount"])
```

```
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

// Long histories split by date. Keep the window count at five or fewer
// and every item still bills at the tier 1 rate.
const windows = [
  'from:NASA since:2026-01-01 until:2026-04-01',
  'from:NASA since:2026-04-01 until:2026-07-01',
];

const run = await client.actor('apidojo/twitter-scraper-lite').call({
  searchTerms: windows,
  sort: 'Latest',
  includeSearchTerms: true,
  maxItems: 10000,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, 'tweets across', windows.length, 'queries');
```

```
curl -X POST \
  "https://api.apify.com/v2/acts/apidojo~twitter-scraper-lite/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms":["from:NASA filter:media"],"sort":"Top","maxItems":1000}'
```

Datasets export as JSON or CSV, or stream over the API. Every key used here is in the actor’s input schema, and the advanced-search syntax is X’s own.

## Twitter Scraper Unlimited FAQ

### Why did adding one more query make the run so much more expensive?

The per-item price is tiered on how many queries a run carries. Five or fewer bills items at $0.0004; six to ten bills at $0.0008. Crossing that line doubles the cost of every tweet past the included ones.

### How much does it cost to scrape 1,000 tweets?

From one query, $0.40, the $0.016 query fee plus 960 tweets at $0.0004. The same 1,000 tweets split across ten queries cost $0.64, because the items move into tier 2.

### What is included in the query fee?

The first two pages, roughly 40 tweets. That applies to searches, profiles and Lists. A single tweet URL is different: it costs $0.05 and includes nothing.

### Which search operators work?

X’s own advanced-search syntax, including from:, to:, conversation\_id:, since:, until: and the filter: family. One well-built string is both a better filter and a cheaper run than many plain terms.

### Why am I getting fewer results than expected?

The actor flags this: Latest has been under-returning, especially on queries carrying until:. Switch sort to Top, remove until:, or use Latest + Top, which runs both searches at once.

### How is this different from Tweet Scraper?

Tweet Scraper is flat-rate at $0.40 per 1,000 tweets with a 50-tweet minimum per query. This one has no per-query result cap and the full query language, at the cost of a tiered item price you have to plan around.

### Can I filter by location, engagement or language?

Yes, though not from the web form. The listing documents geotaggedNear, withinRadius, geocode and placeObjectId for location, minimumRetweets, minimumFavorites and minimumReplies for engagement floors, and tweetLanguage for an ISO 639-1 code. None are in the input schema, so send them as JSON through the API.

### Does it scrape X articles?

Yes. startUrls accepts article URLs alongside tweet, profile, search and List URLs, and the record comes back with an article object carrying the title, preview text, cover image, publish dates and the body as content blocks.

### Why is there no view count in the output?

This actor does not return one. Its output sample carries likes, retweets, replies, quotes and bookmarks. The sibling Twitter Profile Scraper does expose viewCount, which is the usual source of the confusion.

### Can I run several jobs at once?

No. The usage policy is a single concurrent run, so schedule jobs to follow one another rather than firing them in parallel.

### Is the tiered pricing the same on the free plan?

No. The actor states that this pricing applies to paid Apify plans and that free-plan pricing differs, so check the listing’s pricing tab if you are on the free plan.

## Where Twitter Scraper Unlimited fits

[Parent scraper Twitter Scraper The Twitter family in one place: six scrapers, what each one costs, and which to reach for. Tweet Scraper is the flat-rate default at $0.40 per 1,000; this one trades that simplicity for no result cap and the full query language.](/scrapers/twitter-scraper/)

Sibling scrapers

-   [Twitter User Scraper](/scrapers/twitter-user-scraper/)
-   [Twitter Profile Scraper](/scrapers/twitter-profile-scraper/)
-   [Twitter List Scraper](/scrapers/twitter-list-scraper/)

Guides

-   Writing one X query instead of ten*Coming soon*
-   Splitting a long account history into date windows*Coming soon*
-   Latest, Top, or both: what X actually returns*Coming soon*

## Run one query

A cent and a half, and the first forty tweets come with it.

`searchTerms: ["from:NASA since:2026-01-01"] · sort: Latest`

[Run this scraper free](https://apify.com/apidojo/twitter-scraper-lite)

Apidojo is not affiliated with X Corp.

## Guides for this scraper

-   [Scraping X (Twitter) data: guides by task Turning an X search query into structured data: which actor fits each job, what a run costs, and the limits that decide how you batch it.](/blog/twitter-scraping/)
-   [How to rebuild an X conversation tree from replies Replies arrive as a flat list. Two fields, conversationId and inReplyToId, are what turn that list back into the threaded conversation you saw on X.](/blog/twitter-scraping/x-reply-tree/)
-   [How to Scrape Twitter (X) Data in 2026 To scrape Twitter (X) data in 2026, run an X search query through a scraper such as apidojo's Tweet Scraper V2 on Apify, which returns each matching post as.](/blog/twitter-scraping/how-to-scrape-twitter/)
