# Substack Newsletter Scraper

> Substack scraper: read public Substack RSS feeds and get post titles, dates, authors and links as clean rows. Up to 20 feeds per run, $0.001 per post.

URL: https://cliqtomedia.com/actors/substack-newsletter-scraper/

Category: Social media & communities · Status: live on Apify Store · Apify page: https://apify.com/cliqtomedia/substack-newsletter-scraper?fpr=cliqto

Get post data from public Substack feeds. Each post is one row with the title, date, author and link. The tool reads the feed only.

## How to use it: 3 steps

1. **Make a free Apify account.** Apify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `https://on.substack.com/feed` in Full public feed URLs. Each start is one run.
3. **Download the results.** When the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

## What it does

Get structured post metadata from known public Substack RSS or Atom feeds. This Substack newsletter scraper saves one stable Dataset row per unique feed item and never opens article pages.

- monitoring recent posts from a known list of Substack publications;
- importing newsletter post metadata into a database or workflow;
- comparing publication cadence using public feed dates;
- building a lightweight feed index where stable item identity matters.



## Price

Pay per event. Apify bills you, not us.

| What you pay for | Price | When |
|---|---|---|
| Saved post metadata | $0.001 | One unique metadata row saved to the Dataset. |
| Start fee | $0.00071 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |

- One post: about $0.0017.
- 1,000 posts: about $1.00.
- Every day 100 posts, for 30 days: about $3.02 a month.

Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Prices checked on 24 October 2026. Current price: https://apify.com/cliqtomedia/substack-newsletter-scraper?fpr=cliqto

## Questions

### Can I add a newsletter home page?

No. Add the feed URL that ends with /feed.

### Does it work with custom domains?

No. Only feeds on substack.com addresses work.

### Do I get the article text?

No. You get titles, dates, authors and links, not the text.

### Can I get the full archive?

No. It reads one feed response, up to 20 posts per feed.

### Can I give the Actor a publication homepage?

No. Supply the explicit public feed URL, for example `https://on.substack.com/feed`. Homepages, post URLs, `/archive`, and bare slugs are outside this contract.

### Does it support custom-domain newsletters?

No. Inputs must be `*.substack.com/feed`, and redirects to custom domains are not followed. This keeps the network and SSRF boundary explicit.

### What happens with paid posts?

The Actor never bypasses a paywall. If the public feed exposes an audience/paywall signal, it can save allowed metadata with `PAYWALLED_METADATA_ONLY`. It does not request protected article content.

### Why did a valid run return zero rows?

Check `RUN_SUMMARY`. A zero-row result can mean `NO_POSTS` for the chosen date window, `NOT_FOUND`, `BLOCKED`, `RATE_LIMITED`, parser drift, or another explicit source outcome.

### Are duplicate feeds or posts charged twice?

Normalized duplicate input feeds are processed once. Duplicate item identities are first-wins and do not create another Dataset row or `post-saved` event.

## Data fields

- `schemaVersion` (string)
- `recordType` (string)
- `postKey` (string)
- `feedUrl` (string)
- `publicationKey` (string)
- `publicationName` (string)
- `publicationUrl` (string)
- `sourceGuid` (string)
- `canonicalUrl` (string)
- `title` (string)
- `subtitle` (string)
- `publishedAt` (string)
- `updatedAt` (string)
- `author` (string)
- `categories` (array)
- `audience` (string)
- `contentMode` (string)
- `contentAvailability` (string)
- `enclosure` (object)
- `retrievedAt` (string)
- `sourceStatus` (string)

## Input settings

- `feedUrls` (array, required): Use one or more full HTTPS URLs ending in /feed. Homepages, archive URLs, post URLs and custom domains are not accepted.
- `maxPostsPerFeed` (integer): Read at most this many source items from each feed. The Actor does not load older archive pages.
- `maxTotalPosts` (integer): Maximum unique Dataset rows in one run.
- `publishedFrom` (string): Optional ISO 8601 date or UTC date-time. An equal timestamp is included.
- `publishedTo` (string): Optional ISO 8601 date or UTC date-time. An equal timestamp is excluded.

