Resend plugin

The Resend plugin lets a Vaubaan Gateway mission use Resend without handing the agent a credential. Outbound email : transactional sends classified by recipient zone, segments and contacts, broadcast campaigns, sending domains — one resource per domain and per segment.

One account is one Resend API key; resources are its sending domains and its contact segments. Sends are told apart by who the email goes to (internal, allow-listed, anyone), and the owner of the account labels each domain and segment with an environment so that staging and production are held separately.

Permissions

Each permission is a named risk of the plugin's catalog: a mission holds an explicit list of them, never "all". The severity is computed from the permission's six axes (undo, blast radius, data, cost, visible to, lasts); nothing is decided from it.

PermissionWhat it allowsSeverityWhy it is a risk
resend.read-email-statusRead email send status and metadatalowRetrieve the status, subject, from/to and tags of a sent email. Metadata-level : GET /emails/:id returns no body content. Low risk.
resend.read-domainsRead sending domains and DNS verification statuslowList or retrieve the mission's sending domains with their DKIM / SPF / DMARC records and the recipient-zone configuration (describe_zones). Reveals the sending posture ; no secret (DNS records are public).
resend.read-audiencesRead audiences and contacts (PII) — deprecated, replaced by read-segmentsmedium (deprecated)Deprecated : matches no call any more. Resend renamed audiences to segments and made contacts account-level ; `resend.read-segments` carries the same PII read. Kept so the id stays resolvable.
resend.read-segmentsRead segments and contacts (PII)mediumList or retrieve the mission's segments, the account's contacts and the members of a segment. Contacts carry PII (email, first_name, last_name, custom properties) — GDPR-relevant, every read by an agent is a minimisation question. Distinct from read-broadcasts so a campaign status can be checked without unlocking the contact database.
resend.read-broadcastsRead broadcast campaignslowList or retrieve broadcast metadata (name, subject, status, schedule) of the mission's segments. No contact-level PII, aggregate campaign information only.
resend.send-email-internalSend a transactional email to internal recipients onlylowEvery recipient belongs to the sending domain's internal_domains. Low exfiltration risk — the message stays inside the organisation. Side effect : a real email lands in a real inbox.
resend.send-email-allowlistSend a transactional email to pre-approved external recipientsmediumEvery recipient is internal or matches allowlist_domains / allowlist_addresses of the sending domain. Pre-approved but external : the message leaves the organisation and cannot be recalled.
resend.send-email-external-unboundedSend a transactional email to an arbitrary external recipienthigh (only for staging, dev)At least one recipient matches neither internal_domains nor the allowlists. Cardinal exfiltration vector : an agent could put sensitive data in the body and send it to an attacker-controlled address, irreversibly. Acceptable only on domains labelled staging or dev.
resend.send-batchSend a batch of transactional emails (up to 100 per call)highPOST /emails/batch sends up to 100 emails in one call. Bulk amplification whatever the recipient zone — the classifier also emits the zone slice, so both permissions must be held. A distinct marker so the creator consents to bulk sending explicitly.
resend.audience-writeCreate or delete an audience — deprecated, replaced by segment-writemedium (deprecated)Deprecated : matches no call any more. Resend renamed audiences to segments ; `resend.segment-write` carries the same structural change. Kept so the id stays resolvable.
resend.segment-writeCreate or delete a segmentmediumStructural change to the contact database. Creating a segment is low risk ; deleting one drops every membership it held (the contacts survive). Conservative vector for the worst case.
resend.contact-writeCreate, update or delete contacts ; add or remove segment membershighMutate the contact database : add subscribers, edit PII fields, unsubscribe, delete, or move contacts in and out of a segment (which decides who a broadcast reaches). Reversible for creates, not for deletes.
resend.broadcast-draftCreate or update a broadcast (draft, not sent)lowDraft a campaign for a segment of the mission. No side effect until sent — the classifier refuses a create carrying `send` or `scheduled_at`, which would bypass broadcast-send. Reversible (delete the draft).
resend.broadcast-sendSend a broadcast to its segment (mass email delivery)criticalDeliver a broadcast to every contact of the segment. Cardinal bulk action — potentially thousands of real emails, irreversibly, at a cost that scales with the segment. The plugin re-reads the broadcast upstream and refuses to send one that targets another segment than the one named. The highest-risk operation of this service.
resend.broadcast-deleteDelete a broadcastlowRemove a broadcast of a segment of the mission. A sent broadcast loses its record only (delivered emails are not recalled) ; a scheduled one is cancelled.
resend.domain-writeAdd, update or remove a sending domainhighPosture shift : adding a domain widens what the account can send from ; removing one breaks delivery for every sender on it ; tracking and TLS settings change what recipients see. DNS must be configured outside Resend. Suggested : ask first.
resend.domain-verifyTrigger DNS verification of a domainlowIdempotent request that asks Resend to re-check the DNS records of a domain of the mission. No side effect beyond the attempt ; a step of the domain set-up posture shift.
resend.uncategorized-writeUncategorized Resend writemedium (the catch-all: touched only by a call no other permission covers)Catch-all for a write no named permission covers. If Resend adds a surface (webhooks, API keys, templates) and Vaubaan wraps it before the catalog is updated, calls land here — fail-loud by design. Never offered in a preset.

