GET/substack/categoriesapiKey1 credit/request
Returns every public Substack category, with the category id required by /substack/category. Ids span two spaces: 32 categories use a numeric id and one uses the string id `podcast`. Both are accepted by /substack/category.
Takes no parameters.
Sampled 14 Oct 2026: 35 items. Filled in every item: id, slug, name, in_category_listing, in_leaderboard. Not in every item: emoji (34). In the sample: in_category_listing: true in 34 of 35; in_leaderboard: true in 35 of 35.
Open in Playground
GET/substack/categoryapiKey3 credits/request
Returns one page of a category's public publication leaderboard. Each row carries the publication's subscriber signals and its full subscription offering (web plans with multi-currency pricing, App Store plans, and per-tier benefits). Subscriber totals are published to roughly three significant figures and are opt-in per writer; paid subscriber figures are only ever buckets. Upstream serves 25 publications per page and accepts pages 0-26, so at most 675 publications are reachable per category and type.
Required: category_id. Optional: type (2 allowed values: paid, free), page.
Sampled 14 Oct 2026: 25 items. Filled in every item: id, name, subdomain, url, hero_text, author_id, author_name, author_handle and 5 more. Not in every item: custom_domain (18), logo_url (23). In the sample: url: newsletter.semianalysis.com and 24 other hosts; explicit: true in 0 of 25; hero_text: median 121 characters; logo_url: substackcdn.com; payments_enabled: true in 25 of 25.
Open in Playground
GET/substack/exploreapiKey3 credits/request
Returns one page of Substack's Explore surface. Explore is a feed of heterogeneous modules rather than a flat list, so each page returns the modules it contains and every module names its own type. Known module types are `trendingTopicsExplore` (trending topics and suggested searches), `trendingPostsExplore`, `newBestsellersExplore`, `videoSuggestionsExplore`, `categoryLeaderboard`, `comment` (a single Note) and `post` (a single post). Only the collections a module actually carries are populated. Pagination is cursor-based; early pages are curated shelves and later pages are individual Notes and posts.
Optional: tab, type (3 allowed values: base, secondary, category), cursor.
Sampled 14 Oct 2026: 1 item. Filled in every item: type, topics. In the sample: topics: median 4 entries.
Open in Playground
GET/substack/leaderboardapiKey3 credits/request
Returns one page of a category's bestseller leaderboard, pairing each ranked publication with its author. This is a different surface from /substack/category: it exposes the trending ranking (the site's "Rising" tab), validates its ranking values rather than silently defaulting, accepts the extra cross-category id `bestseller`, and returns the author alongside the publication. Use a category_id from /substack/categories whose in_leaderboard is true. Upstream serves 25 rows per page and accepts pages 0-25.
Required: category_id. Optional: type (3 allowed values: trending, paid, all), page.
Sampled 14 Oct 2026: 25 items. Filled in every item: rank, publication. Not in every item: author (23). In the sample: rank: 1 to 25, median 13.
Open in Playground
GET/substack/noteapiKey3 credits/request
Returns one public Note with its author, engagement counts, and the post it links to when it has one. Notes are Substack's short-form social posts. note_id is the numeric id from a Note URL: in `/@handle/note/c-316240438` it is `316240438`.
Required: note_id.
Sampled 14 Oct 2026: 16 fields returned with a value. In the sample: published_at: 2026-08-16; author_bestseller_tier: 100; author_url: substack.com; is_ai_generated: false; body: 242 characters; author_photo_url: substack-post-media.s3.amazonaws.com; url: substack.com; reaction_count: 13,941.
Open in Playground
GET/substack/note/repliesapiKey3 credits/request
Returns one page of public replies to a Note, each in the same shape as /substack/note. Pagination is cursor-based: pass the previous response's next_cursor back as cursor.
Required: note_id. Optional: cursor.
Sampled 14 Oct 2026: 8 items. Filled in every item: id, body, author_id, author_name, published_at, reaction_count, reactions, language and 1 more. Not in every item: author_photo_url (5), restack_count (3), reply_count (6), edited_at (3). In the sample: published_at: 2026-08-16 to 2026-08-18; reaction_count: 11 to 167, median 26; author_photo_url: substack-post-media.s3.amazonaws.com; is_ai_generated: true in 0 of 8; body: median 193 characters; restack_count: 1 to 5, median 3; reply_count: 1 to 15, median 2; edited_at: 2026-08-17 to 2026-08-18.
Open in Playground
GET/substack/note/restacksapiKey3 credits/request
Returns one page of the Notes that restacked a given Note, each in the same shape as the single-Note endpoint. A restack may carry its own commentary in `body` or be a bare reshare with an empty body. Pagination is cursor-based.
Required: note_id. Optional: cursor.
Sampled 14 Oct 2026: 20 items. Filled in every item: id, author_id, author_name, author_photo_url, published_at, reactions, is_ai_generated. Not in every item: body (16), language (15), reaction_count (18), restack_count (1), reply_count (2), edited_at (1). In the sample: published_at: 2026-08-17 to 2026-09-13; reaction_count: 1 to 52, median 1; author_photo_url: substack-post-media.s3.amazonaws.com and 2 other hosts; is_ai_generated: true in 0 of 20; reply_count: 1 to 3, median 1; edited_at: 2026-08-17.
Open in Playground
GET/substack/notesapiKey3 credits/request
Returns one page of the public Notes feed for one tab. tab and type come as a pair from the Notes feed tabs endpoint. Pagination is cursor-based: pass the previous response's next_cursor back as cursor. Post-only rows in the upstream feed are omitted; every returned row is a Note.
Optional: tab, type (3 allowed values: base, secondary, category), cursor.
Sampled 14 Oct 2026: 5 items. Filled in every item: id, body, author_id, author_name, author_handle, author_url, author_photo_url, url and 7 more. Not in every item: edited_at (1), author_bestseller_tier (2). In the sample: published_at: 2026-10-13; reaction_count: 38 to 219, median 89; author_url: substack.com; is_ai_generated: true in 0 of 5; author_photo_url: substack-post-media.s3.amazonaws.com; url: substack.com; restack_count: 1 to 11, median 7; reply_count: 1 to 17, median 3.
Open in Playground
GET/substack/notes/tabsapiKey1 credit/request
Returns every selectable tab for one surface. The two surfaces expose different tab sets: `feed` has 34 tabs (the main feed, the bestseller feed, and one per category) and `explore` has 33. Each row's id and type must be passed together to the matching feed endpoint, which rejects a tab whose type does not match.
Optional: surface (2 allowed values: feed, explore).
Sampled 14 Oct 2026: 34 items. Filled in every item: id, name, type.
Open in Playground
GET/substack/postapiKey3 credits/request
Returns one public post with the extended metadata the archive listing omits, including word count, every credited byline, and podcast audio details where the post has them. Post bodies are not returned.
Required: publication, slug.
Sampled 14 Oct 2026: 4 items. Filled in every item: id, name, handle, url. In the sample: url: substack.com.
Open in Playground
GET/substack/publicationapiKey3 credits/request
Returns a publication's public profile and its complete subscription offering: every purchasable web plan with per-currency pricing, the separately priced App Store plans, per-tier benefit copy, and the toggles governing which tiers are sold. Identify the publication by name (a subdomain such as semianalysis, or a custom domain such as www.thefp.com) or by numeric publication_id -- exactly one is required. Prefer publication_id when you have it: it reads a compact document, while resolving by name has to parse the publication's full homepage.
Optional: publication, publication_id.
Sampled 14 Oct 2026: 2 items. Filled in every item: id, kind, nickname, amount_cents, currency, interval, interval_count, active and 1 more. In the sample: amount_cents: 5,000 to 50,000, median 5,000; active: true in 2 of 2; currencies: median 14 entries.
Open in Playground
GET/substack/publication/contributorsapiKey3 credits/request
Returns one page of the writers credited on a publication, ranked as Substack ranks them. Rows include each writer's handle, profile URL, and bestseller badge tier, so a publication can be fanned out into individual /substack/user lookups. Large publications return several hundred contributors on the first page.
Required: publication. Optional: page.
Sampled 14 Oct 2026: 911 items. Not in every item: id (500), name (496), handle (259), bio (245), photo_url (280), url (259), is_byline_only (500), bestseller_tier (63). In the sample: bestseller_tier: 100 to 10,000, median 1,000; photo_url: substackcdn.com and 2 other hosts; is_byline_only: true in 468 of 500; bio: median 107 characters; url: substack.com.
Open in Playground
GET/substack/publication/postsapiKey3 credits/request
Returns one page of a publication's public post archive with title, subtitle, canonical URL, publish date, engagement counts, and whether each post is paywalled. search filters the publication's own posts full-text; a query with no matches returns an empty list rather than the unfiltered archive.
Required: publication. Optional: search, sort (3 allowed values: new, top, community), offset, limit.
Sampled 14 Oct 2026: 20 items. Filled in every item: id, title, slug, url, type, audience, published_at, paywalled and 3 more. Not in every item: comment_count (12), subtitle (19). In the sample: published_at: 2026-08-21 to 2026-10-08; comment_count: 1 to 6, median 2; url: newsletter.semianalysis.com; paywalled: true in 20 of 20; description: median 105 characters; cover_image_url: substack-post-media.s3.amazonaws.com and 1 other host; reaction_count: 89 to 276, median 140; subtitle: median 127 characters.
Open in Playground
GET/substack/publication/recommendationsapiKey3 credits/request
Returns the publications a given publication recommends to its own readers, as a publication-to-publication graph. Useful for discovering publications beyond the 675-per-category ceiling on /substack/category. publication_id is the numeric id returned by /substack/publication, /substack/category, or /substack/user.
Required: publication_id.
Sampled 14 Oct 2026: 15 items. Filled in every item: id, name, subdomain, url, hero_text, logo_url, author_id, explicit and 3 more. Not in every item: custom_domain (10). In the sample: url: tarotcapital.substack.com and 14 other hosts; explicit: true in 0 of 15; hero_text: median 139 characters; logo_url: substack-post-media.s3.amazonaws.com and 1 other host; payments_enabled: true in 10 of 15.
Open in Playground
GET/substack/searchapiKey3 credits/request
Searches posts across all of Substack and returns the publications that also matched, unlike /substack/publication/posts which searches within a single publication. Set focus_publication_id to additionally receive that one publication's own matching posts in focused_posts alongside the site-wide results.
Required: query. Optional: page, focus_publication_id, focus_limit.
Sampled 14 Oct 2026: 20 items. Filled in every item: id, title, slug, url, type, audience, published_at, paywalled and 1 more. Not in every item: subtitle (17), comment_count (10), reaction_count (18), cover_image_url (15). In the sample: published_at: 2026-09-16 to 2026-10-13; comment_count: 1 to 77, median 3; url: arnoldkling.substack.com and 19 other hosts; paywalled: true in 0 of 20; reaction_count: 1 to 314, median 7; cover_image_url: substackcdn.com and 2 other hosts.
Open in Playground
GET/substack/userapiKey3 credits/request
Returns one public Substack profile: identity, the publications the writer contributes to, their publicly visible subscriptions, and every subscriber signal Substack publishes. total is opt-in per writer and rounded to roughly three significant figures; when a writer hides it, total_hidden is true and total is 0, which must not be read as zero subscribers. paid_rough, paid_rough_int, and paid_tier are buckets - no exact paid subscriber count is published anywhere. follower_count is exact but counts followers, not subscribers.
Required: handle.
Sampled 14 Oct 2026: 38 items. Filled in every item: publication_id, publication_name, subdomain, membership_state, is_founding. In the sample: is_founding: true in 0 of 38.
Open in Playground
GET/substack/user/activityapiKey3 credits/request
Returns one page of a user's public activity: the notes they wrote, posts they published, and items they liked, replied to, or restacked. types is an optional comma-separated filter accepting `note`, `post`, `like`, `replies` and `restack`; omit it for the default mixed feed. Each item's kind is the upstream's own finer-grained label, so filtering on `restack` returns both `comment_restack` and `post_restack` items. Pagination is cursor-based.
Required: user_id. Optional: types, cursor.
Sampled 14 Oct 2026: 12 items. Filled in every item: kind, timestamp, note. In the sample: timestamp: 2026-05-11 to 2026-10-13.
Open in Playground
GET/substack/user/connectionsapiKey5 credits/request
Returns one of a user's public connection lists. Each entry is a full profile in the same shape as /substack/user, subscriber signals included. user_id is the numeric id returned by /substack/user. The upstream returns a bounded preview of each list rather than the complete membership.
Required: user_id. Optional: list (3 allowed values: followers, following, subscribers).
Sampled 14 Oct 2026: 21 items. Filled in every item: id, handle, name, profile_set_up_at, url, subscribers. Not in every item: bio (14), photo_url (17), bestseller_tier (1), publications (0). In the sample: profile_set_up_at: 2021-11-28 to 2026-07-19; photo_url: substack-post-media.s3.amazonaws.com and 1 other host; bio: median 155 characters; url: substack.com.
Open in Playground
GET/substack/user/searchapiKey3 credits/request
Searches public Substack profiles by name or handle. Each result carries the same subscriber signals as /substack/user, so a search enumerates writers without a second lookup per profile. Returns 20 profiles per page; use has_more rather than assuming a fixed depth, since result counts vary by query.
Required: query. Optional: page.
Sampled 14 Oct 2026: 20 items. Filled in every item: id, handle, slug, name, profile_set_up_at, url, subscribers. Not in every item: bio (16), photo_url (19), bestseller_tier (8), publications (19), subscriptions (18). In the sample: profile_set_up_at: 2021-09-06 to 2026-09-23; bestseller_tier: 100 to 10,000, median 100; photo_url: substack-post-media.s3.amazonaws.com and 2 other hosts; bio: median 132 characters; publications: median 1 entry; url: substack.com; subscriptions: median 26 entries.
Open in Playground