---
title: "Email Suppressions"
slug: suppression-list-support
description: "Manage your team's suppressed addresses from the dashboard and the API."
created_at: "2026-07-28"
updated_at: "2026-07-28"
image: https://cdn.resend.com/posts/suppression-list-support.jpg
humans: ["carolina-josephik", "danilo-woznica", "bu-kinoshita", "alexandre-cisneiros"]
---

When a mailbox provider hard-bounces a recipient, or someone marks your email as spam, continuing to send to that address harms your reputation.

Resend automatically suppresses addresses that hard bounce or complain, and today we're introducing **managed suppression lists**. 

<YouTube videoId="fpAH_20pUAU" />

Take full control to view, add, and remove entries to your team's suppression list from both **the dashboard** and **the API**.

## How suppression works

An address is added to the suppression list for one of three reasons:

- `bounce`: the recipient's mail server permanently rejected the email.
- `complaint`: the recipient marked your email as spam.
- `manual`: you add the recipient's address yourself.

## Add suppressions

You can add individual email addresses or bulk import a suppression list for your team.

<video
  src="https://cdn.resend.com/posts/suppression-list-support-1.mp4"
  autoPlay
  loop
  muted
  playsInline
  className="extraWidth"
/>

Or add an email address to your team's suppression list programmatically.

<CodeTabs codeHeight={150}>

```nodejs
import { Resend } from 'resend';

const resend = new Resend('re_xxxxxxxxx');

const { data, error } = await resend.suppressions.add({
  email: 'steve.wozniak@example.com',
});
```

```php
$resend = Resend::client('re_xxxxxxxxx');

$resend->suppressions->add([
  'email' => 'steve.wozniak@example.com',
]);
```

```python
import resend

resend.api_key = "re_xxxxxxxxx"

params: resend.Suppressions.AddParams = {
  "email": "steve.wozniak@example.com",
}

resend.Suppressions.add(params)
```

```ruby
require "resend"

Resend.api_key = 're_xxxxxxxxx'

Resend::Suppressions.add(email: "steve.wozniak@example.com")
```

```go
client := resend.NewClient("re_xxxxxxxxx")

params := &resend.AddSuppressionRequest{
  Email: "steve.wozniak@example.com",
}
suppression, _ := client.Suppressions.Add(params)
```

```rust
use resend_rs::types::AddSuppressionOptions;
use resend_rs::{Resend, Result};

#[tokio::main]
async fn main() -> Result<()> {
  let resend = Resend::new("re_xxxxxxxxx");

  let opts = AddSuppressionOptions::new().with_email("steve.wozniak@example.com");
  let _suppression = resend.suppressions.add(opts).await?;

  Ok(())
}
```

```java
import com.resend.Resend;
import com.resend.services.suppressions.model.AddSuppressionOptions;

Resend resend = new Resend("re_xxxxxxxxx");

AddSuppressionOptions options = AddSuppressionOptions.builder()
    .email("steve.wozniak@example.com")
    .build();

resend.suppressions().add(options);
```

```dotnet
using Resend;

IResend resend = ResendClient.Create( "re_xxxxxxxxx" );

var resp = await resend.SuppressionAddAsync( "steve.wozniak@example.com" );
Console.WriteLine( "Suppression Id={0}", resp.Content );
```

```curl
curl -X POST 'https://api.resend.com/suppressions' \
     -H 'Authorization: Bearer re_xxxxxxxxx' \
     -H 'Content-Type: application/json' \
     -d $'{
  "email": "steve.wozniak@example.com"
}'
```

```cli
resend suppressions add steve.wozniak@example.com
```
</CodeTabs>

If you're moving from another provider or have a larger list, you can also import a CSV.

<video
  src="https://cdn.resend.com/posts/suppression-list-support-2.mp4"
  autoPlay
  loop
  muted
  playsInline
  className="extraWidth"
/>

Or bulk import up to 100 addresses via the API.

<CodeTabs codeHeight={180}>

```nodejs
import { Resend } from 'resend';

const resend = new Resend('re_xxxxxxxxx');

const { data, error } = await resend.suppressions.batch.add({
  emails: ['steve.wozniak@example.com', 'susan.kare@example.com'],
});
```

```php
$resend = Resend::client('re_xxxxxxxxx');

$resend->suppressions->batch->add([
  'emails' => ['steve.wozniak@example.com', 'susan.kare@example.com'],
]);
```

