# Create API key Source: https://resend.com/docs/api-reference/api-keys/create-api-key POST /api-keys Add a new API key to authenticate communications with Resend. ## Body Parameters The API key name. The API key can have full access to Resend's API or be only restricted to send emails. \* `full_access`: Can create, delete, get, and update any resource. \* `sending_access`: Can only send emails. Restrict an API key to send emails only from a specific domain. This is only used when the `permission` is set to `sending_access`. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); resend.apiKeys.create({ name: 'Production' }); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->apiKeys->create([ 'name' => 'Production' ]); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" params: resend.ApiKeys.CreateParams = { "name": "Production", } resend.ApiKeys.create(params) ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" params = { name: "Production" } Resend::ApiKeys.create(params) ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") params := &resend.CreateApiKeyRequest{ Name: "Production", } apiKey, _ := client.ApiKeys.Create(params) ``` ```rust Rust use resend_rs::{types::CreateApiKeyOptions, Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let _api_key = resend .api_keys .create(CreateApiKeyOptions::new("Production")) .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); CreateApiKeyOptions params = CreateApiKeyOptions .builder() .name("Production").build(); CreateApiKeyResponse apiKey = resend.apiKeys().create(params); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI var resp = await resend.ApiKeyCreateAsync( "Production" ); Console.WriteLine( "Token={0}", resp.Content.Token ); ``` ```bash cURL curl -X POST 'https://api.resend.com/api-keys' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' \ -d $'{ "name": "Production" }' ``` ```json Response { "id": "dacf4072-4119-4d88-932f-6202748ac7c8", "token": "re_c1tpEyD8_NKFusih9vKVQknRAQfmFcWCv" } ``` # Delete API key Source: https://resend.com/docs/api-reference/api-keys/delete-api-key DELETE /api-keys/:api_key_id Remove an existing API key. ## Path Parameters The API key ID. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); resend.apiKeys.remove('b6d24b8e-af0b-4c3c-be0c-359bbd97381e'); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->apiKeys->remove('b6d24b8e-af0b-4c3c-be0c-359bbd97381e'); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" resend.ApiKeys.remove(api_key_id="b6d24b8e-af0b-4c3c-be0c-359bbd97381e") ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" Resend::ApiKeys.remove "b6d24b8e-af0b-4c3c-be0c-359bbd97381e" ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") client.ApiKeys.Remove("b6d24b8e-af0b-4c3c-be0c-359bbd97381e") ``` ```rust Rust use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); resend .api_keys .delete("b6d24b8e-af0b-4c3c-be0c-359bbd97381e") .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); resend.apiKeys().remove("b6d24b8e-af0b-4c3c-be0c-359bbd97381e"); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI await resend.ApiKeyDeleteAsync( new Guid( "b6d24b8e-af0b-4c3c-be0c-359bbd97381e" ) ); ``` ```bash cURL curl -X DELETE 'https://api.resend.com/api-keys/b6d24b8e-af0b-4c3c-be0c-359bbd97381e' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' ``` ```text Response HTTP 200 OK ``` # List API keys Source: https://resend.com/docs/api-reference/api-keys/list-api-keys GET /api-keys Retrieve a list of API keys for the authenticated user. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); resend.apiKeys.list(); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->apiKeys->list(); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" resend.ApiKeys.list() ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" Resend::ApiKeys.list ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") keys, err := client.ApiKeys.List() ``` ```rust Rust use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let _api_keys = resend.api_keys.list().await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); resend.apiKeys().list(); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI var resp = await resend.ApiKeyListAsync(); Console.WriteLine( "Nr keys={0}", resp.Content.Count ); ``` ```bash cURL curl -X GET 'https://api.resend.com/api-keys' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' ``` ```json Response { "data": [ { "id": "91f3200a-df72-4654-b0cd-f202395f5354", "name": "Production", "created_at": "2023-04-08T00:11:13.110779+00:00" } ] } ``` # Create Audience Source: https://resend.com/docs/api-reference/audiences/create-audience POST /audiences Create a list of contacts. ## Body Parameters The name of the audience you want to create. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); resend.audiences.create({ name: 'Registered Users' }); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->audiences->create([ 'name' => 'Registered Users' ]); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" params: resend.Audiences.CreateParams = { "name": "Registered Users" } resend.Audiences.create(params) ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" Resend::Audiences.create({ name: "Registered Users" }) ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") params := &resend.CreateAudienceRequest{ Name: "Registered Users", } audience, err := client.Audiences.Create(params) ``` ```rust Rust use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let _audience = resend.audiences.create("Registered Users").await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); CreateAudienceOptions params = CreateAudienceOptions .builder() .name("Registered Users").build(); CreateAudienceResponseSuccess data = resend.audiences().create(params); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI var resp = await resend.AudienceAddAsync( "Registered Users" ); Console.WriteLine( "AudienceId={0}", resp.Content ); ``` ```bash cURL curl -X POST 'https://api.resend.com/audiences' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' \ -d $'{ "name": "Registered Users" }' ``` ```json Response { "object": "audience", "id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", "name": "Registered Users" } ``` # Delete Audience Source: https://resend.com/docs/api-reference/audiences/delete-audience DELETE /audiences/:audience_id Remove an existing audience. ## Path Parameters The Audience ID. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); resend.audiences.remove('78261eea-8f8b-4381-83c6-79fa7120f1cf'); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->audiences->remove('78261eea-8f8b-4381-83c6-79fa7120f1cf'); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" resend.Audiences.remove("78261eea-8f8b-4381-83c6-79fa7120f1cf") ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" Resend::Audiences.remove("78261eea-8f8b-4381-83c6-79fa7120f1cf") ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") removed, err := client.Audiences.Remove("78261eea-8f8b-4381-83c6-79fa7120f1cf") ``` ```rust Rust use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let _deleted = resend .audiences .delete("78261eea-8f8b-4381-83c6-79fa7120f1cf") .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); RemoveAudienceResponseSuccess data = resend.audiences().remove("78261eea-8f8b-4381-83c6-79fa7120f1cf"); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI await resend.AudienceDeleteAsync( new Guid( "78261eea-8f8b-4381-83c6-79fa7120f1cf" ) ); ``` ```bash cURL curl -X DELETE 'https://api.resend.com/audiences/78261eea-8f8b-4381-83c6-79fa7120f1cf' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' ``` ```json Response { "object": "audience", "id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", "deleted": true } ``` # Retrieve Audience Source: https://resend.com/docs/api-reference/audiences/get-audience GET /audiences/:audience_id Retrieve a single audience. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); resend.audiences.get('78261eea-8f8b-4381-83c6-79fa7120f1cf'); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->audiences->get('78261eea-8f8b-4381-83c6-79fa7120f1cf'); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" resend.Audiences.get("78261eea-8f8b-4381-83c6-79fa7120f1cf") ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" Resend::Audiences.get("78261eea-8f8b-4381-83c6-79fa7120f1cf") ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") audience, err := client.Audiences.Get("78261eea-8f8b-4381-83c6-79fa7120f1cf") ``` ```rust Rust use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let _audience = resend .audiences .get("78261eea-8f8b-4381-83c6-79fa7120f1cf") .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); GetAudienceResponseSuccess data = resend.audiences().get("78261eea-8f8b-4381-83c6-79fa7120f1cf"); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI var resp = await resend.AudienceRetrieveAsync( new Guid( "78261eea-8f8b-4381-83c6-79fa7120f1cf" ) ); Console.WriteLine( "Name={0}", resp.Content.Name ); ``` ```bash cURL curl -X GET 'https://api.resend.com/audiences/78261eea-8f8b-4381-83c6-79fa7120f1cf' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' ``` ```json Response { "object": "audience", "id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", "name": "Registered Users", "created_at": "2023-10-06T22:59:55.977Z" } ``` # List Audiences Source: https://resend.com/docs/api-reference/audiences/list-audiences GET /audiences Retrieve a list of audiences. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); resend.audiences.list(); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->audiences->list(); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" resend.Audiences.list() ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" Resend::Audiences.list ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") audiences, err := client.Audiences.List() ``` ```rust Rust use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let _audiences = resend .audiences .list() .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); ListAudiencesResponseSuccess data = resend.audiences().list(); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI var resp = await resend.AudienceListAsync(); Console.WriteLine( "Nr Audience={0}", resp.Content.Count ); ``` ```bash cURL curl -X GET 'https://api.resend.com/audiences' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' ``` ```json Response { "object": "list", "data": [ { "id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", "name": "Registered Users", "created_at": "2023-10-06T22:59:55.977Z" } ] } ``` # Create Broadcast Source: https://resend.com/docs/api-reference/broadcasts/create-broadcast POST /broadcasts Create a new broadcast to send to your audience. ## Body Parameters The ID of the audience you want to send to. Sender email address. To include a friendly name, use the format `"Your Name "`. Email subject. Reply-to email address. For multiple addresses, send as an array of strings. The HTML version of the message. The plain text version of the message. The React component used to write the message. *Only available in the Node.js SDK.* The friendly name of the broadcast. Only used for internal reference. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); await resend.broadcasts.create({ audienceId: '78261eea-8f8b-4381-83c6-79fa7120f1cf', from: 'Acme ', subject: 'hello world', html: 'Hi {{{FIRST_NAME|there}}}, you can unsubscribe here: {{{RESEND_UNSUBSCRIBE_URL}}}', }); ``` ```rust Rust use resend_rs::{types::CreateBroadcastOptions, Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let audience_id = "78261eea-8f8b-4381-83c6-79fa7120f1cf"; let from = "Acme "; let subject = "hello world"; let html = "Hi {{{FIRST_NAME|there}}}, you can unsubscribe here: {{{RESEND_UNSUBSCRIBE_URL}}}"; let opts = CreateBroadcastOptions::new(audience_id, from, subject).with_html(html); let _broadcast = resend.broadcasts.create(opts).await?; Ok(()) } ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->broadcasts->create([ 'audience_id' => '78261eea-8f8b-4381-83c6-79fa7120f1cf', 'from' => 'Acme ', 'subject' => 'hello world', 'html' => 'Hi {{{FIRST_NAME|there}}}, you can unsubscribe here: {{{RESEND_UNSUBSCRIBE_URL}}}', ]); ``` ```java Java Resend resend = new Resend("re_xxxxxxxxx"); CreateBroadcastOptions params = CreateBroadcastOptions.builder() .audienceId("78261eea-8f8b-4381-83c6-79fa7120f1cf") .from("Acme ") .subject("hello world") .html("Hi {{{FIRST_NAME|there}}}, you can unsubscribe here: {{{RESEND_UNSUBSCRIBE_URL}}}") .build(); CreateBroadcastResponseSuccess data = resend.broadcasts().create(params); ``` ```py Python import resend resend.api_key = "re_xxxxxxxxx" params: resend.Broadcasts.CreateParams = { "audience_id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", "from": "Acme ", "subject": "Hello, world!", "html": "Hi {{{FIRST_NAME|there}}}, you can unsubscribe here: {{{RESEND_UNSUBSCRIBE_URL}}}", } resend.Broadcasts.create(params) ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" params = { "audience_id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", "from": "Acme ", "subject": "hello world", "html": "Hi {{{FIRST_NAME|there}}}, you can unsubscribe here: {{{RESEND_UNSUBSCRIBE_URL}}}", } Resend::Broadcasts.create(params) ``` ```go Go import "fmt" import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") params := &resend.CreateBroadcastRequest{ AudienceId: "78261eea-8f8b-4381-83c6-79fa7120f1cf", From: "Acme ", Html: "Hi {{{FIRST_NAME|there}}}, you can unsubscribe here: {{{RESEND_UNSUBSCRIBE_URL}}}", Subject: "Hello, world!", } broadcast, _ := client.Broadcasts.Create(params) ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI var resp = await resend.BroadcastAddAsync( new BroadcastData() { DisplayName = "Example Broadcast", AudienceId = new Guid( "78261eea-8f8b-4381-83c6-79fa7120f1cf" ), From = "Acme ", Subject = "Hello, world!", HtmlBody = "Hi {{{FIRST_NAME|there}}}, you can unsubscribe here: {{{RESEND_UNSUBSCRIBE_URL}}}", } ); Console.WriteLine( "Broadcast Id={0}", resp.Content ); ``` ```bash cURL curl -X POST 'https://api.resend.com/broadcasts' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' \ -d $'{ "audience_id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", "from": "Acme ", "subject": "hello world", "html": "Hi {{{FIRST_NAME|there}}}, you can unsubscribe here: {{{RESEND_UNSUBSCRIBE_URL}}}" }' ``` ```json Response { "id": "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794" } ``` # Delete Broadcast Source: https://resend.com/docs/api-reference/broadcasts/delete-broadcast DELETE /broadcasts/:broadcast_id Remove an existing broadcast. You can only delete broadcasts that are in the `draft` status. In addition, if you delete a broadcast that has already been scheduled to be sent, we will automatically cancel the scheduled delivery and it won't be sent. ## Path Parameters The broadcast ID. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); await resend.broadcasts.remove('559ac32e-9ef5-46fb-82a1-b76b840c0f7b'); ``` ```rust Rust use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let _deleted = resend .broadcasts .delete("559ac32e-9ef5-46fb-82a1-b76b840c0f7b") .await?; Ok(()) } ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->broadcasts->remove('559ac32e-9ef5-46fb-82a1-b76b840c0f7b'); ``` ```java Java Resend resend = new Resend("re_xxxxxxxxx"); RemoveBroadcastResponseSuccess data = resend.broadcasts().remove("559ac32e-9ef5-46fb-82a1-b76b840c0f7b"); ``` ```py Python import resend resend.api_key = "re_xxxxxxxxx" resend.Broadcasts.remove(id="559ac32e-9ef5-46fb-82a1-b76b840c0f7b") ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" Resend::Broadcasts.remove("559ac32e-9ef5-46fb-82a1-b76b840c0f7b") ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") removed, _ := client.Broadcasts.Remove("559ac32e-9ef5-46fb-82a1-b76b840c0f7b") ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI await resend.BroadcastDeleteAsync( new Guid( "559ac32e-9ef5-46fb-82a1-b76b840c0f7b" ) ); ``` ```bash cURL curl -X DELETE 'https://api.resend.com/broadcasts/559ac32e-9ef5-46fb-82a1-b76b840c0f7b' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' ``` ```json Response { "object": "broadcast", "id": "559ac32e-9ef5-46fb-82a1-b76b840c0f7b", "deleted": true } ``` # Retrieve Broadcast Source: https://resend.com/docs/api-reference/broadcasts/get-broadcast GET /broadcasts/:broadcast_id Retrieve a single broadcast. You can retrieve broadcasts created via both this API and the Resend dashboard. Note that currently the API does not return the `html` and `text` fields for broadcasts. ## Path Parameters The broadcast ID. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); await resend.broadcasts.get('559ac32e-9ef5-46fb-82a1-b76b840c0f7b'); ``` ```rust Rust use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let _broadcast = resend .broadcasts .get("559ac32e-9ef5-46fb-82a1-b76b840c0f7b") .await?; Ok(()) } ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->broadcasts->get('559ac32e-9ef5-46fb-82a1-b76b840c0f7b'); ``` ```java Java Resend resend = new Resend("re_xxxxxxxxx"); GetBroadcastResponseSuccess data = resend.broadcasts().get("559ac32e-9ef5-46fb-82a1-b76b840c0f7b"); ``` ```py Python import resend resend.api_key = "re_xxxxxxxxx" resend.Broadcasts.get(id="559ac32e-9ef5-46fb-82a1-b76b840c0f7b") ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" Resend::Broadcasts.get("559ac32e-9ef5-46fb-82a1-b76b840c0f7b") ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") broadcast, _ := client.Broadcasts.Get("559ac32e-9ef5-46fb-82a1-b76b840c0f7b") ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI var resp = await resend.BroadcastRetrieveAsync( new Guid( "559ac32e-9ef5-46fb-82a1-b76b840c0f7b" ) ); Console.WriteLine( "Broadcast name={0}", resp.Content.DisplayName ); ``` ```bash cURL curl -X GET 'https://api.resend.com/broadcasts/559ac32e-9ef5-46fb-82a1-b76b840c0f7b' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' ``` ```json Response { "object": "broadcast", "id": "559ac32e-9ef5-46fb-82a1-b76b840c0f7b", "name": "Announcements", "audience_id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", "from": "Acme ", "subject": "hello world", "reply_to": null, "preview_text": "Check out our latest announcements", "status": "draft", "created_at": "2024-12-01T19:32:22.980Z", "scheduled_at": null, "sent_at": null } ``` # List Broadcasts Source: https://resend.com/docs/api-reference/broadcasts/list-broadcasts GET /broadcasts Retrieve a list of broadcast. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); await resend.broadcasts.list(); ``` ```rust Rust use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let _broadcasts = resend.broadcasts.list().await?; Ok(()) } ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->broadcasts->list(); ``` ```java Java Resend resend = new Resend("re_xxxxxxxxx"); ListBroadcastsResponseSuccess data = resend.broadcasts().list(); ``` ```py Python import resend resend.api_key = "re_xxxxxxxxx" resend.Broadcasts.list() ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" Resend::Broadcasts.list() ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") broadcasts, _ := client.Broadcasts.List() ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI var resp = await resend.BroadcastListAsync(); Console.WriteLine( "Nr Broadcasts={0}", resp.Content.Count ); ``` ```bash cURL curl -X GET 'https://api.resend.com/broadcasts' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' ``` ```json Response { "object": "list", "data": [ { "id": "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794", "audience_id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", "status": "draft", "created_at": "2024-11-01T15:13:31.723Z", "scheduled_at": null, "sent_at": null }, { "id": "559ac32e-9ef5-46fb-82a1-b76b840c0f7b", "audience_id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", "status": "sent", "created_at": "2024-12-01T19:32:22.980Z", "scheduled_at": "2024-12-02T19:32:22.980Z", "sent_at": "2024-12-02T19:32:22.980Z" } ] } ``` # Send Broadcast Source: https://resend.com/docs/api-reference/broadcasts/send-broadcast POST /broadcasts/:broadcast_id/send Start sending broadcasts to your audience through the Resend API. You can send broadcasts only if they were created via the API. ## Path Parameters The broadcast ID. ## Body Parameters Schedule email to be sent later. The date should be in natural language (e.g.: `in 1 min`) or ISO 8601 format (e.g: `2024-08-05T11:52:01.858Z`). ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); await resend.broadcasts.send('559ac32e-9ef5-46fb-82a1-b76b840c0f7b', { scheduledAt: 'in 1 min', }); ``` ```rust Rust use resend_rs::{types::SendBroadcastOptions, Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let opts = SendBroadcastOptions::new("559ac32e-9ef5-46fb-82a1-b76b840c0f7b").with_scheduled_at("in 1 min"); let _broadcast = resend.broadcasts.send(opts).await?; Ok(()) } ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->broadcasts->send('559ac32e-9ef5-46fb-82a1-b76b840c0f7b', [ 'scheduled_at' => 'in 1 min', ]); ``` ```java Java Resend resend = new Resend("re_xxxxxxxxx"); SendBroadcastOptions params = SendBroadcastOptions.builder() .scheduledAt("in 1 min") .build(); SendBroadcastResponseSuccess data = resend.broadcasts().send(params, "498ee8e4-7aa2-4eb5-9f04-4194848049d1"); ``` ```py Python import resend resend.api_key = "re_xxxxxxxxx" params: resend.Broadcasts.SendParams = { "broadcast_id": "559ac32e-9ef5-46fb-82a1-b76b840c0f7b", "scheduled_at": "in 1 min" } resend.Broadcasts.send(params) ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" params = { broadcast_id: "559ac32e-9ef5-46fb-82a1-b76b840c0f7b", scheduled_at: "in 1 min" } Resend::Broadcasts.send(params) ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") sendParams := &resend.SendBroadcastRequest{ BroadcastId: "559ac32e-9ef5-46fb-82a1-b76b840c0f7b", ScheduledAt: "in 1 min", } sent, _ := client.Broadcasts.Send(sendParams) ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI // Send now await resend.BroadcastSendAsync( new Guid( "559ac32e-9ef5-46fb-82a1-b76b840c0f7b" ) ); // Send in 5 mins await resend.BroadcastScheduleAsync( new Guid( "559ac32e-9ef5-46fb-82a1-b76b840c0f7b" ), DateTime.UtcNow.AddMinutes( 5 ) ); ``` ```bash cURL curl -X POST 'https://api.resend.com/broadcasts/559ac32e-9ef5-46fb-82a1-b76b840c0f7b/send' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' \ -d $'{ "scheduled_at": "in 1 min" }' ``` ```json Response { "id": "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794" } ``` # Update Broadcast Source: https://resend.com/docs/api-reference/broadcasts/update-broadcast PATCH /broadcasts/:id Update a broadcast to send to your audience. You can update broadcasts only if they were created via the API. ## Path Parameters The ID of the broadcast you want to update. ## Body Parameters The ID of the audience you want to send to. Sender email address. To include a friendly name, use the format `"Your Name "`. Email subject. Reply-to email address. For multiple addresses, send as an array of strings. The HTML version of the message. The plain text version of the message. The React component used to write the message. *Only available in the Node.js SDK.* The friendly name of the broadcast. Only used for internal reference. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); await resend.broadcasts.update({ id: '49a3999c-0ce1-4ea6-ab68-afcd6dc2e794', html: 'Hi {{{FIRST_NAME|there}}}, you can unsubscribe here: {{{RESEND_UNSUBSCRIBE_URL}}}', }); ``` ```rust Rust use resend_rs::{types::UpdateBroadcastOptions, Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let id = "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794"; let html = "Hi {{{FIRST_NAME|there}}}, you can unsubscribe here: {{{RESEND_UNSUBSCRIBE_URL}}}"; let opts = UpdateBroadcastOptions::new().with_html(html); let _broadcast = resend.broadcasts.update(id, opts).await?; Ok(()) } ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->broadcasts->update('49a3999c-0ce1-4ea6-ab68-afcd6dc2e794', [ 'html' => 'Hi {{{FIRST_NAME|there}}}, you can unsubscribe here: {{{RESEND_UNSUBSCRIBE_URL}}}', ]); ``` ```java Java Resend resend = new Resend("re_xxxxxxxxx"); UpdateBroadcastOptions params = UpdateBroadcastOptions.builder() .id("49a3999c-0ce1-4ea6-ab68-afcd6dc2e794") .html("Hi {{{FIRST_NAME|there}}}, you can unsubscribe here: {{{RESEND_UNSUBSCRIBE_URL}}}") .build(); UpdateBroadcastResponseSuccess data = resend.broadcasts().update(params); ``` ```py Python import resend resend.api_key = "re_xxxxxxxxx" params: resend.Broadcasts.UpdateParams = { "id": "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794", "html": "Hi {{{FIRST_NAME|there}}}, you can unsubscribe here: {{{RESEND_UNSUBSCRIBE_URL}}}" } resend.Broadcasts.update(params) ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" params = { "id": "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794", "html": "Hi #{FIRST_NAME}, you can unsubscribe here: #{RESEND_UNSUBSCRIBE_URL}", } Resend::Broadcasts.update(params) ``` ```go Go import "fmt" import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") params := &resend.UpdateBroadcastRequest{ Id: "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794", Html: fmt.Sprintf("Hi %s, you can unsubscribe here: %s", FIRST_NAME, RESEND_UNSUBSCRIBE_URL), } broadcast, _ := client.Broadcasts.Update(params) ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI var resp = await resend.BroadcastUpdateAsync( new Guid( "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794" ), new BroadcastUpdateData() { HtmlBody = "Hi {{{FIRST_NAME|there}}}, you can unsubscribe here: {{{RESEND_UNSUBSCRIBE_URL}}}", } ); ``` ```bash cURL curl -X PATCH 'https://api.resend.com/broadcasts/49a3999c-0ce1-4ea6-ab68-afcd6dc2e794' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' \ -d $'{ "html": "Hi {{{FIRST_NAME|there}}}, you can unsubscribe here: {{{RESEND_UNSUBSCRIBE_URL}}}" }' ``` ```json Response { "id": "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794" } ``` # Create Contact Source: https://resend.com/docs/api-reference/contacts/create-contact POST /audiences/:audience_id/contacts Create a contact inside an audience. ## Body Parameters The email address of the contact. The Audience ID. The first name of the contact. The last name of the contact. The subscription status. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); resend.contacts.create({ email: 'steve.wozniak@gmail.com', firstName: 'Steve', lastName: 'Wozniak', unsubscribed: false, audienceId: '78261eea-8f8b-4381-83c6-79fa7120f1cf', }); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->contacts->create( audienceId: '78261eea-8f8b-4381-83c6-79fa7120f1cf', [ 'email' => 'steve.wozniak@gmail.com', 'first_name' => 'Steve', 'last_name' => 'Wozniak', 'unsubscribed' => false ] ); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" params: resend.Contacts.CreateParams = { "email": "steve.wozniak@gmail.com", "first_name": "Steve", "last_name": "Wozniak", "unsubscribed": False, "audience_id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", } resend.Contacts.create(params) ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" params = { "email": "steve.wozniak@gmail.com", "first_name": "Steve", "last_name": "Wozniak", "unsubscribed": false, "audience_id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", } Resend::Contacts.create(params) ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") params := &resend.CreateContactRequest{ Email: "steve.wozniak@gmail.com", FirstName: "Steve", LastName: "Wozniak", Unsubscribed: false, AudienceId: "78261eea-8f8b-4381-83c6-79fa7120f1cf", } contact, err := client.Contacts.Create(params) ``` ```rust Rust use resend_rs::{types::ContactData, Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let contact = ContactData::new("steve.wozniak@gmail.com") .with_first_name("Steve") .with_last_name("Wozniak") .with_unsubscribed(false); let _contact = resend .contacts .create("78261eea-8f8b-4381-83c6-79fa7120f1cf", contact) .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); CreateContactOptions params = CreateContactOptions.builder() .email("steve.wozniak@gmail.com") .firstName("Steve") .lastName("Wozniak") .unsubscribed(false) .audienceId("78261eea-8f8b-4381-83c6-79fa7120f1cf") .build(); CreateContactResponseSuccess data = resend.contacts().create(params); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI var resp = await resend.ContactAddAsync( new Guid( "78261eea-8f8b-4381-83c6-79fa7120f1cf" ), new ContactData() { Email = "steve.wozniak@gmail.com", FirstName = "Steve", LastName = "Wozniak", IsUnsubscribed = false, } ); Console.WriteLine( "Contact Id={0}", resp.Content ); ``` ```bash cURL curl -X POST 'https://api.resend.com/audiences/78261eea-8f8b-4381-83c6-79fa7120f1cf/contacts' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' \ -d $'{ "email": "steve.wozniak@gmail.com", "first_name": "Steve", "last_name": "Wozniak", "unsubscribed": false }' ``` ```json Response { "object": "contact", "id": "479e3145-dd38-476b-932c-529ceb705947" } ``` # Delete Contact Source: https://resend.com/docs/api-reference/contacts/delete-contact DELETE /audiences/:audience_id/contacts/:id Remove an existing contact from an audience. ## Path Parameters The Audience ID. Either `id` or `email` must be provided. The Contact ID. The Contact email. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); // Delete by contact id resend.contacts.remove({ id: '520784e2-887d-4c25-b53c-4ad46ad38100', audienceId: '78261eea-8f8b-4381-83c6-79fa7120f1cf', }); // Delete by contact email resend.contacts.remove({ email: 'acme@example.com', audienceId: '78261eea-8f8b-4381-83c6-79fa7120f1cf', }); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); // Delete by contact id $resend->contacts->remove( audienceId: '78261eea-8f8b-4381-83c6-79fa7120f1cf', id: '520784e2-887d-4c25-b53c-4ad46ad38100' ); // Delete by contact email $resend->contacts->remove( '78261eea-8f8b-4381-83c6-79fa7120f1cf', 'acme@example.com' ); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" # Delete by contact id resend.Contacts.remove( id="520784e2-887d-4c25-b53c-4ad46ad38100", audience_id="78261eea-8f8b-4381-83c6-79fa7120f1cf" ) # Delete by contact email resend.Contacts.remove( email="acme@example.com", audience_id="78261eea-8f8b-4381-83c6-79fa7120f1cf" ) ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" # Delete by contact id Resend::Contacts.remove( "78261eea-8f8b-4381-83c6-79fa7120f1cf", "520784e2-887d-4c25-b53c-4ad46ad38100" ) # Delete by contact email Resend::Contacts.remove( "78261eea-8f8b-4381-83c6-79fa7120f1cf", "acme@example.com" ) ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") // Delete by contact id removed, err := client.Contacts.Remove( "78261eea-8f8b-4381-83c6-79fa7120f1cf", "520784e2-887d-4c25-b53c-4ad46ad38100" ) // Delete by contact email removed, err := client.Contacts.Remove( "78261eea-8f8b-4381-83c6-79fa7120f1cf", "acme@example.com" ) ``` ```rust Rust use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); // Delete by contact id let _deleted = resend .contacts .delete_by_contact_id( "78261eea-8f8b-4381-83c6-79fa7120f1cf", "520784e2-887d-4c25-b53c-4ad46ad38100", ) .await?; // Delete by contact email let _deleted = resend .contacts .delete_by_email("78261eea-8f8b-4381-83c6-79fa7120f1cf", "acme@example.com") .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); // Delete by contact id resend.contacts().remove(ContactRequestOptions.builder() .id("520784e2-887d-4c25-b53c-4ad46ad38100") .audienceId("78261eea-8f8b-4381-83c6-79fa7120f1cf") .build()); // Delete by contact email resend.contacts().remove(ContactRequestOptions.builder() .email("acme@example.com") .audienceId("78261eea-8f8b-4381-83c6-79fa7120f1cf") .build()); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI // By Id await resend.ContactDeleteAsync( audienceId: new Guid( "78261eea-8f8b-4381-83c6-79fa7120f1cf" ), contactId: new Guid( "520784e2-887d-4c25-b53c-4ad46ad38100" ) ); // By Email await resend.ContactDeleteByEmailAsync( new Guid( "78261eea-8f8b-4381-83c6-79fa7120f1cf" ), "acme@example.com" ); ``` ```bash cURL # Delete by contact id curl -X DELETE 'https://api.resend.com/audiences/78261eea-8f8b-4381-83c6-79fa7120f1cf/contacts/520784e2-887d-4c25-b53c-4ad46ad38100' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' # Deleted by contact email curl -X DELETE 'https://api.resend.com/audiences/78261eea-8f8b-4381-83c6-79fa7120f1cf/contacts/acme@example.com' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' ``` ```json Response { "object": "contact", "contact": "520784e2-887d-4c25-b53c-4ad46ad38100", "deleted": true } ``` # Retrieve Contact Source: https://resend.com/docs/api-reference/contacts/get-contact GET /audiences/:audience_id/contacts/:id Retrieve a single contact from an audience. ## Path Parameters The Audience ID. Either `id` or `email` must be provided. The Contact ID. The Contact Email. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); // Get by contact id resend.contacts.get({ id: 'e169aa45-1ecf-4183-9955-b1499d5701d3', audienceId: '78261eea-8f8b-4381-83c6-79fa7120f1cf', }); // Get by contact email resend.contacts.get({ email: 'steve.wozniak@gmail.com', audienceId: '78261eea-8f8b-4381-83c6-79fa7120f1cf', }); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); // Get by contact id $resend->contacts->get( audienceId: '78261eea-8f8b-4381-83c6-79fa7120f1cf', id: 'e169aa45-1ecf-4183-9955-b1499d5701d3' ); // Get by contact email $resend->contacts->get( audienceId: '78261eea-8f8b-4381-83c6-79fa7120f1cf', email: 'steve.wozniak@gmail.com' ); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" # Get by contact id resend.Contacts.get( id="e169aa45-1ecf-4183-9955-b1499d5701d3", audience_id="78261eea-8f8b-4381-83c6-79fa7120f1cf" ) # Get by contact email resend.Contacts.get( email="steve.wozniak@gmail.com", audience_id="78261eea-8f8b-4381-83c6-79fa7120f1cf" ) ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" # Get by contact id params = { "id": "e169aa45-1ecf-4183-9955-b1499d5701d3", "audience_id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", } Resend::Contacts.get(params) # Get by contact email params = { "email": "steve.wozniak@gmail.com", "audience_id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", } Resend::Contacts.get(params) ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") // Get by contact id id := "e169aa45-1ecf-4183-9955-b1499d5701d3", contact, err := client.Contacts.Get(audienceId, id) // Get by contact email email := "steve.wozniak@gmail.com", contact, err := client.Contacts.Get(audienceId, email) ``` ```rust Rust use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); // Get by contact id let _contact = resend .contacts .get_by_id( "e169aa45-1ecf-4183-9955-b1499d5701d3", "78261eea-8f8b-4381-83c6-79fa7120f1cf", ) .await?; // Get by contact email let _contact = resend .contacts .get_by_email( "steve.wozniak@gmail.com", "78261eea-8f8b-4381-83c6-79fa7120f1cf", ) .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); // Get by contact id GetContactOptions params = GetContactOptions.builder() .id("e169aa45-1ecf-4183-9955-b1499d5701d3") .audienceId("78261eea-8f8b-4381-83c6-79fa7120f1cf").build(); // Get by contact email GetContactOptions params = GetContactOptions.builder() .email("steve.wozniak@gmail.com") .audienceId("78261eea-8f8b-4381-83c6-79fa7120f1cf").build(); GetContactResponseSuccess data = resend.contacts().get(params); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI // Get by contact id var resp = await resend.ContactRetrieveAsync( audienceId: new Guid( "78261eea-8f8b-4381-83c6-79fa7120f1cf" ), contactId: new Guid( "e169aa45-1ecf-4183-9955-b1499d5701d3" ) ); // Get by contact email var resp = await resend.ContactRetrieveAsync( audienceId: new Guid( "78261eea-8f8b-4381-83c6-79fa7120f1cf" ), email: "steve.wozniak@gmail.com" ); Console.WriteLine( "Contact Email={0}", resp.Content.Email ); ``` ```bash cURL # Get by contact id curl -X GET 'https://api.resend.com/audiences/78261eea-8f8b-4381-83c6-79fa7120f1cf/contacts/e169aa45-1ecf-4183-9955-b1499d5701d3' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' # Get by contact email curl -X GET 'https://api.resend.com/audiences/78261eea-8f8b-4381-83c6-79fa7120f1cf/contacts/steve.wozniak@gmail.com' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' ``` ```json Response { "object": "contact", "id": "e169aa45-1ecf-4183-9955-b1499d5701d3", "email": "steve.wozniak@gmail.com", "first_name": "Steve", "last_name": "Wozniak", "created_at": "2023-10-06T23:47:56.678Z", "unsubscribed": false } ``` # List Contacts Source: https://resend.com/docs/api-reference/contacts/list-contacts GET /audiences/:audience_id/contacts Show all contacts from an audience. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); resend.contacts.list({ audienceId: '78261eea-8f8b-4381-83c6-79fa7120f1cf', }); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->contacts->get( audienceId: '78261eea-8f8b-4381-83c6-79fa7120f1cf' ); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" resend.Contacts.list( audience_id="78261eea-8f8b-4381-83c6-79fa7120f1cf" ) ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" Resend::Contacts.list("78261eea-8f8b-4381-83c6-79fa7120f1cf") ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") contacts, err := client.Contacts.List("78261eea-8f8b-4381-83c6-79fa7120f1cf") ``` ```rust Rust use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let _contacts = resend .contacts .list("78261eea-8f8b-4381-83c6-79fa7120f1cf") .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); ListContactsResponseSuccess data = resend.contacts().list("78261eea-8f8b-4381-83c6-79fa7120f1cf"); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI var resp = await resend.ContactListAsync( new Guid( "78261eea-8f8b-4381-83c6-79fa7120f1cf" ) ); Console.WriteLine( "Nr Contacts={0}", resp.Content.Count ); ``` ```bash cURL curl -X GET 'https://api.resend.com/audiences/78261eea-8f8b-4381-83c6-79fa7120f1cf/contacts' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' ``` ```json Response { "object": "list", "data": [ { "id": "e169aa45-1ecf-4183-9955-b1499d5701d3", "email": "steve.wozniak@gmail.com", "first_name": "Steve", "last_name": "Wozniak", "created_at": "2023-10-06T23:47:56.678Z", "unsubscribed": false } ] } ``` # Update Contact Source: https://resend.com/docs/api-reference/contacts/update-contact PATCH /audiences/:audience_id/contacts/:id Update an existing contact. ## Path Parameters The Audience ID. Either `id` or `email` must be provided. The Contact ID. The Contact Email. ## Body Parameters The first name of the contact. The last name of the contact. The subscription status. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); // Update by contact id resend.contacts.update({ id: 'e169aa45-1ecf-4183-9955-b1499d5701d3', audienceId: '78261eea-8f8b-4381-83c6-79fa7120f1cf', unsubscribed: true, }); // Update by contact email resend.contacts.update({ email: 'acme@example.com', audienceId: '78261eea-8f8b-4381-83c6-79fa7120f1cf', unsubscribed: true, }); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); // Update by contact id $resend->contacts->update( audienceId: '78261eea-8f8b-4381-83c6-79fa7120f1cf', id: 'e169aa45-1ecf-4183-9955-b1499d5701d3', [ 'unsubscribed' => true ] ); // Update by contact email $resend->contacts->update( audienceId: '78261eea-8f8b-4381-83c6-79fa7120f1cf', email: 'acme@example.com', [ 'unsubscribed' => true ] ); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" # Update by contact id params: resend.Contacts.UpdateParams = { "id": "e169aa45-1ecf-4183-9955-b1499d5701d3", "audience_id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", "unsubscribed": True, } resend.Contacts.update(params) # Update by contact email params: resend.Contacts.UpdateParams = { "email": "acme@example.com", "audience_id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", "unsubscribed": True, } resend.Contacts.update(params) ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" # Update by contact id params = { "id": "e169aa45-1ecf-4183-9955-b1499d5701d3", "audience_id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", "unsubscribed": true, } Resend::Contacts.update(params) # Update by contact email params = { "email": "acme@example.com", "audience_id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", "unsubscribed": true, } Resend::Contacts.update(params) ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") // Update by contact id params := &resend.UpdateContactRequest{ Id: "e169aa45-1ecf-4183-9955-b1499d5701d3", AudienceId: "78261eea-8f8b-4381-83c6-79fa7120f1cf", Unsubscribed: true, } contact, err := client.Contacts.Update(params) // Update by contact email params = &resend.UpdateContactRequest{ Email: "acme@example.com", AudienceId: "78261eea-8f8b-4381-83c6-79fa7120f1cf", Unsubscribed: true, } contact, err := client.Contacts.Update(params) ``` ```rust Rust use resend_rs::{types::ContactChanges, Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let changes = ContactChanges::new().with_unsubscribed(true); // Update by contact id let _contact = resend .contacts .update_by_id( "e169aa45-1ecf-4183-9955-b1499d5701d3", "78261eea-8f8b-4381-83c6-79fa7120f1cf", changes.clone(), ) .await?; // Update by contact email let _contact = resend .contacts .update_by_email( "acme@example.com", "78261eea-8f8b-4381-83c6-79fa7120f1cf", changes, ) .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); // Update by contact id UpdateContactOptions params = UpdateContactOptions.builder() .audienceId("78261eea-8f8b-4381-83c6-79fa7120f1cf") .id("e169aa45-1ecf-4183-9955-b1499d5701d3") .unsubscribed(true) .build(); // Update by contact email UpdateContactOptions params = UpdateContactOptions.builder() .audienceId("78261eea-8f8b-4381-83c6-79fa7120f1cf") .email("acme@example.com") .unsubscribed(true) .build(); UpdateContactResponseSuccess data = resend.contacts().update(params); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI // By Id await resend.ContactUpdateAsync( audienceId: new Guid( "78261eea-8f8b-4381-83c6-79fa7120f1cf" ), contactId: new Guid( "e169aa45-1ecf-4183-9955-b1499d5701d3" ), new ContactData() { FirstName = "Stevie", LastName = "Wozniaks", IsUnsubscribed = true, } ); // By Email await resend.ContactUpdateByEmailAsync( new Guid( "78261eea-8f8b-4381-83c6-79fa7120f1cf" ), "acme@example.com", new ContactData() { FirstName = "Stevie", LastName = "Wozniaks", IsUnsubscribed = true, } ); ``` ```bash cURL # Update by contact id curl -X PATCH 'https://api.resend.com/audiences/78261eea-8f8b-4381-83c6-79fa7120f1cf/contacts/520784e2-887d-4c25-b53c-4ad46ad38100' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' \ -d $'{ "unsubscribed": true }' # Update by contact email curl -X PATCH 'https://api.resend.com/audiences/78261eea-8f8b-4381-83c6-79fa7120f1cf/contacts/acme@example.com' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' \ -d $'{ "unsubscribed": true }' ``` ```json Response { "object": "contact", "id": "479e3145-dd38-476b-932c-529ceb705947" } ``` # Create Domain Source: https://resend.com/docs/api-reference/domains/create-domain POST /domains Create a domain through the Resend Email API. ## Body Parameters The name of the domain you want to create. The region where emails will be sent from. Possible values: `us-east-1' | 'eu-west-1' | 'sa-east-1' | 'ap-northeast-1'` ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); resend.domains.create({ name: 'example.com' }); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->domains->create([ 'name' => 'example.com' ]); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" params: resend.Domains.CreateParams = { "name": "example.com", } resend.Domains.create(params) ``` ```ruby Ruby Resend.api_key = ENV["RESEND_API_KEY"] params = { name: "example.com", } domain = Resend::Domains.create(params) puts domain ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") params := &resend.CreateDomainRequest{ Name: "example.com", } domain, err := client.Domains.Create(params) ``` ```rust Rust use resend_rs::{types::CreateDomainOptions, Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let _domain = resend .domains .add(CreateDomainOptions::new("example.com")) .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); CreateDomainOptions params = CreateDomainOptions .builder() .name("example.com").build(); CreateDomainResponse domain = resend.domains().create(params); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI var resp = await resend.DomainAddAsync( "example.com" ); Console.WriteLine( "Domain Id={0}", resp.Content.Id ); ``` ```bash cURL curl -X POST 'https://api.resend.com/domains' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' \ -d $'{ "name": "example.com" }' ``` ```json Response { "id": "4dd369bc-aa82-4ff3-97de-514ae3000ee0", "name": "example.com", "created_at": "2023-03-28T17:12:02.059593+00:00", "status": "not_started", "records": [ { "record": "SPF", "name": "send", "type": "MX", "ttl": "Auto", "status": "not_started", "value": "feedback-smtp.us-east-1.amazonses.com", "priority": 10 }, { "record": "SPF", "name": "send", "value": "\"v=spf1 include:amazonses.com ~all\"", "type": "TXT", "ttl": "Auto", "status": "not_started" }, { "record": "DKIM", "name": "nhapbbryle57yxg3fbjytyodgbt2kyyg._domainkey", "value": "nhapbbryle57yxg3fbjytyodgbt2kyyg.dkim.amazonses.com.", "type": "CNAME", "status": "not_started", "ttl": "Auto" }, { "record": "DKIM", "name": "xbakwbe5fcscrhzshpap6kbxesf6pfgn._domainkey", "value": "xbakwbe5fcscrhzshpap6kbxesf6pfgn.dkim.amazonses.com.", "type": "CNAME", "status": "not_started", "ttl": "Auto" }, { "record": "DKIM", "name": "txrcreso3dqbvcve45tqyosxwaegvhgn._domainkey", "value": "txrcreso3dqbvcve45tqyosxwaegvhgn.dkim.amazonses.com.", "type": "CNAME", "status": "not_started", "ttl": "Auto" } ], "region": "us-east-1" } ``` # Delete Domain Source: https://resend.com/docs/api-reference/domains/delete-domain DELETE /domains/:domain_id Remove an existing domain. ## Path Parameters The Domain ID. ```js Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); resend.domains.remove('d91cd9bd-1176-453e-8fc1-35364d380206'); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->domains->remove('d91cd9bd-1176-453e-8fc1-35364d380206'); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" resend.Domains.remove(domain_id="d91cd9bd-1176-453e-8fc1-35364d380206") ``` ```ruby Ruby Resend.api_key = ENV["RESEND_API_KEY"] Resend::Domains.remove("d91cd9bd-1176-453e-8fc1-35364d380206") ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") removed, err := client.Domains.Remove("d91cd9bd-1176-453e-8fc1-35364d380206") ``` ```rust Rust use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let _deleted = resend .domains .delete("d91cd9bd-1176-453e-8fc1-35364d380206") .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); RemoveDomainResponse removed = resend.domains().remove("d91cd9bd-1176-453e-8fc1-35364d380206"); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI await resend.DomainDeleteAsync( new Guid( "d91cd9bd-1176-453e-8fc1-35364d380206" ) ); ``` ```bash cURL curl -X DELETE 'https://api.resend.com/domains/d91cd9bd-1176-453e-8fc1-35364d380206' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' ``` ```json Response { "object": "domain", "id": "d91cd9bd-1176-453e-8fc1-35364d380206", "deleted": true } ``` # Retrieve Domain Source: https://resend.com/docs/api-reference/domains/get-domain GET /domains/:domain_id Retrieve a single domain for the authenticated user. ## Path Parameters The Domain ID. Possible domain `status` return types include `"not_started"`, `"pending"`, `"verified"`, `"failure"`, and `"temporary_failure"`. You can read more about the statuses [here](https://resend.com/docs/dashboard/domains/introduction#understand-a-domain-status). ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); resend.domains.get('d91cd9bd-1176-453e-8fc1-35364d380206'); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->domains->get('d91cd9bd-1176-453e-8fc1-35364d380206'); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" resend.Domains.get(domain_id="d91cd9bd-1176-453e-8fc1-35364d380206") ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" Resend::Domains.get "d91cd9bd-1176-453e-8fc1-35364d380206" ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") retrievedDomain, err := client.Domains.Get("d91cd9bd-1176-453e-8fc1-35364d380206") ``` ```rust Rust use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let _domain = resend .domains .get("d91cd9bd-1176-453e-8fc1-35364d380206") .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); Domain domain = resend.domains().get("d91cd9bd-1176-453e-8fc1-35364d380206"); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI var resp = await resend.DomainRetrieveAsync( new Guid( "d91cd9bd-1176-453e-8fc1-35364d380206" ) ); Console.WriteLine( "Domain Id={0}", resp.Content.Name ); ``` ```bash cURL curl -X GET 'https://api.resend.com/domains/d91cd9bd-1176-453e-8fc1-35364d380206' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' ``` ```json Response { "object": "domain", "id": "d91cd9bd-1176-453e-8fc1-35364d380206", "name": "example.com", "status": "not_started", "created_at": "2023-04-26T20:21:26.347412+00:00", "region": "us-east-1", "records": [ { "record": "SPF", "name": "send", "type": "MX", "ttl": "Auto", "status": "not_started", "value": "feedback-smtp.us-east-1.amazonses.com", "priority": 10 }, { "record": "SPF", "name": "send", "value": "\"v=spf1 include:amazonses.com ~all\"", "type": "TXT", "ttl": "Auto", "status": "not_started" }, { "record": "DKIM", "name": "resend._domainkey", "value": "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDsc4Lh8xilsngyKEgN2S84+21gn+x6SEXtjWvPiAAmnmggr5FWG42WnqczpzQ/mNblqHz4CDwUum6LtY6SdoOlDmrhvp5khA3cd661W9FlK3yp7+jVACQElS7d9O6jv8VsBbVg4COess3gyLE5RyxqF1vYsrEXqyM8TBz1n5AGkQIDAQA2", "type": "TXT", "status": "not_started", "ttl": "Auto" } ] } ``` # List Domains Source: https://resend.com/docs/api-reference/domains/list-domains GET /domains Retrieve a list of domains for the authenticated user. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); resend.domains.list(); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->domains->list(); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" resend.Domains.list() ``` ```ruby Ruby Resend.api_key = ENV["RESEND_API_KEY"] Resend::Domains.list ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") domains, err := client.Domains.List() ``` ```rust Rust use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let _domains = resend .domains .list() .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); ListDomainsResponse response = resend.domains().list(); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI var resp = await resend.DomainListAsync(); Console.WriteLine( "Nr Domains={0}", resp.Content.Count ); ``` ```bash cURL curl -X GET 'https://api.resend.com/domains' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' ``` ```json Response { "data": [ { "id": "d91cd9bd-1176-453e-8fc1-35364d380206", "name": "example.com", "status": "not_started", "created_at": "2023-04-26T20:21:26.347412+00:00", "region": "us-east-1" } ] } ``` # Update Domain Source: https://resend.com/docs/api-reference/domains/update-domain PATCH /domains/:domain_id Update an existing domain. ## Path Parameters The Domain ID. ## Body Parameters Track clicks within the body of each HTML email. Track the open rate of each email. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); resend.domains.update({ id: 'b8617ad3-b712-41d9-81a0-f7c3d879314e', openTracking: false, clickTracking: true, tls: 'enforced', }); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->domains->update( 'b8617ad3-b712-41d9-81a0-f7c3d879314e', [ 'open_tracking' => false, 'click_tracking' => true, 'tls' => 'enforced', ] ); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" params: resend.Domains.UpdateParams = { "id": "b8617ad3-b712-41d9-81a0-f7c3d879314e", "open_tracking": False, "click_tracking": True, "tls": "enforced", } resend.Domains.update(params) ``` ```ruby Ruby Resend.api_key = "re_xxxxxxxxx" Resend::Domains.update({ id: "b8617ad3-b712-41d9-81a0-f7c3d879314e", open_tracking: false, click_tracking: true, tls: "enforced", }) ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") updateDomainParams := &resend.UpdateDomainRequest{ OpenTracking: false, ClickTracking: true, Tls: resend.Enforced, } updated, err := client.Domains.Update("b8617ad3-b712-41d9-81a0-f7c3d879314e", updateDomainParams) ``` ```rust Rust use resend_rs::{types::{DomainChanges, Tls}, Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let changes = DomainChanges::new() .with_open_tracking(false) .with_click_tracking(true) .with_tls(Tls::Enforced); let _domain = resend .domains .update("b8617ad3-b712-41d9-81a0-f7c3d879314e", changes) .await?; Ok(()) } ``` ```java Java Resend resend = new Resend("re_xxxxxxxxx"); UpdateDomainOptions params = UpdateDomainOptions.builder() .id("b8617ad3-b712-41d9-81a0-f7c3d879314e") .openTracking(false) .clickTracking(true) .tls(Tls.ENFORCED) .build(); resend.domains().update(params); ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI await resend.DomainUpdateAsync( new Guid( "b8617ad3-b712-41d9-81a0-f7c3d879314e" ), new DomainUpdateData() { TrackOpen = false, TrackClicks = true, TlsMode = TlsMode.Enforced, } ); ``` ```bash cURL curl -X PATCH 'https://api.resend.com/domains/b8617ad3-b712-41d9-81a0-f7c3d879314e' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' \ -d $'{ "open_tracking": false, "click_tracking": true, "tls": "enforced" }' ``` ```json Response { "object": "domain", "id": "b8617ad3-b712-41d9-81a0-f7c3d879314e" } ``` # Verify Domain Source: https://resend.com/docs/api-reference/domains/verify-domain POST /domains/:domain_id/verify Verify an existing domain. ## Path Parameters The Domain ID. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); resend.domains.verify('d91cd9bd-1176-453e-8fc1-35364d380206'); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->domains->verify('d91cd9bd-1176-453e-8fc1-35364d380206'); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" resend.Domains.verify(domain_id="d91cd9bd-1176-453e-8fc1-35364d380206") ``` ```ruby Ruby Resend.api_key = ENV["RESEND_API_KEY"] Resend::Domains.verify("d91cd9bd-1176-453e-8fc1-35364d380206") ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") verified, err := client.Domains.Verify("d91cd9bd-1176-453e-8fc1-35364d380206") ``` ```rust Rust use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); resend .domains .verify("d91cd9bd-1176-453e-8fc1-35364d380206") .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); VerifyDomainResponse verified = resend.domains().verify("d91cd9bd-1176-453e-8fc1-35364d380206"); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI var resp = await resend.DomainVerifyAsync( new Guid( "d91cd9bd-1176-453e-8fc1-35364d380206" ) ); ``` ```bash cURL curl -X POST 'https://api.resend.com/domains/d91cd9bd-1176-453e-8fc1-35364d380206/verify' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' ``` ```json Response { "object": "domain", "id": "d91cd9bd-1176-453e-8fc1-35364d380206" } ``` # Cancel Email Source: https://resend.com/docs/api-reference/emails/cancel-email POST /emails/:id/cancel Cancel a scheduled email. ## Path Parameters The Email ID. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); resend.emails.cancel('49a3999c-0ce1-4ea6-ab68-afcd6dc2e794'); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->emails->cancel('49a3999c-0ce1-4ea6-ab68-afcd6dc2e794'); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" resend.Emails.cancel(email_id="49a3999c-0ce1-4ea6-ab68-afcd6dc2e794") ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" Resend::Emails.cancel("49a3999c-0ce1-4ea6-ab68-afcd6dc2e794") ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") canceled, err := client.Emails.Cancel("49a3999c-0ce1-4ea6-ab68-afcd6dc2e794") if err != nil { panic(err) } fmt.Println(canceled.Id) ``` ```rust Rust use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let _canceled = resend .emails .cancel("49a3999c-0ce1-4ea6-ab68-afcd6dc2e794") .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); CancelEmailResponse canceled = resend .emails() .cancel("49a3999c-0ce1-4ea6-ab68-afcd6dc2e794"); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI await resend.EmailCancelAsync( new Guid( "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794" ) ); ``` ```bash cURL curl -X POST 'https://api.resend.com/emails/49a3999c-0ce1-4ea6-ab68-afcd6dc2e794/cancel' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' ``` ```json Response { "object": "email", "id": "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794" } ``` # Retrieve Email Source: https://resend.com/docs/api-reference/emails/retrieve-email GET /emails/:id Retrieve a single email. ## Path Parameters The Email ID. ```js Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); resend.emails.get('37e4414c-5e25-4dbc-a071-43552a4bd53b'); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->emails->get('37e4414c-5e25-4dbc-a071-43552a4bd53b'); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" resend.Emails.get(email_id="4ef9a417-02e9-4d39-ad75-9611e0fcc33c") ``` ```ruby Ruby Resend.api_key = "re_xxxxxxxxx" email = Resend::Emails.get("4ef9a417-02e9-4d39-ad75-9611e0fcc33c") puts email ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") email, err := client.Emails.Get("4ef9a417-02e9-4d39-ad75-9611e0fcc33c") ``` ```rust Rust use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let _email = resend .emails .get("4ef9a417-02e9-4d39-ad75-9611e0fcc33c") .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); Email email = resend.emails().get("4ef9a417-02e9-4d39-ad75-9611e0fcc33c"); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI var resp = await resend.EmailRetrieveAsync( new Guid( "4ef9a417-02e9-4d39-ad75-9611e0fcc33c" ) ); Console.WriteLine( "Subject={0}", resp.Content.Subject ); ``` ```bash cURL curl -X GET 'https://api.resend.com/emails/4ef9a417-02e9-4d39-ad75-9611e0fcc33c' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' ``` ```json Response { "object": "email", "id": "4ef9a417-02e9-4d39-ad75-9611e0fcc33c", "to": ["delivered@resend.dev"], "from": "Acme ", "created_at": "2023-04-03T22:13:42.674981+00:00", "subject": "Hello World", "html": "Congrats on sending your first email!", "text": null, "bcc": [null], "cc": [null], "reply_to": [null], "last_event": "delivered" } ``` # Send Batch Emails Source: https://resend.com/docs/api-reference/emails/send-batch-emails POST /emails/batch Trigger up to 100 batch emails at once. Instead of sending one email per HTTP request, we provide a batching endpoint that permits you to send up to 100 emails in a single API call. ## Body Parameters Sender email address. To include a friendly name, use the format `"Your Name "`. Recipient email address. For multiple addresses, send as an array of strings. Max 50. Email subject. Bcc recipient email address. For multiple addresses, send as an array of strings. Cc recipient email address. For multiple addresses, send as an array of strings. Reply-to email address. For multiple addresses, send as an array of strings. The HTML version of the message. The plain text version of the message. The React component used to write the message. *Only available in the Node.js SDK.* Custom headers to add to the email. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); await resend.batch.send([ { from: 'Acme ', to: ['foo@gmail.com'], subject: 'hello world', html: '

