Buttondown Newsletter Archive Scraper
Buttondown Newsletter Archive Scraper
Scrape posts from any Buttondown newsletter publication. Input a list of publication usernames and get back every post with title, publish date, excerpt, cover image, tags, paid flag, and full body text. Supports multi-publication fan-out in a single run.
What it does
Buttondown is the leading privacy-first newsletter platform used by developers, indie authors, and technical writers. This actor crawls the server-rendered Buttondown archive — no login required.
For each username you provide, the actor:
- Fetches
https://buttondown.com/<username>/sitemap.xmlto discover all post URLs. - Visits the publication's archive page to extract the publication name, description, and per-post card metadata (excerpt, cover image, date, tags, paid flag).
- Visits each post's detail page to extract the title, publish date, and full body text.
Input
| Field | Type | Description |
|---|---|---|
usernames |
array | Required. List of Buttondown usernames (e.g. ["cassidoo", "buttondown"]). You can also pass full URLs like https://buttondown.com/cassidoo. |
maxItems |
integer | Maximum posts to scrape per publication. Set 0 for unlimited. Default: 10. |
Example input
{
"usernames": ["cassidoo", "swyx"],
"maxItems": 50
}
Output
Each record in the dataset contains:
| Field | Description |
|---|---|
publication_username |
Buttondown username (e.g. cassidoo) |
publication_name |
Publication display name |
publication_description |
Publication about text |
post_url |
Full URL to the post |
post_title |
Post title |
post_subtitle |
Subtitle, if present |
author |
Author name |
publish_date |
Publication date as shown on the page (e.g. May 25, 2026) |
excerpt |
Short excerpt from the archive listing card |
cover_image_url |
Cover image URL from the archive card |
tags |
Comma-separated tag list |
is_paid |
Whether the post is behind a paid subscription wall |
full_text |
Full body text of the newsletter email |
scraped_at |
ISO timestamp when this record was scraped |
Example output record
{
"publication_username": "cassidoo",
"publication_name": "rendezvous with cassidoo",
"publication_description": "Interviews, tips, and thoughts on software engineering...",
"post_url": "https://buttondown.com/cassidoo/archive/permit-yourself-to-change-your-mind/",
"post_title": "Permit yourself to change your mind",
"post_subtitle": "",
"author": "rendezvous with cassidoo",
"publish_date": "May 25, 2026",
"excerpt": "Hey friends! I hope you had a good week...",
"cover_image_url": "",
"tags": "",
"is_paid": false,
"full_text": "Hey friends!\nI hope you had a good week!...",
"scraped_at": "2026-05-28T17:15:00.000Z"
}
How to find a Buttondown username
The username is the part of the publication URL after buttondown.com/. For example:
https://buttondown.com/cassidoo→ username iscassidoohttps://buttondown.com/swyx→ username isswyx
Any publication that has a public archive at https://buttondown.com/<username>/archive/ or a sitemap at https://buttondown.com/<username>/sitemap.xml works.
Limitations
- Private posts: Posts behind a free-subscription gate are still fetched but flagged
is_paid: false. Posts behind a paid-tier wall are flaggedis_paid: trueand may have truncatedfull_text. - Sitemap coverage: Only posts listed in the publication's sitemap are discovered. Publications without a sitemap or with a private-only archive return zero results.
- Rate limiting: The actor uses a polite crawl rate. For large publications with thousands of posts, use
maxItemsto cap the run size.