Presets

A preset pre-fills the permissions of a mission for one account, with a limit per period, a rate and whether each permission runs freely or asks the mission creator first. The person creating the mission adjusts it; the mission stores the explicit list.

Read-only

read-only — Email status, sending domains and campaign metadata of the selected resources. No PII, no write.

PermissionWhat it allowsLimit per periodRateRuns
resend.read-email-statusRead email send status and metadata2000120 per minuteruns freely
resend.read-domainsRead sending domains and DNS verification status100060 per minuteruns freely
resend.read-broadcastsRead broadcast campaigns100060 per minuteruns freely

Developer

developer — One mission per code project — transactional sends to internal and allow-listed recipients, generous limits; no bulk, no PII, no domain change.

PermissionWhat it allowsLimit per periodRateRuns
resend.read-email-statusRead email send status and metadata5000120 per minuteruns freely
resend.read-domainsRead sending domains and DNS verification status200060 per minuteruns freely
resend.read-broadcastsRead broadcast campaigns100060 per minuteruns freely
resend.send-email-internalSend a transactional email to internal recipients only200060 per minuteruns freely
resend.send-email-allowlistSend a transactional email to pre-approved external recipients100030 per minuteruns freely

Marketing operator

marketing-operator — Contacts, segments and campaigns; broadcast sends, batch sends and segment deletion ask first. No domain change.

PermissionWhat it allowsLimit per periodRateRuns
resend.read-email-statusRead email send status and metadata2000120 per minuteruns freely
resend.read-domainsRead sending domains and DNS verification status100060 per minuteruns freely
resend.read-segmentsRead segments and contacts (PII)5000120 per minuteruns freely
resend.read-broadcastsRead broadcast campaigns2000120 per minuteruns freely
resend.send-email-internalSend a transactional email to internal recipients only100060 per minuteruns freely
resend.send-email-allowlistSend a transactional email to pre-approved external recipients100030 per minuteruns freely
resend.send-batchSend a batch of transactional emails (up to 100 per call)505 per minuteask me first
resend.contact-writeCreate, update or delete contacts ; add or remove segment members5000120 per minuteruns freely
resend.segment-writeCreate or delete a segment205 per minuteask me first
resend.broadcast-draftCreate or update a broadcast (draft, not sent)20020 per minuteruns freely
resend.broadcast-sendSend a broadcast to its segment (mass email delivery)101 per minuteask me first
resend.broadcast-deleteDelete a broadcast5010 per minuteruns freely

Domain admin

domain-admin — Provision sending domains — read and verify freely, every domain mutation asks first. No send.

PermissionWhat it allowsLimit per periodRateRuns
resend.read-domainsRead sending domains and DNS verification status200060 per minuteruns freely
resend.domain-verifyTrigger DNS verification of a domain20010 per minuteruns freely
resend.domain-writeAdd, update or remove a sending domain205 per minuteask me first

Tools

ToolWhat it does
resend__get_emailRead the status of a sent email
resend__list_domainsList sending domains
resend__get_domainRead a sending domain
resend__list_segmentsList segments
resend__get_segmentRead a segment
resend__list_contactsList contacts
resend__get_contactRead a contact
resend__list_broadcastsList broadcasts
resend__get_broadcastRead a broadcast
resend__describe_zonesRead the recipient zones
resend__send_emailSend an email
resend__send_batch_emailsSend a batch of emails
resend__create_domainAdd a sending domain
resend__update_domainChange a sending domain
resend__delete_domainRemove a sending domain
resend__verify_domainRe-check a sending domain
resend__create_segmentCreate a segment
resend__delete_segmentDelete a segment
resend__create_contactCreate a contact
resend__update_contactChange a contact
resend__delete_contactDelete a contact
resend__add_contact_to_segmentAdd a contact to a segment
resend__remove_contact_from_segmentRemove a contact from a segment
resend__create_broadcastCreate a draft broadcast
resend__update_broadcastChange a draft broadcast
resend__send_broadcastSend a broadcast to its segment
resend__delete_broadcastDelete a broadcast

Health

Health: not enough reports yet. A plugin version is deemed validated by the community with at least 200 reports and 90 % of them successful, over the last 90 days, as reported by the instances whose operators turned community telemetry on. It is a community signal, not a security guarantee.

Last changed 2026-10-16. This page as Markdown: /plugins/resend.md