<rss version="2.0">
        <channel>
            <title>Buttondown's API changelog</title>
            <description>Buttondown's API changelog</description>
            <link>https://docs.buttondown.com/api-changelog</link>
            <item>
                <title>2026-02-26</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2026-02-26</link>
                <pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Each action inside an automation now carries its own timing, paving the way for multi-step sequences in a single automation. Previously, timing was a top-level field on the automation; starting with API version , it lives inside each action as a step . Here&#39;s what a multi-step automation looks like in the new format: { &quot;trigger&quot;: &quot;subscriber.confirmed&quot;, &quot;actions&quot;: [ { &quot;type&quot;: &quot;send_email&quot;, &quot;metadata&quot;: { &quot;email_id&quot;: &quot;welcome-email-id&quot; }, &quot;timing&quot;: { &quot;time&quot;: &quot;immediate&quot; } }, { &quot;type&quot;: &quot;send_email&quot;, &quot;metadata&quot;: { &quot;email_id&quot;: &quot;followup-email-id&quot; }, &quot;timing&quot;: { &quot;time&quot;: &quot;delay&quot;, &quot;delay&quot;: { &quot;unit&quot;: &quot;days&quot;, &quot;value&quot;: &quot;3&quot; } } } ] } If you&#39;re on an older API version, the top-level field still works exactly as before — the translation is handled behind the scenes.</p>
]]></content>
            </item>
<item>
                <title>2026-02-16</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2026-02-16</link>
                <pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>The and endpoints now reject bodies that start with YAML frontmatter (a delimiter followed by key-value pairs). This is almost always a sign of a bug in your integration rather than intentional email content, so the API now returns a with the code . If you need to bypass this restriction, pass the header: curl -X POST &quot;<a href="https://api.buttondown.com/v1/emails">https://api.buttondown.com/v1/emails</a>&quot; \ -H &quot;Authorization: Token YOUR_API_KEY&quot; \ -H &quot;X-Buttondown-Live-Dangerously: true&quot; \ -H &quot;Content-Type: application/json&quot; \ -d &#39;{&quot;subject&quot;: &quot;My email&quot;, &quot;body&quot;: &quot;---\nstatus: sent\n---\nBody&quot;}&#39;</p>
]]></content>
            </item>
<item>
                <title>2026-02-09</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2026-02-09</link>
                <pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>The endpoint now accepts an optional parameter. When provided, the comment is attributed to that subscriber instead of the newsletter author. curl -X POST &quot;<a href="https://api.buttondown.com/v1/comments">https://api.buttondown.com/v1/comments</a>&quot; \ -H &quot;Authorization: Token YOUR_API_KEY&quot; \ -H &quot;Content-Type: application/json&quot; \ -d &#39;{ &quot;email_id&quot;: &quot;your-email-id&quot;, &quot;subscriber_id&quot;: &quot;your-subscriber-id&quot;, &quot;text&quot;: &quot;Great article, thanks for writing this!&quot; }&#39; The subscriber must belong to your newsletter and have access to comment on the email. If is omitted, the comment is attributed to the author as before.</p>
]]></content>
            </item>
<item>
                <title>2026-02-07</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2026-02-07</link>
                <pubDate>Sat, 07 Feb 2026 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>The endpoint now rejects SVG uploads by default, returning a error. SVG files aren&#39;t reliably rendered by most email clients, so this protects you from accidentally sending broken images to subscribers. If you need to upload SVGs anyway (for instance, if they&#39;re only used in your web archive), you can bypass this restriction with the header: curl -X POST &quot;<a href="https://api.buttondown.com/v1/images">https://api.buttondown.com/v1/images</a>&quot; \ -H &quot;Authorization: Token YOUR_API_KEY&quot; \ -H &quot;X-Buttondown-Live-Dangerously: true&quot; \ -F &quot;image=@logo.svg&quot;</p>
]]></content>
            </item>
<item>
                <title>2026-02-06</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2026-02-06</link>
                <pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Subscribers now include engagement counts and rates in the response: You can also filter and order by these rates: Order by / (ascending or descending, via ) Filter by / and / Rates are computed from engagement counts; if a subscriber has no deliveries, the rates are . Example: curl &quot;<a href="https://api.buttondown.com/v1/subscribers">https://api.buttondown.com/v1/subscribers</a>&quot; \ -H &quot;Authorization: Token YOUR_API_KEY&quot; \ -G \ --data-urlencode &quot;ordering=-open_rate&quot; \ --data-urlencode &quot;open_rate__start=0.5&quot; { &quot;count&quot;: 1, &quot;results&quot;: [ { &quot;id&quot;: &quot;9f4c9a1e-0d2c-4a44-8a4f-cc06e97a9df2&quot;, &quot;email_address&quot;: &quot;<a href="mailto:telemachus@buttondown.email">telemachus@buttondown.email</a>&quot;, &quot;delivered_count&quot;: 12, &quot;open_count&quot;: 7, &quot;clicked_count&quot;: 3, &quot;open_rate&quot;: 0.5833, &quot;click_rate&quot;: 0.25 } ] }</p>
]]></content>
            </item>
