Whenever we make a backwards-incompatible change to the API, we release a new version of the API. (The current version is 2026-04-01.)
Buttondown determines the API version associated with a request in two ways:
- If a request includes a
headerwith the keyX-API-Version, Buttondown will use that value as the API version. - If a request does not include a
headerwith the keyX-API-Version, Buttondown will use a pinned version associated with the newsletter. This pinned version can be found (and changed) in the "API" section of your settings page. - If a pinned version is not present on the newsletter, Buttondown will use the latest version of the API.
For example, to pin a single request to a specific version:
Available versions
X-API-Version accepts any of the versions below; anything else is rejected with a 422 and an invalid_api_version code. Each row describes what changed in that version, so pinning to the version above a row opts out of it.
| Version | What changed |
|---|---|
2024-07-01 | The oldest version Buttondown still accepts. |
2024-08-01 | On subscribers, subscriber_type became type and email became email_address. |
2024-08-15 | On emails, included_tags and excluded_tags were replaced by the more expressive filters field. |
2024-09-30 | DELETE /v1/subscribers/{id_or_email} deletes the subscriber outright instead of unsubscribing them. |
2024-12-30 | Nothing on the wire: the last version before commenting_mode, kept so clients could pin to it. |
2025-01-02 | On emails, is_comments_disabled was replaced by commenting_mode. |
2025-05-19 | On bulk actions, metadata.tag became metadata.tag_id. |
2025-06-01 | The date, last_open_date and last_click_date filters on subscribers split into __start/__end pairs, and GET /v1/emails stopped defaulting to sent and in-flight emails. |
2026-01-01 | Responses return TypeIDs (sub_...) rather than bare UUIDs. |
2026-04-01 | An automation's top-level timing moved inside each action. The current version. |
What constitutes a backwards-incompatible change?
We consider a backwards-incompatible change to be any change that could potentially break existing code that uses the API. This includes (but is not limited to):
- Renaming or removing fields from an object
- Removing or renaming an endpoint
- Changing the type of a field
- Changing whether or not a field is required
- Changing logic within an endpoint