Substack hub

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/bodies

1 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.