it works!

', }, { from: 'Acme ', to: ['bar@outlook.com'], subject: 'world hello', html: '

it works!

', }, ]); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->batch->send([ [ 'from' => 'Acme ', 'to' => ['foo@gmail.com'], 'subject' => 'hello world', 'html' => '

it works!

', ], [ 'from' => 'Acme ', 'to' => ['bar@outlook.com'], 'subject' => 'world hello', 'html' => '

it works!

', ] ]); ``` ```py Python import resend from typing import List resend.api_key = "re_xxxxxxxxx" params: List[resend.Emails.SendParams] = [ { "from": "Acme ", "to": ["foo@gmail.com"], "subject": "hello world", "html": "

it works!

", }, { "from": "Acme ", "to": ["bar@outlook.com"], "subject": "world hello", "html": "

it works!

", } ] resend.Batch.send(params) ``` ```rb Ruby require "resend" Resend.api_key = 're_xxxxxxxxx' params = [ { "from": "Acme ", "to": ["foo@gmail.com"], "subject": "hello world", "html": "

it works!

", }, { "from": "Acme ", "to": ["bar@outlook.com"], "subject": "world hello", "html": "

it works!

", } ] Resend::Batch.send(params) ``` ```go Go package examples import ( "fmt" "os" "github.com/resend/resend-go/v2" ) func main() { ctx := context.TODO() client := resend.NewClient("re_xxxxxxxxx") var batchEmails = []*resend.SendEmailRequest{ { From: "Acme ", To: []string{"foo@gmail.com"}, Subject: "hello world", Html: "

