Substack Directory API
Publication subdomains, one file and page at a time.
GET /v1/substack/directory1 credit Failed requests are free
About this endpoint
GET /v1/substack/directory lists publication subdomains in numbered files. file is 1 to 24; each file is a numbered slice of the directory. limit is 1 to 5,000, with 1,000 as the default.
data.entries[] carries subdomain, url and lastModified. data.file echoes the file, data.total is the entry count in that file, and data.page reports offset, limit, hasMore, nextCursor and nextOffset. Pass page.nextCursor as cursor for the next page; a cursor belongs to the file that issued it. The page and offset forms still work; prefer cursor. lookupStatus is found or not_found.
Substack Directory API FAQ
What are the two file sets?
Each file is a numbered slice of the directory, not a category. The 24 files together hold the directory.
Does the directory list every Substack publication?
No. It lists the publications the directory carries, which is a large subset rather than every publication. A publication on a custom domain can still be looked up by host or URL.
How many entries per page?
Between 1 and 5,000, with 1,000 as the default. Pass data.page.nextCursor as cursor while data.page.hasMore is true. The page form still works; prefer cursor.
How many credits does a directory 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}
- 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}