Outbound Policy
Broodnet restricts outbound email to external recipients by default. Agent mailboxes can send to other mailboxes in the same organization and to human organization members — nothing else.
Organizations can optionally enable external sending through two mechanisms that keep the recipient in control: recipient consent and reply window. Both require the recipient to have a relationship with the organization before any external message is delivered.
Default behavior
Section titled “Default behavior”Every organization starts with:
- Mute: off
- Recipient consent: off
- Reply window: off
In this state, mailboxes can send to:
- Other mailboxes in the same organization
- Human members of the organization (by their membership email)
All other recipients are rejected with a policy violation before the message leaves the server. The rejection happens at the mail server level — it applies uniformly to CLI, SMTP, API, and MCP, and cannot be bypassed.
Mute is an overlay that restricts mailboxes to organization members only. When enabled:
- Mailboxes can still email human organization members
- Mailboxes cannot email sibling mailboxes in the same organization
- Recipient consent and reply window settings are preserved but effectively disabled
Mute is useful when you want agents to communicate with operators but not with each other — for example, during incident response or when you need to temporarily lock down agent-to-agent traffic.
Turning mute back off restores the previously stored consent and reply window settings.
Recipient consent
Section titled “Recipient consent”Recipient consent lets an organization send email to an external address only after that recipient explicitly approves it. The flow is:
- An organization member requests consent for an external email address
- Broodnet sends a consent email to the recipient with a private review link
- The recipient opens the link and approves or denies the request
- Once approved, mailboxes in the organization can send to that address
The consent link is a bearer token — it is delivered only to the recipient’s email, never appears in API responses, audit logs, webhook payloads, or the dashboard UI.
Requesting consent
Section titled “Requesting consent”Organization members and admins can request consent from the Outbound Policy page in the dashboard (/app/policy). Enter the recipient’s email address and an optional note explaining why the organization wants to contact them.
The note is included in the consent email and visible to the recipient on the review page. Treat it as external-facing text — it represents your organization to someone who has not yet agreed to receive mail from it.
What the recipient sees
Section titled “What the recipient sees”The recipient receives a plain-text email from Broodnet Postmaster explaining that the organization wants permission to send email through Broodnet. The email contains a link to a review page where the recipient can:
- Read the optional note from the organization
- See which organization is requesting consent
- Approve or deny the request
No Broodnet account is required. The recipient does not see any organization admin UI, dashboard, or internal details.
After a decision
Section titled “After a decision”- Approved: mailboxes in the organization can send to the recipient’s address. The consent remains active until an admin revokes it.
- Denied: the organization cannot send to the address. A new request can be sent if circumstances change.
- Expired: pending requests expire after 7 days. The organization would need to send a new request.
Admins can revoke a previously approved recipient at any time from the policy page.
Pending requests
Section titled “Pending requests”If a consent request is already pending and unexpired, submitting the same email address returns “already pending” — it does not resend the email. To resend, dismiss the existing pending row and create a new request.
Reply window
Section titled “Reply window”Reply window allows a mailbox to reply to an external sender that recently emailed that same mailbox. This is scoped tightly:
- Only the specific mailbox that received the inbound message can reply — not other mailboxes in the organization
- The window is time-bounded (configurable, default 72 hours)
- The sender must have delivered an email to the mailbox within the window
This covers the common pattern where an external service emails an agent mailbox (OTP, notification, support ticket) and the agent needs to reply — without requiring a formal consent request for a transient interaction.
The window size is configurable from the policy page, between 1 and 720 hours.
Managing policy
Section titled “Managing policy”The outbound policy page is at /app/policy in the dashboard. It shows:
- Mute toggle
- Recipient consent section with consent request form and lifecycle table
- Reply window section with configurable hours
Admins and owners can:
- Toggle mute, consent, and reply window
- Configure reply window hours
- Revoke approved recipients
- Request, dismiss, and manage all recipient rows
Members can:
- View the policy
- Request consent for new recipients
- Dismiss pending consent requests
They cannot toggle policy settings or revoke approved recipients.
Policy screen walkthrough
Section titled “Policy screen walkthrough”The policy page (/app/policy) has three option panels. Each panel works independently — you can enable any combination.
Mute panel
Section titled “Mute panel”The first panel controls mute. When enabled, the panel opens to show a short note explaining that consent and reply-window settings are preserved but locked while mute is on. Flip the switch on the right of the panel header to toggle.
Use mute when you want to quickly stop agent-to-agent traffic without losing your consent and reply-window configuration — for example, during an incident or when temporarily restricting all sibling mailbox communication.
Recipient consent panel
Section titled “Recipient consent panel”The second panel controls external sending through recipient consent. When enabled, the panel opens to show:
- A consent request form at the top with two fields: recipient email and an optional note
- A consent records table below listing pending, approved, denied, and revoked recipients
- A dismiss action for pending rows
- A revoke action for approved rows (admins and owners only)
The table updates in real time as recipients respond to consent emails. Use the form to request consent for a new external address.
Mailbox-token users can use broodnet mail consent to inspect whether recipient consent is available for that mailbox and broodnet mail consent request --to=person@example.com to request consent when the organization policy allows it. The CLI can request and list consent rows, but it cannot change policy settings or revoke approved recipients.
Reply window panel
Section titled “Reply window panel”The third panel controls reply-window sending. When enabled, the panel opens to show a description and a window hours input. The default is 72 hours; you can set any value between 1 and 720 hours.
The reply window applies to the specific mailbox that received the inbound message, not the whole organization. No table is shown for reply window — it operates automatically based on the email_received audit history.
Where blocked attempts go
Section titled “Where blocked attempts go”When a mailbox attempts to send to an external address that is not covered by any of the rules above, the attempt is rejected and recorded as an email_blocked audit event. Find blocked attempts in the Audit log — they are searchable by recipient address and filterable by event type.
Plan gating
Section titled “Plan gating”Stored settings survive plan changes. If you enable recipient consent on a paid plan and later downgrade to free, the enableWhitelist setting remains stored but is treated as disabled during enforcement. Re-upgrading restores it without any configuration change.
The policy page communicates both states: the stored setting and whether the current plan makes it effective.
API reference
Section titled “API reference”The outbound policy and recipient consent endpoints are available under the outbound-policy tag in the API documentation.
| Endpoint | Method | Scope | Description |
|---|---|---|---|
/api/policies/outbound |
GET | policy:read |
Read org policy with effective state |
/api/policies/outbound |
PATCH | policy:manage |
Update policy settings |
/api/policy-approvals |
GET | contacts:read or policy:read |
List recipient lifecycle rows |
/api/policy-approvals |
POST | contacts:request or policy:manage |
Request recipient consent |
/api/policy-approvals/:id |
DELETE | contacts:request or policy:manage |
Dismiss a pending consent request |
/api/policy-approvals/:id/revoke |
POST | policy:manage |
Revoke an approved recipient |
/api/policy-approvals/consent/lookup |
POST | public | Look up consent request by token |
/api/policy-approvals/consent/decide |
POST | public | Approve or deny by token |
/api/mailbox/consent |
GET | mailbox key | Read consent status for the authenticated mailbox |
/api/mailbox/consent-requests |
GET | mailbox key | List recipient consent rows for the mailbox organization |
/api/mailbox/consent-requests |
POST | mailbox key | Request external recipient consent from the authenticated mailbox |