Substack Newsletter Scraper
Pricing
from $3.00 / 1,000 results
Substack Newsletter Scraper
Scrape posts from any Substack newsletter publication. Returns post titles, URLs, publish dates, authors, and content previews via RSS feed.
Scrape posts from any Substack newsletter publication. Returns post titles, URLs, publish dates, authors, and content previews via RSS feed.
Use cases
- Research newsletters in a niche and whether they are paid
- Find writers for cross-promotion or sponsorship
- Track a publication's posting frequency
- Build a newsletter discovery digest
- Benchmark your own publishing cadence
Input
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
publicationUrl | string | No | "https://noahpinion.substack.com" | Substack publication URL (e.g., https://example.substack.com or just 'example') |
maxResults | integer | No | 20 | Maximum number of posts to return |
includeContent | boolean | No | false | Fetch full post content (slower, makes additional requests) |
Example input
{"publicationUrl": "https://noahpinion.substack.com","maxResults": 20,"includeContent": false}
Output
Each dataset item looks like this — real output from an actual run of this Actor:
{"title": "America is still beating China in the AI race","author": "Noah Smith","publicationName": "noahpinion","url": "https://www.noahpinion.blog/p/america-is-still-beating-china-in","publishedAt": "2026-09-05T07:36:17.000Z","description": "The U.S. is staying ahead, though the costs of that lead are still unknown.","isPaid": false}
| Field | Type |
|---|---|
title | string |
author | string |
publicationName | string |
url | string |
publishedAt | string |
description | string |
isPaid | boolean |
Results are exportable from Apify Console or the API as JSON, CSV, Excel, or XML.
How to run it
In Apify Console — open the Actor, fill in the input form, click Start, then download the results from the Dataset tab.
With the JavaScript client
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('cloud9_ai/substack-scraper').call({"publicationUrl": "https://noahpinion.substack.com","maxResults": 20,"includeContent": false});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
With the Python client
from apify_client import ApifyClientclient = ApifyClient('YOUR_APIFY_TOKEN')run = client.actor('cloud9_ai/substack-scraper').call(run_input={"publicationUrl": "https://noahpinion.substack.com","maxResults": 20,"includeContent": False})for item in client.dataset(run['defaultDatasetId']).iterate_items():print(item)
With the API — POST https://api.apify.com/v2/acts/cloud9_ai~substack-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN with the input JSON as the body.
Notes and limits
- No API key, account, or login is needed — just the input above.
maxResultscaps how much a single run collects, which is also what caps the run's cost.- Requests are paced and failed requests are retried automatically, so runs stay inside the source's rate limits.
- Only publicly available data is collected. How you use the output is your responsibility, including the source's terms of use and any applicable data-protection law.
Support
Found a bug, or need a field that isn't in the output? Open an issue on the Issues tab of this Actor in Apify Console. Issues there are read and answered.
License
Apache-2.0