it works!

", }, { From: "Acme ", To: []string{"bar@outlook.com"}, Subject: "world hello", Html: "

it works!

", }, } sent, err := client.Batch.SendWithContext(ctx, batchEmails) if err != nil { panic(err) } fmt.Println(sent.Data) } ``` ```rust Rust use resend_rs::types::CreateEmailBaseOptions; use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let emails = vec![ CreateEmailBaseOptions::new( "Acme ", vec!["foo@gmail.com"], "hello world", ) .with_html("

it works!

"), CreateEmailBaseOptions::new( "Acme ", vec!["bar@outlook.com"], "world hello", ) .with_html("

it works!

"), ]; let _emails = resend.batch.send(emails).await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); CreateEmailOptions firstEmail = CreateEmailOptions.builder() .from("Acme ") .to("foo@gmail.com") .subject("hello world") .html("

it works!

") .build(); CreateEmailOptions secondEmail = CreateEmailOptions.builder() .from("Acme ") .to("bar@outlook.com") .subject("world hello") .html("

it works!

") .build(); CreateBatchEmailsResponse data = resend.batch().send( Arrays.asList(firstEmail, secondEmail) ); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI var mail1 = new EmailMessage() { From = "Acme ", To = "foo@gmail.com", Subject = "hello world", HtmlBody = "

