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.
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.
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.
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.
Substack’s own read-only endpoint at https://mcp.substack.com/api/v1/mcp. Requires admin rights on a Bestseller publication. Dashboard metrics, traffic data and publication settings; cannot publish, send Notes or modify the account.
The most complete community server: 27 tools covering drafts, publishing, subscriber export and 16 analytics reports. Authenticates with a session token lifted from browser cookies; its own docs warn to treat that token exactly like a password.
Community server aimed at Substack integration inside Claude Code. Same unsanctioned foundation as the rest, undocumented endpoints, no stability guarantee.
Structured read access with content analysis over public data only. Lower risk than the session-token servers because it asks for no credentials.
Reads Substack publications and Notes. Listed in the Glama and PulseMCP directories, which is discovery surface rather than endorsement.
Narrow server for retrieving individual Substack articles. Useful for research workflows, irrelevant for publishing ones.
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.
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 name | Substack Developer API |
| Governing document | substack.com/api-tos, updated January 8, 2026 |
| Base URL | Not published |
| Version | Not published |
| Response format | JSON |
| Scope | Public creator profile data only, no send, publish or subscriber write |
| Access model | Manual approval; no self-service key issuance documented |
| Pagination | Not published |
| Timeout | Not published |
| Webhooks | None. Substack ships no outbound event delivery of any kind |
| Official MCP endpoint | https://mcp.substack.com/api/v1/mcp – read-only, Bestseller publications |
| Unauthenticated read path | Publication 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.
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.
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.
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.
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 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.
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”.
| Limit | Published value | What is actually documented |
|---|---|---|
| API requests per minute | Not published | Terms of Use defer entirely to Substack’s “sole discretion” |
| Emails per hour | Not published | No hourly cap in any official article |
| Recipients per broadcast | Not published | Publishing is free “no matter how many subscribers you have” |
| Message size | Not published | No size limit stated in the help centre |
| List import size | Uncapped, 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.
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.
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.
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.
| Language | Package | Install | Repo |
|---|---|---|---|
| Python | substack_api | pip install git+https://github.com/NHagar/substack_api | NHagar/substack_api |
| TypeScript | substack-api | npm i github:jakub-k-slys/substack-api | jakub-k-slys/substack-api |
| R | substackR | install.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.
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.
| Capability | Official surface | Notes |
|---|---|---|
| Send an email or broadcast | None | Dashboard only. No send endpoint, no relay |
| Send to a filtered segment | None | Manual from the subscriber dashboard, no API hook |
| Create or publish a post | None | Editor only; community servers drive a browser session |
| Schedule a post | None | Exists in the editor, not programmatically |
| Publish a Note | None | Scheduled Notes shipped April 2026, in-product only |
| Add a subscriber | None | No subscriber write API, no custom form with code access |
| Remove or unsubscribe a reader | None | Dashboard only |
| List subscribers | CSV export | Manual; emails and engagement columns, names excluded |
| Subscriber count | Developer API | Only within public creator profile data, approval-gated |
| Creator profile lookup | Developer API | Names, social URLs, profile summaries. Its entire purpose |
| Dashboard metrics and traffic | Official MCP | Read-only, Bestseller admin required |
| Publication settings read | Official MCP | Read-only; no write counterpart |
| Post archive read | RSS feed | /feed on the publication domain. No key required |
| Podcast feed read | RSS feed | External podcast hosts supported since July 2026 |
| Event notifications | None | No webhooks. Polling the RSS feed is the only substitute |
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.
# 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.// 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.// 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.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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
This review follows our email infrastructure testing methodology. We disclose affiliate relationships in our editorial independence policy.