<item>
                <title>2026-01-24</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2026-01-24</link>
                <pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>You can now create and manage multiple API keys, each with granular permissions. This allows you to create separate keys for different integrations with only the access they need. Each API key can have independent permission levels for: Permission Controls Manage subscribers Manage emails and drafts Send emails Access newsletter settings Manage automations Manage forms Manage design settings Manage surveys Each permission can be set to (full access), (view only), or (no access). API keys can be managed in the Buttondown UI at API → Keys . Example of creating a read-only key for subscribers: curl -X POST &quot;<a href="https://api.buttondown.com/v1/api-keys">https://api.buttondown.com/v1/api-keys</a>&quot; \ -H &quot;Authorization: Token YOUR_API_KEY&quot; \ -H &quot;Content-Type: application/json&quot; \ -d &#39;{ &quot;label&quot;: &quot;Analytics dashboard&quot;, &quot;subscriber_access&quot;: &quot;read&quot;, &quot;email_access&quot;: &quot;read&quot;, &quot;sending_access&quot;: &quot;none&quot;, &quot;administrivia_access&quot;: &quot;none&quot;, &quot;automations_access&quot;: &quot;none&quot;, &quot;forms_access&quot;: &quot;none&quot;, &quot;styling_access&quot;: &quot;none&quot;, &quot;surveys_access&quot;: &quot;none&quot; }&#39; You can also regenerate, update, or delete API keys: Endpoint Action Update a key&#39;s label or permissions Delete a key Regenerate a key&#39;s secret (invalidates the old key)</p>
]]></content>
            </item>
<item>
                <title>2026-01-22</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2026-01-22</link>
                <pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Added a new field to the Tag object. When set to , subscribers can add or remove this tag from their own profile via the subscriber portal . Example: curl -X POST &quot;<a href="https://api.buttondown.com/v1/tags">https://api.buttondown.com/v1/tags</a>&quot; \ -H &quot;Authorization: Token YOUR_API_KEY&quot; \ -H &quot;Content-Type: application/json&quot; \ -d &#39;{ &quot;name&quot;: &quot;Weekly digest&quot;, &quot;color&quot;: &quot;#4CAF50&quot;, &quot;subscriber_editable&quot;: true }&#39; When a tag is marked as subscriber editable: It appears as a checkbox in the subscriber portal Subscribers can toggle it on or off for themselves Tags not marked as subscriber editable can only be managed by the newsletter owner or via the API</p>
]]></content>
            </item>
<item>
                <title>2026-01-12</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2026-01-12</link>
                <pubDate>Mon, 12 Jan 2026 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Added a new endpoint that sends a magic login link to a subscriber. This allows authors and integrations to trigger subscriber login flows programmatically, enabling subscribers to authenticate and access their subscription management portal. Example: curl -X POST &quot;<a href="https://api.buttondown.com/v1/subscribers/%7Bid%7D/send-magic-link">https://api.buttondown.com/v1/subscribers/{id}/send-magic-link</a>&quot; \ -H &quot;Authorization: Token YOUR_API_KEY&quot;</p>
]]></content>
            </item>
<item>
                <title>2026-01-01</title>
                <description>TypeIDs are now the default identifier format</description>
                <link>https://docs.buttondown.com/api-changelog-2026-01-01</link>
                <pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Every ID in Buttondown&#39;s API is a UUID (e.g., ) with no indication of what it represents. UUIDs are great for databases, but they&#39;re not human-friendly. Starting with API version , we&#39;re introducing TypeIDs in Buttondown. A TypeID is a UUID with a readable type prefix. Prefixes like , , and make it immediately clear what kind of object an ID represents. such as for subscribers, for emails, and for tags. Here&#39;s what changes in the response: Old response (&lt; 2026-01-01) New response (&gt;= 2026-01-01) ─────────────────────────── ──────────────────────────── { { &quot;id&quot;: &quot;550e8400-e29b-41d4-...&quot;, &quot;id&quot;: &quot;sub_550e8400e29b41d4...&quot;, &quot;email_id&quot;: &quot;7c9e6679-7425-...&quot; &quot;email_id&quot;: &quot;em_7c9e6679-7425...&quot; } } No breaking changes to how you send requests. The API accepts both TypeIDs and UUIDs as input, but responses are version-aware. Send a request with and you&#39;ll always get TypeIDs back, regardless of what format you sent in. curl &quot;<a href="https://api.buttondown.com/v1/subscribers">https://api.buttondown.com/v1/subscribers</a>&quot; \ -H &quot;Authorization: Token YOUR_API_KEY&quot; \ -H &quot;X-API-Version: 2026-01-01&quot; This is now the default version for every new API key. If you are using an older API version ( ), nothing changes, your API responses still continue to contain UUIDs exactly as they are. But if you want to use our latest TypeID system, migrate through the dashboard or pass in your request headers.</p>
]]></content>
            </item>