```python
import resend

resend.api_key = "re_xxxxxxxxx"

params: resend.Suppressions.Batch.AddParams = {
  "emails": ["steve.wozniak@example.com", "susan.kare@example.com"],
}

resend.Suppressions.Batch.add(params)
```

```ruby
require "resend"

Resend.api_key = 're_xxxxxxxxx'

Resend::Suppressions::Batch.add(
  emails: ["steve.wozniak@example.com", "susan.kare@example.com"]
)
```

```go
client := resend.NewClient("re_xxxxxxxxx")

params := &resend.BatchAddSuppressionsRequest{
  Emails: []string{"steve.wozniak@example.com", "susan.kare@example.com"},
}
added, _ := client.Suppressions.Batch.Add(params)
```

```rust
use resend_rs::types::BatchAddSuppressionOptions;
use resend_rs::{Resend, Result};

#[tokio::main]
async fn main() -> Result<()> {
  let resend = Resend::new("re_xxxxxxxxx");

  let opts =
    BatchAddSuppressionOptions::from(vec!["steve.wozniak@example.com", "susan.kare@example.com"]);
  let _data = resend.suppressions.batch_add(opts).await?;

  Ok(())
}
```

```java
import com.resend.Resend;
import com.resend.services.suppressions.model.AddSuppressionsOptions;
import java.util.List;

Resend resend = new Resend("re_xxxxxxxxx");

AddSuppressionsOptions options = AddSuppressionsOptions.builder()
    .emails(List.of("steve.wozniak@example.com", "susan.kare@example.com"))
    .build();

resend.suppressions().batch().add(options);
```

```dotnet
using Resend;

IResend resend = ResendClient.Create( "re_xxxxxxxxx" );

var resp = await resend.SuppressionBatchAddAsync( new[]
{
    "steve.wozniak@example.com",
    "susan.kare@example.com",
} );
```

```curl
curl -X POST 'https://api.resend.com/suppressions/batch/add' \
     -H 'Authorization: Bearer re_xxxxxxxxx' \
     -H 'Content-Type: application/json' \
     -d $'{
  "emails": ["steve.wozniak@example.com", "susan.kare@example.com"]
}'
```

```cli
resend suppressions batch add --file ./emails.json
```

</CodeTabs>

Suppressions apply to your **entire team**. A bounce or complaint on any domain suppresses that address across every one of your domains and subdomains.

<Callout>
    Remember that adding a Suppression will *skip all sending* to that recipient until it is removed from your team's suppression list.
</Callout>

## View your suppression list

Within the Dashboard, access [Suppressions in the Email tab](/emails/suppressions). Each row shows the suppressed address and its origin, links to the related contact, and offers an inline remove action. 

<img src="https://cdn.resend.com/posts/suppression-list-support-1.jpg" alt="Suppression list" className="extraWidth" />

You can also programmatically retrieve [a single Suppression](/docs/api-reference/suppressions/get-suppression) or [your entire suppression list](/docs/api-reference/suppressions/list-suppressions), which returns key data about the Suppression.

```json
{
  "object": "suppression",
  "id": "e169aa45-1ecf-4183-9955-b1499d5701d3",
  "email": "steve.wozniak@example.com",
  "origin": "bounce",
  "source_id": "4ef9a417-02e9-4d39-ad75-9611e0fcc33c",
  "created_at": "2026-10-06T23:47:56.678Z"
}

// `source_id` references the email id that triggered the suppression (is `null` for `manual` origin suppressions).
```

## Removing suppressed emails

If you've resolved the underlying issue that caused the Suppression, you can remove the address from the [Email tab](/emails/suppressions), from the Contact's timeline, or from email's event.

<video
  src="https://cdn.resend.com/posts/suppression-list-support-3.mp4"
  autoPlay
  loop
  muted
  playsInline
  className="extraWidth"
/>

You can also remove items from Suppressions individually by either `email` or suppression `id` or [bulk remove 100 at a time](/docs/api-reference/suppressions/remove-suppressions).

<CodeTabs codeHeight={400}>

```nodejs
import { Resend } from 'resend';

const resend = new Resend('re_xxxxxxxxx');

// Remove by suppression id
const { data, error } = await resend.suppressions.remove('e169aa45-1ecf-4183-9955-b1499d5701d3');

// Remove by email
await resend.suppressions.remove('steve.wozniak@example.com');
```

