Substack logo

Substack API + MCP (2026): official read-only MCP, no write API

Last verified Sep 14, 2026

Substack shipped an official MCP server before it shipped a usable REST API. Since July 6, 2026 an admin of a Bestseller publication can connect Claude or ChatGPT to a first-party, read-only endpoint and pull dashboard metrics into a chat, while the same admin still has no documented way to publish a post, add a subscriber or send an email programmatically. The official Developer API exists, but its Terms of Use scope it to publicly visible creator profile data behind manual approval, and Substack publishes zero official SDKs. Read this tab as a constraints document, not an integration guide.

At a glance

No public REST API
API surface
Developer API scoped to public creator profile data, approval-gated, no version or base URL published

0
Official SDKs
No first-party client in any language; every Substack-named package is community-built

Official, gated
MCP status
Read-only server shipped July 2026, Bestseller publications only, admins only

MCP integration in 2026

Model Context Protocol is the one developer-adjacent area where Substack moved early. The company announced MCP support on July 6, 2026, describing it as a way for bestsellers to “understand your publication stats by integrating with tools like Claude and ChatGPT”. What it is not is a write channel.

!

Official MCP server exists, but it is read-only and Bestseller-gated

Substack operates a first-party MCP endpoint at https://mcp.substack.com/api/v1/mcp, live since July 6, 2026. It serves dashboard metrics, traffic data and publication settings to an AI client you authorise by signing into Substack. Two hard limits decide whether it is relevant to you. It cannot write, no publishing posts, no sending Notes, no account changes, no profile or Notes activity. And you must administer a Bestseller publication, a badge described only as “hundreds” of paid subscribers at the entry tier, which puts it out of reach for most writers.

Available MCP servers

One official server, five community servers with meaningfully different risk profiles. The community projects all drive undocumented internal endpoints or a copied browser session token, none is sanctioned, and the session-token pattern hands the MCP process the practical equivalent of your password.

Why buyers should care

The ordering tells you what Substack is optimising. A first-party, authenticated data channel for AI assistants arrived before any usable developer API, and it reads rather than writes. That lets the platform answer “how is my newsletter doing” inside Claude without opening a door that lets tools automate it. For a buyer that means two things. If your requirement is reporting, Substack now has a clean answer, provided you clear the Bestseller bar. If it is automation, programmatic publishing, subscriber sync into a CRM, event-driven lifecycle mail, nothing here changes the verdict, and you should be evaluating beehiiv, Kit or MailerLite, all of which document a real write API.

Substack API essentials

One official API surface exists and it is deliberately narrow. The Substack Developer API is governed by Terms of Use last updated January 8, 2026, which scope it to “Authorized Data”, publicly visible creator profile information such as names, social URLs, subscriber counts and profile summaries. Access is granted by manual application. Substack publishes no developer reference with a base URL, version string, request contract or pagination scheme, so the table below records what is documented and marks the rest as unpublished rather than filling gaps from community packages.

Official API nameSubstack Developer API
Governing documentsubstack.com/api-tos, updated January 8, 2026
Base URLNot published
VersionNot published
Response formatJSON
ScopePublic creator profile data only, no send, publish or subscriber write
Access modelManual approval; no self-service key issuance documented
PaginationNot published
TimeoutNot published
WebhooksNone. Substack ships no outbound event delivery of any kind
Official MCP endpointhttps://mcp.substack.com/api/v1/mcp – read-only, Bestseller publications
Unauthenticated read pathPublication RSS feed at /feed on the publication domain

The practical consequence is that the RSS feed, not the API, is the only stable read interface most developers will ever use against Substack. It needs no key, it is a product feature rather than a developer contract, and it survives platform changes because subscribers and podcast apps depend on it. Everything richer than “what did this publication publish, and when” needs the approval-gated profile API, the Bestseller-gated MCP server, or an unsupported wrapper that will break.

Authentication methods

Two authorisation paths exist officially, and they are entirely separate systems. Neither issues a credential you can create yourself in a dashboard, which is the first structural difference a developer coming from beehiiv or Kit will notice.

Developer API credentials

