Substack Archive API
A publication's archive in newest, top or pinned order, with post metadata.
GET /v1/substack/publications/{publication}/posts1 credit Failed requests are free
About this endpoint
GET /v1/substack/publications/{publication}/posts lists a publication's archive. publication is a subdomain, host or URL; a numeric publication id is refused here with a 400. sort is new, top or pinned; oldest is not supported. Add query to match post text, section to narrow to one section id, and limit (1 to 23). Start without a cursor and, while page.hasMore is true, pass cursor=page.nextCursor.
data.posts[] carries each post's id, title, subtitle, slug, url, publishedAt, bodyIsPreview, reactionCount, commentCount, restackCount, section, tags and authors. data.page reports offset, limit, hasMore, nextOffset and nextCursor; nextOffset is always null now that the archive pages by cursor. page is a zero-based page number; a page above 0 is refused with a 400 because the archive pages by cursor. For a whole archive use publication.posts.bodies.list, which pages by cursor with bodies, or publication.posts.index.list, which lists every post URL. lookupStatus marks a missing or restricted publication, and posts is empty in that case.
Substack Archive API FAQ
Which sort orders are available?
new, top and pinned. new is the default. oldest is not supported, so the route refuses it rather than guessing an order.
How do I page the archive?
Call the route without a cursor, then pass cursor=page.nextCursor while page.hasMore is true; page.nextCursor is null on the last page. A page above 0 returns a 400 because the archive pages by cursor. For a whole archive use publication.posts.bodies.list (cursor paged, with bodies) or publication.posts.index.list (every post URL). The limit is 1 to 23 and the default is 23.
Do archive rows include post bodies?
No. Archive rows are metadata only. Use publication.posts.bodies.list for full free bodies, or post.get for one post.
How many credits does an archive 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}
- Post bodiesGET /v1/substack/publications/{publication}/posts/bodies
- 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