<item>
                <title>2025-11-15</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2025-11-15</link>
                <pubDate>Sat, 15 Nov 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Added an optional header to the endpoint. When set to , this header enables test mode behavior for that specific draft send, similar to the global test mode setting. The draft will be rendered as if it&#39;s going to the specified subscribers, but then redirected to the newsletter author instead. This allows authors to preview how emails will appear to subscribers with different states (e.g., gifted subscribers, subscribers with specific metadata or tags). Example: curl -X POST &quot;<a href="https://api.buttondown.com/v1/emails/%7Bid%7D/send-draft">https://api.buttondown.com/v1/emails/{id}/send-draft</a>&quot; \ -H &quot;Authorization: Token YOUR_API_KEY&quot; \ -H &quot;X-Buttondown-Test-Mode: true&quot; \ -H &quot;Content-Type: application/json&quot; \ -d &#39;{ &quot;subscribers&quot;: [&quot;subscriber-id-1&quot;, &quot;subscriber-id-2&quot;] }&#39; When test mode is enabled via this header: Emails are redirected to the newsletter author&#39;s email address Subject lines are prefixed with Email body includes a test mode header showing the intended recipient All other email features (tracking, templating, etc.) work normally</p>
]]></content>
            </item>
<item>
                <title>2025-09-23</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2025-09-23</link>
                <pubDate>Tue, 23 Sep 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>In what is the least impactful change in the history of Buttondown, we&#39;ve increased the maximum length of the field from 1000 to 2000 characters. (We&#39;ve also changed some related lengths, such as for RSS feeds and custom transactional emails, to match.)</p>
]]></content>
            </item>
<item>
                <title>2025-09-18</title>
                <description>Added `churn_date` field and filters to Subscribers API</description>
                <link>https://docs.buttondown.com/api-changelog-2025-09-18</link>
                <pubDate>Thu, 18 Sep 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>We&#39;ve added support for tracking and filtering by churn dates in the Subscribers API: New field The schema now includes a field that tracks when a paid subscriber churned from their subscription. { &quot;email&quot;: &quot;<a href="mailto:subscriber@example.com">subscriber@example.com</a>&quot;, &quot;churn_date&quot;: &quot;2025-09-15T14:30:00Z&quot;, ... } New filters You can now filter subscribers by their churn date using two new query parameters: - Return only subscribers who churned on or after this date (format: ) - Return only subscribers who churned on or before this date (format: ) Example curl -X GET \ &quot;<a href="https://api.buttondown.com/v1/subscribers?churn_date__start=2025-09-01&churn_date__end=2025-09-18">https://api.buttondown.com/v1/subscribers?churn_date__start=2025-09-01&amp;churn_date__end=2025-09-18</a>&quot; \ -H &quot;Authorization: Token your-api-key&quot; This is particularly useful for analyzing churn patterns and building retention reports for your paid newsletter.</p>
]]></content>
            </item>
<item>
                <title>2025-07-28</title>
                <description>Removed deprecated subscriber types</description>
                <link>https://docs.buttondown.com/api-changelog-2025-07-28</link>
                <pubDate>Mon, 28 Jul 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>We&#39;ve simplified the enum by removing the following deprecated types: - Now consolidated into with a specific - Now consolidated into with of - This type has been removed entirely This change streamlines subscriber management by using the existing field to provide more granular information about why a subscriber cannot receive emails, rather than having separate top-level types. If you were filtering subscribers by , you should now filter by instead. The specific reason for undeliverability can be determined by checking the field.</p>
]]></content>
            </item>
<item>
                <title>2025-07-13</title>
                <description>Added source filtering to /v1/subscribers</description>
                <link>https://docs.buttondown.com/api-changelog-2025-07-13</link>
                <pubDate>Sun, 13 Jul 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>We&#39;ve added a new parameter to the endpoint that allows you to filter subscribers by their origin source. What&#39;s new You can now filter subscribers based on their source (e.g. , , , , ). Examples Get all subscribers added via API: Get subscribers from multiple sources (import and organic): Combine with other filters to create more specific queries: This filter works alongside all existing filters, making it easy to create powerful queries to understand your subscriber base better.</p>
]]></content>
            </item>
<item>
                <title>2025-06-26</title>
                <description>Added `product` to `StripeSubscription`</description>
                <link>https://docs.buttondown.com/api-changelog-2025-06-26</link>
                <pubDate>Thu, 26 Jun 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>We&#39;ve added a field to the schema. This field is the name of the product which the subscriber is subscribed to. (You can override this by setting the metadata on the product in Stripe.)</p>
]]></content>
            </item>