it works!

", }; var mail2 = new EmailMessage() { From = "Acme ", To = "bar@outlook.com", Subject = "hello world", HtmlBody = "

it works!

", }; var resp = await resend.EmailBatchAsync( [ mail1, mail2 ] ); Console.WriteLine( "Nr Emails={0}", resp.Content.Count ); ``` ```bash cURL curl -X POST 'https://api.resend.com/emails/batch' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' \ -d $'[ { "from": "Acme ", "to": ["foo@gmail.com"], "subject": "hello world", "html": "

it works!

" }, { "from": "Acme ", "to": ["bar@outlook.com"], "subject": "world hello", "html": "

it works!

" } ]' ```
```json Response { "data": [ { "id": "ae2014de-c168-4c61-8267-70d2662a1ce1" }, { "id": "faccb7a5-8a28-4e9a-ac64-8da1cc3bc1cb" } ] } ``` ## Limitations The `attachments`, `tags`, and `scheduled_at` fields are not supported yet. # Send Email Source: https://resend.com/docs/api-reference/emails/send-email POST /email Start sending emails through the Resend Email API. ## Body Parameters Sender email address. To include a friendly name, use the format `"Your Name "`. Recipient email address. For multiple addresses, send as an array of strings. Max 50. Email subject. Bcc recipient email address. For multiple addresses, send as an array of strings. Cc recipient email address. For multiple addresses, send as an array of strings. Schedule email to be sent later. The date should be in natural language (e.g.: `in 1 min`) or ISO 8601 format (e.g: `2024-08-05T11:52:01.858Z`). [See examples](/dashboard/emails/schedule-email) Reply-to email address. For multiple addresses, send as an array of strings. The HTML version of the message. The plain text version of the message. The React component used to write the message. *Only available in the Node.js SDK.* Custom headers to add to the email. Filename and content of attachments (max 40MB per email, after Base64 encoding of the attachments). [See examples](/dashboard/emails/attachments) Content of an attached file, passed as a buffer or Base64 string. Name of attached file. Path where the attachment file is hosted Content type for the attachment, if not set will be derived from the filename property Custom data passed in key/value pairs. [See examples](/dashboard/emails/tags). The name of the email tag. It can only contain ASCII letters (a–z, A–Z), numbers (0–9), underscores (\_), or dashes (-). It can contain no more than 256 characters. The value of the email tag. It can only contain ASCII letters (a–z, A–Z), numbers (0–9), underscores (\_), or dashes (-). It can contain no more than 256 characters. ## Headers Add an idempotency key to prevent duplicated emails. * Should be **unique per API request** * Idempotency keys expire after **24 hours** * Have a maximum length of **256 characters** [Learn more](/dashboard/emails/idempotency-keys) ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); await resend.emails.send({ from: 'Acme ', to: ['delivered@resend.dev'], subject: 'hello world', html: '