## Tips

- Add the full feed link, for example name.substack.com/feed.
- Use the date filters to get posts from one period only.
- Run it on a schedule to watch for new posts.

## Limits

This Actor reads one finite feed response per accepted URL. It does not paginate an archive and does not claim full historical coverage.

- Up to 20 input feeds per run.
- Up to 20 saved items per feed.
- Up to 200 saved items total.
- One direct HTTPS feed request per successful source, plus at most two bounded retries for retryable failures.
- Internal run deadline is 60 seconds even if the Apify platform timeout is larger.
- Redirects are not followed to custom domains or other hosts.
- Response wire size, decompressed size, compression ratio, concurrency, retries, and DNS targets are bounded.

## Sample result

```json
{
  "schemaVersion": "v1",
  "recordType": "post",
  "postKey": "v1:sha256:54fa1135afab659a504413c570559306127df98abd78cbba50fbd817cb9b5c4f",
  "feedUrl": "https://on.substack.com/feed",
  "publicationKey": "on.substack.com/feed",
  "publicationName": "On Substack",
  "publicationUrl": "https://on.substack.com/",
  "sourceGuid": "https://on.substack.com/p/a-new-vision-for-sponsorships",
  "canonicalUrl": "https://on.substack.com/p/a-new-vision-for-sponsorships",
  "title": "A new vision for sponsorships",
  "subtitle": null,
  "publishedAt": "2026-10-08T13:14:23.000Z",
  "updatedAt": null,
  "author": "Substack team",
  "categories": [],
  "audience": "unknown",
  "contentMode": "metadata_only",
  "contentAvailability": "unknown",
  "retrievedAt": "2026-10-09T11:24:18.452Z",
  "sourceStatus": "POST_SAVED"
}
```

## Use it from code

Actor ID: `cliqtomedia/substack-newsletter-scraper`

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/substack-newsletter-scraper").call(run_input={
    "feedUrls": [
        "https://on.substack.com/feed"
    ],
    "maxPostsPerFeed": 5
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

```bash
curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~substack-newsletter-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"feedUrls": ["https://on.substack.com/feed"], "maxPostsPerFeed": 5}'
```

```python
# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool

tool = ApifyActorsTool("cliqtomedia/substack-newsletter-scraper")
result = tool.invoke({"run_input": {"feedUrls": ["https://on.substack.com/feed"], "maxPostsPerFeed": 5}})
print(result)
```

run-sync waits up to 300 seconds; for longer runs start a run and use a webhook. LlamaIndex and MCP: https://cliqtomedia.com/actors/ai-agents/

## Use cases with this tool

- [Hear what people say about you](https://cliqtomedia.com/actors/use-cases/social-listening/): Find what people say about your brand and your topic on Bluesky, Hacker News, YouTube and more.
- [Find the right creators, fast](https://cliqtomedia.com/actors/use-cases/creator-outreach/): Find podcasts, YouTube channels and newsletters in your niche, with public contact details.

## Similar tools

- [Hacker News Stories & Comments Scraper](https://cliqtomedia.com/actors/hacker-news-stories-comments-scraper/)
- [Bilibili Scraper: Videos, Comments & Creators, No Login](https://cliqtomedia.com/actors/bilibili-scraper/)
- [Bluesky Scraper — Posts, Profiles, Feeds & Threads, No Login](https://cliqtomedia.com/actors/bluesky-scraper/)
- [Medium Article Scraper: Tags, Authors & Publications](https://cliqtomedia.com/actors/medium-articles-scraper/)
- [Pinterest Search Scraper: Pins & Boards, No Login](https://cliqtomedia.com/actors/pinterest-search-scraper/)
- [Product Hunt Launches Scraper – Daily Top, No Login](https://cliqtomedia.com/actors/product-hunt-launches/)