<item>
                <title>2025-06-01</title>
                <description>Removed default filter for status in /v1/emails</description>
                <link>https://docs.buttondown.com/api-changelog-2025-06-01</link>
                <pubDate>Sun, 01 Jun 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>When we first launched Buttondown&#39;s API, we actually had three separate email endpoints: , , and , because we had three separate models for emails, drafts, and scheduled emails. graph TD /v1/emails --&gt; Emails /v1/drafts --&gt; Drafts /v1/scheduled_emails --&gt; Emails This was an architectural mistake for many reasons, and we combined them into a single backing model, : graph TD /v1/emails --&gt; |status=sent,in_flight| Emails /v1/drafts --&gt; |status=draft| Emails /v1/scheduled_emails --&gt; |status=scheduled| Emails We eventually realized the error of our ways and combined these, but to maintain backwards compatibility (before we had a versioning system!) we defaulted to have a behavior of only ever showing &quot;real&quot; emails that were in flight or sent. graph TD /v1/emails --&gt; |status=sent,in_flight| Emails d[&quot;/v1/emails?status=draft&quot;] --&gt; |status=draft| Emails s[&quot;/v1/emails?status=scheduled&quot;] --&gt; |status=scheduled| Emails Fast forward three years, and this is still the case for non-obvious and increasingly tenuous reasons. We&#39;ve cut a new version of the API that removes this little piece of duct tape, such that a call to will return all emails, regardless of status. (And you can still of course filter them by passing in as a query parameter.) graph TD /v1/emails --&gt; before(&quot;Before 2024-04-15&quot;) /v1/emails --&gt; after(&quot;After 2024-04-15&quot;) before --&gt; |status=sent,in_flight| Emails after --&gt; Emails d[&quot;/v1/emails?status=draft&quot;] --&gt; |status=draft| Emails s[&quot;/v1/emails?status=scheduled&quot;] --&gt; |status=scheduled| Emails</p>
]]></content>
            </item>
<item>
                <title>2025-05-30</title>
                <description>New Attachments API endpoint</description>
                <link>https://docs.buttondown.com/api-changelog-2025-05-30</link>
                <pubDate>Fri, 30 May 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>TL;DR requests.post( &quot;<a href="https://api.buttondown.com/v1/attachments">https://api.buttondown.com/v1/attachments</a>&quot;, files={ &quot;file&quot;: open(&quot;newsletter-guide.pdf&quot;, &quot;rb&quot;) }, data={ &quot;name&quot;: &quot;Newsletter Guide&quot; } ) We&#39;ve added a new endpoint to the API that allows you to upload, list, and manage attachments for your emails. This brings the attachment functionality that was previously only available through the web interface to the API. The attachments API supports all the same file types as the web interface , and each attachment must be less than 2MB in size. The attachments feature is available on paid plans. Uploading an attachment Listing attachments Deleting an attachment</p>
]]></content>
            </item>
<item>
                <title>2025-05-19</title>
                <description>Split up date parameters into start and end</description>
                <link>https://docs.buttondown.com/api-changelog-2025-05-19</link>
                <pubDate>Mon, 19 May 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>TL;DR requests.get( &quot;<a href="https://api.buttondown.com/v1/subscribers">https://api.buttondown.com/v1/subscribers</a>&quot;, params={ &quot;date&quot;: [&quot;2025-01-01&quot;, &quot;2025-03-31&quot;], // [!code --] &quot;date__start&quot;: &quot;2025-01-01&quot;, // [!code ++] &quot;date__end&quot;: &quot;2025-03-31&quot;, // [!code ++] }, ) Filters are a tricky thing to get correct. Dates are also a tricky thing to get correct. You combine the two of them, and you can be in a slightly painful world. When the API was very new, we added three date-based parameters: , , and , for filtering Subscribers by those fields. The idea was an implicit bracketing. You could supply two dates or one, and it was all a little implicit and messy. We&#39;ve since standardized on a much more explicit and ergonomic approach, which is and , which is how the vast majority of the date parameters in the API work... except for those initial few, which changes today. We&#39;re cutting a new version of the API to finally migrate those old fields onto the new style. We&#39;re honoring existing call sites but encourage you to migrate to this new style for your own sanity and happiness. The old style of doing things: The new style of doing things:</p>
]]></content>
            </item>
<item>
                <title>2025-05-17</title>
                <description>Exports can now be generated in JSON format</description>
                <link>https://docs.buttondown.com/api-changelog-2025-05-17</link>
                <pubDate>Sat, 17 May 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>You can now request newsletter exports in JSON format by specifying the new field when creating an export. The old CSV functionality remains unchanged.</p>
]]></content>
            </item>
<item>
                <title>2025-05-14</title>
                <description>Added new newsletter customization fields to the API</description>
                <link>https://docs.buttondown.com/api-changelog-2025-05-14</link>
                <pubDate>Wed, 14 May 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>We&#39;ve expanded the Newsletter API to include the following new fields that allow for further programmatic customization of your newsletter: - Custom CSS styling for your newsletter emails - Custom CSS styling for your newsletter&#39;s web presence - URL to your newsletter&#39;s icon image - A brief description of your newsletter - URL to your newsletter&#39;s header or branding image These additions make it possible to programmatically customize the visual appearance of your newsletter both in email and on the web, giving you more control when integrating Buttondown as a headless email or newsletter provider. With these fields, you can now update your newsletter&#39;s branding and styling via the API, matching the capabilities previously only available through the web interface.</p>
]]></content>
            </item>
