Buttondown Newsletter Archive Scraper
Independent tool. Trademarks referenced on this page are the property of their respective owners and are used only to identify the public website this tool reads. No affiliation or endorsement.
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 full 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.