Access is granted through a manual application. Substack publishes no credential format, header name or token lifetime, so no example request can be written here without inventing it. What the Terms of Use do state is the boundary on a granted credential: you may not derive non-public attributes about creators, aggregate the data for profiling, redistribute it as a standalone product, build features that compete with Substack, or use it for unsolicited communications. Plan approval as a dependency with unknown turnaround, not a formality.

MCP account authorisation

The official MCP server uses an OAuth-style consent flow inside the AI client rather than a static key. In Claude you add it under Customize › Connectors › Add custom connector, point it at https://mcp.substack.com/api/v1/mcp, sign into Substack in the window that opens and grant read permission on a publication you administer. Revocation happens on the Substack side, not by rotating a secret.

Session tokens used by community tools

Most community MCP servers and SDKs ask you to copy a session cookie out of your browser into a config file. This is not an authentication method Substack offers; it is an impersonation of your logged-in browser.

A pasted session token is a full-account credential

A Substack session cookie carries everything your logged-in browser can do, publish, delete, export subscribers, change payment settings, with no scoping and no separate audit trail. The most capable community server, marcomoauro/substack-mcp, says so itself and tells you to treat the token like a password. If you run it anyway, use a dedicated browser profile, keep the token out of any file that reaches a repository, and log out of that session to revoke it the moment the work is done.

Rate limits

Substack publishes no numeric limit of any kind, for the API or for sending. That is the documented position, not a research gap: the Developer API Terms of Use state only that “Your use of the API is subject to rate limits, quotas, and other technical restrictions as determined by Substack in its sole discretion”.

LimitPublished valueWhat is actually documented
API requests per minuteNot publishedTerms of Use defer entirely to Substack’s “sole discretion”
Emails per hourNot publishedNo hourly cap in any official article
Recipients per broadcastNot publishedPublishing is free “no matter how many subscribers you have”
Message sizeNot publishedNo size limit stated in the help centre
List import sizeUncapped, but reviewed“No limit to the mailing list size that you import”, yet a “really big list” triggers manual verification with no published threshold

The workaround is architectural rather than technical, because there is no quota to negotiate up. If your integration reads, build it on the RSS feed and cache aggressively: poll on a schedule measured in minutes, store last-seen GUIDs, and never fan out per-item requests against publication URLs. If it writes, accept that no supported path exists and move the write side to a platform that documents one – beehiiv, Kit, MailerLite and Flodesk all expose a sending or subscriber API with stated behaviour. For a large migration in either direction, budget slack for the human review step rather than assuming an overnight cutover.

Official SDKs

There are none. Substack publishes no client library, no OpenAPI description and no public engineering repositories, in any language, as of 2026. Every package on npm, PyPI or CRAN carrying the Substack name is community-built and wraps undocumented internal endpoints or an authenticated session.

github.com/substack is not the company

The GitHub account substack belongs to Node.js developer James Halliday and predates the newsletter company. The repositories there, tape, minimist, mkdirp, dnode, stream-handbook, are general JavaScript utilities with no relationship to the platform. Installing one because the name looked official is the most common wasted afternoon in this ecosystem.

Notable community SDKs

Three community clients are maintained well enough to be worth naming. All three read public or semi-public data; none can send an email, and none carries a support commitment. Pin a commit, read the code before you run it, and assume the interface it wraps can change without notice.

LanguagePackageInstallRepo
Pythonsubstack_apipip install git+https://github.com/NHagar/substack_apiNHagar/substack_api
TypeScriptsubstack-apinpm i github:jakub-k-slys/substack-apijakub-k-slys/substack-api
RsubstackRinstall.packages("substackR")CRAN: substackR

The Python wrapper reads publications, posts and user profiles; the TypeScript client offers an entity-based interface over publications, posts, comments and profiles. substackR is the only one distributed through a curated registry, which raises the floor on packaging quality but says nothing about the endpoints underneath. None should sit on the critical path of a production system.

Endpoints reference

A conventional endpoint table cannot be written for Substack, because Substack documents no REST endpoints. What follows is the honest equivalent: the inventory of things a developer might want to do, and the officially documented surface for each. Third-party articles describe internal JSON paths that Substack’s own site calls; those are deliberately not listed, because they are unsupported and can change without notice. The authoritative references are the Developer API Terms of Use and the AI assistant help article.

