{"name":"substack-scraper","id":"sfoln/substack-scraper","title":"Substack Scraper – Newsletter Posts","description":"Scrape any Substack newsletter (or one on its own domain): every post with title, subtitle, date, authors, likes, comments, word count, paywall flag and the full text as markdown for free posts, plus the publication's profile and subscriber count. $1 per 1,000 posts, no start fee.","version":"0.1","status":"ready","family":{"id":"social-media-data","name":"Social media data","description":"Profiles, posts, comments, followers and account audits from X, Instagram, TikTok, YouTube, Reddit, Threads, LinkedIn, Facebook, Bluesky, Telegram, Hacker News and Substack.","actors":31},"categories":["NEWS","SOCIAL_MEDIA","AI"],"availability":"on_request","seoTitle":"Substack Scraper – Newsletter Posts & Full Text API","seoDescription":"Scrape Substack newsletters: posts with full text as markdown, dates, authors, likes, comments, paywall flag and subscriber counts. $1 per 1,000 posts.","summary":"Scrape any Substack newsletter — on name.substack.com or its own domain — into clean rows: every post with title, subtitle, date, authors as published, likes, comments, restacks, word count, paywall flag and, for free posts, the full text as markdown. Each newsletter also gets a free publication profile (name, author, description, start date, subscriber count). Built for newsletter research, competitor and creator tracking, content datasets and AI agents.","pricing":{"model":"pay-per-event","currency":"USD","billedBy":"Apify","freePlanMaxItemsPerRun":10,"events":[{"name":"post","title":"Substack post","description":"Charged once per newsletter post delivered (metadata, engagement and, for free posts, the full text as markdown).","priceUsd":0.001}]},"input":{"description":"Substack publications, post URLs or writer @handles. Each one delivers its posts (one charged row per post) and one free summary record with the publication profile.","required":["publications"],"fields":[{"name":"publications","title":"Publications, posts or @handles","type":"array","required":true,"description":"One per line: a Substack name (platformer), a URL (https://name.substack.com or the publication's own domain), a post URL (…/p/<slug>) or a writer's @handle. Accounts on the Apify free plan can process up to 10 publications per run, with up to 20 posts each.","prefill":["https://on.substack.com"],"editor":"stringList"},{"name":"maxPostsPerPublication","title":"Max posts per publication","type":"integer","required":false,"description":"Posts to deliver per publication, newest first (or most popular first with sort: top).","default":20,"prefill":5,"minimum":1,"maximum":5000},{"name":"sort","title":"Sort","type":"string","required":false,"description":"new (newest first) or top (Substack's most popular posts first).","default":"new","enum":["new","top"],"editor":"select"},{"name":"searchQuery","title":"Search within the archive","type":"string","required":false,"description":"Only posts matching this text (Substack's own archive search).","editor":"textfield"},{"name":"postedAfter","title":"Posted after","type":"string","required":false,"description":"Only posts on or after this date: YYYY-MM-DD, an ISO date-time, or a relative period such as \"30 days\".","editor":"textfield"},{"name":"postedBefore","title":"Posted before","type":"string","required":false,"description":"Only posts on or before this date (a YYYY-MM-DD date includes the whole day).","editor":"textfield"},{"name":"includeBody","title":"Include full text","type":"boolean","required":false,"description":"Add the full post as markdown (bodyMarkdown) for posts everyone can read. Paid and subscriber-only posts always come with their public excerpt only.","default":true},{"name":"includePaywalled","title":"Include paid posts","type":"boolean","required":false,"description":"Deliver paid and subscriber-only posts too (metadata and the public excerpt, no body). Off: they are left out and not charged.","default":true},{"name":"includePublicationProfile","title":"Include publication profile","type":"boolean","required":false,"description":"Add the publication's name, description, author, logo, start date and subscriber count to its free summary record (one extra request).","default":true},{"name":"maxPublications","title":"Max publications","type":"integer","required":false,"description":"Safety cap on inputs in this run; the rest are ignored and counted as inputItemsDropped in the OUTPUT record.","default":100,"minimum":1,"maximum":1000},{"name":"concurrency","title":"Concurrency","type":"integer","required":false,"description":"Publications read in parallel.","default":2,"minimum":1,"maximum":5},{"name":"includeRaw","title":"Include raw post objects","type":"boolean","required":false,"description":"Attach Substack's post object (without the HTML body) to each row (larger output).","default":false}]},"exampleInput":{"publications":["https://on.substack.com"],"maxPostsPerPublication":5},"outputFields":[{"name":"input","type":"string | object","title":"Input","description":"The publication, post URL or @handle this record belongs to."},{"name":"recordType","type":"string","title":"Record type","description":"post (charged) or summary (one per input, with the publication profile; free).","example":"post"},{"name":"position","type":"integer","title":"Position","description":"Post number within its input in this run (1 = first)."},{"name":"status","type":"string","title":"Status","description":"ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan | skipped_unmetered","example":"ok"},{"name":"charged","type":"boolean","title":"Charged","description":"Whether this record incurred a pay-per-event charge."},{"name":"chargedEvent","type":"string","title":"Charged event","description":"Pay-per-event event charged for this record (present only when charged)."},{"name":"chargedCount","type":"integer","title":"Events charged","description":"Events actually charged when the charge came back short of the requested count (present only then; a warning explains it)."},{"name":"source","type":"string","title":"Source","description":"Upstream data source."},{"name":"fetchedAt","type":"string","title":"Fetched at","description":"ISO timestamp."},{"name":"error","type":"object","title":"Error","description":"{ code, message, provider?, status? } when status is not ok. Codes set by the runtime: budget_exhausted, free_plan_limit, unmetered, aborted, charge_failed, record_too_large, invalid_record, dataset_push_failed; upstream codes: rate_limit, timeout, network, server, client, invalid_response, not_found; this Actor: invalid_input, not_substack."},{"name":"warnings","type":"array","title":"Warnings","description":"Notes about this record, e.g. a cap or the budget that stopped an input early."},{"name":"postId","type":"integer","title":"Post ID","description":"Substack's post id."},{"name":"title","type":"string | null","title":"Title","description":"Post title."},{"name":"subtitle","type":"string | null","title":"Subtitle","description":"Post subtitle."},{"name":"slug","type":"string | null","title":"Slug","description":"URL slug (…/p/<slug>)."},{"name":"url","type":"string | null","title":"URL","description":"Canonical post URL."},{"name":"publishedAt","type":"string | null","title":"Published at","description":"ISO 8601 UTC."},{"name":"updatedAt","type":"string | null","title":"Updated at","description":"Last edit (post URLs only)."},{"name":"type","type":"string | null","title":"Type","description":"newsletter | podcast | thread | video …"},{"name":"audience","type":"string | null","title":"Audience","description":"everyone | only_free | only_paid | founding"},{"name":"isPaywalled","type":"boolean","title":"Paywalled","description":"Not readable by everyone (subscriber-only or paid)."},{"name":"authors","type":"array","title":"Authors","description":"Bylines as published: [{ name, handle, profileUrl }]."},{"name":"likes","type":"integer | null","title":"Likes","description":"All reactions (Substack's likes)."},{"name":"reactions","type":"object","title":"Reactions","description":"Reaction counts by emoji."},{"name":"restacks","type":"integer | null","title":"Restacks","description":"Restacks (shares within Substack)."},{"name":"commentsCount","type":"integer | null","title":"Comments","description":"Comment count."},{"name":"wordcount","type":"integer | null","title":"Word count","description":"Words in the post."},{"name":"description","type":"string | null","title":"Description","description":"The post's description (social/SEO text)."},{"name":"excerpt","type":"string | null","title":"Excerpt","description":"The public excerpt from the archive."},{"name":"bodyMarkdown","type":"string | null","title":"Full text (markdown)","description":"The full post as markdown: posts everyone can read, with includeBody."},{"name":"coverImage","type":"string | null","title":"Cover image","description":"Cover image URL."},{"name":"section","type":"string | null","title":"Section","description":"Publication section."},{"name":"tags","type":"array","title":"Tags","description":"Post tags."},{"name":"language","type":"string | null","title":"Language","description":"Post language code."},{"name":"podcastUrl","type":"string | null","title":"Podcast audio","description":"Audio URL of a podcast post."},{"name":"podcastDurationSecs","type":"integer | null","title":"Podcast duration","description":"Seconds."},{"name":"publicationId","type":"integer | null","title":"Publication ID","description":"Substack's publication id."},{"name":"publicationHost","type":"string","title":"Publication host","description":"Host the post was read from (name.substack.com or the custom domain)."},{"name":"raw","type":"object","title":"Raw","description":"Substack's post object without the HTML body (only with includeRaw)."},{"name":"publication","type":"string","title":"Publication","description":"Summary records: the publication host."},{"name":"publicationName","type":"string | null","title":"Publication name","description":"Summary records."},{"name":"publicationUrl","type":"string","title":"Publication URL","description":"Summary records."},{"name":"subdomain","type":"string | null","title":"Subdomain","description":"Summary records: <subdomain>.substack.com."},{"name":"customDomain","type":"string | null","title":"Custom domain","description":"Summary records."},{"name":"publicationDescription","type":"string | null","title":"Publication description","description":"Summary records: the tagline."},{"name":"logoUrl","type":"string | null","title":"Logo","description":"Summary records."},{"name":"coverPhotoUrl","type":"string | null","title":"Cover photo","description":"Summary records."},{"name":"authorName","type":"string | null","title":"Author","description":"Summary records: the publication's main author as published."},{"name":"authorHandle","type":"string | null","title":"Author handle","description":"Summary records."},{"name":"createdAt","type":"string | null","title":"Created at","description":"Summary records: when the publication was created."},{"name":"firstPostDate","type":"string | null","title":"First post","description":"Summary records."},{"name":"subscriberCount","type":"integer | null","title":"Subscribers","description":"Summary records: subscribers when the publication shows the count, else null."},{"name":"subscriberCountText","type":"string | null","title":"Subscribers (as shown)","description":"Summary records: e.g. 460,000."},{"name":"paidSubscribersRange","type":"string | null","title":"Paid subscribers","description":"Summary records: Substack's band, e.g. Tens of thousands of paid subscribers."},{"name":"bestsellerTier","type":"integer | null","title":"Bestseller tier","description":"Summary records: Substack's bestseller badge tier (100, 1000, 10000)."},{"name":"paymentsEnabled","type":"boolean","title":"Paid subscriptions","description":"Summary records: the publication sells subscriptions."},{"name":"hasPodcast","type":"boolean","title":"Podcast","description":"Summary records."},{"name":"podcastFeedUrl","type":"string | null","title":"Podcast feed","description":"Summary records."},{"name":"sections","type":"array","title":"Sections","description":"Summary records."},{"name":"resultsDelivered","type":"integer","title":"Posts delivered","description":"Summary records: charged post rows of this input."},{"name":"stopReason","type":"string","title":"Stop reason","description":"Summary records: limit | free_plan | end | budget | aborted | deadline | empty_pages | max_pages | error."}],"outputExample":[{"input":"synthetic","recordType":"post","position":1,"postId":5,"title":"Synthetic post 5","subtitle":"Subtitle 5","slug":"fifth-post","url":"https://synthetic.substack.com/p/fifth-post","publishedAt":"2026-10-10T10:00:00.000Z","updatedAt":null,"type":"newsletter","audience":"everyone","isPaywalled":false,"authors":[{"name":"Sam Synthetic","handle":"samsynthetic","profileUrl":"https://substack.com/@samsynthetic"}],"likes":15,"reactions":{"❤":15},"restacks":5,"commentsCount":10,"wordcount":500,"description":"Description 5","excerpt":"Excerpt of post 5…","bodyMarkdown":"Hello **readers**, see [this link](https://example.com/x).[^1]\n\n![A chart](https://substackcdn.example/a.png)\n_Figure 1: growth_\n\n[^1]: A synthetic footnote.","coverImage":"https://substackcdn.example/img/5.png","section":"Essays","tags":["Testing"],"language":"en","podcastUrl":null,"podcastDurationSecs":null,"publicationId":777,"publicationHost":"synthetic.substack.com","status":"ok","charged":true,"chargedEvent":"post","source":"substack","fetchedAt":"2026-10-14T12:00:00.000Z"},{"input":"synthetic","publication":"synthetic.substack.com","publicationName":"Synthetic Letter","publicationUrl":"https://synthetic.substack.com","publicationId":777,"subdomain":"synthetic","customDomain":null,"publicationDescription":"Notes on synthetic data.","logoUrl":"https://substackcdn.example/logo.png","coverPhotoUrl":null,"authorName":"Sam Synthetic","authorHandle":"samsynthetic","language":"en","createdAt":"2021-01-02T03:04:05.000Z","firstPostDate":"2021-01-03T00:00:00.000Z","subscriberCount":12500,"subscriberCountText":"12,500","paidSubscribersRange":"Hundreds of paid subscribers","bestsellerTier":100,"paymentsEnabled":true,"hasPodcast":true,"podcastFeedUrl":null,"sections":["Essays"],"recordType":"summary","resultsDelivered":20,"stopReason":"limit","status":"ok","charged":false,"source":"substack","fetchedAt":"2026-10-14T12:00:05.000Z"}],"faq":[{"question":"Does it work for newsletters on their own domain?","answer":"Yes. Give the custom domain (for example https://www.example-newsletter.com) or the name.substack.com address; the Actor follows Substack's redirect to the custom domain."},{"question":"Can it read paid posts?","answer":"No. Paid and subscriber-only posts come with their metadata and the public excerpt (isPaywalled: true, bodyMarkdown: null). Turn off includePaywalled to leave them out."},{"question":"How do I get only new posts every day?","answer":"Schedule the Actor with postedAfter set to a relative period such as \"1 day\" and sort set to new: paging stops at the first older post."}],"mcpExamplePrompt":"Use substack-scraper to get the 10 newest posts of https://on.substack.com with their full text, then summarize the main announcements.","related":["hacker-news-scraper","telegram-channel-scraper","url-to-markdown-summary","brand-mentions-monitor","google-news-search","reddit-subreddit-posts","website-change-monitor"],"urls":{"site":"https://www.sfoln.com/actors/substack-scraper/","siteJson":"https://www.sfoln.com/actors/substack-scraper.json","siteMarkdown":"https://www.sfoln.com/actors/substack-scraper.md","runSync":"https://api.apify.com/v2/actors/sfoln~substack-scraper/run-sync-get-dataset-items","runAsync":"https://api.apify.com/v2/actors/sfoln~substack-scraper/runs","mcp":"https://mcp.apify.com?tools=sfoln/substack-scraper","requestAccess":"mailto:contact@sfoln.com?subject=Access%20request%3A%20Substack%20Scraper%20%E2%80%93%20Newsletter%20Posts%20(sfoln%2Fsubstack-scraper)&body=Please%20publish%20substack-scraper.%20What%20we%20plan%20to%20use%20it%20for%3A"},"publisher":{"name":"SFOLN LLC","apifyUsername":"sfoln","url":"https://www.sfoln.com","apifyProfile":"https://apify.com/sfoln","email":"contact@sfoln.com"},"generatedAt":"2026-10-22T04:28:58.477Z"}