Logs
O registro de cada requisição feita com uma chave de API e de cada envio por SMTP.
Cada requisição feita com uma chave de API, e cada mensagem recebida pelo SMTP, fica registrada com o corpo enviado e a resposta. Conteúdos de anexos e textos com mais de 5.000 caracteres são cortados. Requisições feitas pelo painel não entram nos logs. Os logs ficam guardados por 30 dias. Um envio por SMTP aparece com method SMTP e endpoint /smtp: o corpo traz o remetente, os destinatários do envelope, o assunto, o tamanho e a quantidade de anexos, e a resposta traz o id do e-mail (ou o motivo da recusa).
#Listar logs
GET/logs
Parâmetros de consulta
limitintegerDe 1 a 100. Padrão: 20.afterstringCursor da próxima página.beforestringCursor da página anterior.statusstringStatus HTTP ou faixas separados por vírgula, como4xx,500.methodstringMétodos separados por vírgula, comoPOST,PATCH. Envios SMTP usam o métodoSMTP.sourcestringapiousmtp.user_agentstringParte do User-Agent.api_key_idstringSó requisições de uma chave.searchstringBusca no caminho, como/emails/batch.start_datestringA partir desta data (ISO 8601, inclusive). Sem fuso, vale UTC.end_datestringAté esta data (ISO 8601, inclusive). Só com a data, cobre o dia inteiro. Se vier antes destart_date, a resposta é422. Veja os filtros de data.
Erros
- 422
validation_errorAlgum campo é inválido. A mensagem diz qual.
cURL
curl 'https://api.postal.so/logs?status=4xx&source=api' \
-H "Authorization: Bearer $POSTAL_API_KEY"
Node.js
const response = await fetch('https://api.postal.so/logs?status=4xx&source=api', {
headers: {
Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
},
});
const data = await response.json();
Python
import os
import requests
response = requests.get(
"https://api.postal.so/logs",
headers={"Authorization": f"Bearer {os.environ['POSTAL_API_KEY']}"},
params={
"status": "4xx",
"source": "api",
},
timeout=10,
)
data = response.json()
PHP
$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.postal.so']);
$response = $client->get('logs', [
'headers' => ['Authorization' => 'Bearer '.getenv('POSTAL_API_KEY')],
'query' => [
'status' => '4xx',
'source' => 'api',
],
]);
$data = json_decode($response->getBody(), true);
{
"object": "list",
"has_more": false,
"data": [
{
"id": "019a1b2d-0000-7b11-a2c3-d4e5f6a7b8c9",
"created_at": "2026-10-24T13:02:11.000000Z",
"endpoint": "/emails",
"method": "POST",
"response_status": 422,
"user_agent": "node-fetch/1.0",
"api_key_id": "0199f0e2-7b8c-7d9e-8f0a-1b2c3d4e5f6a"
}
]
}
#Obter um log
GET/logs/{id}
Devolve o log com request_body (o JSON enviado, ou a query string em requisições GET) e response_body.
Parâmetros de caminho
idstringobrigatórioID do log.
Erros
- 404
not_foundO recurso não existe ou é de outro time.
cURL
curl https://api.postal.so/logs/019a1b2c-4d60-7a11-b2c3-d4e5f6a7b8c9 \
-H "Authorization: Bearer $POSTAL_API_KEY"
Node.js
const response = await fetch('https://api.postal.so/logs/019a1b2c-4d60-7a11-b2c3-d4e5f6a7b8c9', {
headers: {
Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
},
});
const data = await response.json();
Python
import os
import requests
response = requests.get(
"https://api.postal.so/logs/019a1b2c-4d60-7a11-b2c3-d4e5f6a7b8c9",
headers={"Authorization": f"Bearer {os.environ['POSTAL_API_KEY']}"},
timeout=10,
)
data = response.json()
PHP
$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.postal.so']);
$response = $client->get('logs/019a1b2c-4d60-7a11-b2c3-d4e5f6a7b8c9', [
'headers' => ['Authorization' => 'Bearer '.getenv('POSTAL_API_KEY')],
]);
$data = json_decode($response->getBody(), true);
{
"object": "log",
"id": "019a1b2c-4d60-7a11-b2c3-d4e5f6a7b8c9",
"created_at": "2026-10-24T13:02:11.000000Z",
"endpoint": "/emails",
"method": "POST",
"response_status": 200,
"user_agent": "node-fetch/1.0",
"api_key_id": "0199f0e2-7b8c-7d9e-8f0a-1b2c3d4e5f6a",
"request_body": {
"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>"
},
"response_body": {
"id": "019a1b2c-4d5e-7f60-8a9b-0c1d2e3f4a5b"
}
}