Docs/Reference

Changelog

2026-07-30

A message that retries for its full 72-hour window and never reaches the receiving server now ends in an email.bounced event with bounce.type of expired. Previously it produced a run of email.delayed and then nothing, leaving no terminal event to close the message out. An expired bounce does not suppress the address and is not counted as a hard bounce against your sending reputation, since no server ever refused it. See bounces.

bounce_type on the events API and in webhook payloads is now one of permanent, transient, or expired. Filter on permanent where you are measuring list quality.

2026-07-29

Accounts with dedicated IPs can now split them into named pools and pick one per message with ip_pool on POST /v1/email and POST /v1/email/batch, or the X-Anypost-Ip-Pool header over SMTP. Mail in different pools is queued and paced separately, so a marketing stream cannot delay transactional mail or carry its reputation. The pool is echoed on every event for the message. See the ip_pool field.

Events can be filtered by pool: GET /v1/events?ip_pool=marketing returns only mail that egressed from that pool, and ip_pool is on every event object in the response. The dashboard's events page gained a matching filter for teams with named pools. See list events.

2026-07-19

Every API response now carries RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset. Size your concurrency from these rather than hardcoding a limit, which varies by plan and can change for your team. See rate limits.

Documented the two kinds of 429 and how to tell them apart: a per-second request limit that resets in one second, and a send-volume limit that carries a scope field and resets hours out.

2026-07-13

email.suppressed events now carry a suppression object with the reason, topic, and classification that caused the address to be held. See suppressions.

2026-07-12

Added an AI assistants page covering llms.txt, the per-page Markdown mirrors, and how to point a coding agent at these docs.

2026-07-11

Dashboard reporting now breaks sends down by tag, topic, campaign, template, and sending domain, with filtering down to an individual value.

Automated and prefetch opens are no longer recorded. Opens from scanners and inbox prefetchers never reach the events feed.

Fixed: batch sends totaling more than 1,000 recipients were rejected as a monthly quota error rather than being checked against the per-call limit.

2026-07-07

Templates moved to the emailmd React builder, with a warning when navigating away from unsaved changes.

2026-07-03

One-click DNS setup for sending domains at Cloudflare through Domain Connect. Other providers follow the same flow as they are added.

2026-07-02

Published a brand assets page and a Supabase integration guide.

2026-06-27

Added the Zapier integration guide.

2026-06-25

The dashboard shows the remaining overage credit balance.

2026-06-24

Domain setup recommends a DMARC record alongside SPF and DKIM.

2026-06-21

Teams without overage enabled are alerted as they approach their monthly quota.

2026-06-20

Overage billing is now a prepaid credit wallet with optional auto-reload, and sends a low balance alert email. Credits roll over and are consumed only after the monthly quota.

The dashboard and events feed refresh live.

2026-06-18

Events expose a bot field marking opens and clicks attributed to automation rather than a human. See tracking.

Fixed: suppressed addresses were not filtered out of batch sends.

Fixed: plan upgrade and downgrade timing, and the proration shown in the upgrade dialog.

2026-06-15

Fixed: changing a tracking domain broke unsubscribe links in already-sent mail.

Fixed: the domains API returned an error on some requests.

2026-06-11

Per-tenant burst limits on the API. See rate limits.

2026-05-17

The Anypost API is available at v1: transactional sending over the HTTP API and SMTP, sending domains, templates, open and click tracking, webhooks, suppressions, and the events feed.