RefreshDocsConsole →

API reference

Unsubscribe & tracking

Which messages carry List-Unsubscribe, what the /u, /p and /t endpoints do, and how the platform applies open/click tracking.

Headers on every message

Header Value
Message-ID <message id>@<sending domain> — the platform threads replies that quote it in Inbound.
Feedback-ID <org slug>:<kind or "transactional">:f5send (Gmail Postmaster).
your headers Appended as given.

Bulk kinds get one-click unsubscribe

If kind starts with bulk., broadcast., digest. or sequence., the message must have exactly one recipient (422 bulk_single_recipient otherwise). The platform sends it with these headers:

List-Unsubscribe: <https://app.f5send.com/u/<token>>
List-Unsubscribe-Post: List-Unsubscribe=One-Click

Transactional messages (any other kind, or none) never carry these headers. If your app sends its own List-Unsubscribe or List-Unsubscribe-Post, the platform drops them and sends the message. To keep your own list in step, handle the email.unsubscribed webhook. The token is <message id>.<recipient>.<signature>. The signature is an HMAC that binds the message and the address. No one can forge the token or replay it for another recipient.

/u/<token> — unsubscribe

  • GET renders a small confirmation page (organization name, masked address, an Unsubscribe button). It has no side effects. The page uses the logo and colors from Settings → Unsubscribe.
  • POST applies the unsubscribe and returns 200. This is the RFC 8058 one-click call that mail clients make, or the button. Repeats are idempotent.

The meaning of "unsubscribe" depends on the message:

Message Effect
Carries a topic — kind: "broadcast.<slug>" or a topic tag naming one of the topics of the organization The subscription of the contact to that topic becomes unsubscribed. Other topics and transactional messages continue.
No topic (e.g. kind: "digest.weekly" with no topic tag) The platform adds the address to the organization-wide suppression list (reason UNSUBSCRIBE). If the address is a contact, its status becomes unsubscribed.

In both cases, the platform records an unsubscribed event on the message and delivers it to webhooks as email.unsubscribed. Invalid or tampered tokens return 404.

/p/<token> — preferences page

This is a per-contact page that lists the topics of the organization with checkboxes and an Unsubscribe from all button. The link is on the contact page in the console (Audience → contact → Preferences). The token is an HMAC over the contact id. When the contact saves, the platform writes explicit subscription rows (source preferences). "Unsubscribe from all" also adds the organization-wide suppression, so messages stop. The page uses the same branding as /u.

Suppression at send time

On every POST /emails, the platform drops suppressed recipients before it queues the message. A suppression can be organization-wide or scoped to the sending domain. Dropped recipients come back in the suppressed array of the response and get a suppressed event. The platform adds addresses automatically on hard bounces (HARD_BOUNCE) and complaints (COMPLAINT), and on unsubscribe (UNSUBSCRIBE). A person can also add them in the console (MANUAL).

Open and click tracking

The platform turns tracking off by default. Turn it on per message with "track": { "opens": true, "clicks": true }. The worker applies it only when all of these hold:

  • you created the sending domain with Tracking (it has a link.<domain> host, CNAME → link.f5send.com);
  • the tracking host serves HTTPS. The platform sets it up after the link CNAME resolves. Until then, the message keeps its original links;
  • the message has an HTML body;
  • the message has exactly one recipient (tokens name the recipient; the platform does not track multi-recipient messages to avoid mis-attribution).

Opens — the worker appends a 1×1 GIF https://link.<domain>/t/o/<token> before </body> (or at the end). When a client loads it, the platform records an opened event.

Clicks — the worker rewrites each <a href="http(s)://…"> to https://link.<domain>/t/c/<token>. The redirect (302) records a clicked event with the destination url. The worker does not rewrite mailto:, tel:, #anchors, links to the tracking host or to f5send.com, unsubscribe (/u/) links, and anchors with a data-no-track attribute.

The platform signs tokens with an HMAC. A tampered token returns 404 (the pixel still returns a GIF; the click redirect returns nothing).