Skip to content

September 22, 2026 · 11 min read

Buttondown Scraper: $5.00 per 1,000 Results with 8 Controls (2026)

By Crawlerbros Engineering Team

Extracting public newsletter archives without an API key requires parsing rendered archive pages, and this tool handles the pagination across the 8 controls in its schema. It retrieves structured data from any buttondown.com/{newsletter} URL without requiring login credentials or proxies. You can choose to pull only metadata or enrichment fields like full HTML bodies and exact timestamps. Every record includes a unique composite ID and the publication status. This is for researchers and developers building content backups or analysis pipelines; it is not for users who need to bypass paid subscriber walls.

What does a Buttondown Newsletter Scraper run cost?

Each result costs $0.005 on the free tier, which is $5.00 per 1,000 results. Starting a run is charged separately at $0.01 per GB of Actor memory.

Apify plan Per result Per 1,000 results
FREE $0.005 $5.00
BRONZE $0.00433 $4.33
SILVER $0.00367 $3.67
GOLD $0.003 $3.00
PLATINUM $0.003 $3.00
DIAMOND $0.003 $3.00

Each result is priced at $0.005, making the baseline cost $5.00 per 1,000 results on the free tier. The includeFullBody setting is the primary cost driver because it requires an additional request for every individual post to retrieve the full content and metadata.

How do you run Buttondown Newsletter Scraper from the API?

The schema marks 2 of its 8 controls as required: mode, newsletterSlug. Nothing in the payload below is illustrative. Those are the schema's prefilled defaults for Buttondown Newsletter Scraper, so the request works once your token is in place.

Call the synchronous endpoint to start a run and receive dataset items in one request:

curl -X POST "https://api.apify.com/v2/acts/crawlerbros~buttondown-newsletter-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode":"posts","newsletterSlug":"buttondown","postUrls":[],"includeFullBody":false,"dateFrom":"","dateTo":"","keyword":"","maxItems":50}'

The same run from Python, using the official client:

from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")

run_input = {
  "mode": "posts",
  "newsletterSlug": "buttondown",
  "postUrls": [],
  "includeFullBody": False,
  "dateFrom": "",
  "dateTo": "",
  "keyword": "",
  "maxItems": 50
}

run = client.actor("crawlerbros~buttondown-newsletter-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

And from Node.js:

import { ApifyClient } from 'apify-client'

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' })

const input = {
  "mode": "posts",
  "newsletterSlug": "buttondown",
  "postUrls": [],
  "includeFullBody": false,
  "dateFrom": "",
  "dateTo": "",
  "keyword": "",
  "maxItems": 50
}

const run = await client.actor('crawlerbros~buttondown-newsletter-scraper').call(input)
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)

Because the call is synchronous, your client waits for the whole run. Keep it for exploration. For scheduled work, start the run without waiting and collect the dataset afterwards, so network trouble costs you a retry rather than the results.

Which Buttondown Newsletter Scraper inputs matter, and which can you skip?

The mode and newsletterSlug are the only 2 required controls for any run. Use includeFullBody only when the HTML content is strictly necessary, as the standard posts mode is faster and cheaper for gathering basic archive lists.

  • mode (string): What to fetch. Default: "posts".
  • newsletterSlug (string): The newsletter's Buttondown slug, e.g. buttondown for buttondown.com/buttondown. Also accepts a full URL. Default: "buttondown".
  • postUrls (array): Full Buttondown archive post URLs, e.g. https://buttondown.com/buttondown/archive/updates-from-july-4795/. Default: [].
  • includeFullBody (boolean): Fetch each post's individual page for full HTML body, exact timestamps, and author info. Slower - one extra request per post. Default: false.
  • dateFrom (string): ISO date, e.g. 2024-01-01. Only posts published on or after this date. Default: "".
  • dateTo (string): ISO date, e.g. 2024-12-31. Only posts published on or before this date. Default: "".
  • keyword (string): Case-insensitive substring match against the title and excerpt. Default: "".
  • maxItems (integer): Hard cap on emitted records. Default: 50.

Fixed-choice controls: mode accepts posts, byPostUrls, newsletterInfo.

Move one control per run. Compare each new sample against the previous one and keep the accepted, uncertain, and excluded counts side by side. A control that increases volume without improving decision quality still bills at $0.005 per result.

What does Buttondown Newsletter Scraper return?

The output provides structured newsletter records containing titles, excerpts, and clean URLs for migration or research. It does not include private subscriber lists, email addresses, or content from posts marked as paid-only by the author.

The Actor does not publish a per-field output list, so treat the first run as the specification: collect a small sample and record which fields are present before anything downstream depends on them.

How do you build the workflow end to end?

Open Buttondown Newsletter Scraper and work through these in order. Each step ends with something to check, so a bad configuration surfaces on a small run rather than a scheduled one.

  1. Identify the target newsletter by finding its buttondown.com/{newsletter} slug and enter it into the newsletterSlug field.
  2. Select posts as the mode to retrieve the broad chronological archive of the newsletter.
  3. Set maxItems to a low number like 5 to verify the structure of the data before committing to a larger run.
  4. Toggle includeFullBody to true if your project requires the full HTML content and exact ISO timestamps from publishedAt.
  5. Check the scrapedAt field in the first run results to confirm the execution timestamp matches your current run.
  6. Apply dateFrom and dateTo strings in ISO format if you need to restrict the collection to a specific historical window.
  7. Examine the postId field to ensure you have a unique composite identifier for each record in your database.
  8. Run in newsletterInfo mode separately if you only need the socialLinks and description of the publication.

How do you apply it? Three worked playbooks

These are Buttondown Newsletter Scraper's own documented use cases, each worked through as an operating pattern rather than a description.

Use case 1: Content research

