curl -X POST https://cloudapi.mailercloud.com/v1/transactional-email/suppressions \
-H "Authorization: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"emails": ["one@example.com", "two@example.com"], "scope": "marketing"}'import requests
url = "https://cloudapi.mailercloud.com/v1/transactional-email/suppressions"
payload = {
"emails": ["one@example.com", "two@example.com"],
"scope": "global"
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({emails: ['one@example.com', 'two@example.com'], scope: 'global'})
};
fetch('https://cloudapi.mailercloud.com/v1/transactional-email/suppressions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://cloudapi.mailercloud.com/v1/transactional-email/suppressions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'emails' => [
'one@example.com',
'two@example.com'
],
'scope' => 'global'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://cloudapi.mailercloud.com/v1/transactional-email/suppressions"
payload := strings.NewReader("{\n \"emails\": [\n \"one@example.com\",\n \"two@example.com\"\n ],\n \"scope\": \"global\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"added": 1,
"skipped": 1,
"duplicates": 0,
"data": [
{
"email": "one@example.com",
"reason": "manual",
"source": "api",
"scope": "marketing",
"smtp_response": "",
"date_added": 1787204050,
"date_added_local": "2026-08-19 05:34:10"
}
]
}Add Suppressions
Adds one or more recipients to your suppression list. They are rejected on every future send until reactivated.
The request is all-or-nothing: if any address is not a valid email address the whole request is rejected and the offending values are named, so a typo cannot leave you believing an address is suppressed when it is not.
Each request can carry a scope. A scoped entry only takes effect once your account’s suppression policy is stream-scoped; until then every entry blocks all sends.
Sample Code
curl -X POST https://cloudapi.mailercloud.com/v1/transactional-email/suppressions \
-H "Authorization: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"emails": ["one@example.com", "two@example.com"], "scope": "marketing"}'import requests
url = "https://cloudapi.mailercloud.com/v1/transactional-email/suppressions"
payload = {
"emails": ["one@example.com", "two@example.com"],
"scope": "global"
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({emails: ['one@example.com', 'two@example.com'], scope: 'global'})
};
fetch('https://cloudapi.mailercloud.com/v1/transactional-email/suppressions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://cloudapi.mailercloud.com/v1/transactional-email/suppressions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'emails' => [
'one@example.com',
'two@example.com'
],
'scope' => 'global'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://cloudapi.mailercloud.com/v1/transactional-email/suppressions"
payload := strings.NewReader("{\n \"emails\": [\n \"one@example.com\",\n \"two@example.com\"\n ],\n \"scope\": \"global\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"added": 1,
"skipped": 1,
"duplicates": 0,
"data": [
{
"email": "one@example.com",
"reason": "manual",
"source": "api",
"scope": "marketing",
"smtp_response": "",
"date_added": 1787204050,
"date_added_local": "2026-08-19 05:34:10"
}
]
}Authorizations
Your Mailercloud API key (plain text, no Bearer prefix). Create keys in Settings → API.
Body
The addresses to suppress.
["one@example.com", "two@example.com"]
The scope applied to every address in this request. global (the default) blocks all sends. marketing or transactional block only that stream once your account's suppression policy is set to stream-scoped (Settings → Suppression); under the default account-wide policy every entry blocks all sends regardless of scope. An omitted or unrecognised value falls back to global — a suppression is never silently narrowed.
global, marketing, transactional