Substack API. Publications, posts and Notes as JSON.
Read publication metadata by id, subdomain, host or URL, and its archive, sitemap and feed by subdomain, host or URL. Follow posts into comments and reactions, with readers, Notes, search and categories covered too.
- Publication and reader routes
- 1 credit per request
- Typed not_found
- Failed requests aren't charged
Teams running monitoring, research, and enrichment pipelines
Why Social Fetch
Substack data as JSON. You build the product.
Live Substack data in one response shape, with platform changes handled for you.
Substack, plus every other platform
One key and one response envelope for Substack and 56 more platforms.
Pricing you can reason about
One request, one credit. Know how far your balance will go before you run your next batch.
Live data on every request
Fetch public data when you ask for it.
Nothing to maintain
We handle platform changes and breakages.
Built for production jobs
Run concurrent workloads with explicit statuses and request IDs.
Regular jobs. Better rates.
Running lookups every month? Get lower per-credit rates with a monthly plan. For occasional projects, choose pay as you go.
What Substack data can you get?
26 endpoints, one API key. Every response comes back as live JSON in the same envelope.
- +3 more publications endpoints
Publications
Posts
- +3 more readers and notes endpoints
Readers and Notes
- +4 more search and discovery endpoints
Search and discovery
Browse all 26 Substack endpoints
Publications
Posts
Readers and Notes
Search and discovery
What teams build with Substack data
Monitoring, enrichment, research and content workflows on Substack data, on the same API as every other platform.
How it works
Your first request in three steps.
Use TypeScript or your automation tool of choice.
Sources
+ 51 more platforms
One request
GET/v1/tiktok/profiles/
x-api-key: sk_live_••••••••
Same JSON shape
{
"data": {
"lookupStatus": "found",
"profile": {
"platform": "tiktok",
"handle": "charlidamelio",
"displayName": "charli d’amelio",
"verified": true
},
"metrics": {
"followers": 160263648
}
}
}Step 1
Create your free account
Get an API key with 100 requests included.
Step 2
Choose an endpoint
Pass a username, URL, keyword, or post ID.
Step 3
Get clean JSON
Use the response immediately or send it into your pipeline.
Works with your stack
Code, automate, or connect your AI.
TypeScript
n8n
- Make
- Apify
- MCP
- AI clients
Pricing
Social data, priced simply.
Start with 100 free credits. Monthly plans give you predictable volume and lower per-request rates.
Starter
18,000credits
$1.61 per 1k · $0.00161 per request
- Top up from $1.61 / 1k if you run out
- Up to 25 monitors
Growth
50,000credits
$1.58 per 1k · $0.00158 per request
- Top up from $1.58 / 1k if you run out
- 5 team seats
- Up to 100 monitors
Scale
150,000credits
$1.50 per 1k · $0.00150 per request
- Top up from $1.50 / 1k if you run out
- 25 team seats
- Up to 250 monitors
- Cancel anytime
- 30-day money-back guarantee
- Price locked while you stay
Need 1M+ credits, invoicing, or volume rates? Talk to us
Trust signals
DevHunt
Product Hunt
Uneed
Customers
Teams building on Social Fetch.
“Our TikTok and Instagram scrapers broke constantly. Social Fetch took us off that rotation — we ship product again.”
“Transcripts at volume from one endpoint. No broken scrapers for our small team to maintain.”
“Live profile data on every request. We never flag accounts from a stale cache.”
“Heavy concurrent load, no rate limits to negotiate. The rare API I haven't wrapped in retries.”
Substack API: common questions
Is there a Substack API for publications, posts and Notes?
Yes. Social Fetch has 26 Substack routes under /v1/substack covering publications, archives, post bodies, sitemaps, in-publication search, recommendations, feeds, posts, comments, reactors, restackers, reader profiles, Notes, subscriptions, search, categories, the explore feed and the publication directory. Authenticate with your Social Fetch API key in x-api-key.
How do I identify a publication?
Publication metadata takes a numeric id (89120), a Substack subdomain (astralcodexten), a host (www.astralcodexten.com) or a full publication URL. The archive, bulk posts, sitemap, in-publication search and feed routes take a subdomain, host or URL; a numeric id returns a 400 there. Recommendations accept a numeric id or a host. A host or URL is the safest choice when the publication uses a custom domain.
Can I get full post bodies?
Free posts return bodyHtml with the whole body. Paid posts return the preview the publication makes public and set bodyIsPreview to true, so a preview is never mistaken for the full text. Use publication.posts.bodies.list to pull up to 50 posts with their bodies per cursor page.
Why can publication search return 503?
Publication search sometimes cannot be answered reliably. The request then returns 503 and is not charged, rather than an empty list that could be mistaken for no matches. search.profiles and categories.publications.list are the dependable ways to find a publication. Podcast search follows the same rule.
What does a comment response include?
post.comments.list returns the whole nested tree in comments, the number of top-level and nested nodes in returnedCount, and commentsHidden true when a paid post does not serve comments publicly. Use the post URL, not a numeric id. When more than 5,000 nodes are present the list is cut and truncated is true.
How deep can I page?
Archive listings serve up to 23 rows and page by the page.nextCursor each response carries; a page above 0 returns a 400. Bulk posts, Notes, subscriptions, restacks, podcast search and the explore feed also use an opaque cursor. In-publication post search, profile search, publication search and category leaderboards use a page number; profile and publication search run from page 0 to page 3, in-publication post search runs to page 20, and a category leaderboard runs from page 0 to page 20. A page past the last one returns an empty list with hasMore: false. Top search uses a cursor. Every list reports page.hasMore and the next value.
What is in a reader profile?
profile.get returns name, handle, bio, photoUrl, follower and subscriber labels, badges, links, publications with their role and primary flag, public subscriptions, and counts. profile.notes.list returns the Notes and replies history, and profile.subscriptions.list returns the publications that person shows publicly.
Can I list publications by category?
Yes. categories.list returns top-level categories with subcategories and the recommended view. categories.publications.list returns one page of a leaderboard for a category id, ranking all, paid or trending, with 25 publications a page, pages 0 to 20. The global directory route lists publication subdomains, one file of about 16,000 at a time and up to 5,000 entries a page.
What is in the sitemap response?
publication.posts.index.list splits the sitemap into posts (only /p/{slug} URLs) and pages (everything else, such as /archive and /about). Every row carries kind, url, slug, lastModified and changeFrequency, and publicationId is filled when the publication is known.
Does HTTP 200 mean the publication or post exists?
No. HTTP 200 means the request finished. Check data.lookupStatus: not_found means the publication, post, reader or note does not exist, and restricted means the publication exists but does not serve that surface publicly.
Can I use these routes from agents or MCP?
Yes. Every Substack route is reachable from the hosted MCP server and through Ask (POST /v1/ask) in plain English, with the same credit metering as REST. Use the typed routes for production jobs.
The Substack API in detailHow the Substack routes work, what they cost, and how they differ from the official API.
Why teams use Social Fetch for Substack
Social Fetch exposes 26 routes under /v1/substack. Publication metadata takes a publication as a numeric id (89120), a Substack subdomain (astralcodexten), a host (www.astralcodexten.com) or a full publication URL. The archive, bulk posts, sitemap, in-publication search and feed routes take a subdomain, host or URL; a numeric id is refused there with a 400. Recommendations accept either a numeric id or a host. Post routes take a numeric post id or a canonical post URL; comments need the post URL. Reader routes take the handle shown on the profile.
Publication routes cover the publication itself, its archive in new, top or pinned order, bulk posts with full free bodies, the per-publication sitemap, in-publication search with highlighted snippets, its recommendations and its feed. Post routes return one post with a full free body or a paid preview, the whole comment tree, and the people who reacted or restacked. Reader routes return a public profile, the posts across that person's publications, their Notes and replies, and the publications they show publicly. Search, category, explore and directory routes cover discovery.
Every lookup answers HTTP 200 with data.lookupStatus, so a missing publication, post, reader or note is a typed not_found, not an error. Lists use an opaque cursor where Substack allows deep paging, or an offset or page number where it does not. The response also reports page.hasMore and the next cursor, offset or page. Publication and podcast search sometimes cannot be answered reliably; the request then returns 503 and is not charged. For dependable publication discovery, use search.profiles or categories.publications.list.
How to call the Substack API
1. Create an API key
Sign up at Social Fetch and copy a key (
sfk_...). New accounts get 100 free credits, enough to try every Substack route on a few publications.2. Name the publication or entity
Use
GET /v1/substack/publications/astralcodexten/postsfor an archive,GET /v1/substack/posts/223208969for one post, orGET /v1/substack/profiles/dieworkwear/notesfor a reader's Notes. Sendx-api-keyon every request.3. Branch on lookupStatus, then page
Check
data.lookupStatusbefore storing a row. Keep calling withpage.nextCursor,page.nextOffsetorpage.nextPagewhilepage.hasMoreis true, and bill frommeta.creditsCharged.
What each Substack route returns
- Publication metadata: plans, audience bands, sections, contributors, podcast details, links and benefits.
- Archive listings from the first page, bulk posts with full free bodies and cursors, the sitemap, and in-publication search snippets.
- Posts by id or URL, with
bodyHtml, a paid preview flag, tags, authors, audio and video details. - The whole nested comment tree, up to the 100 reactors and Substack's restacker cap of about 96 per post, each with
truncatedwhen the list is at that limit. - Reader profiles with roles and links, posts across publications, Notes history, replies and public subscriptions.
- Top search, profile search, podcast search, categories and leaderboards, the explore feed and the global publication directory.
How much does the Substack API cost?
Each Substack route charges 1 credit per completed request, and each page of a list is its own request. Credits never expire on pay-as-you-go packs, and meta.creditsCharged on every response is the billing source of truth. A request that ends in 503 is not charged.
Social Fetch vs the official Substack API
Substack has no documented public API for publication, post, comment, Notes and search data. Its surfaces return different shapes: a publication page, a reader profile and a search page each nest their fields differently. Social Fetch gives every route one JSON shape, typed lookupStatus, stable paging, and the same field names across publications and custom domains.
Pull your first Substack data.
Run a live Substack request in the playground. 100 free credits, no card, JSON back in seconds.
No credit cardSign up in 30 seconds withGoogleGitHub