curl --request POST \
--url https://api.mail.gorillaa.one/v1/emails/batch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
[
{
"from": "[email protected]",
"to": [
"[email protected]"
],
"subject": "<string>",
"cc": [
"[email protected]"
],
"bcc": [
"[email protected]"
],
"replyTo": "[email protected]",
"html": "<string>",
"text": "<string>",
"headers": {},
"tags": [
"<string>"
],
"scheduledAt": "2023-11-07T05:31:56Z",
"idempotencyKey": "<string>",
"attachments": [
{
"filename": "<string>",
"contentType": "application/pdf",
"content": "aSDinaTvuI8gbWludGxpZnk=",
"contentId": "<string>"
}
],
"metadata": {}
}
]
'import requests
url = "https://api.mail.gorillaa.one/v1/emails/batch"
payload = [
{
"from": "[email protected]",
"to": ["[email protected]"],
"subject": "<string>",
"cc": ["[email protected]"],
"bcc": ["[email protected]"],
"replyTo": "[email protected]",
"html": "<string>",
"text": "<string>",
"headers": {},
"tags": ["<string>"],
"scheduledAt": "2023-11-07T05:31:56Z",
"idempotencyKey": "<string>",
"attachments": [
{
"filename": "<string>",
"contentType": "application/pdf",
"content": "aSDinaTvuI8gbWludGxpZnk=",
"contentId": "<string>"
}
],
"metadata": {}
}
]
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify([
{
from: '[email protected]',
to: ['[email protected]'],
subject: '<string>',
cc: ['[email protected]'],
bcc: ['[email protected]'],
replyTo: '[email protected]',
html: '<string>',
text: '<string>',
headers: {},
tags: ['<string>'],
scheduledAt: '2023-11-07T05:31:56Z',
idempotencyKey: '<string>',
attachments: [
{
filename: '<string>',
contentType: 'application/pdf',
content: 'aSDinaTvuI8gbWludGxpZnk=',
contentId: '<string>'
}
],
metadata: {}
}
])
};
fetch('https://api.mail.gorillaa.one/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.mail.gorillaa.one/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([
[
'from' => '[email protected]',
'to' => [
'[email protected]'
],
'subject' => '<string>',
'cc' => [
'[email protected]'
],
'bcc' => [
'[email protected]'
],
'replyTo' => '[email protected]',
'html' => '<string>',
'text' => '<string>',
'headers' => [
],
'tags' => [
'<string>'
],
'scheduledAt' => '2023-11-07T05:31:56Z',
'idempotencyKey' => '<string>',
'attachments' => [
[
'filename' => '<string>',
'contentType' => 'application/pdf',
'content' => 'aSDinaTvuI8gbWludGxpZnk=',
'contentId' => '<string>'
]
],
'metadata' => [
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://api.mail.gorillaa.one/v1/emails/batch"
payload := strings.NewReader("[\n {\n \"from\": \"[email protected]\",\n \"to\": [\n \"[email protected]\"\n ],\n \"subject\": \"<string>\",\n \"cc\": [\n \"[email protected]\"\n ],\n \"bcc\": [\n \"[email protected]\"\n ],\n \"replyTo\": \"[email protected]\",\n \"html\": \"<string>\",\n \"text\": \"<string>\",\n \"headers\": {},\n \"tags\": [\n \"<string>\"\n ],\n \"scheduledAt\": \"2023-11-07T05:31:56Z\",\n \"idempotencyKey\": \"<string>\",\n \"attachments\": [\n {\n \"filename\": \"<string>\",\n \"contentType\": \"application/pdf\",\n \"content\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"contentId\": \"<string>\"\n }\n ],\n \"metadata\": {}\n }\n]")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.mail.gorillaa.one/v1/emails/batch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"from\": \"[email protected]\",\n \"to\": [\n \"[email protected]\"\n ],\n \"subject\": \"<string>\",\n \"cc\": [\n \"[email protected]\"\n ],\n \"bcc\": [\n \"[email protected]\"\n ],\n \"replyTo\": \"[email protected]\",\n \"html\": \"<string>\",\n \"text\": \"<string>\",\n \"headers\": {},\n \"tags\": [\n \"<string>\"\n ],\n \"scheduledAt\": \"2023-11-07T05:31:56Z\",\n \"idempotencyKey\": \"<string>\",\n \"attachments\": [\n {\n \"filename\": \"<string>\",\n \"contentType\": \"application/pdf\",\n \"content\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"contentId\": \"<string>\"\n }\n ],\n \"metadata\": {}\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mail.gorillaa.one/v1/emails/batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"from\": \"[email protected]\",\n \"to\": [\n \"[email protected]\"\n ],\n \"subject\": \"<string>\",\n \"cc\": [\n \"[email protected]\"\n ],\n \"bcc\": [\n \"[email protected]\"\n ],\n \"replyTo\": \"[email protected]\",\n \"html\": \"<string>\",\n \"text\": \"<string>\",\n \"headers\": {},\n \"tags\": [\n \"<string>\"\n ],\n \"scheduledAt\": \"2023-11-07T05:31:56Z\",\n \"idempotencyKey\": \"<string>\",\n \"attachments\": [\n {\n \"filename\": \"<string>\",\n \"contentType\": \"application/pdf\",\n \"content\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"contentId\": \"<string>\"\n }\n ],\n \"metadata\": {}\n }\n]"
response = http.request(request)
puts response.read_body{
"data": {
"data": [
{
"index": 123,
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "queued",
"error": "<string>",
"code": "<string>"
}
],
"summary": {
"total": 123,
"successful": 123,
"failed": 123
}
}
}{
"error": {
"code": "invalid_request",
"message": "Request validation failed",
"details": {
"validation": {
"subject": [
"Subject is required"
]
}
},
"suggestion": "Check the request body against the API documentation"
}
}{
"error": {
"code": "invalid_api_key",
"message": "Invalid API key provided",
"suggestion": "Include a valid API key in the Authorization header: Bearer grl_live_..."
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Try again in 60 seconds."
}
}Send a batch of emails
Queue up to 100 emails in a single request. Each email in the batch is processed independently.
Requires email:send scope.
Returns a per-email result array with queued/scheduled status or individual error details.
curl --request POST \
--url https://api.mail.gorillaa.one/v1/emails/batch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
[
{
"from": "[email protected]",
"to": [
"[email protected]"
],
"subject": "<string>",
"cc": [
"[email protected]"
],
"bcc": [
"[email protected]"
],
"replyTo": "[email protected]",
"html": "<string>",
"text": "<string>",
"headers": {},
"tags": [
"<string>"
],
"scheduledAt": "2023-11-07T05:31:56Z",
"idempotencyKey": "<string>",
"attachments": [
{
"filename": "<string>",
"contentType": "application/pdf",
"content": "aSDinaTvuI8gbWludGxpZnk=",
"contentId": "<string>"
}
],
"metadata": {}
}
]
'import requests
url = "https://api.mail.gorillaa.one/v1/emails/batch"
payload = [
{
"from": "[email protected]",
"to": ["[email protected]"],
"subject": "<string>",
"cc": ["[email protected]"],
"bcc": ["[email protected]"],
"replyTo": "[email protected]",
"html": "<string>",
"text": "<string>",
"headers": {},
"tags": ["<string>"],
"scheduledAt": "2023-11-07T05:31:56Z",
"idempotencyKey": "<string>",
"attachments": [
{
"filename": "<string>",
"contentType": "application/pdf",
"content": "aSDinaTvuI8gbWludGxpZnk=",
"contentId": "<string>"
}
],
"metadata": {}
}
]
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify([
{
from: '[email protected]',
to: ['[email protected]'],
subject: '<string>',
cc: ['[email protected]'],
bcc: ['[email protected]'],
replyTo: '[email protected]',
html: '<string>',
text: '<string>',
headers: {},
tags: ['<string>'],
scheduledAt: '2023-11-07T05:31:56Z',
idempotencyKey: '<string>',
attachments: [
{
filename: '<string>',
contentType: 'application/pdf',
content: 'aSDinaTvuI8gbWludGxpZnk=',
contentId: '<string>'
}
],
metadata: {}
}
])
};
fetch('https://api.mail.gorillaa.one/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.mail.gorillaa.one/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([
[
'from' => '[email protected]',
'to' => [
'[email protected]'
],
'subject' => '<string>',
'cc' => [
'[email protected]'
],
'bcc' => [
'[email protected]'
],
'replyTo' => '[email protected]',
'html' => '<string>',
'text' => '<string>',
'headers' => [
],
'tags' => [
'<string>'
],
'scheduledAt' => '2023-11-07T05:31:56Z',
'idempotencyKey' => '<string>',
'attachments' => [
[
'filename' => '<string>',
'contentType' => 'application/pdf',
'content' => 'aSDinaTvuI8gbWludGxpZnk=',
'contentId' => '<string>'
]
],
'metadata' => [
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://api.mail.gorillaa.one/v1/emails/batch"
payload := strings.NewReader("[\n {\n \"from\": \"[email protected]\",\n \"to\": [\n \"[email protected]\"\n ],\n \"subject\": \"<string>\",\n \"cc\": [\n \"[email protected]\"\n ],\n \"bcc\": [\n \"[email protected]\"\n ],\n \"replyTo\": \"[email protected]\",\n \"html\": \"<string>\",\n \"text\": \"<string>\",\n \"headers\": {},\n \"tags\": [\n \"<string>\"\n ],\n \"scheduledAt\": \"2023-11-07T05:31:56Z\",\n \"idempotencyKey\": \"<string>\",\n \"attachments\": [\n {\n \"filename\": \"<string>\",\n \"contentType\": \"application/pdf\",\n \"content\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"contentId\": \"<string>\"\n }\n ],\n \"metadata\": {}\n }\n]")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.mail.gorillaa.one/v1/emails/batch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"from\": \"[email protected]\",\n \"to\": [\n \"[email protected]\"\n ],\n \"subject\": \"<string>\",\n \"cc\": [\n \"[email protected]\"\n ],\n \"bcc\": [\n \"[email protected]\"\n ],\n \"replyTo\": \"[email protected]\",\n \"html\": \"<string>\",\n \"text\": \"<string>\",\n \"headers\": {},\n \"tags\": [\n \"<string>\"\n ],\n \"scheduledAt\": \"2023-11-07T05:31:56Z\",\n \"idempotencyKey\": \"<string>\",\n \"attachments\": [\n {\n \"filename\": \"<string>\",\n \"contentType\": \"application/pdf\",\n \"content\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"contentId\": \"<string>\"\n }\n ],\n \"metadata\": {}\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mail.gorillaa.one/v1/emails/batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"from\": \"[email protected]\",\n \"to\": [\n \"[email protected]\"\n ],\n \"subject\": \"<string>\",\n \"cc\": [\n \"[email protected]\"\n ],\n \"bcc\": [\n \"[email protected]\"\n ],\n \"replyTo\": \"[email protected]\",\n \"html\": \"<string>\",\n \"text\": \"<string>\",\n \"headers\": {},\n \"tags\": [\n \"<string>\"\n ],\n \"scheduledAt\": \"2023-11-07T05:31:56Z\",\n \"idempotencyKey\": \"<string>\",\n \"attachments\": [\n {\n \"filename\": \"<string>\",\n \"contentType\": \"application/pdf\",\n \"content\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"contentId\": \"<string>\"\n }\n ],\n \"metadata\": {}\n }\n]"
response = http.request(request)
puts response.read_body{
"data": {
"data": [
{
"index": 123,
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "queued",
"error": "<string>",
"code": "<string>"
}
],
"summary": {
"total": 123,
"successful": 123,
"failed": 123
}
}
}{
"error": {
"code": "invalid_request",
"message": "Request validation failed",
"details": {
"validation": {
"subject": [
"Subject is required"
]
}
},
"suggestion": "Check the request body against the API documentation"
}
}{
"error": {
"code": "invalid_api_key",
"message": "Invalid API key provided",
"suggestion": "Include a valid API key in the Authorization header: Bearer grl_live_..."
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Try again in 60 seconds."
}
}Authorizations
API key authentication. Pass your Gorillaa Mail API key as a Bearer token.
Example: Authorization: Bearer grl_live_xxxxxxxxxxxx
Keys prefixed grl_test_ operate in test mode with reduced limits.
Body
1 - 100 elementsAn email address — either a plain string or an object with name
Primary recipients (1–50)
1 - 50 elementsAn email address — either a plain string or an object with name
1 - 99850An email address — either a plain string or an object with name
50An email address — either a plain string or an object with name
An email address — either a plain string or an object with name
HTML body (max 5MB). Either html or text is required.
5242880Plain text body (max 1MB). Either html or text is required.
1048576Custom email headers
Show child attributes
Show child attributes
Tags for categorization (max 10)
10100Schedule delivery for a future time (must be ≥1 minute in the future)
Client-generated idempotency key
255File attachments (max 10)
10Show child attributes
Show child attributes
Arbitrary metadata stored with the email
Response
Batch accepted
Show child attributes
Show child attributes