```php
$resend = Resend::client('re_xxxxxxxxx');

// Remove by suppression id
$resend->suppressions->remove('e169aa45-1ecf-4183-9955-b1499d5701d3');

// Remove by email
$resend->suppressions->remove('steve.wozniak@example.com');
```

```python
import resend

resend.api_key = "re_xxxxxxxxx"

# Remove by suppression id
resend.Suppressions.remove("e169aa45-1ecf-4183-9955-b1499d5701d3")

# Remove by email
resend.Suppressions.remove("steve.wozniak@example.com")
```

```ruby
require "resend"

Resend.api_key = 're_xxxxxxxxx'

# Remove by suppression id
Resend::Suppressions.remove("e169aa45-1ecf-4183-9955-b1499d5701d3")

# Remove by email
Resend::Suppressions.remove("steve.wozniak@example.com")
```

```go
client := resend.NewClient("re_xxxxxxxxx")

// Remove by suppression id
client.Suppressions.Remove("e169aa45-1ecf-4183-9955-b1499d5701d3")

// Remove by email
client.Suppressions.Remove("steve.wozniak@example.com")
```

```rust
use resend_rs::{Resend, Result};

#[tokio::main]
async fn main() -> Result<()> {
  let resend = Resend::new("re_xxxxxxxxx");

  // Remove by suppression id
  let _data = resend
    .suppressions
    .remove("e169aa45-1ecf-4183-9955-b1499d5701d3")
    .await?;

  // Remove by email
  let _data = resend
    .suppressions
    .remove("steve.wozniak@example.com")
    .await?;

  Ok(())
}
```

```java
import com.resend.Resend;

Resend resend = new Resend("re_xxxxxxxxx");

// Remove by suppression id
resend.suppressions().remove("e169aa45-1ecf-4183-9955-b1499d5701d3");

// Remove by email
resend.suppressions().remove("steve.wozniak@example.com");
```

```dotnet
using Resend;

IResend resend = ResendClient.Create( "re_xxxxxxxxx" );

// Remove by suppression id
await resend.SuppressionRemoveAsync( "e169aa45-1ecf-4183-9955-b1499d5701d3" );

// Remove by email
await resend.SuppressionRemoveAsync( "steve.wozniak@example.com" );
```

```curl
# Remove by suppression id
curl -X DELETE 'https://api.resend.com/suppressions/e169aa45-1ecf-4183-9955-b1499d5701d3' \
     -H 'Authorization: Bearer re_xxxxxxxxx'

# Remove by email
curl -X DELETE 'https://api.resend.com/suppressions/steve.wozniak@example.com' \
     -H 'Authorization: Bearer re_xxxxxxxxx'
```

```cli
# Remove by suppression id
resend suppressions delete e169aa45-1ecf-4183-9955-b1499d5701d3 --yes

# Remove by email
resend suppressions delete steve.wozniak@example.com --yes
```

</CodeTabs>

<Callout>
  Removing an address from the suppression list does not guarantee delivery. If it bounces or is marked as spam again, it will be suppressed again automatically. Remember that repeated bounces harm your sender reputation.
</Callout>

## Full webhook support

For maximum visibility, we've added two new webhook events you can track:

- `suppression.added`: triggered when an address is added.
- `suppression.removed`: triggered when an address is removed.

<video
  src="https://cdn.resend.com/posts/suppression-list-support-4.mp4"
  autoPlay
  loop
  muted
  playsInline
  className="extraWidth"
/>

Listen to these events to respond in real-time within your own application.

<Callout>
The existing [`email.suppressed`](/docs/webhooks/emails/suppressed) fires whenever you send an email that is suppressed because it matches a suppression list entry.
</Callout>

## What you can build with it

- **Manual do-not-send control**: add or remove addresses yourself, individually or in bulk.
- **Sync with your own systems**: listen for the `email.suppressed` webhook to mirror suppressions in your database.
- **Audit and export**: review why an address was suppressed and export the full list from the dashboard.

## Conclusion

Suppression lists protect your sender reputation automatically, while keeping you in full control from both the dashboard and the API.

If you have any questions, please reach out to us and we'll be happy to help.