it works!

', }); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->emails->send([ 'from' => 'Acme ', 'to' => ['delivered@resend.dev'], 'subject' => 'hello world', 'html' => '

it works!

' ]); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" params: resend.Emails.SendParams = { "from": "Acme ", "to": ["delivered@resend.dev"], "subject": "hello world", "html": "

it works!

" } email = resend.Emails.send(params) print(email) ``` ```rb Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" params = { "from": "Acme ", "to": ["delivered@resend.dev"], "subject": "hello world", "html": "

it works!

" } sent = Resend::Emails.send(params) puts sent ``` ```go Go import ( "fmt" "github.com/resend/resend-go/v2" ) func main() { ctx := context.TODO() client := resend.NewClient("re_xxxxxxxxx") params := &resend.SendEmailRequest{ From: "Acme ", To: []string{"delivered@resend.dev"}, Subject: "hello world", Html: "

it works!

" } sent, err := client.Emails.SendWithContext(ctx, params) if err != nil { panic(err) } fmt.Println(sent.Id) } ``` ```rust Rust use resend_rs::types::{CreateEmailBaseOptions}; use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let from = "Acme "; let to = ["delivered@resend.dev"]; let subject = "hello world"; let html = "

it works!

"; let email = CreateEmailBaseOptions::new(from, to, subject) .with_html(html); let _email = resend.emails.send(email).await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); CreateEmailOptions params = CreateEmailOptions.builder() .from("Acme ") .to("delivered@resend.dev") .subject("hello world") .html("

it works!

") .build(); CreateEmailResponse data = resend.emails().send(params); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI var resp = await resend.EmailSendAsync( new EmailMessage() { From = "Acme ", To = "delivered@resend.dev", Subject = "hello world", HtmlBody = "

it works!

", } ); Console.WriteLine( "Email Id={0}", resp.Content ); ``` ```bash cURL curl -X POST 'https://api.resend.com/emails' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' \ -d $'{ "from": "Acme ", "to": ["delivered@resend.dev"], "subject": "hello world", "html": "

it works!

" }' ```
```json Response { "id": "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794" } ``` # Update Email Source: https://resend.com/docs/api-reference/emails/update-email PATCH /emails/:id Update a scheduled email. ## Path Parameters The Email ID. ## Body Parameters Schedule email to be sent later. The date should be in ISO 8601 format (e.g: 2024-08-05T11:52:01.858Z). ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); const oneMinuteFromNow = new Date(Date.now() + 1000 * 60).toISOString(); resend.emails.update({ id: '49a3999c-0ce1-4ea6-ab68-afcd6dc2e794', scheduledAt: oneMinuteFromNow, }); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $oneMinuteFromNow = (new DateTime())->modify('+1 minute')->format(DateTime::ISO8601); $resend->emails->update('49a3999c-0ce1-4ea6-ab68-afcd6dc2e794', [ 'scheduled_at' => $oneMinuteFromNow ]); ``` ```python Python import resend from datetime import datetime, timedelta resend.api_key = "re_xxxxxxxxx" one_minute_from_now = (datetime.now() + timedelta(minutes=1)).isoformat() update_params: resend.Emails.UpdateParams = { "id": "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794", "scheduled_at": one_minute_from_now } resend.Emails.update(params=update_params) ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" one_minute_from_now = (Time.now + 1 * 60).strftime("%Y-%m-%dT%H:%M:%S.%L%z") update_params = { "email_id": "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794", "scheduled_at": one_minute_from_now } Resend::Emails.update(update_params) ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") oneMinuteFromNow := time.Now().Add(time.Minute * time.Duration(1)) oneMinuteFromNowISO := oneMinuteFromNow.Format("2006-01-02T15:04:05-0700") updateParams := &resend.UpdateEmailRequest{ Id: "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794", ScheduledAt: oneMinuteFromNowISO } updatedEmail, err := client.Emails.Update(updateParams) if err != nil { panic(err) } fmt.Printf("%v\n", updatedEmail) ``` ```rust Rust use chrono::{Local, TimeDelta}; use resend_rs::types::UpdateEmailOptions; use resend_rs::{Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let one_minute_from_now = Local::now() .checked_add_signed(TimeDelta::minutes(1)) .unwrap() .to_rfc3339(); let update = UpdateEmailOptions::new() .with_scheduled_at(&one_minute_from_now); let _email = resend .emails .update("49a3999c-0ce1-4ea6-ab68-afcd6dc2e794", update) .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); String oneMinuteFromNow = Instant .now() .plus(1, ChronoUnit.MINUTES) .toString(); UpdateEmailOptions updateParams = UpdateEmailOptions.builder() .scheduledAt(oneMinuteFromNow) .build(); UpdateEmailResponse data = resend.emails().update("49a3999c-0ce1-4ea6-ab68-afcd6dc2e794", updateParams); } } ``` ```csharp .NET using Resend; IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI await resend.EmailRescheduleAsync( new Guid( "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794" ), DateTime.UtcNow.AddMinutes( 1 ) ); ``` ```bash cURL curl -X PATCH 'https://api.resend.com/emails/49a3999c-0ce1-4ea6-ab68-afcd6dc2e794' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' \ -d $'{ "scheduled_at": "2024-08-05T11:52:01.858Z" }' ``` ```json Response { "object": "email", "id": "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794" } ``` # Errors Source: https://resend.com/docs/api-reference/errors Troubleshoot problems with this comprehensive breakdown of all error codes. ## Error schema We use standard HTTP response codes for success and failure notifications, and our errors are further classified by type. ### `invalid_idempotency_key` * **Status:** 400 * **Message:** The key must be between 1-256 chars. * **Suggested action:** Retry with a valid idempotency key. ### `validation_error` * **Status:** 400 * **Message:** We found an error with one or more fields in the request. * **Suggested action:** The message will contain more details about what field and error were found. ### `missing_api_key` * **Status:** 401 * **Message:** Missing API key in the authorization header. * **Suggested action:** Include the following header in the request: `Authorization: Bearer YOUR_API_KEY`. ### `restricted_api_key` * **Status:** 401 * **Message:** This API key is restricted to only send emails. * **Suggested action:** Make sure the API key has `Full access` to perform actions other than sending emails. ### `invalid_api_key` * **Status:** 403 * **Message:** API key is invalid. * **Suggested action:** Make sure the API key is correct or generate a new [API key in the dashboard](https://resend.com/api-keys). ### `validation_error` * **Status:** 403 * **Message:** You can only send testing emails to your own email address (`youremail@domain.com`). * **Suggested action:** In [Resend's Domain page](https://resend.com/domains), add and verify a domain for which you have DNS access. This allows you to send emails to addresses beyond your own. ### `not_found` * **Status:** 404 * **Message:** The requested endpoint does not exist. * **Suggested action:** Change your request URL to match a valid API endpoint. ### `method_not_allowed` * **Status:** 405 * **Message:** Method is not allowed for the requested path. * **Suggested action:** Change your API endpoint to use a valid method. ### `invalid_idempotent_request` * **Status:** 409 * **Message:** Same idempotency key used with a different request payload. * **Suggested action:** Change your idempotency key or payload. ### `concurrent_idempotent_requests` * **Status:** 409 * **Message:** Same idempotency key used while original request is still in progress. * **Suggested action:** Try the request again later. ### `invalid_attachment` * **Status:** 422 * **Message:** Attachment must have either a `content` or `path`. * **Suggested action:** Attachments must either have a `content` (strings, Buffer, or Stream contents) or `path` to a remote resource (better for larger attachments). ### `invalid_from_address` * **Status:** 422 * **Message:** Invalid `from` field. * **Suggested action:** Make sure the `from` field is a valid. The email address needs to follow the `email@example.com` or `Name ` format. ### `invalid_access` * **Status:** 422 * **Message:** Access must be "full\_access" | "sending\_access". * **Suggested action:** Make sure the API key has necessary permissions. ### `invalid_parameter` * **Status:** 422 * **Message:** The `parameter` must be a valid UUID. * **Suggested action:** Check the value and make sure it's valid. ### `invalid_region` * **Status:** 422 * **Message:** Region must be "us-east-1" | "eu-west-1" | "sa-east-1". * **Suggested action:** Make sure the correct region is selected. ### `missing_required_field` * **Status:** 422 * **Message:** The request body is missing one or more required fields. * **Suggested action:** Check the error message to see the list of missing fields. ### `daily_quota_exceeded` * **Status:** 429 * **Message:** You have reached your daily email sending quota. * **Suggested action:** [Upgrade your plan](https://resend.com/settings/billing) to remove the daily quota limit or wait until 24 hours have passed to continue sending. ### `rate_limit_exceeded` * **Status:** 429 * **Message:** Too many requests. Please limit the number of requests per second. Or [contact support](https://resend.com/contact) to increase rate limit. * **Suggested action:** You should read the [response headers](./introduction#rate-limit) and reduce the rate at which you request the API. This can be done by introducing a queue mechanism or reducing the number of concurrent requests per second. If you have specific requirements, [contact support](https://resend.com/contact) to request a rate increase. ### `security_error` * **Status:** 451 * **Message:** We may have found a security issue with the request. * **Suggested action:** The message will contain more details. [Contact support](https://resend.com/contact) for more information. ### `application_error` * **Status:** 500 * **Message:** An unexpected error occurred. * **Suggested action:** Try the request again later. If the error does not resolve, check our [status page](https://resend-status.com) for service updates. ### `internal_server_error` * **Status:** 500 * **Message:** An unexpected error occurred. * **Suggested action:** Try the request again later. If the error does not resolve, check our [status page](https://resend-status.com) for service updates. # Introduction Source: https://resend.com/docs/api-reference/introduction Understand general concepts, response codes, and authentication strategies. ## Base URL The Resend API is built on **REST** principles. We enforce **HTTPS** in every request to improve data security, integrity, and privacy. The API does not support **HTTP**. All requests contain the following base URL: ``` https://api.resend.com ``` ## Authentication To authenticate you need to add an *Authorization* header with the contents of the header being `Bearer re_xxxxxxxxx` where `re_xxxxxxxxx` is your [API Key](https://resend.com/api-keys). ``` Authorization: Bearer re_xxxxxxxxx ``` ## Response codes Resend uses standard HTTP codes to indicate the success or failure of your requests. In general, `2xx` HTTP codes correspond to success, `4xx` codes are for user-related failures, and `5xx` codes are for infrastructure issues. | Status | Description | | ------ | --------------------------------------- | | `200` | Successful request. | | `400` | Check that the parameters were correct. | | `401` | The API key used was missing. | | `403` | The API key used was invalid. | | `404` | The resource was not found. | | `429` | The rate limit was exceeded. | | `5xx` | Indicates an error with Resend servers. | Check [Error Codes](/api-reference/errors) for a comprehensive breakdown of all possible API errors. ## Rate limit The default maximum rate limit is **2 requests per second**. This number can be increased for trusted senders by request. After that, you'll hit the rate limit and receive a `429` response error code. Learn more about our [rate limits](/api-reference/rate-limit). ## FAQ At this moment, there are no pagination parameters since we don't provide a way to fetch data via API yet. We plan to add pagination capabilities in the future. Currently, there's no versioning system in place. We plan to add versioning via calendar-based headers in the future. # Rate Limit Source: https://resend.com/docs/api-reference/rate-limit Understand rate limits and how to increase them. The response headers describe your current rate limit following every request in conformance with the [IETF standard](https://datatracker.ietf.org/doc/html/draft-ietf-httpapi-ratelimit-headers): | Header name | Description | | --------------------- | ------------------------------------------------------------------- | | `ratelimit-limit` | Maximum number of requests allowed within a window. | | `ratelimit-remaining` | How many requests you have left within the current window. | | `ratelimit-reset` | How many seconds until the limits are reset. | | `retry-after` | How many seconds you should wait before making a follow-up request. | The default maximum rate limit is **2 requests per second**. This number can be increased for trusted senders upon request. After that, you'll hit the rate limit and receive a `429` response error code. You can find all 429 responses by filtering for 429 at the [Resend Logs page](https://resend.com/logs?status=429). To prevent this, we recommend reducing the rate at which you request the API. This can be done by introducing a queue mechanism or reducing the number of concurrent requests per second. If you have specific requirements, [contact support](https://resend.com/contact) to request a rate increase. # Introduction Source: https://resend.com/docs/dashboard/api-keys/introduction Visualize all the API Keys on the Resend Dashboard. ## What is an API Key API Keys are secret tokens used to authenticate your requests. They are unique to your account and should be kept confidential. ## Add API Key You can create a new API Key from the [API Key Dashboard](https://resend.com/api-keys). 1. Click **Create API Key**. 2. Give your API Key a name. 3. Select **Full access** or **Sending access** as the permission. 4. If you select **Sending access**, you can choose the domain you want to restrict access to. Add API Key For security reasons, you can only view the API Key once. ## Set API Key permissions There are two different permissions of API Keys: 1. **Full access**: grants access to create, delete, get, and update any resource. 2. **Sending access**: grants access only to send emails. With API Key permissions, you can isolate different application actions to different API Keys. Using multiple keys, you can view logs per key, detect possible abuse, and control the damage that may be done accidentally or maliciously. ## View all API Keys The [API Dashboard](https://resend.com/api-keys) shows you all the API Keys you have created along with their details, including the **last time you used** an API Key. Different color indicators let you quickly scan and detect which API Keys are being used and which are not. View All API Keys ## Edit API Key details After creating an API Key, you can edit the following details: * Name * Permission * Domain To edit an API Key, click the **More options** button and then **Edit API Key**. View Inactive API Key You cannot edit an API Key value after it has been created. ## Delete inactive API Keys If an API Key **hasn't been used in the last 30 days**, consider deleting it to keep your account secure. View Inactive API Key You can delete an API Key by clicking the **More options** button and then **Remove API Key**. Delete API Key ## View API Key logs When visualizing an active API Key, you can see the **total number of requests** made to the key. For more detailed logging information, select the underlined number of requests to view all logs for that API Key. View Active API Key # Managing Contacts Source: https://resend.com/docs/dashboard/audiences/contacts How to manage and import contacts to your audiences. Resend has [Audiences](/dashboard/audiences/introduction) made up of Contacts. You can send [Broadcasts](/dashboard/broadcasts/introduction) to your Audiences. When adding a Contact, you can assign it an email address and first and last name to personalize your Broadcast to them. You can add your Contacts to an Audience in three different ways: via API, CSV upload, or manually. ## 1. Adding Contacts programmatically via API You can add contacts to an Audience programmatically. For instance, after someone makes a purchase, you can add them to your "Paying Customers" audience. Resend's SDKs have support for the [contacts](/api-reference/contacts/create-contact) endpoint. ```ts Node.js import { Resend } from 'resend'; const resend = new Resend('re_xxxxxxxxx'); resend.contacts.create({ email: 'steve.wozniak@gmail.com', firstName: 'Steve', lastName: 'Wozniak', unsubscribed: false, audienceId: '78261eea-8f8b-4381-83c6-79fa7120f1cf', }); ``` ```php PHP $resend = Resend::client('re_xxxxxxxxx'); $resend->contacts->create( audienceId: '78261eea-8f8b-4381-83c6-79fa7120f1cf', [ 'email' => 'steve.wozniak@gmail.com', 'first_name' => 'Steve', 'last_name' => 'Wozniak', 'unsubscribed' => false ] ); ``` ```python Python import resend resend.api_key = "re_xxxxxxxxx" params: resend.Contacts.CreateParams = { "email": "steve.wozniak@gmail.com", "first_name": "Steve", "last_name": "Wozniak", "unsubscribed": False, "audience_id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", } resend.Contacts.create(params) ``` ```ruby Ruby require "resend" Resend.api_key = "re_xxxxxxxxx" params = { "email": "steve.wozniak@gmail.com", "first_name": "Steve", "last_name": "Wozniak", "unsubscribed": false, "audience_id": "78261eea-8f8b-4381-83c6-79fa7120f1cf", } Resend::Contacts.create(params) ``` ```go Go import "github.com/resend/resend-go/v2" client := resend.NewClient("re_xxxxxxxxx") params := &resend.CreateContactRequest{ Email: "steve.wozniak@gmail.com", FirstName: "Steve", LastName: "Wozniak", Unsubscribed: false, AudienceId: "78261eea-8f8b-4381-83c6-79fa7120f1cf", } contact, err := client.Contacts.Create(params) ``` ```rust Rust use resend_rs::{types::ContactData, Resend, Result}; #[tokio::main] async fn main() -> Result<()> { let resend = Resend::new("re_xxxxxxxxx"); let contact = ContactData::new("steve.wozniak@gmail.com") .with_first_name("Steve") .with_last_name("Wozniak") .with_unsubscribed(false); let _contact = resend .contacts .create("78261eea-8f8b-4381-83c6-79fa7120f1cf", contact) .await?; Ok(()) } ``` ```java Java import com.resend.*; public class Main { public static void main(String[] args) { Resend resend = new Resend("re_xxxxxxxxx"); CreateContactOptions params = CreateContactOptions.builder() .email("steve.wozniak@gmail.com") .firstName("Steve") .lastName("Wozniak") .unsubscribed(false) .audienceId("78261eea-8f8b-4381-83c6-79fa7120f1cf") .build(); CreateContactResponseSuccess data = resend.contacts().create(params); } } ``` ```bash cURL curl -X POST 'https://api.resend.com/audiences/78261eea-8f8b-4381-83c6-79fa7120f1cf/contacts' \ -H 'Authorization: Bearer re_xxxxxxxxx' \ -H 'Content-Type: application/json' \ -d $'{ "email": "steve.wozniak@gmail.com", "first_name": "Steve", "last_name": "Wozniak", "unsubscribed": false }' ``` ## 2. Adding Contacts by uploading a .csv Go to the [Audiences](https://resend.com/audiences) page, and select **Add Contacts**. ![Adding Contacts](https://mintlify.s3.us-west-1.amazonaws.com/resend/images/audiences-intro-6.png) Select **Import CSV**. Upload your CSV file from your computer. ![Adding Contacts](https://mintlify.s3.us-west-1.amazonaws.com/resend/images/audiences-intro-6.png) After uploading your CSV file, you're able to map the fields you want to use. Currently, the supported mapping fields are `email`, `first_name`, `last_name`, and `unsubscribed`. Import Contacts via CSV Finally, select **Continue**, review the contacts, and finish the upload. ## 3. Adding Contacts manually Go to the [Audiences](https://resend.com/audiences) page, and select **Add Contacts**. ![Adding Contacts](https://mintlify.s3.us-west-1.amazonaws.com/resend/images/audiences-intro-6.png) Select **Add Manually**. You can then add either one, or multiple email addresses into the text field, separating multiple email addresses with commas. ![Adding Contacts Manually](https://mintlify.s3.us-west-1.amazonaws.com/resend/images/audiences-intro-7.png) # Managing Audiences Source: https://resend.com/docs/dashboard/audiences/introduction Learn how to add, update, retrieve, and remove contacts that you send Broadcasts to. Managing subscribers and unsubscribers is a critical part of any email implementation. It's important to respect your users' preferences and ensure that they're receiving the right emails at the right time. Resend Audiences allow you to group and manage your [contacts](/dashboard/audiences/contacts) in a simple and intuitive way. Audience ## Send emails to your Audience Audiences were designed to be used in conjunction with [Broadcasts](https://resend.com/broadcasts). You can send a Broadcast to an Audience from the Resend dashboard or from the Broadcast API. ### From Resend's no-code editor You can send emails to your Audience by creating a new Broadcast and selecting the Audience you want to send it to. ![Send emails to your Audience](https://mintlify.s3.us-west-1.amazonaws.com/resend/images/audiences-intro-2.png) You can include the Unsubscribe Footer in your Broadcasts, which will be automatically replaced with the correct link for each contact. ### From the Broadcast API You can also use our [Broadcast API](/api-reference/broadcasts/create-broadcast) to create and send a Broadcast to your Audience. ### How to customize the unsubscribe link in my Broadcast? Resend generates a unique link for each recipient and each Broadcast. You can use `{{{RESEND_UNSUBSCRIBE_URL}}}` as the link target. ![Unsubscribe Link](https://mintlify.s3.us-west-1.amazonaws.com/resend/images/audiences-intro-3.png) ## Automatic Unsubscribes When you send emails to your Audience, Resend will automatically handle the unsubscribe flow for you. If a contact unsubscribes from your emails, they will be skipped when sending a future Broadcast to this same audience. ![Automatic Unsubscribes](https://mintlify.s3.us-west-1.amazonaws.com/resend/images/audiences-intro-4.png) Learn more about managing your unsubscribe list [here](https://resend.com/docs/dashboard/audiences/managing-unsubscribe-list). # Managing Unsubscribed Contacts Source: https://resend.com/docs/dashboard/audiences/managing-unsubscribe-list Learn how to check and remove recipients who have unsubscribed to your marketing emails. It's essential to update your contact list when someone unsubscribes to maintain a good sender reputation. This reduces the likelihood of your emails being marked as spam, and can also improve deliverability for any other marketing or transactional emails you send. When a contact unsubscribes from your emails, Resend will automatically handle the unsubscribe flow for you, and they will be skipped when sending the next Broadcast to that same audience. ## Checking Unsubcribed Contacts To see which contacts have unsubscribed, first navigate to the [Audiences page](https://resend.com/audiences). Then, select the Audience that you want to check. Click on the **All Statuses** filter next to the search bar, then select **Unsubscribed**. Managing Unsubscribe List # Managing Broadcasts Source: https://resend.com/docs/dashboard/broadcasts/introduction Send marketing emails efficiently without code. Broadcasts allow you to send email blasts to your customers using a no-code editor on Resend, or from our [Broadcast API](/api-reference/broadcasts/create-broadcast). You can use this to send email blasts such as: * Newsletters * Product Launches * Investor Updates * Promotions * Changelogs ## Sending a Broadcast from Resend Our Broadcasts feature was made to enable your entire team to send email campaigns without having to ask for help from developers. ### No-Code Editor