Can an AI agent use Buttondown?

As of 2 Oct 2026, an AI agent gets into Buttondown on its own and does 83% of the core work.

Level 4 · Runs on its ownAn agent does the core work and can stop paying on its own.
  • Find: Some docs for agents: llms.txt and an OpenAPI.
  • Access: Sign-up in a browser.
  • Use: 83% of the work.
  • Pay: Reaches the checkout: Stopped at the card form.
  • Leave: Leaves on its own: Nothing to cancel, deletes its account.

To reach L5 · Autonomous: pay without a person.

What the levels mean

Driven 2 Oct 2026New level in the latest driveRules of 15 Oct 2026Claim this page

Written and checked by our agents from this drive's record. How we write.

Who gets in

  • Agents on a serverGet in on their own.
  • Signed agentsThe sign-up page opens.
  • Agents in a person's browserNot measured yet.

Sign-up page checked 12 Oct 2026. Signed agents: the ones Cloudflare verifies. Where agents come from

What an agent can do in Buttondown.

On its own

  • Write, schedule and send newsletter emails through the API, with personalized content per subscriber
  • Add, update, remove and import subscribers, including bulk edits
  • See delivery and open/click stats for a sent email
4 more
  • Publish sent emails automatically to a public archive page
  • Set up webhooks, surveys, reader comments and team invitations
  • Export all subscriber and email data as a downloadable file
  • Manage drafts from a command-line tool as well as the API

What it can't, and why

  • Sign up and get the very first API key without a browserAccount creation and the first key only exist on the website, not as an API
  • Turn on automations, RSS-to-email, tags, attachments, extra newsletters or a custom domainThese require paying for a plan, which the free account did not have
  • Upgrade to a paid plan or cancel one without a human entering a cardNo billing API exists; payment only happens through a card form in the dashboard
2 more
  • Delete the account through the APIAccount deletion is a dashboard-only button, not an API endpoint
  • Fully test the sponsorship marketplace featureSelling an ad slot needs a paying sponsor, which the test could not provide
On its own, in a browser

Can an AI agent sign up for Buttondown on its own?

Yes, in a browser, without a human. Sign-up is a JS form at /register (username, email, password) with no CAPTCHA; no documented sign-up API. Worked first time in our agent's browser.

No MCP server found

Does Buttondown have an MCP server, and can an agent connect to it?

No. The drive found no MCP server for Buttondown.

A new agent can get in on its own: in the drive of 2 Oct 2026, our agent signed up, verified and got its key without a person.

What the drive found

APIOpenAPI–MCPCLI–SDKllms.txtWebhooksSandbox
On its own, in a browser

How does an AI agent get a Buttondown API key?

In the drive of 2 Oct 2026, our agent got its Buttondown API key in a browser, without a person. A primary API key is created at sign-up and shown in the dashboard at /keys. There is no documented API to read or create keys.

On its own, in a browser

Can an AI agent delete its Buttondown account?

Yes, in a browser, without a human. Settings > Danger Zone > Delete your account (type a random phrase). Afterwards the API returns 401 and the archive returns 404. There is no documented API to delete the account. The first browser try did not take; an identical second try worked.

Reaches the checkout

Can an AI agent pay for Buttondown?

Reaches the checkout: stopped at the card form.

It has a free plan.

What would let agents pay on their own
  1. Accept x402 or MPP on your API. Answer an unpaid call with 402 and a payment challenge, so an agent pays per call or buys credits without an account or a card.Step-by-step guide
  2. List your plans on Stripe Projects. Agents buy a plan with `stripe projects add`, paid with a token under a spend cap the owner sets (projects.dev).Step-by-step guide

No x402, MPP or L402 rail: the x402., mpp. and agents. subdomains do not resolve, the well-known files return 404, there are no Bazaar or mpp.dev listings, and the OpenAPI has no billing endpoints. Upgrading happens in the dashboard (/settings/billing): a plan picker with an embedded Stripe card field ('Upgrade for $9/mo'), and an hCaptcha script was detected on that page (not visible). Nothing was paid, so whether an agent could finish checkout alone with a card is not proven. There is a free plan; there is no card-free trial of paid plans (they offer a 30-day money-back guarantee instead).

