> **For coding agents and LLMs:** This is one Social Fetch marketing page (markdown export). For API orientation start with [`/llms.txt`](https://www.socialfetch.dev/llms.txt); for auth and crawl rules use [`/agents.txt`](https://www.socialfetch.dev/agents.txt); for every operation use [`/llms-endpoints.txt`](https://www.socialfetch.dev/llms-endpoints.txt).

## This page

- **On-site (HTML):** <https://www.socialfetch.dev/platforms/substack/publications-publication-posts>
- **Markdown (.mdx) URL:** <https://www.socialfetch.dev/platforms/substack/publications-publication-posts.mdx>

---

# Substack Archive API

A publication's archive in newest, top or pinned order, with post metadata.

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

## Request

- **Endpoint:** `GET /v1/substack/publications/{publication}/posts`
- **Credits:** 1 credit
Failed requests are free
- **Input:** by subdomain, host or URL
- **Full reference:** [docs](https://www.socialfetch.dev/docs/api/v1/substack/publications/publication/posts/get)
- **Platform page:** [/platforms/substack](https://www.socialfetch.dev/platforms/substack)

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