Resend
Email for developers
- Category
- Developer Tools
- Primary Subcategory
- Email & SMS Lifecycle Marketing Automation
Integration details
Description
Resend helps users send transactional email, inspect delivery and request logs, manage audiences, domains, templates, broadcasts, automations, webhooks, API keys, and OAuth grants from ChatGPT using their own Resend credentials.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Email & SMS Lifecycle Marketing Automation
- Secondary Subcategories
- None listed
- Brand
- Resend
- Access
- Account required
- First tracked
- 2026-07-09
- Tool count
- 129
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Get alerts for Resend
Get updates when Resend’s Discoverability Score or category rank changes.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT Email & SMS Lifecycle Marketing Automation
View Category129 tools agents can invoke
Add a contact to a segment in Resend (by contact ID or email).
add-contact-to-segment
Add an email address to the suppression list in Resend. Suppressed addresses never receive emails from the account, even when included as recipients. Hard bounces and spam complaints are added to the suppression list automatically; use this tool to manually suppress an address when needed, e.g. to honor a do-not-contact request. To suppress many addresses at once, use batch-add-suppressions instead.
add-suppression
Add multiple email addresses to the suppression list in Resend in a single call. Suppressed addresses never receive emails from the account. Hard bounces and spam complaints are added to the suppression list automatically; use this tool to manually suppress addresses when needed, e.g. to honor do-not-contact requests. For a single address, use add-suppression instead.
batch-add-suppressions
Remove multiple entries from the suppression list in Resend in a single call, by email addresses or by suppression IDs (provide exactly one of the two). The addresses will start receiving emails again. Before using this tool, you MUST double-check with the user that they want to remove these suppressions. Reference the EMAIL ADDRESSES (or IDs) when double-checking, and warn the user that addresses suppressed due to a bounce or complaint may hurt deliverability if emailed again. You may only use this tool if the user explicitly confirms they want to remove the suppressions after you double-check.
batch-remove-suppressions
**Purpose:** Cancel a queued or scheduled broadcast by ID or Resend dashboard URL, without removing it. Cancelling a queued broadcast stops it mid-send (emails already sent are not affected). Cancelling a scheduled broadcast reverts it to draft. **NOT for:** Removing a broadcast entirely (use remove-broadcast). Draft and sent broadcasts cannot be cancelled — sent broadcasts are immutable, and drafts have nothing to cancel. **When to use:** User wants to "stop", "cancel", or "pause" a broadcast that is currently sending or scheduled to send.
cancel-broadcast
Cancel a scheduled email that has not yet been sent. Only works for emails that were scheduled using the scheduledAt parameter.
cancel-email
**Purpose:** Set the TipTap JSON content of a broadcast, enabling it to be edited visually in the Resend dashboard editor. Automatically connects and disconnects from the editor. Can also update metadata (subject, preview text, name) in the same call. **This is the recommended way to set email content.** Content set via compose-broadcast can be visually edited by the user in the dashboard. Use this for newsletters and any broadcast where the user may want to refine the content. **Workflow:** get-tiptap-json-content (with include_schema: true) → compose-broadcast **When to use:** - After create-broadcast, to set the email body - When the user wants to write, edit, or style email content - When the user wants to collaborate on the email in the dashboard editor **Important:** Always call get-tiptap-json-content first to retrieve the existing TipTap JSON, then build your changes on top of it. Skipping this will overwrite all existing content. **Note:** Switching between compose (TipTap) and update (raw HTML) modes is lossy — some content or formatting may be lost. If the broadcast already has HTML content, ask the user before switching to compose mode.
compose-broadcast
**Purpose:** Set the TipTap JSON content of a template, enabling it to be edited visually in the Resend dashboard editor. Automatically connects and disconnects from the editor. Can also update metadata (subject, name) in the same call. **This is the recommended way to set email content.** Content set via compose-template can be visually edited by the user in the dashboard. **Workflow:** get-tiptap-json-content (with include_schema: true) → compose-template **When to use:** - After create-template, to set the email body - When the user wants to write, edit, or style email content - When the user wants to collaborate on the email in the dashboard editor **Important:** Always call get-tiptap-json-content first to retrieve the existing TipTap JSON, then build your changes on top of it. Skipping this will overwrite all existing content. **Note:** Switching between compose (TipTap) and update (raw HTML) modes is lossy — some content or formatting may be lost. If the template already has HTML content, ask the user before switching to compose mode.
compose-template
**Purpose:** Show agent presence in the Resend dashboard editor. Users will see an agent avatar while connected. **When to use:** - To signal to dashboard users that an AI agent is working on the content outside of compose workflows - **Not needed before compose-broadcast or compose-template** — get-tiptap-json-content connects automatically, and compose tools disconnect when done. **Returns:** Connection token and room ID.
connect-to-editor
Create a new API key in Resend. The token is only shown once upon creation, so you MUST display it to the user.
create-api-key
**Purpose:** Create an automation workflow that triggers on events and executes a sequence of steps. **When to use:** - User wants to set up automated email sequences (welcome series, drip campaigns, re-engagement) - User wants to automate actions based on events (update contacts, add to segments) **Workflow:** manage-events (create event, if needed) → list-templates (to get template IDs) → get-template (to check if template has "from" and "subject" — if not, use list-domains to pick a verified domain for the step config) → create-automation → send-event (to test) **Returns:** Automation ID and dashboard link. The workflow is a JSON object with one key: "steps" — an array of step objects. Each step has: key (unique string), type, config, and either "next" (string|null) or "branches" (for branching steps). Use keys like: "trigger", "send_email_1", "delay_1", "condition_1", "wait_event_1". ## Step types ### trigger — starts the automation when an event fires (required, exactly one) config: { "eventName": "<event_name>" } Uses "next". ### send_email — send an email using a published template config: { "template": { "id": "<template_id>", "variables": { "<key>": "<value>" } }, "from": "Name <[email protected]>", "subject": "Email subject", "replyTo": "<address>" } **"from" and "subject" are resolved from the step config first, then fall back to the template.** If neither provides a "from", the email will silently fail to send. If neither provides a "subject", the run will error. Best practice: always set "from" and "subject" on the step config so the automation is self-contained. Use list-domains to find verified domains for "from". "replyTo" and "variables" are optional. Variables can use { "var": "event.<field>" } or { "var": "contact.<field>" } for dynamic values. Uses "next". ### delay — pause the workflow config: { "duration": "<human-readable>" } Examples: "30 minutes", "1 hour", "2 days", "1 week". Max 30 days. Uses "next". ### condition — conditional split based on contact or event data config: A condition rule object: Single rule: { "type": "rule", "field": "event.<field>" or "contact.<field>", "operator": "<op>", "value": <value> } Compound: { "type": "and"|"or", "rules": [<rule>, ...] } Operators: eq, neq, gt, gte, lt, lte, contains, starts_with, ends_with, exists, is_empty. exists/is_empty do not require a value. Uses "branches": { "condition_met": "<step_key>", "condition_not_met": "<step_key_or_null>" } ### wait_for_event — pause until a specific event arrives or timeout config: { "eventName": "<event_name>", "timeout": "<human-readable>", "filterRule": <optional condition rule> } For email lifecycle events use "resend:email.<opened|clicked|bounced|delivered|complained|failed|suppressed>". Uses "branches": { "event_received": "<step_key>", "timeout": "<step_key_or_null>" } ### contact_update — update contact fields config: { "firstName": "<value>", "lastName": "<value>", "unsubscribed": true|false, "properties": { "<key>": "<value>" } } All fields optional. Values can use { "var": "event.<field>" } for dynamic data. Uses "next". ### contact_delete — remove the contact from the audience config: {} Uses "next". ### add_to_segment — add contact to a segment config: { "segmentId": "<segment_id>" } Uses "next". ## Rules 1. Every step must be reachable from the trigger via next/branches. 2. Terminal steps have "next": null (or null branch values). 3. The workflow must be tree-shaped — no merging branches back together. ## Example: Linear drip campaign { "steps": [ { "key": "trigger", "type": "trigger", "config": { "eventName": "user.created" }, "next": "send_email_1" }, { "key": "send_email_1", "type": "send_email", "config": { "template": { "id": "tmpl_123" }, "from": "Welcome <[email protected]>", "subject": "Welcome!" }, "next": "delay_1" }, { "key": "delay_1", "type": "delay", "config": { "duration": "3 days" }, "next": "send_email_2" }, { "key": "send_email_2", "type": "send_email", "config": { "template": { "id": "tmpl_456" }, "from": "Welcome <[email protected]>", "subject": "Getting started" }, "next": null } ] } ## Example: Re-engagement with wait_for_event { "steps": [ { "key": "trigger", "type": "trigger", "config": { "eventName": "user.created" }, "next": "send_email_1" }, { "key": "send_email_1", "type": "send_email", "config": { "template": { "id": "tmpl_789" }, "from": "Team <[email protected]>", "subject": "Welcome" }, "next": "wait_event_1" }, { "key": "wait_event_1", "type": "wait_for_event", "config": { "eventName": "resend:email.opened", "timeout": "3 days" }, "branches": { "event_received": null, "timeout": "send_email_2" } }, { "key": "send_email_2", "type": "send_email", "config": { "template": { "id": "tmpl_abc" }, "from": "Team <[email protected]>", "subject": "Did you miss this?" }, "next": null } ] } ## Example: Condition branch { "steps": [ { "key": "trigger", "type": "trigger", "config": { "eventName": "trial.ended" }, "next": "condition_1" }, { "key": "condition_1", "type": "condition", "config": { "type": "rule", "field": "event.converted", "operator": "eq", "value": true }, "branches": { "condition_met": "send_email_1", "condition_not_met": "send_email_2" } }, { "key": "send_email_1", "type": "send_email", "config": { "template": { "id": "tmpl_thanks" }, "from": "Team <[email protected]>", "subject": "Thanks for upgrading!" }, "next": null }, { "key": "send_email_2", "type": "send_email", "config": { "template": { "id": "tmpl_win_back" }, "from": "Team <[email protected]>", "subject": "We'd love to have you back" }, "next": null } ] }
create-automation
**Purpose:** Create a broadcast campaign (one email sent to an entire segment). Defines subject, body, and segment; does NOT send yet. Use send-broadcast to send it. **NOT for:** Sending a one-off email to specific people (use send-email). Not for adding contacts (use create-contact). **Returns:** Broadcast ID. Use this ID with send-broadcast to send, or get-broadcast/update-broadcast to manage. **When to use:** - User wants to "email my list", "send a newsletter", "broadcast to my segment", "email all contacts in X" - Newsletter, announcement, or bulk message to one segment - Supports personalization: {{{FIRST_NAME}}}, {{{LAST_NAME}}}, {{{EMAIL}}}, {{{RESEND_UNSUBSCRIBE_URL}}} **"All contacts" note:** Broadcasts require a segment. There is no "all contacts" option in the API. If the user wants to send to all contacts, check list-segments for an existing segment that covers everyone. If none exists, suggest creating one with create-segment. **Workflow:** list-segments (if needed) → create-broadcast → get-tiptap-json-content (with include_schema: true) → compose-broadcast → send-broadcast. **Content options after creating:** - **compose-broadcast** (recommended): Sets TipTap content that the user can visually edit in the Resend dashboard. Use this when the user wants to collaborate on or refine the email in the editor. - **update-broadcast with html/text**: Sets static HTML/text content. Use this only when the user explicitly wants to set raw HTML. Switching between compose and html/text modes is lossy — some content or formatting may be lost. Ask the user before switching.
create-broadcast
Create a new contact in Resend. Optionally assign to segments and configure topic subscriptions.
create-contact
Bulk-import contacts from a CSV file into Resend. The import is processed asynchronously: this returns an import ID immediately, then use get-contact-import to poll its status and counts. Provide the CSV as raw text via `content`. Max file size 100MB.
create-contact-import
Create a new contact property in Resend. A contact property is a custom attribute (e.g. "company_name", "plan_tier") that can be attached to contacts.
create-contact-property
Create a new domain in Resend. Returns DNS records that must be configured with your DNS provider for verification. You MUST display the DNS records to the user so they can set them up.
create-domain
Start a claim for a domain another Resend account has already verified. The domain is recreated under your account with brand-new DKIM keys, so the previous account's DNS records cannot be reused. Returns a TXT record that MUST be added to your DNS to prove ownership. You MUST display the TXT record to the user. After they add it, use verify-domain-claim, then poll get-domain-claim until status is "completed".
create-domain-claim
**Beta.** Only accounts in the Inboxes beta can use this tool. Create an inbox in Resend. An inbox receives email at an address on one of your domains and groups what arrives into threads. The domain must already be verified for receiving — or set forwarding to true, and Resend returns a forwarding address you point your existing mail provider at instead.
create-inbox
**Beta.** Only accounts in the Inboxes beta can use this tool. **Purpose:** Create a draft in a Resend inbox — a message saved for later, NOT sent. At least one of to, cc, bcc, subject, text, or html is required. Nothing leaves the account until send-inbox-draft is called on it. **NOT for:** Sending mail. To send straight away, use reply-to-inbox-thread-email to answer a thread, forward-inbox-thread-email to pass a message along, or send-email for an unrelated message. **Returns:** The draft's id, type, recipients, subject, the thread and message it replies to if any, and its timestamps. **When to use:** User asks to draft, compose, or prepare a message without sending it, or wants to read the wording back before it goes out. Pass threadId and replyToEmailId together to draft a reply to a message in a thread; omit both to draft a standalone message. The id this returns is the "draftId" that get-inbox-draft, update-inbox-draft, send-inbox-draft, and remove-inbox-draft all take.
create-inbox-draft
**Beta.** Only accounts in the Inboxes beta can use this tool. Create a label in a Resend inbox. A label is a tag the threads in that inbox can carry. Creating one does not put it on anything — pass the ID this returns to update-inbox-thread to apply it to a thread. Resend picks a color when you omit one.
create-inbox-label
Create a new segment in Resend. A segment is a group of contacts that can be used to target specific broadcasts.
create-segment
Create a new email template in Resend. Templates are created in draft status. Use publish-template to make them available for sending. Variables use triple-brace syntax in HTML: {{{VAR_NAME}}}. **Workflow:** create-template → get-tiptap-json-content (with include_schema: true) → compose-template → publish-template. **Content options after creating:** - **compose-template** (recommended): Sets TipTap content that the user can visually edit in the Resend dashboard. Use this when the user wants to collaborate on or refine the template in the editor. - **update-template with html/text**: Sets static HTML/text content. Use this only when the user explicitly wants to set raw HTML. Switching between compose and html/text modes is lossy — some content or formatting may be lost. Ask the user before switching.
create-template
Create a new topic in Resend. Topics allow contacts to manage their subscription preferences for different types of emails.
create-topic
Create a new webhook in Resend. A webhook allows you to receive notifications at a specified URL when certain events occur (e.g. email.sent, email.delivered, email.bounced).
create-webhook
Remove agent presence from the Resend dashboard editor. Call this when done editing.
disconnect-from-editor
Duplicate an existing automation by ID or Resend dashboard URL. Creates a copy with its own ID, including the steps and connections of the original. Use this when the user wants a new automation based on one they already have, instead of rebuilding the workflow from scratch. Use update-automation on the new ID to rename it or change its workflow.
duplicate-automation
**Purpose:** Duplicate a broadcast by ID or Resend dashboard URL. Creates a new draft broadcast with the same segment, topic, sender, subject, reply-to, preview text, and content as the source, named after the source with " (copy)" appended (truncated to 70 characters). Any broadcast can be duplicated, including sent ones. **NOT for:** Editing the source broadcast (use update-broadcast) or sending the copy (use send-broadcast on the new draft's ID). **When to use:** User wants to "copy", "clone", "duplicate", or "reuse" an existing broadcast as the starting point for a new one.
duplicate-broadcast
Duplicate an existing email template in Resend. Creates a new draft copy of the template with a new ID. Accepts a template ID, alias, or Resend dashboard URL.
duplicate-template
Retrieve account-level email delivery and engagement metrics (sent, delivered, bounced, opened, clicked, etc.) for a date range, optionally broken down by period, domain, email, or broadcast.
get-email-metrics
**Beta.** Only accounts in the Inboxes beta can use this tool. **Purpose:** Forward one message from a Resend inbox thread to someone else. This sends a real email the moment you call it, from the inbox's address to the recipients named in "to". **NOT for:** Answering the sender (use reply-to-inbox-thread-email, which goes to the thread's existing participants). Not for composing an unrelated email (use send-email). **Returns:** The forward's email ID — its place in the thread — and its sent email ID, the outgoing email itself, plus who it went to. **When to use:** User asks to forward a message in an inbox thread, pass it along, or loop someone in on it. Before using this tool, you MUST double-check with the user that they want to forward this message. Reference the RECIPIENTS and the SUBJECT when double-checking, and warn the user that forwarding cannot be undone — a sent email cannot be recalled, and everyone in "to" keeps the original message. You may only use this tool if the user explicitly confirms they want to forward the message after you double-check. "to" is the only body field required: html and text are an optional note of your own, because the original message is carried either way. Get the emailId from get-inbox-thread.
forward-inbox-thread-email
**Purpose:** Get details of a specific automation (with its workflow) or list all automations. **Modes:** - With `id`: Returns full automation details including the workflow definition. - Without `id`: Lists all automations with optional status filter and pagination. **When to use:** - User asks "show me my automations" or "what automations do I have?" - User wants to inspect a specific automation's workflow - Before update-automation, to see the current workflow
get-automation
**Purpose:** List runs for an automation, or get details of a specific run. **Modes:** - With `runId`: Returns detailed run info with step-by-step execution status, outputs, and errors. - Without `runId`: Lists runs for the automation with optional status filter. **When to use:** - User wants to see if an automation is working - User wants to debug a failed automation run - User asks "why did this automation fail?" or "show me recent runs" **Run statuses:** running, completed, failed, cancelled **Step statuses:** pending, running, completed, failed, skipped, waiting
get-automation-runs
Retrieve full details of a specific broadcast by ID or Resend dashboard URL (e.g. https://resend.com/broadcasts/<id>), including HTML and plain text content.
get-broadcast
Get a contact by ID or email from Resend.
get-contact
Get the status and counts of a contact import by ID. Use after create-contact-import to track progress (queued, in_progress, completed, failed).
get-contact-import
Get a contact property by ID from Resend.
get-contact-property
Get a domain by ID from Resend. Returns full domain details including DNS records needed for verification.
get-domain
Retrieve the latest claim for a domain by its placeholder Domain ID (the domain_id from create-domain-claim). Returns claim status and the TXT record needed to prove ownership. Poll until status is "completed".
get-domain-claim
Retrieve full details of a specific sent transactional email by ID, including message_id, HTML and plain text content.
get-email
**Beta.** Only accounts in the Inboxes beta can use this tool. Get an inbox by ID from Resend, including its forwarding address, how many threads are unread, how many drafts it holds, and when it last received mail. Use list-inboxes to find the ID.
get-inbox
**Beta.** Only accounts in the Inboxes beta can use this tool. Get a draft by ID from a Resend inbox, body included — its recipients, subject, html and text, and the thread and message it replies to if it is a reply. A draft is one message being composed, so its body is returned here, unlike get-inbox-thread, which lists a whole conversation without the bodies. Use this to read a draft back before send-inbox-draft puts it in the mail. Get the draft ID from list-inbox-drafts.
get-inbox-draft
**Beta.** Only accounts in the Inboxes beta can use this tool. **Purpose:** Get one thread in a Resend inbox: the thread itself plus the metadata of every message in it. **NOT for:** Reading a message's body. This tool returns no html or text — a whole conversation's bodies would flood the response. Use get-inbox-thread-email for one message's body. **Returns:** The thread's id, subject, folder, labels and read state, then for each message its email ID, direction (inbound or outbound), from, to, subject, received_at, read state, and how many attachments it carries. **When to use:** User wants to see a conversation, or you need a message's email ID. A message's ID IS the email ID that get-inbox-thread-email, reply-to-inbox-thread-email, and forward-inbox-thread-email take as their "emailId". Get the thread ID from list-inbox-threads.
get-inbox-thread
**Beta.** Only accounts in the Inboxes beta can use this tool. **Purpose:** Read one message in a Resend inbox thread, body included — its html and text, its full headers, and the attachments it carries. **NOT for:** Reading a whole conversation at once (use get-inbox-thread, which lists a thread's messages without their bodies). Not for emails sent with send-email (use get-email), and not for mail at the account's Resend receiving address (use get-received-email). **Returns:** The message's email ID, direction (inbound or outbound), from, to, cc, bcc, reply_to, subject, message_id, read state, received_at, one line per attachment (filename, size and attachment ID), and the html and text bodies it has. **When to use:** get-inbox-thread points here for a body. Take the "Email ID" it printed for the message the user wants and pass it as emailId. Attachment contents cannot be downloaded through this server — attachments are listed, not fetched.
get-inbox-thread-email
**Purpose:** Get detailed information about a specific API request log, including the full request and response bodies. **Returns:** Log details: id, created_at, endpoint, method, response_status, user_agent, request_body, response_body. **When to use:** - User wants to inspect a specific API request - Debugging a particular API call - User says "show me that log", "what was in that request?"
get-log
Check for additional tools whenever your task might benefit from specialized capabilities - even if existing tools could work as a fallback.
get_more_tools
Retrieve full details of a specific received email by ID, including HTML and plain text content, headers, and raw email download URL.
get-received-email
Retrieve details of a specific attachment from a received email, including a time-limited download URL.
get-received-email-attachment
Get a segment by ID from Resend.
get-segment
Retrieve details of a specific attachment from a sent email, including a time-limited download URL.
get-sent-email-attachment
Get a suppression list entry by ID or email address from Resend. Use this to check whether a specific address is suppressed and why (origin: bounce, complaint, or manual).
get-suppression
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Resend alternatives on ChatGPT?
As of 2026-09-29, Resend competes with ActiveCampaign, Aivie, AWeber, beehiiv, Bizgo, Brevo, Conversion, Customer.io, Flodesk, Intuit Mailchimp, Kanal, Klaviyo, Knock, L Message(エルメ), Life Analytics Mail, Loops, magnews, MailerLite, Mailrith, MailSenpai, Nitrosend - AI Native Email, Notifly, Omnisend, OneSignal, SAMWAD, Sendly, Sent, Spoki, subscline, Systeme.io, Textmagic, TrueDialog, VerticalResponse, Yournotify in ChatGPT Email & SMS Lifecycle Marketing Automation, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.