CapabilityOfficial surfaceNotes
Send an email or broadcastNoneDashboard only. No send endpoint, no relay
Send to a filtered segmentNoneManual from the subscriber dashboard, no API hook
Create or publish a postNoneEditor only; community servers drive a browser session
Schedule a postNoneExists in the editor, not programmatically
Publish a NoteNoneScheduled Notes shipped April 2026, in-product only
Add a subscriberNoneNo subscriber write API, no custom form with code access
Remove or unsubscribe a readerNoneDashboard only
List subscribersCSV exportManual; emails and engagement columns, names excluded
Subscriber countDeveloper APIOnly within public creator profile data, approval-gated
Creator profile lookupDeveloper APINames, social URLs, profile summaries. Its entire purpose
Dashboard metrics and trafficOfficial MCPRead-only, Bestseller admin required
Publication settings readOfficial MCPRead-only; no write counterpart
Post archive readRSS feed/feed on the publication domain. No key required
Podcast feed readRSS feedExternal podcast hosts supported since July 2026
Event notificationsNoneNo webhooks. Polling the RSS feed is the only substitute

Code examples

Two of the three snippets read the RSS feed, the only officially supported interface available without an approval process. The third connects the official MCP server. There is deliberately no send example: there is no Substack host, port, credential or endpoint to write one against.

Python, read a publication feed

# Substack documents no REST endpoints for sending, subscribers or posts.
# The only officially supported programmatic READ surface is the publication RSS feed.

import feedparser

FEED = "https://example.substack.com/feed"  # or https://yourdomain.com/feed on a custom domain

parsed = feedparser.parse(FEED)
print(parsed.feed.get("title"))

for entry in parsed.entries[:10]:
    print(entry.published, "|", entry.title)
    print(entry.link)

# There is deliberately no send() here: Substack exposes no relay and no send endpoint.
# To send mail yourself, export subscribers to CSV and use a provider with a relay.

Node.js, same read path

// Substack has no public send or subscriber API. The supported read path is the RSS feed.

import Parser from 'rss-parser';

const parser = new Parser();
const FEED = 'https://example.substack.com/feed'; // or https://yourdomain.com/feed

const feed = await parser.parseURL(FEED);
console.log(feed.title);

for (const item of feed.items.slice(0, 10)) {
  console.log(item.pubDate, '|', item.title);
  console.log(item.link);
}

// No nodemailer example is possible: there is no Substack SMTP host, port or credential.

MCP client configuration

// Remote MCP server, HTTP transport. Authorisation happens in the browser:
// you sign into Substack and grant read access on a publication you administer.
// Requires admin rights on a Bestseller publication - the server returns nothing otherwise.

{
  "mcpServers": {
    "substack": {
      "url": "https://mcp.substack.com/api/v1/mcp"
    }
  }
}

// In Claude: Customize -> Connectors -> Add custom connector -> paste the URL above.
// Operations are read-only: dashboard metrics, traffic data, publication settings.

Common gotchas

The official API is a profile lookup, not a publishing API

Substack does have a Developer API in 2026, which is exactly why teams scope projects around it and discover the boundary late. Its Terms of Use limit it to publicly visible creator profile data and prohibit deriving non-public attributes, profiling, redistribution as a product, competing features and unsolicited communications. There is no endpoint to create a post, add a subscriber or send an email. If your design document says “we push content to Substack via API”, it does not survive contact with the terms.

MCP eligibility cannot be checked with a number

Official MCP requires an admin of a Bestseller publication, and Substack describes the badge tiers only as “hundreds”, “thousands” and “tens of thousands” of paid subscribers. No exact cut-off is published, so you cannot determine eligibility before attempting the connection, nor promise a client they will qualify at a given subscriber count. Budget for the connector simply returning nothing.

No webhooks means polling, and polling means the RSS feed

There is no new-subscriber event, no post-published event and no payment event delivered outbound. Every automation built on Substack, including the Zapier workflows people call a “Substack integration”, is a generic RSS trigger on a publication feed. That gives you new posts with polling latency and nothing else: no subscriber signals, no engagement signals, no writes back.

You cannot paste HTML, CSS or an iframe into a post

Substack blocks custom code in the editor outright, including raw iframe embeds. Only allow-listed embeds work, by pasting a bare URL: YouTube, Vimeo, Spotify, SoundCloud, X/Twitter, Instagram and GIFs. That rules out booking widgets, custom signup forms, survey tools and tracking pixels, a ceiling that catches developers migrating from a platform where those snippets simply worked.

