Documentação da API
Envie e receba e-mails, gerencie domínios e acompanhe cada entrega com uma API REST simples, em português e com dados no Brasil.
#Visão geral
A API da Postal é uma API REST com JSON. Você envia e-mails transacionais, recebe mensagens nas suas inboxes, gerencia domínios, templates, webhooks e a lista de supressão, cuida da audiência de marketing (contatos, segmentos, tópicos e formulários de inscrição), envia campanhas, monta automações a partir de eventos do seu produto e consulta logs e métricas, tudo com uma chave de API. Quem prefere SMTP usa a mesma chave em smtp.postal.so.
- Primeiros passosVerifique um domínio, crie uma chave e envie o primeiro e-mail em cinco minutos.
- AutenticaçãoChaves de acesso total ou só de envio, restritas a um domínio.
- WebhooksReceba entregas, bounces, aberturas e e-mails recebidos em tempo real.
- SMTPPara sistemas que só falam SMTP:
smtp.postal.socom a sua chave. - Domínios e DNSOs registros DKIM, SPF e MX, região de envio e rastreamento.
- ErrosO formato das respostas de erro e o que fazer com cada uma.
#URL base
Todas as requisições vão para:
https://api.postal.so
Use sempre HTTPS. O corpo das requisições e das respostas é JSON (Content-Type: application/json), em UTF-8. A exceção é o upload de imagens, em multipart/form-data, e as mensagens originais (/raw), em texto puro.
#Sua primeira requisição
Com uma chave em POSTAL_API_KEY e um domínio verificado, um envio é só isto:
cURL
curl -X POST https://api.postal.so/emails \
-H "Authorization: Bearer $POSTAL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "Loja Exemplo <[email protected]>",
"to": ["[email protected]"],
"subject": "Seu pedido #10482 saiu para entrega",
"html": "<p>O pedido <b>#10482</b> está a caminho.</p>"
}'
Node.js
const response = await fetch('https://api.postal.so/emails', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
from: 'Loja Exemplo <[email protected]>',
to: ['[email protected]'],
subject: 'Seu pedido #10482 saiu para entrega',
html: '<p>O pedido <b>#10482</b> está a caminho.</p>',
}),
});
const data = await response.json();
Python
import os
import requests
response = requests.post(
"https://api.postal.so/emails",
headers={"Authorization": f"Bearer {os.environ['POSTAL_API_KEY']}"},
json={
"from": "Loja Exemplo <[email protected]>",
"to": ["[email protected]"],
"subject": "Seu pedido #10482 saiu para entrega",
"html": "<p>O pedido <b>#10482</b> está a caminho.</p>",
},
timeout=10,
)
data = response.json()
PHP
$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.postal.so']);
$response = $client->post('emails', [
'headers' => ['Authorization' => 'Bearer '.getenv('POSTAL_API_KEY')],
'json' => [
'from' => 'Loja Exemplo <[email protected]>',
'to' => ['[email protected]'],
'subject' => 'Seu pedido #10482 saiu para entrega',
'html' => '<p>O pedido <b>#10482</b> está a caminho.</p>',
],
]);
$data = json_decode($response->getBody(), true);
{
"id": "019a1b2c-4d5e-7f60-8a9b-0c1d2e3f4a5b"
}
O passo a passo completo, com o cadastro do domínio e da chave, está em Primeiros passos.
#Convenções
- IDs são UUIDs ordenados pelo tempo, como
019a1b2c-4d5e-7f60-8a9b-0c1d2e3f4a5b. - Datas vêm em ISO 8601, em UTC (
2026-10-24T13:02:11.000000Z). Nas que você envia, inclua o fuso, como2026-10-25T09:00:00-03:00. - Objetos trazem o campo
object(email,domain,list…), que diz o que é a resposta. - Listas usam paginação por cursor, com
has_more. - Exclusões respondem
{"object": "…", "id": "…", "deleted": true}. - Erros seguem sempre o formato
{"statusCode", "name", "message"}. Veja Erros. - As mensagens de erro e os nomes de campos são em inglês, para facilitar a busca e a integração.
#Recursos da API
A referência está agrupada por recurso. Cada endpoint traz os parâmetros, exemplos em cURL, Node.js, Python e PHP, a resposta e os erros possíveis.
#Retenção de dados
E-mails enviados (com conteúdo, anexos e eventos), entregas de webhooks e logs da API ficam guardados por 30 dias. Depois disso, são apagados automaticamente. Se você precisa de histórico mais longo, guarde os eventos que recebe pelos webhooks ou use as exportações.