<item>
                <title>2025-04-17</title>
                <description>Added new email statuses to really let you peek under the hood</description>
                <link>https://docs.buttondown.com/api-changelog-2025-04-17</link>
                <pubDate>Thu, 17 Apr 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>We&#39;ve expanded the enum to include the following new statuses: - The email is being sent out slowly to ensure deliverability. - The email is being resent to subscribers by Buttondown&#39;s systems in order to make sure all subscribers have received it. - The email is a transactional email used by a core workflow in your newsletter or Automations, and is not visible in your web archives nor sent out to subscribers. The first two statuses do not represent any changes to Buttondown&#39;s existing logic; we&#39;re not changing how we throttle or resend emails, just surfacing when we do so in a more legible way. The third status will (though does not yet!) represent a shift in how we approach things — specifically in how we approach sending automation-borne emails. No action will be required from you, but we&#39;re going to shift away from the current model of allowing &quot;bespoke&quot; emails defined within an automation towards a contract where all automations which send emails must reference an . (This doesn&#39;t represent a change in functionality — it&#39;s mostly internal plumbing — but is worth calling out.)</p>
]]></content>
            </item>
<item>
                <title>2025-04-14</title>
                <description>Added UTM filtering parameters to the subscribers API</description>
                <link>https://docs.buttondown.com/api-changelog-2025-04-14</link>
                <pubDate>Mon, 14 Apr 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>We&#39;ve expanded the subscriber filtering capabilities by adding support for UTM parameters. You can now filter subscribers by: - Find subscribers who arrived via specific marketing promotions - Filter by the channel that drove subscribers (social, email, etc.) - Filter by the specific source of subscribers We&#39;ve also added a new filter to help you understand why subscribers are leaving. These parameters work just like existing filters - pass them as query parameters when listing subscribers :</p>
]]></content>
            </item>
<item>
                <title>2025-03-31</title>
                <description>Added support for passing IP addresses to subscriber creation</description>
                <link>https://docs.buttondown.com/api-changelog-2025-03-31</link>
                <pubDate>Mon, 31 Mar 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>You can now provide an IP address when creating a subscriber . This will be used to determine the subscriber&#39;s location and validate their legitimacy (especially useful for folks submitting requests from a form that doesn&#39;t have CAPTCHA protection or similar anti-spam measures).</p>
]]></content>
            </item>
<item>
                <title>2025-03-25</title>
                <description>Added support for filtering subscribers by undeliverability status and reason</description>
                <link>https://docs.buttondown.com/api-changelog-2025-03-25</link>
                <pubDate>Tue, 25 Mar 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>You can now filter subscribers by their undeliverability status and specific reasons for being marked undeliverable. This helps you better manage your list health and diagnostics. A new field has been added to the model which can be used for filtering: You can also filter by undeliverability date range: Check out the undeliverability reasons documentation to see all possible values.</p>
]]></content>
            </item>
<item>
                <title>2025-03-01</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2025-03-01</link>
                <pubDate>Sat, 01 Mar 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>RSS Feed Metadata Support RSS feeds just got smarter! Now you can attach metadata to your feeds and have it show up in your emails. Need to mark which site a feed is coming from or add some extra context? We&#39;ve got you covered. What&#39;s new We added a field to the RSS feed endpoints. It&#39;s just a simple key-value dictionary where both keys and values are strings. You&#39;ll find the new field in: (when you fetch a feed) (when you create a feed) (when you update a feed) How to use it Here&#39;s a quick example: { &quot;url&quot;: &quot;<a href="https://example.com/feed">https://example.com/feed</a>&quot;, &quot;behavior&quot;: &quot;create_draft&quot;, &quot;cadence&quot;: &quot;every&quot;, &quot;subject&quot;: &quot;New post: {{ item.title }}&quot;, &quot;body&quot;: &quot;Check out my new post: {{ item.url }}&quot;, &quot;label&quot;: &quot;My blog feed&quot;, &quot;metadata&quot;: { &quot;source&quot;: &quot;blog&quot;, &quot;category&quot;: &quot;tech&quot; } } Once you&#39;ve set this up, just use the metadata values in your templates like any other variable. Don&#39;t worry - this change won&#39;t break any of your existing integrations.</p>
]]></content>
            </item>
<item>
                <title>2025-02-26</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2025-02-26</link>
                <pubDate>Wed, 26 Feb 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>We&#39;ve added a new field to the Subscriber schema to help you track undeliverable subscribers! The schema now includes an field, which records when a subscriber was marked as undeliverable. This is similar to the existing field, but specifically for tracking when email delivery to a subscriber fails permanently. Additionally, you can now: Filter subscribers by and when listing subscribers Sort subscribers by or via the parameter This change makes it easier to track when subscribers become undeliverable and manage your subscriber list more effectively.</p>
]]></content>
            </item>
<item>
                <title>2025-02-12</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2025-02-12</link>
                <pubDate>Wed, 12 Feb 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>We&#39;ve added the ability to filter emails by subject! Now, when you list emails , you can pass in an optional parameter in the query to grab just the emails that match that. This parameter is substring-based (so &quot;Hello&quot; will match &quot;Hello world&quot;, for example) and case-insensitive.</p>
]]></content>
            </item>
