Substack Post Bodies API
Up to 50 posts a cursor page, each with its full free body or the public preview of a paid post.
GET /v1/substack/publications/{publication}/posts/bodies1 credit Failed requests are free
About this endpoint
GET /v1/substack/publications/{publication}/posts/bodies returns archive posts with their bodies. publication is a subdomain, host or URL; a numeric publication id is refused here. limit is 1 to 50 and defaults to 20, and cursor comes from the previous page's page.nextCursor.
data.posts[] carries the same post fields as the archive plus bodyHtml. A free post has its whole body and bodyIsPreview: false. A paid or subscriber-only post has the preview the publication makes public and bodyIsPreview: true. data.page reports hasMore and nextCursor. The route is cursor paged because the archive offset does not carry bodies.
Substack Post Bodies API FAQ
Will I get the full text of a paid post?
No. You get the preview the publication makes public, with bodyIsPreview: true. A free post has the whole body and bodyIsPreview: false.
How many posts fit on a page?
Between 1 and 50, with 20 as the default. Follow page.nextCursor while page.hasMore is true.
What else is on each post?
The same metadata as the archive: id, title, subtitle, url, publishedAt, tags, authors, commentCount, reactionCount, restackCount, audio and video details when present.
How many credits does a bodies page cost?
Pricing is documented on the operation in the API registry (shown on this page). Confirm on every response with meta.creditsCharged: that field is the billing source of truth.
Other Substack endpoints
- PublicationGET /v1/substack/publications/{publication}
- PostsGET /v1/substack/publications/{publication}/posts
- Post indexGET /v1/substack/publications/{publication}/posts/index
- Search postsGET /v1/substack/publications/{publication}/posts/search
- RecommendationsGET /v1/substack/publications/{publication}/recommendations
- Publication feedGET /v1/substack/publications/{publication}/feed
- PostGET /v1/substack/posts/{post}
- CommentsGET /v1/substack/posts/{post}/comments