# When the X replies endpoint under-returns

If a reply scrape returns fewer rows than the tweet claims, check maxItems first, because a low ceiling looks exactly like a quiet thread. If the ceiling was not the problem, switch to the search-based flow, which queries the conversation directly and reaches replies the standard endpoint misses on large or old threads.

[![apidojo](/blog/authors/apidojo.png)**Apidojo** *15+ years of experience in data retrieval.*](/blog/authors/apidojo/)

**28 September 2026** Published

**2 min** Read

![Cover card reading "When the X replies endpoint under-returns"](/blog/covers/x-replies-vs-search-flow.png)

-   A thin result has three common causes, and only one of them is the thread itself being quiet.
-   maxItems caps the whole run. It is the first thing to rule out and the cheapest to fix.
-   The search flow runs a conversation\_id query instead of the replies endpoint, and costs 14% more per tweet.
-   Compare your row count against the root tweet's own replyCount before concluding anything.

## Three reasons a thread comes back thin

A reply scrape that returns forty rows for a tweet showing four hundred replies is not necessarily broken. There are three explanations, and they are worth ruling out in this order because that is the order of how cheap they are to check.

**The ceiling.** `maxItems` caps the number of items for the whole run, not per tweet. A batch of ten tweets under a ceiling of 200 shares those 200 rows between them, so the first tweet looks complete and the rest look empty. This is the single most common cause and costs nothing to rule out.

**The counter.** X counts replies that a scrape cannot return. Deleted replies, replies from suspended or protected accounts, and replies hidden by the author all contribute to `replyCount` without ever appearing in a result set. A gap of a few percent is normal and permanent.

**The endpoint.** The standard replies endpoint walks the conversation the way the app does. On very large or very old threads that walk can stop short of what the conversation actually contains.

## Measuring before you spend

The root tweet carries its own `replyCount`, so the check is arithmetic rather than judgement:

```
rows = replies(tweet_id)                    # default flow
root = next(r for r in rows if not r.get("inReplyToId"))
got, claimed = len(rows), root["replyCount"]

print(f"{got} of {claimed} ({got / claimed:.0%})")
```

A result in the high nineties is a complete capture. Somewhere in the eighties is normal attrition. Below about half, something is wrong with the run rather than with the thread.

## What the second flow actually changes

Setting `useSearch` to true stops the actor using the replies endpoint. It runs a `conversation_id:` search instead, which queries the conversation as a corpus rather than walking it as a tree.

The practical difference is coverage on the awkward cases. The listing is explicit that the search route can retrieve results not available through the standard endpoint, and names large and old threads as where that happens.

|  | Default flow | Search flow |
| --- | --- | --- |
| Cost per tweet | $0.014 | $0.016 |
| Items included | about 40 | about 40 |
| Route | replies endpoint | conversation_id search |
| Best on | ordinary threads | large or old threads |

Fourteen percent more per tweet sounds like a decision. On a single deep thread it is two tenths of a cent, which is not a decision at all. Across fifty tweets it is a tenth of a dollar, which is the price of not missing a conversation you already paid to collect.

## The order that saves money

Run the cheap flow. Compare the count. Raise the ceiling if it was binding and run again. Only then pay the premium, and only for the tweets that actually came back short, not for the whole batch.

## The scrapers behind this

-   [Twitter Replies Scraper Every reply under a tweet by ID or URL, with author data $0.014 / tweet + $0.40 / 1K replies](/scrapers/twitter-replies-scraper/)

## Questions people ask

### Why did my reply scrape return fewer replies than X shows?

Usually the run ceiling. maxItems applies across the entire run rather than per tweet, so a batch shares it. If the ceiling was not binding, the thread may be large or old enough that the standard replies endpoint under-returns, which is what the search-based flow exists for.

### Does the search flow cost more?

Yes, $0.016 a tweet against $0.014 on the default flow, which is about 14% more. Both include roughly the first 40 items per query on a paid plan, so on a deep thread the difference is a rounding error and on a wide batch it is a few cents.

### Should I just always use the search flow?

No. It is the second attempt, not the default. Run the cheaper flow, measure what came back against the tweet's replyCount, and switch only when the gap is real.

1.  [Twitter Replies Scraper, flows and pricing](https://apify.com/apidojo/twitter-replies-scraper) apify.com

![apidojo](/blog/authors/apidojo.png)

## [Apidojo](/blog/authors/apidojo/)

15+ years of experience in data retrieval.

API Dojo is always ready for you. With 15+ years of experience, data acquisition has never been that easy. Cheapest prices with high availability.

-   🏯 15+ years of experience in data retrieval.
-   💰 Cheapest prices, qualified data.
-   ⚙️ High availability, extreme maintenance.
-   🐉 Hyper communicative, excellent support.

-   [apidojo.io](https://apidojo.io)

## More in this cluster

-   [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 Tweets by Date Range To scrape tweets by date range, add since: and until: to the query in the searchTerms input of apidojo's Tweet Scraper V2, and split long periods into.](/blog/twitter-scraping/scrape-tweets-by-date/)
-   [How to Scrape Tweets by Keyword To scrape tweets by keyword, put the keyword query in the searchTerms input of apidojo's Tweet Scraper V2 on Apify, set sort and maxItems, and run it.](/blog/twitter-scraping/scrape-tweets-by-keyword/)
-   [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/)
-   [Reading account age in X reply data Every reply carries the responder's account creation date, follower counts and post history. Here is what those fields can and cannot tell you.](/blog/twitter-scraping/x-replier-account-age/)
