Send emails in batch
curl --request POST \
--url https://api.torpedo.co.mz/api/v1/emails/batch \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"emails": [
{
"from": "Acme <hello@myapp.com>",
"to": "alice@example.com",
"subject": "Welcome",
"html": "<h1>Welcome!</h1>"
},
{
"from": "Acme <hello@myapp.com>",
"to": "bob@example.com",
"subject": "Welcome",
"html": "<h1>Welcome!</h1>"
}
]
}
'import requests
url = "https://api.torpedo.co.mz/api/v1/emails/batch"
payload = { "emails": [
{
"from": "Acme <hello@myapp.com>",
"to": "alice@example.com",
"subject": "Welcome",
"html": "<h1>Welcome!</h1>"
},
{
"from": "Acme <hello@myapp.com>",
"to": "bob@example.com",
"subject": "Welcome",
"html": "<h1>Welcome!</h1>"
}
] }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
emails: [
{
from: 'Acme <hello@myapp.com>',
to: 'alice@example.com',
subject: 'Welcome',
html: '<h1>Welcome!</h1>'
},
{
from: 'Acme <hello@myapp.com>',
to: 'bob@example.com',
subject: 'Welcome',
html: '<h1>Welcome!</h1>'
}
]
})
};
fetch('https://api.torpedo.co.mz/api/v1/emails/batch', 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://api.torpedo.co.mz/api/v1/emails/batch",
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' => [
[
'from' => 'Acme <hello@myapp.com>',
'to' => 'alice@example.com',
'subject' => 'Welcome',
'html' => '<h1>Welcome!</h1>'
],
[
'from' => 'Acme <hello@myapp.com>',
'to' => 'bob@example.com',
'subject' => 'Welcome',
'html' => '<h1>Welcome!</h1>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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://api.torpedo.co.mz/api/v1/emails/batch"
payload := strings.NewReader("{\n \"emails\": [\n {\n \"from\": \"Acme <hello@myapp.com>\",\n \"to\": \"alice@example.com\",\n \"subject\": \"Welcome\",\n \"html\": \"<h1>Welcome!</h1>\"\n },\n {\n \"from\": \"Acme <hello@myapp.com>\",\n \"to\": \"bob@example.com\",\n \"subject\": \"Welcome\",\n \"html\": \"<h1>Welcome!</h1>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<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))
}HttpResponse<String> response = Unirest.post("https://api.torpedo.co.mz/api/v1/emails/batch")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"emails\": [\n {\n \"from\": \"Acme <hello@myapp.com>\",\n \"to\": \"alice@example.com\",\n \"subject\": \"Welcome\",\n \"html\": \"<h1>Welcome!</h1>\"\n },\n {\n \"from\": \"Acme <hello@myapp.com>\",\n \"to\": \"bob@example.com\",\n \"subject\": \"Welcome\",\n \"html\": \"<h1>Welcome!</h1>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.torpedo.co.mz/api/v1/emails/batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"emails\": [\n {\n \"from\": \"Acme <hello@myapp.com>\",\n \"to\": \"alice@example.com\",\n \"subject\": \"Welcome\",\n \"html\": \"<h1>Welcome!</h1>\"\n },\n {\n \"from\": \"Acme <hello@myapp.com>\",\n \"to\": \"bob@example.com\",\n \"subject\": \"Welcome\",\n \"html\": \"<h1>Welcome!</h1>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "queued"
}
]
}{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "Domain not verified",
"field": "from"
}
]
}{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "Domain not verified",
"field": "from"
}
]
}{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "Domain not verified",
"field": "from"
}
]
}{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "Domain not verified",
"field": "from"
}
]
}{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "Domain not verified",
"field": "from"
}
]
}Emails
Send emails in batch
Queues up to N emails (plan-dependent) in a single request. All emails are validated
before any are queued — if any check fails the entire request is rejected.
Returns an array of { id, status } per email in the same order as the input.
Batch size limits by plan:
| Plan | Max emails per batch |
|---|---|
| Launch | 50 |
| Starter | 100 |
| Growth | 500 |
| Scale | 1,000 |
POST
/
api
/
v1
/
emails
/
batch
Send emails in batch
curl --request POST \
--url https://api.torpedo.co.mz/api/v1/emails/batch \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"emails": [
{
"from": "Acme <hello@myapp.com>",
"to": "alice@example.com",
"subject": "Welcome",
"html": "<h1>Welcome!</h1>"
},
{
"from": "Acme <hello@myapp.com>",
"to": "bob@example.com",
"subject": "Welcome",
"html": "<h1>Welcome!</h1>"
}
]
}
'import requests
url = "https://api.torpedo.co.mz/api/v1/emails/batch"
payload = { "emails": [
{
"from": "Acme <hello@myapp.com>",
"to": "alice@example.com",
"subject": "Welcome",
"html": "<h1>Welcome!</h1>"
},
{
"from": "Acme <hello@myapp.com>",
"to": "bob@example.com",
"subject": "Welcome",
"html": "<h1>Welcome!</h1>"
}
] }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
emails: [
{
from: 'Acme <hello@myapp.com>',
to: 'alice@example.com',
subject: 'Welcome',
html: '<h1>Welcome!</h1>'
},
{
from: 'Acme <hello@myapp.com>',
to: 'bob@example.com',
subject: 'Welcome',
html: '<h1>Welcome!</h1>'
}
]
})
};
fetch('https://api.torpedo.co.mz/api/v1/emails/batch', 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://api.torpedo.co.mz/api/v1/emails/batch",
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' => [
[
'from' => 'Acme <hello@myapp.com>',
'to' => 'alice@example.com',
'subject' => 'Welcome',
'html' => '<h1>Welcome!</h1>'
],
[
'from' => 'Acme <hello@myapp.com>',
'to' => 'bob@example.com',
'subject' => 'Welcome',
'html' => '<h1>Welcome!</h1>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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://api.torpedo.co.mz/api/v1/emails/batch"
payload := strings.NewReader("{\n \"emails\": [\n {\n \"from\": \"Acme <hello@myapp.com>\",\n \"to\": \"alice@example.com\",\n \"subject\": \"Welcome\",\n \"html\": \"<h1>Welcome!</h1>\"\n },\n {\n \"from\": \"Acme <hello@myapp.com>\",\n \"to\": \"bob@example.com\",\n \"subject\": \"Welcome\",\n \"html\": \"<h1>Welcome!</h1>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<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))
}HttpResponse<String> response = Unirest.post("https://api.torpedo.co.mz/api/v1/emails/batch")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"emails\": [\n {\n \"from\": \"Acme <hello@myapp.com>\",\n \"to\": \"alice@example.com\",\n \"subject\": \"Welcome\",\n \"html\": \"<h1>Welcome!</h1>\"\n },\n {\n \"from\": \"Acme <hello@myapp.com>\",\n \"to\": \"bob@example.com\",\n \"subject\": \"Welcome\",\n \"html\": \"<h1>Welcome!</h1>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.torpedo.co.mz/api/v1/emails/batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"emails\": [\n {\n \"from\": \"Acme <hello@myapp.com>\",\n \"to\": \"alice@example.com\",\n \"subject\": \"Welcome\",\n \"html\": \"<h1>Welcome!</h1>\"\n },\n {\n \"from\": \"Acme <hello@myapp.com>\",\n \"to\": \"bob@example.com\",\n \"subject\": \"Welcome\",\n \"html\": \"<h1>Welcome!</h1>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "queued"
}
]
}{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "Domain not verified",
"field": "from"
}
]
}{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "Domain not verified",
"field": "from"
}
]
}{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "Domain not verified",
"field": "from"
}
]
}{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "Domain not verified",
"field": "from"
}
]
}{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "Domain not verified",
"field": "from"
}
]
}Authorizations
Prefix tor_ followed by a base64url-encoded random key.
Create and manage API keys from the authenticated Torpedo dashboard.
Headers
Unique key for replaying the original accepted response without sending again. Leading and trailing whitespace is removed; only the first 255 characters are retained.
Body
application/json
Required array length:
1 - 1000 elementsShow child attributes
Show child attributes
Response
All emails queued for delivery
Show child attributes
Show child attributes