Outcome: pull a newsletter's full public archive with metadata

Configure: Set mode to 'posts', newsletterSlug to the target name, and includeFullBody to true.

Working method: Start with a baseline run of the most recent 10 posts to verify the HTML structure, then increase maxItems to cover the known history of the publication.

Deliverable: A dataset of records containing the full HTML body, authorName, and articleSection for every public post.

Stop condition: The presence of empty html fields in the dataset despite includeFullBody being enabled.

Use case 2: Migration / backup

Outcome: export a Buttondown newsletter's post history

Configure: Set mode to 'posts', enter the newsletterSlug, and define a dateFrom and dateTo range.

Working method: Compare the archive counts on the live site for that period against the emitted record count to ensure no pagination jumps occurred.

Deliverable: A chronological export of newsletter titles and excerpts within the specified date boundaries.

Stop condition: A zero-record output when the date range is known to contain published public content.

Use case 3: Content monitoring

Outcome: track a newsletter's publishing cadence and topics

Configure: Set mode to 'newsletterInfo' and provide the newsletterSlug.

Working method: Run once per target newsletter to extract the high-level metadata without processing individual archive posts.

Deliverable: A single record per slug containing the newsletterDescription, icon, and the socialLinks array.

Stop condition: The icon or newsletterName field returning as null for a known active newsletter.

What breaks, and how do you design around it?

  • Test a small, representative input against your acceptance criteria before increasing scope.

The Actor is limited to public content and cannot see posts that are not present in the public archive listing. If you hit the hard cap of 1000 items, partition your extraction by using the dateFrom and dateTo filters to scrape smaller chronological windows.

When should you not use Buttondown Newsletter Scraper?

Avoid this Actor if you need to scrape private content that requires a paid subscription or a login session, as it only sees what is publicly available on the web. If the target newsletter provides an official RSS feed, a simple RSS parser will be significantly more efficient and cheaper than scraping the rendered HTML archive. You should not use this tool for real-time monitoring of high-frequency publishers; instead, use a webhook-based approach or an official API if the author has granted you access. Finally, if you need to collect email addresses or subscriber counts, this scraper will fail you because that data is never exposed on the public-facing archive pages this Actor targets.

What should you check before trusting the output?

  • Stop the run if recordType is missing, as this differentiates between newsletter metadata and post content.
  • Check that html is present when includeFullBody is true; its absence suggests a request failure on the individual post page.
  • Verify that publishedDate matches the YYYY-MM-DD format extracted from the archive listing.
  • Alert if maxItems is reached exactly, as this indicates more data exists in the archive than was captured.
  • Monitor for empty results when a valid newsletterSlug is used, which may indicate the owner has disabled public archives.

None of this proves a record is correct. It gives a scheduled Buttondown Newsletter Scraper run defined points where it should stop instead of quietly passing bad data downstream.

Frequently asked questions

Is the $5.00 per 1,000 results price consistent across all run modes?

Yes, the price of $0.005 per result, or $5.00 per 1,000 results on the free tier, applies regardless of the mode. However, modes that require additional requests, such as enabling full-body enrichment, will consume more compute time and memory, slightly increasing the total platform cost beyond the per-result fee.

Why does publishedDate only show the day while publishedAt shows seconds?

The publishedDate is scraped from the main archive list which only displays the date. To get the more precise publishedAt ISO timestamp, you must enable includeFullBody or use byPostUrls, as that level of detail is only found on the individual post's own page.

Does this tool allow me to scrape posts from a private or paid-only newsletter?

No. This Actor functions as a logged-out visitor and can only see what is public. If a post is gated behind a subscription or the archive is private, the Actor will not be able to access the content or the post metadata.

What happens if I provide an incorrect or non-existent newsletterSlug?

The Actor is designed to fail soft. It will typically finish with zero results and a status message rather than crashing, ensuring that automated workflows are not interrupted by a single bad input.

Can I use this to find specific topics within a newsletter archive?

Yes, use the keyword control to perform a case-insensitive search. This filter checks both the title and the excerpt provided in the archive listing to return only the records that match your specific search term.

Where to go next

Start with the Buttondown Newsletter Scraper Actor page for the current input schema, pricing tier, and run history.

If you are comparing approaches rather than committing to one Actor, these category pages list every option we publish:

Readers running Buttondown Newsletter Scraper commonly pair it with:

  • Copart Public Search Scraper Scrape Copart vehicle auction listings with search by keyword, make, model, damage type, location, and more.
  • Roblox Scraper Scrape Roblox, search games by keyword, fetch game details by universe ID, browse trending games, search catalog UGC items, and get user profiles with their published games.
  • Responsive Website Checker Test and verify how websites render across multiple devices and screen sizes.
  • Signature Generator Create professional email signatures in seconds! Choose from multiple templates, customize with your brand colors and logo, add social media icons, and export to HTML (copy-paste ready for Gmail/Outlook), PNG, JPG, or SVG.
  • Apple Podcasts + Listen Notes Scraper Scrape podcast and episode data from Apple Podcasts (free, no auth) or Listen Notes (free tier with API key).
  • Resident Advisor (RA) Scraper Scrape Resident Advisor (ra.co) with upcoming events by city, artist profiles, and venue/club profiles.
  • MLB Stats Scraper Scrape the official MLB Stats API, comprehensive baseball data including teams, players, schedules, standings, and detailed statistics.
  • Website Image Scraper Extract every image URL from a website.

Related guides:

Resources

  • Actor documentation, input schema, and pricing: verified against the published Actor on 2026-09-22.

  • Actor last updated by its maintainers on 2026-08-07.

  • Run outcome figures cover the 30 day public window ending 2026-09-22.

  • Buttondown Newsletter Scraper on Apify

● Featured actors

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.

Run on Apify ↗