email.opened
email.opened fires on a tracked open, with bot and privacy-proxy hits flagged. Requires open tracking on the domain or on the send.
A tracked open. Requires open tracking on the domain, or on the send.
Payload
Every field, with an example body, is in the email.opened reference, generated from the API contract.
Bot detection
Every hit is reported; bot says whether a person made it. Count and act on the ones where it is false.
bot_reason |
What it is |
|---|---|
privacy_proxy |
Apple Mail Privacy Protection, which fetches every image as the message lands. |
script |
An HTTP library that announces itself. |
known_bot |
A security scanner, link expander or sync daemon that names itself. |
stale_browser |
A browser build nobody runs any more, which is what scanners dress up as. |
too_fast |
Within seconds of delivery, sooner than a person could act. |
More reasons may be added, so treat one you do not know as a bot. Events created before 2026-09-18 carry neither field.
Detection is conservative: a missing or unfamiliar user-agent counts as a person, and so do Gmail’s and Yahoo’s image proxies, which fetch when the reader opens the message.
Handling it
Never branch application logic on a single open — “they haven’t read it, resend” will misfire on both kinds of client. email.clicked is the signal worth acting on.