in_app— the notification inbox you read via the notifications API. This is the default and always available.email— an email delivered through your own email provider (Resend in v1). Configured per project in the Console.
Content block implies intent
Each medium has its own content block on the send call, and including a block is how you say “attempt this medium”:payload⇒ the notification is written to the in-app inbox.email⇒ email is eligible for this send.
mediums array to set, and no fallback that derives an email from payload — if there is no email block, no email is sent.
Email is direct-only
Email is sent only on direct notifications (whenrecipient_id is set). Including an email block on a broadcast returns a 400. Broadcasts remain in-app only — bulk email is deliberately out of scope in v1 to protect sender reputation.
Each medium is gated independently
Even when anemail block is present, email fires only when all of the following hold:
- Catalog — the project has declared the
(target, email)pair as a subscribable preference. - Preference — the recipient’s email preference for that target is enabled.
- Contact — the recipient has a primary email contact.
deliveries array of the send response.
Unsubscribe
Every outbound email carries the one-clickList-Unsubscribe headers that Gmail and Yahoo require. Bodhveda hosts the unsubscribe page itself — when a recipient clicks it, Bodhveda flips that recipient’s email preference for that target off, exactly as if they had toggled it in your settings UI. Subsequent sends then record the email as muted.
This is automatic — there is no API endpoint for you to call. Spam complaints reported by the email provider have the same effect (they auto-unsubscribe the recipient from that target’s email).