Buttondown Newsletter Scraper
Pricing
from $3.00 / 1,000 results
Buttondown Newsletter Scraper
Scrape posts and info from any public Buttondown newsletter (buttondown.com/{newsletter}) via its public archive pages. Browse a newsletter's full public archive, look up specific posts by URL, or fetch newsletter info. No login required.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
Crawler Bros
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Scrape posts and info from any public Buttondown newsletter — buttondown.com/{newsletter} — via its public archive pages. Works globally against any Buttondown-hosted newsletter. No login, no API key, no proxy required.
What this actor does
- Three modes:
posts,byPostUrls,newsletterInfo - Full archive pagination: walks a newsletter's entire public archive, newest first
- Optional full-body enrichment: fetch each post's individual page for exact timestamps, author info, and complete HTML body
- Filters: publish-date range, keyword (title/excerpt substring)
- Empty fields are omitted — every record only contains fields that actually have data
Output fields
Posts (recordType: "post")
| Field | Description |
|---|---|
postId | {newsletterSlug}/{postSlug} composite ID |
newsletterSlug, postSlug | Post identity |
title, excerpt | Title and short description (always present, from the archive listing) |
publishedDate | Publish date, YYYY-MM-DD (from the archive listing, day precision) |
featureImage | Cover image URL, if the post has one |
postUrl | Canonical archive URL |
html | Full HTML body (only with includeFullBody: true or mode=byPostUrls) |
publishedAt, updatedAt | Exact ISO timestamps (only with full-body enrichment) |
isAccessibleForFree | Whether the post is publicly free vs. paid-subscriber-gated (only with full-body enrichment; not present for Buttondown's own cross-posted /blog/ articles, which are always free) |
articleSection | Category/section label, when the post has one (only with full-body enrichment) |
authorName, authorUrl, authorImage | Author info (only with full-body enrichment) |
ogTitle, ogDescription, ogImage | Social card fields (only with full-body enrichment) |
language | Newsletter's declared page language (e.g. en, fr, pt-br), from the newsletter owner's account language setting |
Newsletter info (recordType: "newsletter")
newsletterSlug, newsletterName, newsletterDescription, icon, language, newsletterUrl, archiveUrl, socialLinks (the author's own configured identity links — GitHub, X/Twitter, Bluesky, Mastodon, personal site, etc. — as {platform, url} pairs; only present when the newsletter owner has configured them)
Every record also includes recordType and scrapedAt (UTC ISO timestamp).
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode | string | posts | posts / byPostUrls / newsletterInfo |
newsletterSlug | string | buttondown | The newsletter's Buttondown slug, or a full URL |
postUrls | array | – | mode=byPostUrls: exact archive post URLs |
includeFullBody | boolean | false | mode=posts: fetch each post's page for full body/timestamps/author (slower) |
dateFrom | string | – | ISO date, published on/after |
dateTo | string | – | ISO date, published on/before |
keyword | string | – | Case-insensitive substring match on title/excerpt |
maxItems | integer | 50 | Hard cap (1–1000) |
Example: a newsletter's full archive
{"mode": "posts","newsletterSlug": "buttondown","maxItems": 50}
Example: with full post bodies
{"mode": "posts","newsletterSlug": "thesephist","includeFullBody": true,"maxItems": 20}
Example: posts in a date range
{"mode": "posts","newsletterSlug": "buttondown","dateFrom": "2026-01-01","dateTo": "2026-12-31","maxItems": 50}
Example: single post lookup
{"mode": "byPostUrls","newsletterSlug": "buttondown","postUrls": ["https://buttondown.com/buttondown/archive/updates-from-july-4795/"]}
Use cases
- Content research — pull a newsletter's full public archive with metadata
- Migration / backup — export a Buttondown newsletter's post history
- Content monitoring — track a newsletter's publishing cadence and topics
- Curation — filter posts by date range or keyword across a newsletter's history
FAQs
Does this require a Buttondown account or API key?
No. This actor reads the same public archive pages any visitor sees at buttondown.com/{newsletter}/archive — no login required.
Will this work on any Buttondown newsletter? Yes, as long as the newsletter owner has public archives enabled (Buttondown lets writers mark individual emails as public, subscriber-only, or paid-only — this actor only sees what's publicly visible, same as a logged-out visitor).
Why is publishedDate day-precision but publishedAt has exact time?
publishedDate comes from the archive listing page (which only shows a date, e.g. "August 6, 2026"). Set includeFullBody: true to also fetch each post's individual page, which includes an exact ISO timestamp.
What if a newsletter slug doesn't exist? The actor fails soft with a clear status message and emits zero records — it never crashes on a bad or private newsletter slug.
Is this actor global? Yes — Buttondown hosts newsletters worldwide with no regional restrictions. Any public newsletter's slug works as input.