From the drive of 2 Oct 2026.

For the team behind Buttondown.

Agents get through Buttondown today. The fixes that keep it that way, highest impact first.

Through every checkpoint

The fixes, highest impact first

  1. Offer an API for sign-up and first keyStep-by-step guide
  2. Add a billing API or agent payment railStep-by-step guide
  3. Align llms.txt pricing with live plansStep-by-step guide
3 more fixes
  1. Fix GET /advertising_units/slots 405
  2. Document bulk-action metadata per type
  3. Add an account-deletion API endpoint
  • Claim it free and reply next to the result.
  • A Drive, $49: your private report, with where agents stop, the evidence and the fixes that move your level.
  • Fixed something? Order a Drive ($49) any time, or the Monthly drive ($29/month).
See the example report
Details

Your API, MCP server or CLI is the product? An Audit ($299) also checks every documented route, MCP tool and CLI command against your docs. Compare plans.

Already claimed it? Open it in your dashboard.

Rather not be driven? Block AgentDrivesAgent in robots.txt or write to us. We stop driving it ourselves; this page stays, with its date.

Embed the badge on your site

Driven · L4 · Runs on its own badge

Behind the level.

The part scores and the measures behind them.

Part scores and the measures · level history · paid plans

Part scores

Agent-ready setup

  • llms.txt: found
  • OpenAPI: found
  • MCP server: not found
  • CLI: found

Not measured in this drive: Holds up, Docs match (part of an Audit).

The measures

  1. Work done83
  2. Reliability100
  3. Crash test–

Level history

  1. 1 Oct 2026L2Gets in
  2. 2 Oct 2026new driveL4Runs on its own

Needs a paid plan

Not counted in the level. Our drive used free plan.

Needs a paid plan
CapabilityPlan
Automated email sequencesStandard
RSS-to-emailBasic
Paid subscription tiersBasic + Stripe connect
TagsBasic
Multiple newsletterspaid
AttachmentsBasic
Custom domainStandard
Remove brandingpaid

For agents and builders.

The drive as data, every checkpoint and all 39 attempts.

How an agent connects · 7 tips
  • Get the primary API key at buttondown.com/keys after signing up in a browser; after that everything is REST with 'Authorization: Token <key>'.
  • The first send with status about_to_send needs the header 'X-Buttondown-Live-Dangerously: true' (once per key); the 400 error tells you so.
  • New newsletters have an aggressive subscriber firewall: API-created subscribers from a datacenter IP get 400 subscriber_blocked. Pass the real subscriber's ip_address, or 'X-Buttondown-Bypass-Firewall: true' for addresses you own.
  • Subscribers created through the API are double opt-in (type unactivated) unless you send type 'regular'; CSV imports land as 'regular'.
  • The API adds a fancy-editor marker to bodies without one; start the body with '<!-- buttondown-editor-mode: plaintext -->' to keep it as Markdown/plain text.
  • Paid features return a 403 that names the required plan: create the object, then check whether activation is gated.
  • Use test_mode on the newsletter to route sends to yourself while testing.
Every checkpoint, in detail · 9 checkpoints
  1. DocsHeadlessllms.txt on buttondown.com and docs.buttondown.com, OpenAPI at docs.buttondown.com/openapi.json (77 paths); 401 errors point at the auth docs.
  2. Sign upIn a browserSign-up is a JS form at /register (username, email, password) with no CAPTCHA; no documented sign-up API. Worked first time in our agent's browser.
  3. VerifyHeadlessConfirmation mail arrived within a minute; the link works with a plain GET (302 to /home).
  4. KeyIn a browserA primary API key is created at sign-up and shown in the dashboard at /keys. There is no documented API to read or create keys.
  5. First callHeadlessGET /v1/ping and /v1/accounts/me returned 200 with the key on the free plan.
  6. First actionHeadlessPOST /v1/emails created a draft, which was read back with GET.
  7. PayIn a browserNo x402, MPP or L402 rail: the x402., mpp. and agents. subdomains do not resolve, the well-known files return 404, there are no Bazaar or mpp.dev listings, and the OpenAPI has no billing endpoints. Upgrading happens in the dashboard (/settings/billing): a plan picker with an embedded Stripe card field ('Upgrade for $9/mo'), and an hCaptcha script was detected on that page (not visible). Nothing was paid, so whether an agent could finish checkout alone with a card is not proven. There is a free plan; there is no card-free trial of paid plans (they offer a 30-day money-back guarantee instead).
  8. CancelNot neededNothing to cancel: our agent used the free plan.
  9. DeleteIn a browserSettings > Danger Zone > Delete your account (type a random phrase). Afterwards the API returns 401 and the archive returns 404. There is no documented API to delete the account. The first browser try did not take; an identical second try worked.