Deprecations and changelog

Substack maintains no developer changelog or API release-notes feed. The dates below come from the company’s own product announcements and from the Terms of Use, the only versioned developer-facing document the platform publishes.

  • August 25, 2026 – Product release: creator match, audience-specific content blocks, global reply rules and advanced podcast transcript editing. No developer-facing surface added.
  • July 6, 2026 – Official MCP support ships for Bestseller publications, alongside Subscriber Perks, saved Notes, scheduled Chats, polls and RSS support for externally hosted podcasts. Substack’s first first-party programmatic channel of any kind.
  • April 8, 2026 – Product release: post templates, drop caps, scheduled Notes, callout blocks, a customisable subscribe homepage block and feed refinement controls.
  • January 8, 2026 – Developer API Terms of Use last updated, formalising the API’s scope as publicly visible creator profile data only, with rate limits left to Substack’s sole discretion.
  • October 21, 2020 – Custom domains launched at a one-time $50 fee per publication. Unchanged nearly six years later, and never extended to email sending.

Official release notes live at on.substack.com/archive, the API terms at substack.com/api-tos. Neither carries deprecation notices, because there is no versioned public API to deprecate.

Frequently asked questions

Does Substack have a public API?

Not in the sense developers usually mean. There is an official Substack Developer API, but its Terms of Use scope it to publicly visible creator profile data and access is granted by manual approval. No base URL, version or endpoint list is published, there is no way to send an email, publish a post or add a subscriber, and there are no webhooks. The only unauthenticated read path is the publication RSS feed at /feed.

How do I get access to the Substack Developer API?

Through a manual application, not a self-service dashboard. Substack publishes no credential format, request header or turnaround time, so treat approval as a project dependency with unknown latency. Check the Terms of Use against your use case first: profiling, redistribution as a standalone data product, competing features and unsolicited outreach are all prohibited, which eliminates most reasons people want the key.

Is there an official Substack MCP server?

Yes, since July 6, 2026, at https://mcp.substack.com/api/v1/mcp. It is read-only and restricted to admins of Bestseller publications. It exposes dashboard metrics, traffic data and publication settings, and cannot publish posts, send Notes or modify the account. Add it in Claude under Customize › Connectors › Add custom connector and authorise with your Substack login.

Can I publish a Substack post programmatically?

Not through any supported interface. The official API has no write scope and the official MCP server is read-only. Community servers such as marcomoauro/substack-mcp do publish, but by driving an authenticated browser session with a token copied from your cookies, an unscoped, full-account credential. If programmatic publishing is a requirement, beehiiv and Kit both document a real write API.

Are the unofficial Substack API packages safe to use?

It depends on whether they ask for a credential. Read-only wrappers over public data, such as substackR or NHagar/substack_api, carry normal supply-chain risk and a real chance of breaking when Substack changes its internals. Anything that asks you to paste a session cookie carries account-takeover risk, because that token is equivalent to your password. Note also that github.com/substack is not the company – it is the personal account of Node.js developer James Halliday.

How do I read Substack posts programmatically without an API key?

Use the publication RSS feed: https://example.substack.com/feed, or https://yourdomain.com/feed on a custom domain. It needs no key, it is a product feature rather than an internal endpoint, and it is the hook virtually all real-world Substack automation uses, including the Zapier RSS-trigger pattern. Poll on a schedule measured in minutes, cache by GUID, and do not fan out per-item requests against publication URLs.

Changelog (recent)

  • 2026-08-25 Product release: creator match, audience-specific content blocks, global reply rules and advanced podcast transcript editing. No developer-facing surface added.
  • 2026-07-06 Official MCP support ships for Bestseller publications at https://mcp.substack.com/api/v1/mcp, read-only, alongside Subscriber Perks, saved Notes, scheduled Chats and RSS support for externally hosted podcasts.
  • 2026-04-08 Product release: post templates, drop caps, scheduled Notes, callout blocks, a customisable subscribe homepage block and feed refinement controls.
AAlaa Touil RRabeb How we test →

This review follows our email infrastructure testing methodology. We disclose affiliate relationships in our editorial independence policy.