Use this Substack scraper to export leaderboard rankings as clean publication data for newsletter research, creator discovery, competitor tracking, and market dashboards. Select categories and Top Bestsellers or Rising boards, then receive ranked newsletters with public author, subscriber, pricing, and publication details. The Actor provides Substack newsletter data through the Apify API, schedules, and MCP.
What data can you export?
- Exact leaderboard rank, category, and board type
- Publication identity, URL, description, language, and images
- Public author name, handle, bio, and profile
- Public subscriber count signals and bestseller tier
- Monthly and annual subscription pricing
- Free and paid subscription benefits
- Podcast, community, and payments availability
- Optional previous rank, rank movement, and new-entry status
Example input
{
"categories": ["technology", "business"],
"boardTypes": ["paid", "rising"],
"maxItems": 100,
"includeRankHistory": true
}
Example output
{
"publicationId": 6349492,
"rank": 1,
"publicationName": "SemiAnalysis",
"publicationUrl": "https://newsletter.semianalysis.com",
"subdomain": "semianalysis",
"customDomain": "newsletter.semianalysis.com",
"description": "Bridging the gap between semiconductors and business.",
"logoUrl": "https://substackcdn.com/image/fetch/...",
"coverPhotoUrl": null,
"language": "en",
"publicationType": "newsletter",
"createdAt": "2025-09-22T15:54:12.958Z",
"authorId": 21783302,
"authorName": "Dylan Patel",
"authorHandle": "semianalysis",
"authorBio": "Semiconductor industry analysis.",
"authorPhotoUrl": "https://substackcdn.com/image/fetch/...",
"category": "technology",
"boardType": "paid",
"bestsellerBadgeTier": 1000,
"subscriberCount": "307,000",
"subscriberCountMagnitude": "307K+",
"paidSubscriberDetail": "Thousands of paid subscribers",
"totalSubscriberDetail": "Hundreds of thousands of subscribers",
"monthlyPrice": 50,
"annualPrice": 500,
"currency": "USD",
"freeSubscriptionBenefits": ["Free posts"],
"paidSubscriptionBenefits": ["Full archive"],
"paymentsEnabled": true,
"podcastEnabled": false,
"communityEnabled": true,
"profileUrl": "https://substack.com/@semianalysis",
"subscribeUrl": "https://newsletter.semianalysis.com/subscribe",
"scrapedAt": "2026-08-06T13:42:37.044Z",
"sourceUrl": "https://substack.com/leaderboard/technology/paid",
"sourceCategory": "technology",
"sourceBoardType": "paid",
"sourcePage": 0,
"rankChange": null,
"previousRank": null,
"isNew": true
}
Input settings
| Field | Type | Description |
|---|---|---|
categories |
string[] | One or more Substack category slugs, such as technology, business, or culture. |
leaderboardUrls |
URL[] | Optional explicit public leaderboard URLs. |
boardTypes |
string[] | paid, rising, or both. |
maxItems |
integer | Maximum total publications across all selected boards. |
includeRankHistory |
boolean | Compare results with the prior snapshot in the same Actor storage. |
changedSince |
string | Optional ISO timestamp for incremental monitoring. |
Input recipes
Category research: use three categories, boardTypes: ["paid"], and maxItems: 100.
Rising-newsletter monitor: use boardTypes: ["rising"], includeRankHistory: true, and schedule the Actor daily.
One public board URL: provide leaderboardUrls: [{"url":"https://substack.com/leaderboard/technology/paid"}].
Who is it for?
Newsletter operators can monitor competitors, creator-economy analysts can compare category leaders, and growth teams can discover partnership targets or enrich recurring market dashboards.
Tips and limits
- A category board currently exposes up to 100 publications.
maxItemsis a global cap, so earlier selected boards can fill it first.- Subscriber counts are public source labels, not private subscriber identities.
- Rank history uses the Actor's key-value store; reuse the same task/storage for comparisons.
- If one board fails after others succeed, already saved rows are preserved and the run log identifies the failed board.
API usage
JavaScript
const run = await client.actor('fetch_cat/substack-leaderboard-scraper').call({
categories: ['technology'], boardTypes: ['paid'], maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python
from apify_client import ApifyClient
client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('fetch_cat/substack-leaderboard-scraper').call(run_input={
'categories': ['technology'], 'boardTypes': ['paid'], 'maxItems': 50,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
cURL
curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~substack-leaderboard-scraper/runs?token=YOUR_APIFY_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"categories":["technology"],"boardTypes":["paid"],"maxItems":50}'
Use with MCP and AI agents
Connect Apify MCP at https://mcp.apify.com/?tools=fetch_cat/substack-leaderboard-scraper, then ask your agent to export and compare Substack category leaders.
Support
Open an issue from the Actor page with the input, run URL, expected behavior, and observed behavior. We review reproducible reports and source changes.