<item>
                <title>2025-02-06</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2025-02-06</link>
                <pubDate>Thu, 06 Feb 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>We&#39;ve removed the following fields from the object: This is a completely breaking change with no backwards compatibility or API version. If you&#39;re relying on these fields to be present (or are writing to these fields), then: You should migrate to using the field and setting the paywall therein. You should email us , because our analysis showed us that nobody was setting these fields programmatically! You can read more about the decision in the changelog entry for 2025-02-06 .</p>
]]></content>
            </item>
<item>
                <title>2025-01-02</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2025-01-02</link>
                <pubDate>Thu, 02 Jan 2025 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>In what may be the most niche breaking change ever, we&#39;ve changed the field in the field of bulk actions to . Previously, when wanted to create a bulk action to add a tag to a list of subscribers, you could either specify a list of tag IDs: { &quot;type&quot;: &quot;apply_tags&quot;, &quot;metadata&quot;: { &quot;tag_ids&quot;: [&quot;123&quot;, &quot;456&quot;, &quot;789&quot;], &quot;action&quot;: &quot;add&quot;, } } Or you could specify a single tag: { &quot;type&quot;: &quot;apply_tags&quot;, &quot;metadata&quot;: { &quot;tag&quot;: &quot;123&quot;, &quot;action&quot;: &quot;add&quot;, } } We&#39;ve unified the two approaches to use instead of : { &quot;type&quot;: &quot;apply_tags&quot;, &quot;metadata&quot;: { &quot;tag&quot;: &quot;123&quot;, // [!code --] &quot;tag_id&quot;: &quot;123&quot;, // [!code ++] &quot;action&quot;: &quot;add&quot;, } } The behavior of the endpoint has not changed, and we cut a new version of the API to make this backwards-compatible for existing callers.</p>
]]></content>
            </item>
<item>
                <title>2024-12-31</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2024-12-31</link>
                <pubDate>Tue, 31 Dec 2024 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>We&#39;ve added the field to the model. This field is a date that indicates the date on which the subscriber upgraded to a paid subscription. Not only that, you can also filter subscribers by their upgrade date, or sort them by it.</p>
]]></content>
            </item>
<item>
                <title>2024-12-30</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2024-12-30</link>
                <pubDate>Mon, 30 Dec 2024 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Breaking change : we&#39;ve unshipped the field from emails, and replaced it with a more flexible field. The field is now a string that can be one of the following values: : comments are enabled : comments are disabled : comments are enabled, but only for paid enabled_for_paid_subscribers.</p>
]]></content>
            </item>
<item>
                <title>2024-12-14</title>
                <description>A new `/images` endpoint for you to list your images</description>
                <link>https://docs.buttondown.com/api-changelog-2024-12-14</link>
                <pubDate>Sat, 14 Dec 2024 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>In addition to deleting and creating images based on their , you can now list all of your images by using the new endpoint . ).</p>
]]></content>
            </item>
<item>
                <title>2024-12-11</title>
                <description>Override Buttondown's default collision behavior for new subscribers</description>
                <link>https://docs.buttondown.com/api-changelog-2024-12-11</link>
                <pubDate>Wed, 11 Dec 2024 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>When creating a new subscriber, Buttondown will now reject the request if a subscriber with the same email address already exists, even if that subscriber has unsubscribed or is otherwise in a &quot;valid&quot; state. We do this to protect the data and history of existing subscribers. However, if you&#39;re looking for behavior more akin to an upsert, you can provide a header of or in the request header: This is a slightly nuanced decision for you to make as an API caller; we&#39;ve explained more about our default behavior and reasoning in the API endpoint docs .</p>
]]></content>
            </item>
<item>
                <title>2024-12-10</title>
                <description>Customize your API-borne exports</description>
                <link>https://docs.buttondown.com/api-changelog-2024-12-10</link>
                <pubDate>Tue, 10 Dec 2024 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>When creating an export of your Buttondown data , you can now specify two new fields to transform the shape and specificity of the data you receive: : a dictionary of parameters to filter the data you receive. : a list of columns to include in the export. Rather than just getting &quot;every data point about every subscriber, ever&quot;: You can, say, grab just the email address and status of every subscriber in the past week : curl --request POST \ --url <a href="https://api.buttondown.com/v1/exports">https://api.buttondown.com/v1/exports</a> \ --header &quot;Authorization: Token <your-api-key>&quot; \ --data &#39;{&quot;collections&quot;: [&quot;subscribers&quot;], &quot;parameters&quot;: {&quot;date&quot;: [&quot;2024-12-03&quot;, null]}, &quot;columns&quot;: [&quot;email&quot;, &quot;subscriber_type&quot;]}&#39; (We plan on augmenting this functionality to allow pulling specific metadata fields, too, but you can&#39;t do that quite yet.)</p>
]]></content>
            </item>
