> **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/profiles-handle-posts>
- **Markdown (.mdx) URL:** <https://www.socialfetch.dev/platforms/substack/profiles-handle-posts.mdx>

---

# Substack Profile Posts API

A reader's posts across every publication they write for, up to 50 per request.

`GET /v1/substack/profiles/{handle}/posts` lists the posts a reader published across all of their publications. `limit` is 1 to 50 and defaults to 12. No further posts are available past `limit`, so ask for `limit=50` to get all that are available. `cursor` comes from the previous answer's `page.nextCursor` when there is one.

`data.posts[]` carries the post fields, `data.publications[]` carries summaries of the publications those posts belong to, and `data.profileId` names the reader. `data.page` reports `hasMore` and `nextCursor`. When no further page is available, the response is `found` with the rows available, `page.hasMore: false` and no `nextCursor`, so there is no empty page to follow. `lookupStatus` is `found` or `not_found`.

## Request

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

## FAQ

### Does this cover one publication or all of them?

All publications the reader writes for. The response includes a `publications` array so you can group the posts without a second call.

### How many posts per page?

Between 1 and 50, with 12 as the default. No further posts are available past `limit`, so ask for `limit=50` to get all that are available. Follow `page.nextCursor` only while `page.hasMore` is true. When no further page is available, `page.hasMore` is false and there is no next page.

### What if the handle does not exist?

HTTP 200 with `lookupStatus: not_found`, `profileId: null` and an empty `posts` list.

### How many credits does a profile posts 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.
