# Changelog of Reddit Scraper: Posts, Comments, Search & Subreddits (`makework36/reddit-scraper`) Actor

- **URL**: https://apify.com/makework36/reddit-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/makework36/reddit-scraper.md

## Changelog

### Unreleased (beta, build 3.1.15)

#### An empty result is no longer reported as a failure

A run that found nothing used to fail with a message blaming a Reddit rate limit
or block, a cause it had never checked. Searching a narrow term, or a subreddit
with nothing new inside `timeFilter`, returned "the feed may be rate limited or
blocked" while Reddit had in fact answered every request with a clean 200.

- **Nothing found, nothing wrong: the run now succeeds** with an empty dataset
  and says why it is empty, pointing at the subreddit spelling, `timeFilter`, or
  a narrower `searchQuery`.
- **A real block still fails**, and now names what actually happened, for
  example `1x HTTP 403 (blocked)` or `1x HTTP 429 (rate limited)`, instead of
  guessing a cause.
- Status messages state only what the run can prove from the status codes it saw.

### 3.1.18 (2026-09-18)

#### The default run timeout is now 1200 seconds

A run of 100 posts with their comment threads needs about 357 seconds of sequential
work, and the old 300 second default left roughly 297 usable seconds, so those runs
were cut short and delivered a partial dataset. With the new default they finish with
room to spare.

- **Nothing to configure.** New runs pick up the 1200 second default.
- **Larger jobs still need a higher timeout**, set in the run options, and a run that
  does run out of time keeps flagging itself with `isPartialResult: true`.

#### Fixed

- **Engagement metrics arrive reliably again.** Between 2026-09-17 00:00 UTC and
  2026-09-18, `score`, `upvoteRatio` and `numComments` came back `null` on runs that
  should have carried them. Fixed and verified.

#### Unchanged

- The automatic enrichment ceiling stays at **25 comments per post**. Above that,
  ask for the metrics with `useRichData: true`.

### Pricing change effective 2026-09-17

**Comments delivered with their engagement metrics cost $0.70 per 1,000 comments.**
A comment is billed only when it arrives with its `score`, `depth`, `created`,
`isSubmitter` and `parentId` filled in.

- **$1.50 per 1,000 posts does not change.**
- **Comments that arrive without those fields stay free.** That covers every run
  with `useRichData: false`, and the default for more than 25 comments per post.
- **A run that loses the metrics halfway is billed only for the comments that
  carried them.** The run log reports how many comments were charged, how many
  were not, and why.
- Announced 2026-09-03, 14 days ahead, as Apify requires. Runs before 2026-09-17
  are billed at the old price.

### 3.1 (2026-09-02)

#### Engagement metrics now come included on most runs

`score`, `upvoteRatio`, `numComments`, `flair`, `awards`, `postLanguage` and the
per-comment `score`, `depth`, `created`, `isSubmitter` and `parentId` arrive without
setting anything:

| What you ask for | Engagement metrics |
|---|---|
| Posts only (`includeComments: false`) | included |
| Posts plus up to 25 comments each | included |
| Posts plus more than 25 comments each | ask for them with `useRichData: true` |
| `useRichData: true` | always included |
| `useRichData: false` | never included, the run finishes sooner |

If the metrics cannot be collected on a given run, you still get your posts and
comments, with those fields `null` and a line in the log saying so.

#### Up to 1000 comments per post

Instead of 100, whenever engagement metrics are on. The default stays 100.

#### Fixed

- **Post and comment text no longer ends with a trailing footer.** Earlier versions
  appended a fixed boilerplate string and a stray `&#32;` to the end of every
  `selftext` and every comment `body`. Text now stops where the author's text stops.
  This affected every run.
- **Runs use the timeout you set.** Before 3.1, a longer run was cut at 10 minutes
  whatever timeout was configured. See 3.1.18 for the current default.
- **A run that ran out of time no longer reports success.** When results are cut short,
  every item carries `isPartialResult: true` with a `partialReason`, the posts still
  missing their comments carry `commentsIncomplete: true`, the log names what is
  missing, and the run ends flagged. A truncated dataset can no longer be mistaken for
  a complete one.
- **A comment fetch that failed is no longer indistinguishable from a post with no
  comments.** Those posts carry `commentsFetchFailed: true`.
- **Items whose engagement fields went missing part-way through a run** carry
  `enrichmentIncomplete: true`, so a half-enriched dataset says so.

#### Added

- **Promoted posts are excluded.** Sponsored content never arrives as a result.
- **`subredditWeeklyActiveUsers`**, reported under its own name rather than as a
  subscriber count, because it is not one.
- `proxyConfiguration` is declared in the input schema. You do not need to set it: the
  Actor brings its own, at no proxy cost to you. The legacy `proxyConfig` name still
  works.

#### Still null, on every run

`subredditSubscribers`, `isNSFW`, `isSpoiler`, `isPinned`, `numCrossposts` and
`controversiality`. Reddit does not publish them. `subredditSubscribers` in particular
stays `null` on purpose: the community-size number Reddit does publish read 292,024 for
r/Drizzy and 3,599,935 for r/explainlikeimfive, a subreddit with more than 20 million
subscribers, so it is returned as `subredditWeeklyActiveUsers` instead. A wrong number
in a field named "subscribers" is undetectable downstream.

### 3.0.2 (2026-09-01)

Rebuilt after Reddit changed what it publishes to anonymous clients.

- Listings, all sort orders, search and per-post comment threads all work again.
- Pagination verified past 100 results, 150 in a single run.
- Vote data and moderation flags come back `null` rather than `0`, so a missing value
  cannot be mistaken for a real zero.
- New `requestDelaySecs` input, to slow a run down when you collect many subreddits at
  once.
- An empty result now fails the run instead of reporting a successful empty dataset.

### 2.0.5 (2026-09-01)

- A blocked run now ends in about 17 seconds instead of about 84, cutting the cost of a
  blocked run by 77%.

### 2.0.0 (2026-05-30)

- **Output restored** after Reddit began refusing anonymous requests, which had been
  silently producing 0-item runs.
- Runs are dramatically faster and cheaper, with the same output shape.

### 1.2.0 (2026-03-29)

#### Added

- **7 new post fields**: `imageUrls`, `isGallery`, `isSpoiler`, `numCrossposts`,
  `subredditSubscribers`, `edited`, `postType: gallery`
- **5 new comment fields**: `depth`, `isSubmitter`, `parentId`, `controversiality`,
  `replies`
- **Gallery support.** All image URLs from multi-image gallery posts.
- **Nested comments** up to 3 levels deep, each with its depth (0 = top level,
  1 = reply, 2 = reply to reply).
- **29 post fields, 10 comment fields.**

### 1.1.0 (2026-03-29)

#### Fixed

- `maxPosts` was global; it now applies per subreddit.
- Thumbnails came back as an empty string; they are `null` when there is no real
  thumbnail.
- `linkUrl` pointed at old.reddit.com; it now returns the actual external URL.
- Runs no longer crash on retry.

#### Added

- 9 new output fields: `id`, `flair`, `awards`, `isNSFW`, `isPinned`, `isSelf`,
  `postType`, `media`, `comments`
- `timeFilter` and `maxCommentsPerPost` inputs.

#### Changed

- `selftext` limit raised from 2,000 to 5,000 characters.

### 1.0.0 (2026-03-22)

- Initial public release. Posts and comments from any subreddit, sorted by hot, new,
  top or rising.