<item>
                <title>2024-12-09</title>
                <description>We've added support for filtering subscribers by referrer URL, too!</description>
                <link>https://docs.buttondown.com/api-changelog-2024-12-09</link>
                <pubDate>Mon, 09 Dec 2024 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>When we added support for filtering subscribers by IP address , many of you wrote in asking for the same feature for referrer URLs. We&#39;ve added support for this, too, and you can now filter subscribers by referrer URL:</p>
]]></content>
            </item>
<item>
                <title>2024-12-05</title>
                <description>We've added support for filtering subscribers by IP address.</description>
                <link>https://docs.buttondown.com/api-changelog-2024-12-05</link>
                <pubDate>Thu, 05 Dec 2024 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>We&#39;ve added support for filtering subscribers by IP address . This is, we imagine, a very niche feature, but we&#39;re glad to have it.</p>
]]></content>
            </item>
<item>
                <title>2024-09-30</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2024-09-30</link>
                <pubDate>Mon, 30 Sep 2024 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Breaking change : we&#39;ve made actually delete subscribers instead of just unsubscribing them. This change was implemented to align the API behavior with common REST conventions, where DELETE operations typically remove resources entirely. The difference between deleting and unsubscribing a subscriber is significant: Deleting a subscriber removes all their data from your list permanently. Unsubscribing a subscriber keeps their data but prevents them from receiving future emails. You can still unsubscribe users by calling and setting the field to . This method is preferable if you want to retain subscriber data while respecting their wish not to receive emails.</p>
]]></content>
            </item>
<item>
                <title>2024-08-15</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2024-08-15</link>
                <pubDate>Thu, 15 Aug 2024 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Breaking change : we&#39;ve combined the two fields of and on Emails into the field, which is now more flexible and composable. Historically, the and fields have been intersections rather than unions : An email with and would only be sent to subscribers with the tag. An email with and would be sent to subscribers with the and tag. An email with and would be sent to subscribers with the and tag except for subscribers with the tag. This meant it was impossible to model more complex filters or audiences, such as: Sending an email to subscribers tagged foo or bar. Sending an email to subscribers tagged foo and either bar or baz. Sending an email to subscribers tagged foo or those with a given metadata key-value pair. Our new field allows you to express these kinds of filters in a more flexible way by letting you nest specific fields. It&#39;s more verbose, but within that verbosity lies power. Here are some examples of how you can use the field to express the same filters as above. A simple filter Before { &quot;email&quot;: { // ...other fields... &quot;included_tags&quot;: [&quot;foo&quot;], &quot;excluded_tags&quot;: [] } } After { &quot;email&quot;: { // ...other fields... &quot;filters&quot;: { &quot;predicate&quot;: &quot;and&quot;, &quot;groups&quot;: [], &quot;filters&quot;: [ { &quot;operator&quot;: &quot;contains&quot;, &quot;field&quot;: &quot;subscriber.tags&quot;, &quot;value&quot;: &quot;foo&quot; } ] } } } A more complex filter Before { &quot;email&quot;: { // ...other fields... &quot;included_tags&quot;: [&quot;foo&quot;, &quot;bar&quot;], &quot;excluded_tags&quot;: [&quot;baz&quot;] } } After { &quot;email&quot;: { // ...other fields... &quot;filters&quot;: { &quot;predicate&quot;: &quot;and&quot;, &quot;groups&quot;: [], &quot;filters&quot;: [ { &quot;operator&quot;: &quot;contains&quot;, &quot;field&quot;: &quot;subscriber.tags&quot;, &quot;value&quot;: &quot;foo&quot; }, { &quot;operator&quot;: &quot;contains&quot;, &quot;field&quot;: &quot;subscriber.tags&quot;, &quot;value&quot;: &quot;bar&quot; }, { &quot;operator&quot;: &quot;not_contains&quot;, &quot;field&quot;: &quot;subscriber.tags&quot;, &quot;value&quot;: &quot;baz&quot; } ] } } } (Note that these changes do not apply to the RSS feeds endpoints, which similarly have taken an optional field. That change will come too, in good time.) Super-breaking change : we&#39;re also removing the and filters from the list endpoint. This is not backwards compatible: I investigated the possibility of adding a new field to the list endpoint, but decided that it would be too confusing and too onerous for what it achieves. No active API clients have used either filter in the past 90 days, so we&#39;re deeming it safe; if you have a specific use case in mind that hinged on this functionality, email us and we can discuss your options.</p>
]]></content>
            </item>
<item>
                <title>2024-08-01</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2024-08-01</link>
                <pubDate>Thu, 01 Aug 2024 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Breaking change : we&#39;ve renamed two fields on Subscribers : is now is now The shape and mechanics of these fields have not changed, but the names are now more consistent with other API fields.</p>
]]></content>
            </item>
<item>
                <title>2024-07-13</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2024-07-13</link>
                <pubDate>Sat, 13 Jul 2024 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Breaking change : we&#39;ve removed the field from Email . If you&#39;re interested in setting a canonical URL for your newsletter (because, for example, you&#39;re cross-posting it from a different CMS or platform), you&#39;ll want to use the field instead.</p>
]]></content>
            </item>
