Substack Scraper — Publication Posts | $3/1K
Pricing
from $2.91 / 1,000 listings
Substack Scraper — Publication Posts | $3/1K
Extract post metadata from a Substack publication's official public REST API. Get titles, dates, audience, engagement, and podcast URLs. Run with a publication identifier; no Substack authentication. Pricing: $0.003 per result event on the Free plan.
Pricing
from $2.91 / 1,000 listings
Rating
0.0
(0)
Developer
Vitalii Bondarev
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Features
Share
Substack Publication Posts Scraper
Extract structured post metadata from a Substack publication’s official public REST API, including titles, dates, audience, engagement, and podcast URLs. Run it from your Apify account without Substack authentication; live Free-plan rates are listed below.
- Research publication archives with titles, subtitles, dates, URLs, and audience labels.
- Monitor competitor newsletters by filtering
post_date; usemaxPosts=20for incremental runs. - Extract podcast episode lists by selecting records where
typeispodcastandpodcast_urlis not null. - Check field quality with the per-record
parse_confidencescore andwarningslist. - Export structured results without providing a Substack API key, cookies, or proxy credentials.
What you get
| Field | Type | Description |
|---|---|---|
title | string or null | Post title |
subtitle | string or null | Deck or tagline shown under the title |
canonical_url | string or null | Full canonical URL to the post |
slug | string or null | URL slug |
post_date | string or null | Published timestamp, normally ISO 8601 UTC |
audience | string or null | everyone for free posts or only_paid for paywalled posts |
type | string or null | Post type such as newsletter, podcast, or video |
podcast_url | string or null | Direct audio file URL for podcast posts |
reactions_count | integer | Total reactions, calculated from the available reactions data |
comment_count | integer | Number of comments |
restacks | integer | Substack repost count |
cover_image | string or null | Cover image URL |
wordcount | integer or null | Approximate word count |
publication_slug | string or null | Short publication identifier, such as on or platformer.news |
parse_confidence | number | Data-quality score from 0.0 to 1.0 |
warnings | array of strings | Machine-readable missing-field or parsing warning codes |
Note: The listing API returns post metadata, not full post bodies. Paywalled posts return metadata only; body content is not scraped.
Sample output
{"title": "New on Substack: chat channels, lists, freewalls, discounts, podcast updates, and more","subtitle": "More ways to connect with your audience, get paid for your work, and be in control of your feed","canonical_url": "https://on.substack.com/p/new-on-substack-chat-channels-lists","slug": "new-on-substack-chat-channels-lists","post_date": "2026-10-30T17:03:17.633Z","audience": "everyone","type": "newsletter","podcast_url": null,"reactions_count": 822,"comment_count": 0,"restacks": 92,"cover_image": "https://substack-post-media.s3.amazonaws.com/public/images/4be31bf5-e657-46bf-b998-79e7cb8f0306_2398x1342.png","wordcount": 1115,"publication_slug": "on","parse_confidence": 1,"warnings": []}
Pricing
You pay per event for this Actor.
The primary result event is apify-default-dataset-item, shown as listing: one scraped result with all fields. It costs $0.003 per event on the Free plan, or $3.00 per 1,000 results on the Free plan.
The apify-actor-start event is charged when the Actor starts. The number of start events depends on Actor memory, with one event per GB and a minimum of one event. It costs $0.00005 per event on the Free plan.
| Plan | apify-actor-start | apify-default-dataset-item (listing) |
|---|---|---|
| Free | $0.00005 per event on the Free plan | $0.003 per event on the Free plan |
| Silver | $0.000049 per event on the Silver plan | $0.00294 per event on the Silver plan |
| Gold | $0.0000485 per event on the Gold plan | $0.00291 per event on the Gold plan |
| Platinum | $0.000048 per event on the Platinum plan | $0.00288 per event on the Platinum plan |
| Diamond | $0.0000475 per event on the Diamond plan | $0.00285 per event on the Diamond plan |
| Bronze | $0.0000495 per event on the Bronze plan | $0.00297 per event on the Bronze plan |
For the result event alone, 1,000 result events cost $3.00 on the Free plan, and 10,000 result events cost $30.00 on the Free plan. A worked example is 1,600 results = $4.80 on the Free plan. After one Free-plan Actor Start event, the Apify Free plan’s $5 monthly platform usage credit covers 1,666 result events, based on the listed Free-plan event prices.
The post-item event has no price, so the buyer is not charged for it.
Actor charges are separate from platform usage. For this Actor, platform usage such as compute, Apify Proxy traffic, and storage is included in the event prices and paid by the Actor developer; you do not pay for that platform usage.
How to use
- Enter a Substack slug such as
on, a full publication URL, or a custom domain. - Set
maxPoststo a positive integer for a capped result set, or use0to fetch the complete archive. - Run the Actor; it requests the publication’s public
/api/v1/postsendpoint without authentication, a browser, or a proxy. - Collect the dataset records, then filter by fields such as
post_date,audience,type, orpodcast_url. - Inspect
parse_confidenceandwarningswhen you need to identify records with missing fields. - Schedule the run through Apify Schedules and use daily as a starting point for newsletter monitoring.
{"publication": "on","maxPosts": 20}
Export the dataset as JSON or CSV, or read it through the Apify dataset API.
Input parameters
| Parameter | What it does | Default |
|---|---|---|
publication | Required publication identifier. Accepts a slug such as on, a full URL such as https://on.substack.com, or a custom domain such as https://www.platformer.news. | on in the input form |
maxPosts | Maximum number of posts to return. 0 means no limit and fetches the complete archive. | 100 in the input form; 0 when omitted from the Actor input |
disableUsageStats | Disables the usage-statistics record described in the Usage statistics section. | false |
Limits and edge cases
| Condition | What the buyer sees | What to do |
|---|---|---|
maxPosts is a positive integer | The Actor stops after returning up to that many posts. | Increase the value or use 0 when you need the full available archive. |
| A publication has many posts | Requests are made in pages of up to 50 posts, and the API cursor is followed until the limit or archive end is reached. | Leave pagination to the Actor; set maxPosts to control the total returned. |
| The publication has no published posts | The run returns no post records and reports emptyReason as NO_POSTS in its run output. | Check the publication identifier and try a publication with published posts. |
The first API page fails, including a publication-level 403 response | The run records an error output and fails before any post records are pushed or charged. Some publications restrict API access. | Check the identifier and try another publication, such as a publication whose public listing endpoint is available. |
| A later API page fails after earlier pages were fetched | The fetched posts are returned as a partial result, and the run output includes a partialReason. | Review the partial result and run the Actor again if you need to retrieve the remaining pages. |
| The API returns no next cursor or repeats a cursor | Pagination stops and the posts collected so far are returned. | Review the returned count and retry if the archive appears incomplete. |
| A post is paywalled | Metadata is returned, but the full body is not scraped. | Use the available metadata fields; this Actor does not retrieve paid body content. |
| A post has missing fields | The field can be null, while parse_confidence and warnings indicate data-quality information. | Check warnings before using optional fields in downstream processing. |
FAQ
How much does it cost to scrape a Substack publication?
The result event costs $0.003 per event on the Free plan, or $3.00 per 1,000 results on the Free plan. The Actor Start event costs $0.00005 per event on the Free plan. For example, 1,600 results = $4.80 on the Free plan. The post-item event has no price, so the buyer is not charged for it.
Why did the Actor return no posts?
A publication may have no published posts, or its public listing endpoint may return an empty response. The run reports NO_POSTS for an empty publication. Verify the slug or URL and try another publication if needed.
What happens if the publication returns a 403?
A first-page failure causes the run to fail before post records are pushed. Some publications restrict API access at the publication level. Check the identifier or try another publication whose public listing endpoint is available.
Do I need a Substack account, API key, or proxy?
No Substack authentication is required. The Actor uses the official public REST API and does not require a browser or proxy. You only need your own Apify account to run it.
Is it legal to use this public data?
The Actor collects metadata from Substack’s official public REST API. Source terms and applicable law depend on your use case, so review the relevant terms and legal requirements before using the results.
Related actors
- Dzen.ru Scraper - Articles & Channels — related public media and article extraction.
- Indie Hackers Posts Scraper — related post-list extraction.
- Truth Social Scraper — Posts, Profiles & Engagement API — related social post and engagement data.
Usage statistics
This Actor creates a small, content-free summary at the end of each run, used only to monitor reliability and improve this Actor. No input values, credentials or scraped data are sent.
A copy of the exact record for your run is saved as USAGE_STATS in your own Apify key-value store.
To opt out, set disableUsageStats to true in the input. Nothing is sent then.