Substack Comments API
One post's whole comment tree in a single answer, nested and with engagement on each comment.
GET /v1/substack/posts/{post}/comments1 credit Failed requests are free
About this endpoint
GET /v1/substack/posts/{post}/comments returns the whole comment tree for a post. sort is best, oldest or newest; the whole tree is returned either way. The post must be a canonical post URL; a numeric post id is refused with a 400.
data.comments[] starts at the top-level comments. Each comment has id, postId, publicationId, body, bodyJson, createdAt, editedAt, author, reactionCount, reactions, restackCount, replyCount, isPinned, reactorNames and attachments, with replies nested under replies. data.returnedCount counts the nodes returned. commentsHidden is true when a paid post does not serve comments publicly, and truncated is true when more than 5,000 nodes were cut.
Substack Comments API FAQ
How are replies nested?
Top-level comments are in comments, and each comment's replies are in its replies array. The route bounds depth and node count so one very large tree cannot exhaust the response.
Why are comments hidden?
A paid post may serve no comments publicly. In that case commentsHidden is true and comments is empty, rather than an error.
What is truncated?
The tree is cut at 5,000 nodes. When truncated is true, more nodes existed than the response carries.
How many credits does a comments lookup 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 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}