<item>
                <title>2024-06-27</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2024-06-27</link>
                <pubDate>Thu, 27 Jun 2024 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Breaking change : we&#39;ve removed the ability to send non-final emails like drafts from /v1/subscribers/{id}/emails . Such requests will now return an error message: { &quot;code&quot;: &quot;email_invalid_status&quot;, &quot;detail&quot;: &quot;You can&#39;t programmatically send emails with status &#39;draft&#39;. Finalize the email first or use the /v1/emails/{id}/send-drafts endpoint instead.&quot;, &quot;metadata&quot;: { &quot;email_status&quot;: &quot;draft&quot;, &quot;email_id&quot;: &quot;{{ email.id }}&quot;, &quot;subscriber_id&quot;: &quot;{{ subscriber.id }}&quot; } } This is a breaking change, and apologies if you suddenly started getting 400s as a result of it, but the fix should hopefully be simple: just migrate that call to /v1/emails/{id}/send-draft instead.</p>
]]></content>
            </item>
<item>
                <title>2024-06-21</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2024-06-21</link>
                <pubDate>Fri, 21 Jun 2024 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>We&#39;ve added two new top-level routes for you to query from: These endpoints were previously sequestered under the and routes, respectively. Now, you can query them directly without needing to implicitly filter on a given survey or email, making it easier to batch large bits of data across multiple sources.</p>
]]></content>
            </item>
<item>
                <title>2024-05-22</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2024-05-22</link>
                <pubDate>Wed, 22 May 2024 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>We&#39;ve added as a filter to the endpoint , which allows you to filter subscribers by the import in which you brought them in. (It&#39;s not easy to actually get that ID from the API at the moment, we know. More stuff coming soon in that area!)</p>
]]></content>
            </item>
<item>
                <title>2024-04-03</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2024-04-03</link>
                <pubDate>Wed, 03 Apr 2024 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>We&#39;ve launched the endpoint, which allows you to create, list, and delete comments on emails.</p>
]]></content>
            </item>
<item>
                <title>2023-08-23</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2023-08-23</link>
                <pubDate>Wed, 23 Aug 2023 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>You can now filter emails by and in the endpoint.</p>
]]></content>
            </item>
<item>
                <title>2023-08-21</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2023-08-21</link>
                <pubDate>Mon, 21 Aug 2023 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Added , which allows you to create and list webhooks that will be called when certain events happen in your account.</p>
]]></content>
            </item>
<item>
                <title>2023-07-23</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2023-07-23</link>
                <pubDate>Sun, 23 Jul 2023 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Added , , and to the endpoint. If these fields are not present, the values will be inferred from a provided .</p>
]]></content>
            </item>
<item>
                <title>2022-11-24</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2022-11-24</link>
                <pubDate>Thu, 24 Nov 2022 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Added , which returns aggregated information about opens, clicks, and other events for a given email that you&#39;ve sent.</p>
]]></content>
            </item>
<item>
                <title>2022-11-19</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2022-11-19</link>
                <pubDate>Sat, 19 Nov 2022 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Removed the , , and endpoints. The behavior of all three endpoints have been subsumed into and : you can create (or list) drafts by specifying you can create (or list) scheduled emails by specifying you can list unsubscribers by specifying (Note: this field was renamed from to in 2024-08-01 )</p>
]]></content>
            </item>
<item>
                <title>2022-03-08</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2022-03-08</link>
                <pubDate>Tue, 08 Mar 2022 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Added support for filtering emails in on and .</p>
]]></content>
            </item>
<item>
                <title>2021-11-26</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2021-11-26</link>
                <pubDate>Fri, 26 Nov 2021 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Took the ability to send specific emails to subscribers out of beta; added , which allows you to send reminders to your subscribers to confirm their email address.</p>
]]></content>
            </item>
<item>
                <title>2021-08-27</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2021-08-27</link>
                <pubDate>Fri, 27 Aug 2021 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Added support for Exports via the endpoint.</p>
]]></content>
            </item>
<item>
                <title>2021-01-02</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2021-01-02</link>
                <pubDate>Sat, 02 Jan 2021 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Added support to set and retrieve metadata on Emails.</p>
]]></content>
            </item>
<item>
                <title>2020-12-23</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2020-12-23</link>
                <pubDate>Wed, 23 Dec 2020 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Added deletion and update abilities to the Scheduled emails endpoint, giving you much more programmability than the hitherto append-only state of the world.</p>
]]></content>
            </item>
<item>
                <title>2020-12-09</title>
                <description>undefined</description>
                <link>https://docs.buttondown.com/api-changelog-2020-12-09</link>
                <pubDate>Wed, 09 Dec 2020 00:00:00 GMT</pubDate>
                <content type="html"><![CDATA[<p>Added a deletion endpoint to the Images endpoint, allowing you to delete unused images.</p>
]]></content>
            </item>
        </channel>
    </rss>