The attempt log · 39 attempts
Attempt log
CapabilityRouteResultEvidence
Find docs: Find API docs, OpenAPI, llms.txtapidone ✓llms.txt on buttondown.com and docs.buttondown.com (200 text/plain); docs.buttondown.com/openapi.json 200 application/json, 77 paths; unauthenticated GET api.buttondown.com/v1/emails -> 401 {"code":"authentication_missing","detail":"...Authorization: Token <your-api-key>","documentation_url":...}
Sign up: Create accountbrowserdone ✓https://buttondown.com/register: JS form (username/email/password), no CAPTCHA signals; submitted in pw browser, landed on /home onboarding wizard. No documented signup API (no account-creation path in OpenAPI).
Verify email: Confirm account emailapidone ✓Mail "Confirm your new Buttondown account" arrived <1 min.
Get API key: Get API keybrowserdone ✓Primary API key auto-created at signup, shown at https://buttondown.com/keys/<id> in dashboard (browser). No documented API to mint the first key.
First API call: GET /v1/ping and /v1/accounts/meapidone ✓GET /v1/ping 200 {}; /v1/accounts/me 200 {"username":"agentdrivestest037",...}; /v1/newsletters 200 one newsletter news_19yh...
Draft and write an email in Markdown or rich text: Create a Markdown draft, edit subject, read it backapidone ✓POST /v1/emails status=draft -> 201 em_3tdzrnyy789t4840xb4yxvk3b7; PATCH subject -> 200; GET -> status draft, subject edited, body kept
First real action: Create a draft emailapidone ✓POST /v1/emails -> 201 em_3tdzrnyy789t4840xb4yxvk3b7, read back by GET
Add, update, and remove a subscriber: Add subscriber, update notes/metadata, delete another, read backapidone ✓POST /v1/subscribers an inbox -> 201 sub_6xk3m4z3hv8j3sawjkp5c1nf91 (type unactivated, double opt-in); PATCH notes+metadata -> 200, GET by email shows update; second POST an inbox -> 400 subscriber_blocked "blocked by your firewall"; retried with documented X-Buttondown-Bypass-Firewall: true + type regular -> 201; DELETE -> 204; GET -> 404; list count 1
Schedule an email to send at a future time: Schedule an email for +7 days and read it backapidone ✓POST /v1/emails status=scheduled publish_date=2026-10-09T21:50:03Z -> 201 em_7b4tfqtv3t8x1amhg5q7f35nhj; GET -> status scheduled, publish_date 2026-10-09T21:50:03Z
Send a broadcast email to subscribers: Send an email to our one confirmed test subscriberapidone ✓POST /v1/emails status=about_to_send -> 400 sending_requires_confirmation ("requires the X-Buttondown-Live-Dangerously header... only required once per API key"); retried with header -> 201 em_4ssxys7hyd8qh87d4mxz6sdxxm; GET -> status sent; /analytics recipients 1 deliveries 1; mail arrived in an inbox inbox 1s later
Personalize emails with subscriber data via templating: Send with {{ subscriber.metadata.first_name }} and {{ subscriber.email }}apidone ✓Received mail body: "Hi Ada, ... (the agent's inbox)"both variables replaced from the subscriber record
Publish sent emails to a public web archive: Check the sent email shows in the public archiveapidone ✓GET https://buttondown.com/agentdrivestest037/archive/ 200 lists "AgentDrives broadcast test" (draft not listed); permalink /archive/agentdrives-broadcast-test/ 200 with body; documented GET /v1/public/emails/agentdrivestest037 returns it
View opens, clicks, referrers, and per-email analytics: Read per-email analytics for the sent emailapipartial ✓GET /v1/emails/{id}/analytics 200 {"recipients":1,"deliveries":1,"opens":0,"clicks":0,...}
Build automated email sequences: Create a welcome automation on subscriber.confirmed and activate itapiplan_gated ✓POST /v1/automations -> 201 aut_72mtd3714v9nt9hcvzqam0zjhd status inactive (creation allowed on free); PATCH status=active -> 403 {"code":"forbidden","detail":"Automation access requires the Standard plan - please upgrade your account.","metadata":{"feature":"automations","required_plan":"standard"}}
Turn an RSS feed into automatic newsletter sends: Create an RSS-to-email feed (draft behaviour) and activate itapiplan_gated ✓POST /v1/external_feeds -> 201 rss_67298x8cqr94hv4y8hg1wsmcbe status inactive; PATCH status=active -> 403 "RSS-to-email access requires the Basic plan - please upgrade your account." (feature rss_automation, required_plan basic)
Organize subscribers with tags: Create a tagapiplan_gated ✓POST /v1/tags -> 403 {"code":"feature_disabled","detail":"Tags require a Basic plan or higher - please upgrade your account."}
Sell and manage sponsorship ad slots: Create a sponsorship ad unit, read it back, list slotsapipartial ✓POST /v1/advertising_units -> 201 adsku_22bb4dry8493k8n9bjc0mrksmx status active; GET /v1/advertising_units lists it; GET /v1/advertising_units/slots -> 405 "Method not allowed" although OpenAPI documents GET
Charge for the newsletter via paid subscription tiers: List prices / set up paid tier via APIapiplan_gated ✓GET /v1/prices -> 400 {"code":"paid_subscriptions_uninitialized","detail":"Paid subscriptions have not been initialized for this newsletter; Buttondown has no Stripe product for which to list prices."}
Receive webhooks for newsletter events: Register a subscriber.created webhook, trigger it, read delivery attemptsapidone ✓POST /v1/webhooks -> 201 hook_2573g7d78f9qhva26t9g6magne; POST /webhooks/{id}/test -> 204 (not listed in attempts); creating subscriber an inbox -> GET /webhooks/{id}/attempts shows event subscriber.created, attempt_count 1, status failed "Webhook returned 405" from example.com
Export subscriber/email data: Export subscribers+emails and download the fileapidone ✓POST /v1/exports -> 201 exp_3xvqvt79ar98dvbs37njrsnn6z; GET after 1s -> status ready with url; downloaded zip (2116 bytes) contains subscribers.csv (both test subscribers), emails.csv and 3 email .md files
Perform bulk actions: Bulk-add a note to 2 subscribersapidone ✓POST /v1/bulk_actions add_notes with metadata.notes -> 400 bulk_action_invalid_metadata "You must provide a non-empty body field."; retried with metadata.body -> 201; GET /bulk_actions/{id} -> processed after ~4s; GET /v1/notes shows 2 notes on both subscriber ids
Collect feedback via surveys: Create a survey and record a response for our test subscriberapidone ✓POST /v1/surveys -> 201 srv_2ajtz24v4v80ha0pkws9pqtk9p status active (free plan); POST /v1/survey_responses: 422 each time naming the missing/invalid field (email_id required, answer must be an integer >= 1, i.e. 1-based index); then 201; GET /v1/survey_responses?survey_id= lists answer "yes"
Run multiple distinct newsletters: Create a second newsletterapiplan_gated ✓POST /v1/newsletters -> 403 "Please upgrade your account to create additional newsletters through the API."
Attach files to an email: Upload an attachmentapiplan_gated ✓POST /v1/attachments (multipart) -> 403 {"code":"feature_unavailable_on_plan","detail":"Attachments aren't included on your current plan. Upgrade your account to upload attachments."}
Let subscribers comment on sent emails: Post a comment on the sent email as our test subscriber and see it on the archive pageapidone ✓POST /v1/comments -> 201 com_5bvrh6pddv8vs90p64c5wk9ahd status active; GET /v1/comments/{id} 200; public archive page of the email contains the comment text
Import subscriber/content data from another provider: Import a CSV with one subscriber address we ownapidone ✓POST /v1/imports (multipart CSV) -> 201 sub_imp_1c5w82p3d38258kccyqncn5rpg; GET /v1/imports/{id} -> succeeded, new_subscribers 1; GET /v1/subscribers lists the agent's inbox type regular
Draft, schedule, and manage the newsletter from a terminal CLI: Install @buttondown/cli, login, pull, create a draft, push itclidone ✓npm --prefix ./cli install @buttondown/cli; buttondown login --api-key --json -> logged_in; pull -> 3 emails + 1 automation pulled; create --title -> local .md; push --json -> emails created 1; GET /v1/emails?status=draft lists "AgentDrives CLI draft" with the appended body
Generate and manage API keys: Create a second labelled API key and use itbrowserdone ✓Dashboard /keys/new (browser): label agentdrives-second, per-scope permissions; Create -> key shown; GET /v1/accounts/me with the new key -> 200
Compose/save a draft by sending an email from your own inbox: Mail a draft to Buttondown from our inboxnoneskippedThe agent's inbox tool can only receive mail; we have no way to send an email from the account address.
Toggle subscriber tracking on or off: Turn tracking on then off via the newsletter settingsapipartial ✓GET /v1/newsletters/{id} enabled_features had no "tracking" on a new free newsletter; PATCH enabled_features +tracking -> 200, GET shows it; PATCH back without tracking -> 200, gone
Send and host the newsletter on a custom domain: Set a custom hosting domainapiplan_gated ✓PATCH /v1/newsletters/{id} {"domain":...} -> 403 "A custom domain requires the Standard plan - please upgrade your account." (feature custom_domain, required_plan standard)
Invite collaborators and assign roles/permissions: Invite our own second address with email:readapidone ✓POST /v1/users -> 422 "permissions Field required"; with permissions {email: read} -> 201 inv_1qx4jdv2bw9se8h7xa0237r73c pending; GET /v1/users lists it with email read; invitation mail arrived at an inbox
Remove Buttondown branding: Remove "Powered by Buttondown" footernoneplan_gatedbuttondown.com/llms.txt pricing: "Basic ($9/month): Custom domains, API access, automations, remove Buttondown branding"; our sent mail carried "Powered by Buttondown". No documented API field for branding found in NewsletterUpdateInput.
Connect third-party tools: Connect Discord/Stripe/Zapier integrationnoneskippedIntegrations connect via OAuth to third-party accounts we do not have (Discord server, Stripe, Zapier); not attempted.
Pause billing while keeping archives online: Pause billingnoneskippedAccount is on the free plan with no billing to pause; not applicable to our scope.
Pay step: Find how an agent could buy a planbrowserpartial ✓No 402/x402/MPP/L402: x402./mpp./agents.buttondown.com do not resolve (curl 000); /.well-known/oauth-protected-resource, /auth.md, /SKILL.md, /.well-known/ucp 404 text/html; no Buttondown entries in x402 Bazaar or mpp.dev/api/services; OpenAPI has no billing/upgrade endpoint. Dashboard /settings/billing -> "Upgrade your newsletter today" opens in-page plan picker (Basic $9, Standard $29, Professional $79, Advanced $139) with a Stripe card field and "Upgrade for $9/mo"; hCaptcha script detected on that page (not visible). Not paid.
Delete created objects: Delete every object created during the drive via APIapidone ✓DELETE 204 then GET 404 for 4 emails, comment, automation, RSS feed, survey, webhook, invite; ad unit and 3 subscribers DELETE 204 with list count 0
Cancel plan: Cancel paid plannoneskippedNo paid plan was started (free plan only), so nothing to cancel. No billing API exists in the OpenAPI; billing is in the dashboard (/settings/billing).
Delete account: Delete the account and its databrowserdone ✓Dashboard Settings > Danger Zone > Delete your account: type a random 3-word phrase, click Delete account -> redirected to buttondown.com/. First browser call returned no page output and the account remained (GET /v1/accounts/me still 200); second identical try succeeded. Afterwards GET /v1/accounts/me -> 401 authentication_invalid and https://buttondown.com/agentdrivestest037/archive/ -> 404.

Also in Email marketing.