Documentação interativa · Portal de programadores · Especificação OpenAPI · EN · FR · DE · IT · PT · ES
URL de base : https://api.mailpro.com/v2
A API Email v2 da Mailpro™ permite-lhe gerir programaticamente listas de contactos, modelos de email, endereços de remetente e campanhas — e enviar emails em massa e transacionais.
Cada endpoint aceita três métodos de autenticação. Utilize o que melhor se adequar à sua stack.
POST /token, sem scopes.> O Bearer JWT legado e IdClient+ApiKey continuam a funcionar sem alterações e não estão > sujeitos aos scopes. Apenas os tokens de acesso OAuth 2.0 estão sujeitos aos controlos de scope por endpoint > indicados em cada operação abaixo.
A Mailpro utiliza um único servidor de autorização OAuth 2.0 para todas as suas API, numa superfície única e independente da versão: https://api.mailpro.com/oauth/. Não existe um endpoint OAuth por versão — obtém um token em /oauth/token e o mesmo token funciona nesta API Email v2, na CRM v3 e na SMS. Os endpoints que pode invocar dependem dos scopes do token, não do URL base da API. Emissor (claim iss): https://api.mailpro.com/oauth/.
| Endpoint | URL |
|---|---|
| Autorização | GET https://api.mailpro.com/oauth/authorize |
| Token / renovação | POST https://api.mailpro.com/oauth/token |
| JWKS | GET https://api.mailpro.com/oauth/.well-known/jwks |
| Descoberta | GET https://api.mailpro.com/oauth/.well-known/openid-configuration |
Grants: authorization_code + PKCE (S256, obrigatório), client_credentials, refresh_token (rotação). Duração do token de acesso: 20 min; token de atualização: 30 dias (deslizantes, de utilização única); código de autorização: 60 s.
Início rápido — obter um token e invocar esta API (substitua os valores; nunca faça commit de um segredo real):
curl -X POST https://api.mailpro.com/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET" \
-d "scope=email:send email:read"
Invoque depois esta API com Authorization: Bearer ACCESS_TOKEN. O mesmo token funciona nas API CRM v3 e SMS. Um token a que falte o scope exigido por um endpoint recebe 403 insufficient_scope. Percurso completo e catálogo de scopes: consulte a documentação da API CRM v3 › Autenticação. Scopes úteis para o email: email:send, email:read, email:templates:read, email:templates:write, contacts:read, contacts:write, account:read.
Authorization: Bearer <access_token>
Obtenha um token através de POST /token (codificado como formulário, OAuth2 password grant):
POST https://api.mailpro.com/v2/token
Content-Type: application/x-www-form-urlencoded
grant_type=password&username=YOUR_USERNAME&password=YOUR_API_KEY
O mesmo token também é válido na API CRM v3 e na API SMS — autentique-se uma vez, invoque qualquer API. Os tokens são válidos por 30 dias por predefinição; utilize grant_type=refresh_token para renovar sem ter de se autenticar novamente. Sem scopes — prefira OAuth 2.0 para as integrações instaláveis.
Duas credenciais:
| Parâmetro | Tipo | Descrição |
|---|---|---|
IdClient | integer | O seu ID numérico de cliente Mailpro, disponível em Definições → Acesso à API |
ApiKey | string | A sua chave de API, disponível em Definições → Acesso à API |
Envie-as num destes locais — escolha um:
IdClient: 12345 e ApiKey: a1b2c3d4-…. Os URLs são registados pelos servidores web, CDN e proxies, pelo que uma chave na query string pode ser exposta nos registos de acesso. Os cabeçalhos não são registados.?IdClient=12345&ApiKey=…. Mantida por questões de retrocompatibilidade com integrações existentes. Mude para cabeçalhos assim que puder.IdClient=12345&ApiKey=… em application/x-www-form-urlencoded.Se fornecer credenciais em mais do que um local, o cabeçalho prevalece.
Para os tokens emitidos por OAuth, cada grupo de endpoints exige um scope (a autenticação legada está isenta). Cada operação indica o seu scope em Authorization. Resumo:
| Endpoints | Scope exigido |
|---|---|
/send/* (campanhas, transacional, agendamento, teste — exceto /send/{IdSend}/status) | email:send |
/stats/* (exceto /stats/del), /history/list, /send/{IdSend}/status | email:read |
/message/*, /senderEmail/* (leitura) | email:templates:read |
/message/*, /senderEmail/* (add/edit/del), /stats/del | email:templates:write |
/list/list, /email/list | contacts:read |
/list/{add,edit,del}, /email/{add,addSingle,edit,del}, /import/upload | contacts:write |
/account/* | account:read |
Uma recusa por scope devolve 403 com { "error": "insufficient_scope", "required_scope": "…" }.
Todos os endpoints suportam json (predefinido) e xml. Indique o formato no URL:
/email/list.json/email/list.xmlMesma regra nas três API Mailpro (Email v2, CRM v3, SMS): 5000 itens por página, por predefinição e no máximo.
numberOfRecords — itens por página. Ausente, 0 ou acima de 5000 = 5000.pageNumber — número de página a partir de 1 (predefinição 1).bodyHTML=true) devolvem 10 itens por página./email/list acrescenta X-Total-Count (o total real) e X-Truncated: true quando restam contactos para além da página.Parâmetros desconhecidos: são ignorados, nunca recusados. Quando um pedido contém um parâmetro que a API não reconhece, a resposta inclui X-Ignored-Parameters (os nomes) e X-Documentation (uma ligação para esta página), para que um erro de escrita não passe despercebido.
| HTTP | Significado |
|---|---|
| 400 | Pedido inválido — parâmetro obrigatório em falta ou inválido |
| 401 | Não autorizado — IdClient ou ApiKey inválido |
| 403 | Proibido — limite da conta atingido (ex.: número máximo de listas) |
| 404 | Não encontrado — o recurso solicitado não existe |
| 500 | Erro interno do servidor |
Erros resultantes de regras de negócio:
"Not enough credit available." → 403 — a sua conta não tem créditos de email disponíveis"Email address unsubscribed." → 400 — o destinatário cancelou a subscriçãoCada email enviado individualmente (POST /send/sendmail, a CRM API v3, o relay SMTP ou uma automação) recebe um identificador. Pode ser acompanhado até o servidor do destinatário o aceitar ou recusar. As campanhas não são abrangidas aqui: utilize as estatísticas.
POST /send/sendmail.{format} contém o identificador do envio.email.delivered e email.bounced enviam o estado final para o seu servidor assim que é conhecido, sem qualquer consulta.GET /send/{IdSend}/status.{format} devolve o estado atual (tabela abaixo).status | Significado | Final? |
|---|---|---|
queued | Aceite, à espera de envio. | não |
scheduled | Agendado para mais tarde (DatePlanned). | não |
sent | Entregue pelos nossos servidores, ainda sem resposta do servidor do destinatário. | não |
delivered | Aceite pelo servidor do destinatário (DiagCode = a sua resposta SMTP). | sim |
bounced | Recusado. BounceType: hard = endereço inválido ou recusa definitiva; soft = recusa após novas tentativas (caixa cheia, servidor inacessível…). | sim |
not_found | Identificador desconhecido ou que não pertence à sua conta. | sim |
Consultar sem entrar em ciclo
delivered aparece cerca de 5 minutos após a entrega.Retry-After (o número de segundos a aguardar), e a chamada não conta para a sua quota.scheduled: não é preciso consultar antes de DatePlanned.Os estados são conservados durante 365 dias.
A Mailpro™ pode notificar o seu servidor em tempo real quando determinados eventos ocorrem na sua conta (um email é entregue, uma campanha termina, um contacto devolve, etc.). Ao estilo da Stripe — o seu URL recebe um POST assinado com HMAC-SHA256 assim que o evento é disparado.
Cada evento enviado para o seu webhook conta como 1 pedido na sua quota de pedidos à API.
POST /webhooks. A resposta contém um secret apresentado uma única vez (ao estilo Stripe / GitHub) — guarde-o.secret (excertos abaixo).> ⏱ Atraso de ativação — após criar, atualizar ou eliminar um webhook, a > alteração demora até 10 minutos a propagar-se pelos servidores da API > Mailpro. Durante essa janela, os eventos poderão ainda não corresponder à sua nova subscrição > (ou continuar a corresponder a uma que acabou de ser removida). Este é o tempo necessário para > atualizar a cache em memória das subscrições em cada instância da API.
Todos os eventos partilham um envelope comum:
{
"id": "evt_8f3a9b2c4d1e5f6789abcdef01234567",
"type": "email.delivered",
"created": 1748194800,
"apiVersion": "v2",
"account": { "id": 12345, "name": "ACME Corp" },
"data": { "messageId": "...", "email": "[email protected]", "...": "..." }
}
| Campo | Formato | Descrição |
|---|---|---|
id | evt_ + 32 hex | ID único do evento — utilize-o como chave de idempotência no seu lado. |
type | <domain>.<verb> | Tipo de evento canónico. |
created | Segundos Unix UTC | Incluído na assinatura HMAC. |
apiVersion | "v2" | Qual a API Mailpro que publicou o evento. |
account.id | int | O seu ID de cliente Mailpro (= IdClient). |
account.name | string | O nome da sua conta (útil para depuração no cliente). |
data | object | Payload do evento — o formato depende do type (consulte o catálogo abaixo). |
| Evento | Gatilho | Formato de data |
|---|---|---|
ping | Teste através de POST /webhooks/{id}/test | { message } |
email.processed | Envio aceite pelo pipeline | { messageId, email, campaignId, processedAt } |
email.delivered | Um e-mail individual foi aceite pelo servidor do destinatário — API v2/v3, SMTP ou Automation (não campanhas). Emitido a partir do fluxo de entrega do PowerMTA. | { messageId, email, idSending, sendingType, diagCode, deliveredAt } |
email.opened | Pixel de rastreio acionado | { messageId, email, campaignId, openedAt, ip, userAgent } |
email.clicked | Clique numa hiperligação rastreada | { messageId, email, campaignId, clickedAt, url, ip, userAgent } |
email.bounced | Devolução definitiva ou temporária | { messageId, email, campaignId, bouncedAt, bounceType, reason } |
email.spam_report | Queixa FBL | { messageId, email, campaignId, reportedAt } |
email.unsubscribed | Hiperligação de cancelamento clicada | { messageId, email, campaignId, unsubscribedAt } |
email.dropped | Recusado antes do envio | { messageId, email, campaignId, droppedAt, reason } |
campaign.started | Início do envio | { campaignId, name, totalRecipients, startedAt } |
campaign.finished | Todos os destinatários processados | { campaignId, name, totalSent, totalFailed, finishedAt } |
credits.low | Saldo de créditos de email abaixo do seu limiar de alerta | { remaining, threshold } |
Subscreva todos os eventos desta API passando ["*"] no array events.
Cada POST transporta um cabeçalho X-Mailpro-Signature:
X-Mailpro-Signature: t=1748194800,v1=7f9ac2b6e4d1c8a3...
X-Mailpro-Event-Id: evt_8f3a9b2c4d1e5f6789abcdef01234567
X-Mailpro-Event-Type: email.delivered
X-Mailpro-Attempt: 1
Para verificar:
t e v1 do cabeçalho.|now - t| > 300 (janela de proteção contra replay de 5 minutos).expected = hex(HMAC_SHA256(secret, t + "." + raw_body)).v1 com expected (crypto.timingSafeEqual, hash_equals, CryptographicOperations.FixedTimeEquals) — nunca ==.const crypto = require('crypto');
function verifyMailproSignature(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(',').map(p => p.split('=')));
if (Math.abs(Date.now() / 1000 - parseInt(parts.t)) > 300) return false;
const expected = crypto
.createHmac('sha256', secret)
.update(parts.t + '.' + rawBody)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(parts.v1, 'hex'),
Buffer.from(expected, 'hex'));
}
function verifyMailproSignature(string $rawBody, string $header, string $secret): bool {
parse_str(str_replace(',', '&', $header), $p);
if (abs(time() - (int)$p['t']) > 300) return false;
$expected = hash_hmac('sha256', $p['t'] . '.' . $rawBody, $secret);
return hash_equals($expected, $p['v1']);
}
import hmac, hashlib, time
def verify_mailpro_signature(raw_body: bytes, header: str, secret: str) -> bool:
parts = dict(p.split('=') for p in header.split(','))
t = int(parts['t'])
if abs(time.time() - t) > 300:
return False
expected = hmac.new(
secret.encode(),
f"{t}.".encode() + raw_body,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, parts['v1'])
using System.Security.Cryptography;
using System.Text;
static bool VerifyMailproSignature(string rawBody, string header, string secret) {
var parts = header.Split(',')
.Select(p => p.Split('='))
.ToDictionary(a => a[0], a => a[1]);
var t = long.Parse(parts["t"]);
if (Math.Abs(DateTimeOffset.UtcNow.ToUnixTimeSeconds() - t) > 300) return false;
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes($"{t}.{rawBody}"));
var expected = Convert.ToHexString(hash).ToLowerInvariant();
return CryptographicOperations.FixedTimeEquals(
Encoding.UTF8.GetBytes(expected),
Encoding.UTF8.GetBytes(parts["v1"]));
}
| Tentativa | Atraso até à próxima tentativa |
|---|---|
| 1 → 2 | 10 segundos |
| 2 → 3 | 1 minuto |
| 3 → 4 | 5 minutos |
| 4 → 5 | 30 minutos |
| 5 → 6 | 2 horas |
| 6 → 7 | 6 horas |
| 7 | abandonado (entrega marcada como failed) |
Após 10 falhas consecutivas no mesmo webhook, este é automaticamente desativado (isActive: false) e recebe uma notificação por email. Reative-o com PUT /webhooks/{id} assim que o seu endpoint estiver corrigido.
Apenas consideramos o seu webhook bem-sucedido se devolver um estado em 200–299. Qualquer 3xx/4xx/5xx ou um timeout (> 10 s) conta como falha e despoleta retentativas. Se o seu endpoint estiver permanentemente desativado, devolva 410 Gone explicitamente — as retentativas continuam a ocorrer, mas o motivo da falha fica mais claro no seu registo de entregas.
| Limite | Valor |
|---|---|
| Webhooks por conta | 20 |
| Eventos subscritos por webhook | 50 |
| Tamanho máximo do payload | 256 KB |
| Timeout HTTP por tentativa | 10 segundos |
| Retenção do histórico de entregas | 30 dias |
Obtenha um token JWT Bearer para autenticar todas as outras chamadas à API. O endpoint /token da v2 é um redirecionamento 307 para o emissor canónico /v3/token — o seu cliente HTTP segue o redirecionamento de forma transparente (o método POST e o corpo são preservados).
/tokenObter token de acesso (redirecionamento 307 para /v3/token)
Obtém um token JWT Bearer utilizando as credenciais de cliente Mailpro. Indique o access_token devolvido como Authorization: Bearer <token> em todos os pedidos subsequentes. O mesmo token também é válido na API CRM v3 e na API SMS.
> ⚙ Detalhe de implementação — POST /v2/token é um redirecionamento 307 > temporário para POST /v3/token (configurado na camada de reescrita do IIS > web.config). O HTTP 307 preserva tanto o método (POST) como > o corpo do pedido, pelo que qualquer cliente HTTP em conformidade com a norma segue > o redirecionamento de forma transparente — continua a fazer POST para /v2/token e recebe > um JWT válido. Não existe lógica duplicada de emissão de tokens; a > API Email v2 nunca emite tokens por si própria.
| Tipo de concessão | Caso de utilização |
|---|---|
password | Integração padrão — nome de utilizador + chave de API |
refresh_token | Renovar um token de acesso prestes a expirar sem voltar a autenticar |
client_credentials | Servidor para servidor apenas com o ID de cliente |
Utilize grant_type=refresh_token para renovar o token de acesso sem voltar a autenticar. Armazene os tokens do lado do servidor (Vault, variáveis de ambiente); nunca os incorpore em JavaScript de browser ou em binários de aplicações móveis. Consulte a nota de segurança completa na documentação do /token da API CRM v3.
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
grant_type | string: password, refresh_token, client_credentials | sim | |
username | string | O seu nome de utilizador Mailpro (email). Obrigatório para a concessão password. | |
password | string | A sua chave de API Mailpro (formato GUID). Obrigatória para a concessão password. | |
refresh_token | string | Token de atualização anterior. Obrigatório para a concessão refresh_token. | |
client_id | string | O seu ID de cliente Mailpro (inteiro). Obrigatório para a concessão client_credentials. |
Respostas
| Código | Descrição |
|---|---|
200 | Token emitido com sucesso. Devolvido por POST /v3/token após o
encaminhamento 307 transparente — o seu cliente HTTP vê um 200 normal com
o mesmo formato de corpo que receberia diretamente do endpoint de
token v3.
|
307 | Redirecionamento temporário para POST /v3/token, emitido pela regra de reescrita
do IIS em web.config. Os clientes HTTP em conformidade com a norma seguem este redirecionamento
automaticamente e preservam o método POST original + o corpo de formulário.
Visível apenas para clientes que desativem explicitamente o seguimento de redirecionamentos
(por exemplo, curl --max-redirs 0).
|
400 | Credenciais inválidas ou tipo de concessão não suportado |
Exemplo 200
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "bearer",
"expires_in": 31535999,
"userName": "12345",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"application": null
}
Exemplo 400
{
"error": "invalid_grant",
"error_description": "The username or password is incorrect."
}
Verifique o saldo de créditos de email, a quota mensal da API e o estado da subscrição.
/account/credits.{format}Obter saldo de créditos de email
Devolve o saldo de créditos de email restantes da sua conta Mailpro. Cada email enviado consome um crédito. Os créditos não expiram com a subscrição, mas só podem ser utilizados enquanto a subscrição estiver ativa.
Scope OAuth : account:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Respostas
| Código | Descrição |
|---|---|
200 | Saldo de créditos devolvido com sucesso |
401 | Credenciais inválidas |
Exemplo 200
{
"Credits": 48500
}
/account/subscriptionEndDate.{format}Obter data de fim da subscrição
Devolve a data de expiração da subscrição Mailpro atual. Após a data de expiração, os envios são bloqueados até que a subscrição seja renovada.
Scope OAuth : account:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Respostas
| Código | Descrição |
|---|---|
200 | Data de fim da subscrição devolvida com sucesso |
401 | Credenciais inválidas |
Exemplo 200
{
"SubscriptionEndDate": "2027-01-15T00:00:00"
}
/account/limits.{format}Obter quota mensal da API
Devolve a quota mensal de pedidos à API do cliente autenticado.
Cálculo da quota: o limite é calibrado a partir dos créditos de subscrição de email (normalmente créditos_de_subscrição × 5). Para um plano de 10 000 emails por mês, isto resulta num orçamento mensal de 50 000 pedidos. Reinicia na data de aniversário da subscrição (não no dia 1 do mês de calendário).
O que consome créditos:
v2, v3 ou sms.O que é GRATUITO (não consome créditos):
/health.401, 403 ou 429.A quota é partilhada por todas as 3 APIs Mailpro (v2, v3, sms) — um cliente = um orçamento mensal em toda a plataforma.
Scope OAuth : account:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Respostas
| Código | Descrição |
|---|---|
200 | Instantâneo da quota |
401 | Credenciais inválidas |
404 | Nenhum registo de quota encontrado (conta recém-criada; a linha será criada no primeiro pedido autenticado). |
Exemplo 200
{
"MonthlyLimit": 50000,
"Remaining": 32847,
"Used": 17153,
"IsFree": false,
"RemainedSendsForFree": 0
}
Gira listas (listas de contactos). Uma lista agrupa contactos para campanhas em massa. Máximo de 1000 listas por conta (mesmo limite nas três API Mailpro e na app). Type 0 = lista padrão. Type 1 = lista negra (utilizada para gestão de cancelamentos de subscrição).
/list/list.{format}Listar todas as listas
Devolve todas as listas da conta, ordenadas por data de criação (mais recentes primeiro), a menos que sortByName=true esteja definido. Utilize type=0 para listas normais ou type=1 para listas negras.
> Alias legado: /addressbook/list.{format} — mesmo endpoint, mantido por compatibilidade > retroativa. As novas integrações devem utilizar /list/*.
Scope OAuth : contacts:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
titleFilter | query | string | Filtrar por título (correspondência parcial, sem distinção entre maiúsculas e minúsculas) | |
type | query | integer: 0, 1 | 0 = apenas listas padrão, 1 = apenas listas negras. Omitir para devolver todas. | |
numberOfRecords | query | integer | Itens por página — 5000 por predefinição e no máximo (ver Paginação). | |
pageNumber | query | integer | Número da página (começa em 1). O valor predefinido é 1. | |
sortByName | query | boolean | Defina como true para ordenar os resultados alfabeticamente por título |
Respostas
| Código | Descrição |
|---|---|
200 | Listas devolvidas com sucesso.
> A resposta contém também um campo duplicado legado AddressBookList (conteúdo idêntico)
> e cada item tem um AddressBookID duplicado legado (idêntico a ListID). As novas
> integrações devem ignorá-los.
|
401 | Credenciais inválidas |
Exemplo 200
{
"Lists": [
{
"ListID": 101,
"Title": "Newsletter — France",
"Type": 0,
"NumberEmails": 4521,
"CreationDate": "2025-01-15T10:30:00"
},
{
"ListID": 102,
"Title": "Unsubscribers",
"Type": 1,
"NumberEmails": 312,
"CreationDate": "2025-01-15T10:31:00"
}
]
}
/list/add.{format}Criar uma lista
Cria uma nova lista (lista de contactos). A lista começa vazia — adicione contactos com /email/add ou /email/addSingle. Máximo de 1000 listas por conta (mesmo limite nas três API Mailpro e na app). Devolve HTTP 422 se o limite for atingido.
> Alias legado: /addressbook/add.{format} — mesmo endpoint, mantido por compatibilidade retroativa.
Scope OAuth : contacts:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
Title | string | sim | Nome visível da nova lista |
Type | integer: 0, 1 | 0 = lista padrão (predefinido), 1 = lista negra |
Respostas
| Código | Descrição |
|---|---|
200 | Lista criada com sucesso.
> Também é devolvido um campo duplicado legado AddressBookList (conteúdo idêntico).
|
400 | Title em falta |
401 | Credenciais inválidas |
422 | Limite de listas (1000) atingido |
Exemplo 200
{
"Lists": [
{
"ListID": 103,
"Title": "Spring Campaign 2026",
"Type": 0,
"NumberEmails": 0,
"CreationDate": "2026-04-14T12:00:00"
}
]
}
/list/edit.{format}Renomear uma lista
Atualiza o título de uma lista existente. Os contactos dentro da lista não são afetados.
> Alias legado: /addressbook/edit.{format} — mesmo endpoint, mantido por compatibilidade retroativa. > O nome de parâmetro AddressBookID também é aceite como alias legado de ListID.
Scope OAuth : contacts:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
ListID | integer | sim | ID da lista a renomear (a partir de /list/list). O alias legado AddressBookID também é aceite. |
Title | string | sim | Novo título para a lista |
Respostas
| Código | Descrição |
|---|---|
200 | Lista renomeada com sucesso |
400 | ListID ou Title em falta |
401 | Credenciais inválidas |
404 | Lista não encontrada |
/list/del.{format}Eliminar uma lista
Elimina permanentemente uma lista e todos os contactos que contém. Esta ação não pode ser anulada.
> Alias legado: /addressbook/del.{format} — mesmo endpoint, mantido por compatibilidade retroativa. > O nome de parâmetro AddressBookID também é aceite como alias legado de ListID.
Scope OAuth : contacts:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
ListID | integer | sim | ID da lista a eliminar. O alias legado AddressBookID também é aceite. |
Respostas
| Código | Descrição |
|---|---|
200 | Lista eliminada com sucesso |
400 | ListID em falta |
401 | Credenciais inválidas |
404 | Lista não encontrada |
Exemplo 200
{
"Result": "OK"
}
Gira contactos de email individuais. Os contactos pertencem a uma ou mais listas. Utilize a importação em massa (/email/add) para grandes lotes, ou a adição de contacto único (/email/addSingle) para inscrições individuais com valores de campos personalizados.
/email/list.{format}Listar contactos
Devolve uma lista paginada de contactos de email da conta. Filtre por lista ou por padrão de email. Os resultados são ordenados alfabeticamente quando sortByName=true, caso contrário, por ordem de inserção.
Scope OAuth : contacts:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
emailFilter | query | string | Filtrar por endereço de email (correspondência parcial, sem distinção entre maiúsculas e minúsculas) | |
listId | query | integer | Devolver apenas contactos nesta lista. O alias legado addressBookId também é aceite. | |
numberOfRecords | query | integer | Itens por página — 5000 por predefinição e no máximo (ver Paginação). | |
pageNumber | query | integer | Número da página (começa em 1). O valor predefinido é 1. | |
sortByName | query | boolean | Defina como true para ordenar os resultados alfabeticamente por endereço de email |
Respostas
| Código | Descrição |
|---|---|
200 | Lista de contactos devolvida com sucesso |
401 | Credenciais inválidas |
Exemplo 200
{
"Emails": [
{
"IdEmail": 10001,
"Email": "[email protected]",
"Field1": "Alice",
"Field2": "Dupont"
}
]
}
/email/add.{format}Importar contactos (em massa)
Importa um ou mais endereços de email para uma lista num único pedido. Indique os endereços em EmailList separados por ponto e vírgula.
Exemplo: [email protected];[email protected];[email protected]
Este endpoint só importa endereços de email. Para definir também valores de campos personalizados, utilize antes /email/addSingle para cada contacto.
Os endereços previamente cancelados da subscrição são ignorados silenciosamente, a menos que Force=1 seja definido.
Seleção da lista: indique ListId (ou o seu alias legado AddressBookId). É obrigatório indicar pelo menos um.
Scope OAuth : contacts:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
ListId | integer | ID da lista de destino. O alias legado AddressBookId também é aceite. | |
EmailList | string | sim | Endereços de email a importar, separados por ponto e vírgula |
Force | integer: 0, 1 | Defina como 1 para reimportar endereços que tinham cancelado anteriormente a subscrição.
Valor predefinido: 0 (os endereços com cancelamento são ignorados).
|
Respostas
| Código | Descrição |
|---|---|
200 | Contactos importados com sucesso |
400 | EmailList em falta |
401 | Credenciais inválidas |
Exemplo 200
{
"Result": "3 contacts imported"
}
/email/addSingle.{format}Adicionar um único contacto
Adiciona um contacto a uma lista com valores opcionais para campos personalizados.
Field1 a Field25 correspondem às definições de colunas personalizadas da sua lista. O mapeamento depende da ordem em que as colunas foram definidas — verifique as definições da lista na interface da Mailpro para ver que número de campo corresponde a cada coluna (por exemplo, Field1 = Nome, Field2 = Apelido, Field3 = Cidade…).
Seleção da lista: indique ListId (ou o seu alias legado AddressBookId).
Scope OAuth : contacts:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
ListId | integer | ID da lista de destino. O alias legado AddressBookId também é aceite. | |
Email | string | sim | Endereço de email do novo contacto |
Force | integer: 0, 1 | Defina como 1 para voltar a adicionar um endereço que tinha cancelado anteriormente a subscrição | |
Field1 | string | Valor para o campo personalizado 1 (o mapeamento das colunas depende da sua lista) | |
Field2 | string | Valor para o campo personalizado 2 | |
Field3 | string | Valor para o campo personalizado 3 | |
Field4 | string | Valor para o campo personalizado 4 | |
Field5 | string | Valor para o campo personalizado 5 |
Respostas
| Código | Descrição |
|---|---|
200 | Contacto adicionado com sucesso |
400 | Email em falta |
401 | Credenciais inválidas |
Exemplo 200
{
"EmailId": 10002,
"Email": "[email protected]",
"Field1": "Alice",
"Field2": "Dupont",
"ListID": 101
}
/email/edit.{format}Atualizar um contacto
Atualiza o endereço de email e/ou os valores dos campos personalizados de um contacto existente. Identifique o contacto pelo EmailId (a partir de /email/list). Tanto EmailId como Email são obrigatórios.
Scope OAuth : contacts:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
EmailId | integer | sim | ID do contacto a atualizar (a partir de /email/list) |
Email | string | sim | Novo endereço de email do contacto |
Field1 | string | Novo valor para o campo personalizado 1 | |
Field2 | string | Novo valor para o campo personalizado 2 | |
Field3 | string | Novo valor para o campo personalizado 3 |
Respostas
| Código | Descrição |
|---|---|
200 | Contacto atualizado com sucesso |
400 | EmailId ou Email em falta |
401 | Credenciais inválidas |
404 | Contacto não encontrado |
/email/del.{format}Eliminar um contacto
Elimina permanentemente um contacto pelo seu identificador único.
Scope OAuth : contacts:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
EmailId | integer | sim | ID do contacto a eliminar (a partir de /email/list) |
Respostas
| Código | Descrição |
|---|---|
200 | Contacto eliminado com sucesso |
400 | EmailId em falta |
401 | Credenciais inválidas |
404 | Contacto não encontrado |
Gira modelos de email em HTML. Um modelo de mensagem armazena o assunto do email, o corpo HTML e a configuração da hiperligação de cancelamento de subscrição. Os modelos são reutilizados nas várias campanhas.
/message/list.{format}Listar modelos de mensagem
Devolve os modelos de email HTML guardados para a conta. Por predefinição, o corpo HTML não é incluído na resposta para manter os payloads pequenos. Defina bodyHTML=true para o incluir (limita automaticamente os resultados a 10 por página).
Scope OAuth : email:templates:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
subjectFilter | query | string | Filtrar por assunto (correspondência parcial, sem distinção entre maiúsculas e minúsculas) | |
numberOfRecords | query | integer | Itens por página — 5000 por predefinição e no máximo (ver Paginação). | |
pageNumber | query | integer | Número da página (começa em 1). O valor predefinido é 1. | |
bodyHTML | query | boolean | Defina como true para incluir o corpo HTML completo em cada resultado.
Quando definido como true, os resultados são automaticamente limitados a 10 por página, independentemente do numberOfRecords.
|
Respostas
| Código | Descrição |
|---|---|
200 | Modelos de mensagem devolvidos com sucesso |
401 | Credenciais inválidas |
Exemplo 200
{
"MessageList": [
{
"IDMessage": 501,
"Subject": "Spring Newsletter — April 2026",
"Language": "EN",
"LinkAlign": "center",
"LinkUp": 0,
"UpdateDate": "2026-03-10T14:22:00"
}
]
}
/message/add.{format}Criar um modelo de mensagem
Cria um novo modelo de email HTML. O modelo armazena o assunto, o corpo HTML e as definições da hiperligação de cancelamento de subscrição. Uma vez criado, utilize o IDMessage devolvido ao lançar uma campanha.
Scope OAuth : email:templates:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
Subject | string | sim | Linha de assunto do email (máx. 255 caracteres) |
BodyHTML | string | sim | Conteúdo HTML completo do corpo do email |
Language | string | sim | Código de idioma para a localização da hiperligação de cancelamento de subscrição (por exemplo, EN, FR, DE) |
LinkAlign | string: left, center, right | sim | Alinhamento horizontal da hiperligação de cancelamento de subscrição |
LinkUp | integer: 0, 1 | sim | Posição da hiperligação de cancelamento de subscrição — 0 = parte inferior do email, 1 = parte superior |
Respostas
| Código | Descrição |
|---|---|
200 | Modelo de mensagem criado com sucesso |
400 | Campo obrigatório em falta |
401 | Credenciais inválidas |
Exemplo 200
{
"IDMessage": 502,
"Subject": "Spring Newsletter — April 2026",
"Language": "EN",
"LinkAlign": "center",
"LinkUp": 0
}
/message/edit.{format}Atualizar um modelo de mensagem
Atualiza o conteúdo e os metadados de um modelo de mensagem existente.
Scope OAuth : email:templates:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
MessageId | integer | sim | ID do modelo de mensagem a atualizar (a partir de /message/list) |
Subject | string | sim | Nova linha de assunto do email |
BodyHTML | string | sim | Novo conteúdo HTML do corpo do email |
Language | string | sim | Código de idioma para a localização da hiperligação de cancelamento de subscrição |
LinkAlign | string: left, center, right | sim | |
LinkUp | integer: 0, 1 | sim |
Respostas
| Código | Descrição |
|---|---|
200 | Modelo de mensagem atualizado com sucesso |
400 | Campo obrigatório em falta |
401 | Credenciais inválidas |
404 | Modelo de mensagem não encontrado |
/message/del.{format}Eliminar um modelo de mensagem
Elimina permanentemente um modelo de mensagem pelo seu identificador único. Os modelos utilizados por campanhas agendadas pendentes não podem ser eliminados.
Scope OAuth : email:templates:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
MessageId | integer | sim | ID do modelo de mensagem a eliminar (a partir de /message/list) |
Respostas
| Código | Descrição |
|---|---|
200 | Modelo de mensagem eliminado com sucesso |
400 | MessageId em falta |
401 | Credenciais inválidas |
404 | Modelo de mensagem não encontrado |
Envie campanhas de email em massa para uma lista e gira envios agendados. Uma campanha utiliza um modelo de mensagem e um endereço de remetente.
/send/list.{format}Listar campanhas agendadas
Devolve a lista das campanhas de email agendadas e recentemente processadas. Os resultados são ordenados por data de envio prevista (mais recentes primeiro).
Scope OAuth : email:send
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
subjectMessageFilter | query | string | Filtrar por assunto da campanha (correspondência parcial, sem distinção entre maiúsculas e minúsculas) | |
numberOfRecords | query | integer | Itens por página — 5000 por predefinição e no máximo (ver Paginação). | |
pageNumber | query | integer | Número da página (começa em 1). O valor predefinido é 1. |
Respostas
| Código | Descrição |
|---|---|
200 | Lista de campanhas devolvida com sucesso |
401 | Credenciais inválidas |
Exemplo 200
{
"sends": [
{
"IDSend": 3001,
"ListID": 101,
"SenderEmail": "[email protected]",
"SenderName": "Your Company Newsletter",
"DatePlanned": "2026-04-20T09:00:00",
"SubjectMessage": "Spring Newsletter — April 2026",
"NumberCredit": 4521
}
]
}
/send/campaign.{format}Lançar uma campanha
Agenda ou envia imediatamente uma campanha de email para uma lista utilizando um modelo de mensagem guardado e um endereço de remetente.
Obrigatórios:
IDMessage — o modelo a enviar (a partir de /message/list)IDEmailExp — o endereço de remetente a utilizar (a partir de /senderEmail/list)ListId — a lista de destinatários (a partir de /list/list). O alias legado IDAddressBook também é aceite.Agendamento: defina DatePlanned para uma data/hora ISO 8601 futura para agendar o envio. Omita DatePlanned para enviar imediatamente.
Acompanhamento de estatísticas: defina Campaign=1 e indique um TitleCampaign para ativar o acompanhamento de aberturas/cliques/devoluções na secção de Estatísticas.
Scope OAuth : email:send
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
ListId | integer | ID da lista de destinatários (a partir de /list/list). O alias legado IDAddressBook também é aceite. | |
IDMessage | integer | sim | ID do modelo de mensagem a enviar (a partir de /message/list) |
IDEmailExp | integer | sim | ID do endereço de email do remetente a utilizar (a partir de /senderEmail/list) |
IDUnsubscribeList | integer | Lista utilizada para recolher contactos com subscrição cancelada (lista negra).
O alias legado IDUnsubscribeAddressBook também é aceite.
| |
DatePlanned | string (date-time) | Data/hora de envio agendadas (ISO 8601). Omita para enviar imediatamente. | |
Campaign | integer: 0, 1 | Defina como 1 para acompanhar este envio como uma campanha identificada nas estatísticas | |
TitleCampaign | string | Título da campanha apresentado nas estatísticas (obrigatório quando Campaign=1) |
Respostas
| Código | Descrição |
|---|---|
200 | Campanha agendada ou enviada com sucesso.
> A resposta devolve também os aliases legados AddressBookID e UnsubscribeAddressBookID
> (idênticos a ListID / UnsubscribeListID). As novas integrações devem ignorá-los.
|
400 | IDMessage ou IDEmailExp em falta |
401 | Credenciais inválidas |
403 | Créditos de email insuficientes |
404 | Lista, mensagem ou remetente não encontrados |
Exemplo 200
{
"send": {
"IDSend": 3002,
"ListID": 101,
"UnsubscribeListID": 102,
"IDCampaign": 8001,
"SenderName": "Your Company Newsletter",
"SenderEmail": "[email protected]",
"DatePlanned": "2026-04-20T09:00:00",
"SubjectMessage": "Spring Newsletter — April 2026",
"NumberCredit": 4521
}
}
/send/del.{format}Cancelar ou eliminar uma campanha
Cancela um envio de campanha agendado e pendente, ou elimina um envio já concluído. Apenas os envios agendados para o futuro podem ser cancelados — os envios em curso não podem ser parados.
Scope OAuth : email:send
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
IdSend | integer | sim | ID do envio de campanha a cancelar ou eliminar (a partir de /send/list) |
Respostas
| Código | Descrição |
|---|---|
200 | Campanha cancelada ou eliminada com sucesso |
400 | IdSend em falta |
401 | Credenciais inválidas |
404 | Campanha não encontrada |
Exemplo 200
{
"Result": "Campaign Deleted"
}
/send/scheduled.{format}Listar as minhas campanhas de email agendadas
Devolve as campanhas de email e os envios únicos agendados para uma data futura que ainda não foram despachados. Útil antes de chamar /cancel ou /reschedule. Os registos são ordenados por DatePlanned ascendente.
Scope OAuth : email:send
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
numberOfRecords | query | integer | Itens por página — 5000 por predefinição e no máximo (ver Paginação). | |
pageNumber | query | integer | Número da página (começa em 1). O valor predefinido é 1. |
Respostas
| Código | Descrição |
|---|---|
200 | Lista de campanhas / envios agendados.
> Cada registo inclui também os aliases legados AddressBookID e
> UnsubscribeAddressBookID (idênticos a ListID / UnsubscribeListID).
|
401 | Credenciais inválidas |
Exemplo 200
{
"sends": [
{
"IDSend": 5001,
"ListID": 101,
"UnsubscribeListID": 102,
"IDCampaign": 8001,
"SenderName": "Your Company Newsletter",
"SenderEmail": "[email protected]",
"DatePlanned": "2026-05-01T09:00:00",
"SubjectMessage": "Spring Sale 2026",
"NumberCredit": 4521
}
]
}
/send/{IdSend}/cancel.{format}Cancelar uma campanha / envio agendado
Cancela um envio de email agendado (campanha ou único) que ainda não foi despachado. Se o envio já tiver sido feito (ou não existir / pertencer a outro cliente), devolve 409 Conflict.
Scope OAuth : email:send
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
IdSend | path | integer | sim |
Respostas
| Código | Descrição |
|---|---|
200 | Envio cancelado |
401 | Credenciais inválidas |
409 | Já despachado ou não encontrado |
Exemplo 200
{
"Result": "OK",
"Cancelled": 5001
}
/send/{IdSend}/reschedule.{format}Reagendar uma campanha / envio agendado
Atualiza o DatePlanned de um envio de email agendado. A nova data tem de ser futura e dentro de 90 dias.
Scope OAuth : email:send
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
IdSend | path | integer | sim |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
PlanDate | string (date-time) | sim |
Respostas
| Código | Descrição |
|---|---|
200 | Envio reagendado |
400 | PlanDate em falta ou inválido |
401 | Credenciais inválidas |
409 | Já despachado, não encontrado, ou nova data fora do intervalo (tem de ser futura e dentro de 90 dias) |
Exemplo 200
{
"Result": "OK",
"IdSend": 5001,
"NewPlanDate": "2026-12-31T14:30:00"
}
/send/sendingTest.{format}Enviar um email de teste
Envia uma pré-visualização de um modelo de mensagem para um destinatário especificado para revisão antes de lançar a campanha real. O remetente, o modelo e o destinatário de teste são todos identificados pelos seus IDs.
Scope OAuth : email:send
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
MessageId | integer | sim | ID do modelo de mensagem a pré-visualizar (a partir de /message/list) |
IDEmailExpFrom | integer | sim | ID do endereço de remetente a utilizar (a partir de /senderEmail/list) |
IDEmailExpTo | integer | sim | ID do endereço de remetente destinatário — o email de teste é enviado para este endereço |
Respostas
| Código | Descrição |
|---|---|
200 | Email de teste enviado com sucesso |
400 | Campo obrigatório em falta |
401 | Credenciais inválidas |
Exemplo 200
{
"SendingTest": {
"IdSendingTest": 7001,
"ToEmail": "[email protected]",
"FromEmail": "[email protected]",
"SenderName": "Your Company Newsletter"
}
}
Envie emails transacionais avulsos para destinatários individuais. Ao contrário das campanhas, os emails transacionais não exigem uma lista — indica diretamente o email do destinatário e o corpo HTML.
/send/mail/scheduled.{format}Listar os emails individuais agendados
Devolve os emails individuais enviados com /send/sendmail e uma data futura, ainda não expedidos. As campanhas são listadas por /send/scheduled.
Scope OAuth : email:send
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Respostas
| Código | Descrição |
|---|---|
200 | Emails agendados devolvidos |
401 | Credenciais inválidas |
Exemplo 200
{
"scheduledMails": [
{
"IdSingleSend": 880123,
"Email": "[email protected]",
"Subject": "Your invoice",
"DatePlanned": "2026-12-01T09:00:00"
}
]
}
/send/mail/{IdSingleSend}/cancel.{format}Cancelar um email individual agendado
Cancela o email enquanto não tiver sido expedido.
Scope OAuth : email:send
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
IdSingleSend | path | integer (int64) | sim | IdSingleSend devolvido por /send/sendmail |
Respostas
| Código | Descrição |
|---|---|
200 | Email cancelado |
401 | Credenciais inválidas |
409 | Envio não encontrado ou já expedido |
Exemplo 200
{
"Result": "OK",
"Cancelled": 880123
}
/send/mail/{IdSingleSend}/reschedule.{format}Reagendar um email individual agendado
Altera a data de envio. A nova data tem de ser futura e dentro de 90 dias. PATCH também é aceite.
Scope OAuth : email:send
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
IdSingleSend | path | integer (int64) | sim | IdSingleSend devolvido por /send/sendmail |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
PlanDate | string (date-time) | sim | Nova data de envio (ISO 8601) |
Respostas
| Código | Descrição |
|---|---|
200 | Email reagendado |
400 | Data em falta ou inválida |
401 | Credenciais inválidas |
409 | Envio não encontrado, já expedido ou data fora dos limites |
Exemplo 200
{
"Result": "OK",
"IdSingleSend": 880123,
"NewPlanDate": "2026-12-15T09:00:00"
}
/send/sendmail.{format}Enviar um email transacional
Envia um email transacional avulso para um ou mais destinatários. Ao contrário das campanhas, este endpoint não exige uma lista — o endereço do destinatário e o corpo HTML são indicados diretamente.
Obrigatórios:
IDEmailExp — o ID do endereço de remetente (a partir de /senderEmail/list)EmailData — destinatário no formato email,field1,field2,...,field25 (separado por vírgulas)BodyHTML — o corpo HTMLSubject — a linha de assuntoFormato de EmailData: [email protected],Alice,Dupont,Paris O primeiro valor é o endereço de email; os valores 2 a 26 correspondem a Field1 a Field25 para as variáveis de personalização no seu modelo HTML.
Vários destinatários: separe várias entradas EmailData com ponto e vírgula: [email protected],Alice;[email protected],Bob
Agendamento: defina DatePlanned para uma data/hora ISO 8601 futura ou omita para enviar imediatamente.
Scope OAuth : email:send
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (multipart/form-data)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
IDEmailExp | integer | sim | ID do endereço de email do remetente a utilizar (a partir de /senderEmail/list) |
EmailData | string | sim | Destinatário no formato email,campo1,campo2,...,campo25 (separados por vírgula).
O primeiro valor é o endereço de email; os restantes são campos de personalização
mapeados para Field1–Field25 no seu modelo HTML.
A parte local do email (antes do @) aceita letras, dígitos e
. _ - + — incluindo o sub-addressing RFC 5322 (user+tag@domain, ex. Gmail,
Fastmail, Proton). Os outros caracteres especiais permitidos pela RFC 5322
(ex. ! # $ % & ' * / = ? ^ { | } ~) e as partes locais entre aspas não
são aceites.
|
BodyHTML | string | sim | Conteúdo HTML completo do corpo do email |
Subject | string | sim | Linha de assunto do email (máx. 255 caracteres) |
attachments | array of string (binary) | Anexos opcionais — envie a requisição como multipart/form-data e adicione uma parte de arquivo por anexo (qualquer nome de campo). Até 5 arquivos, 10 MB por arquivo, 15 MB no total. Tipos aceitos: PDF, Word, Excel, PowerPoint, imagens (JPG, PNG, GIF, WebP), ZIP, CSV, TXT — arquivos executáveis e scripts são rejeitados. Cobrança: o envio mantém seu crédito habitual, mais 1 crédito por 512 KB de anexos além dos primeiros 512 KB (anexos ≤ 512 KB não adicionam nada). Todos os outros campos deste endpoint (ReplyTo, ActivateStatistics, CustomHeaders, …) funcionam exatamente como na variante form-urlencoded. | |
KeepInMyFiles | boolean | false (predefinição): os anexos são usados apenas para este envio — são guardados fora da sua
conta, não contam para a sua quota de armazenamento e são eliminados automaticamente após
35 dias. true: os anexos também são guardados nos ficheiros da sua conta (pasta
Secure/Files/Sending/api) e contam para a sua quota de armazenamento.
|
Respostas
| Código | Descrição |
|---|---|
200 | Email transacional enviado ou agendado com sucesso |
400 | Campo obrigatório em falta ou formato de email inválido |
401 | Credenciais inválidas |
403 | Créditos de email insuficientes |
404 | Remetente não encontrado ou endereço de email com subscrição cancelada |
Exemplo 200
{
"SingleSend": {
"IdSingleSend": 8001,
"IdEmailExp": 201,
"DatePlanned": "2026-04-15T14:30:00",
"Subject": "Your order #12345 is confirmed",
"Email": "[email protected]",
"Field1": "Alice",
"Field2": "Dupont",
"UnsubscriptionLink": false,
"ActivateStatistics": true
}
}
/send/{IdSend}/status.{format}Obter o estado de entrega de um e-mail transacional
Devolve o estado de entrega atual de um e-mail transacional enviado com /send/sendmail. Passe o IdSingleSend que essa chamada devolveu.
Valores possíveis: delivered (aceite pelo servidor do destinatário, ver DiagCode), bounced (recusado — BounceType: hard endereço inválido ou recusa definitiva, soft recusa após novas tentativas), sent (entregue ao servidor de correio, ainda sem resposta), scheduled (ainda não enviado, DatePlanned no futuro) e queued (à espera de envio). delivered e bounced são finais: pare de consultar. Cada email tem um estado final no máximo 48 horas após o envio; consulte no máximo a cada 15 minutos (cada chamada conta para a sua quota da API) ou utilize os webhooks email.delivered / email.bounced. Só o cliente que enviou o email pode ler o seu estado — qualquer outro id devolve 404.
Scope OAuth : email:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
IdSend | path | integer | sim | O IdSingleSend retornado por /send/sendmail. |
Respostas
| Código | Descrição |
|---|---|
200 | Estado de entrega atual |
401 | Credenciais inválidas |
404 | Nenhum envio transacional encontrado com este id para este cliente |
Exemplo 200
{
"status": {
"IdSingleSend": 8001,
"Email": "[email protected]",
"Status": "delivered",
"DatePlanned": "2026-04-15T14:30:00",
"StatusDate": "2026-04-15T14:30:07",
"DiagCode": "2.0.0 (success)",
"BounceType": null
}
}
Liste e gira os endereços de email de remetente validados. Apenas os endereços verificados podem ser utilizados como endereço From nas campanhas.
/senderEmail/list.{format}Listar endereços de remetente validados
Devolve a lista dos endereços de email de remetente configurados para a conta. Apenas os endereços com IsValid: true podem ser utilizados ao enviar campanhas. Os novos endereços são adicionados com /senderEmail/add e tornam-se válidos depois de clicar na hiperligação do email de validação.
Scope OAuth : email:templates:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
emailFilter | query | string | Filtrar por endereço de email (correspondência parcial, sem distinção entre maiúsculas e minúsculas) | |
numberOfRecords | query | integer | Itens por página — 5000 por predefinição e no máximo (ver Paginação). | |
pageNumber | query | integer | Número da página (começa em 1). O valor predefinido é 1. | |
sortByName | query | boolean | Defina como true para ordenar os resultados alfabeticamente pelo nome do remetente |
Respostas
| Código | Descrição |
|---|---|
200 | Endereços de remetente devolvidos com sucesso |
401 | Credenciais inválidas |
Exemplo 200
{
"ExpEmailList": [
{
"IDEmailExp": 201,
"Email": "[email protected]",
"SenderName": "Your Company Newsletter",
"IsValid": true,
"CreationDate": "2025-06-01T09:00:00"
},
{
"IDEmailExp": 202,
"Email": "[email protected]",
"SenderName": "Your Company Support",
"IsValid": true,
"CreationDate": "2025-06-01T09:05:00"
}
]
}
/senderEmail/add.{format}Adicionar um endereço de remetente
Adiciona o endereço com os mesmos controlos da aplicação e envia-lhe um email de validação. Pode ser utilizado depois de clicar na hiperligação desse email. Uma conta pode ter até 25 remetentes, validados ou pendentes.
Scope OAuth : email:templates:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
Email | string | sim | Endereço do remetente |
SenderName | string | sim | Nome apresentado aos destinatários |
Respostas
| Código | Descrição |
|---|---|
200 | Endereço adicionado. DomainHasMx é false quando o domínio não tem registo MX. |
400 | Email ou SenderName em falta |
401 | Credenciais inválidas |
422 | Endereço recusado: inválido, já entre os remetentes da conta, domínio de email público, nome proibido ou limite de 25 atingido. A mensagem indica o motivo. |
503 | Temporariamente indisponível, tente novamente |
Exemplo 200
{
"Result": "OK",
"ConfirmationSent": true,
"DomainHasMx": true
}
/senderEmail/{IdSenderEmail}/resendValidation.{format}Enviar novamente o email de validação
Para um endereço ainda a aguardar validação.
Scope OAuth : email:templates:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
IdSenderEmail | path | integer | sim | ID do remetente, de /senderEmail/list |
Respostas
| Código | Descrição |
|---|---|
200 | Email enviado novamente |
401 | Credenciais inválidas |
404 | Remetente não encontrado |
409 | Este remetente já está validado |
503 | Temporariamente indisponível, tente novamente |
Exemplo 200
{
"Result": "OK",
"ConfirmationSent": true
}
/senderEmail/{IdSenderEmail}/authentication.{format}Verificar o domínio de um remetente (SPF, DKIM, DMARC, MX)
Verifica o domínio em direto no DNS e devolve os registos a publicar. Apenas leitura. O DKIM é ativado na aplicação: DkimSettingsUrl abre o ecrã certo.
Scope OAuth : email:templates:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
IdSenderEmail | path | integer | sim | ID do remetente, de /senderEmail/list |
Respostas
| Código | Descrição |
|---|---|
200 | Estado do domínio. Spf.RecommendedRecord é criado a partir do seu registo atual: publique-o apenas se Spf.ChangeNeeded for true. |
401 | Credenciais inválidas |
404 | Remetente não encontrado |
503 | Temporariamente indisponível, tente novamente |
Exemplo 200
{
"Domain": "example.com",
"Spf": {
"Valid": true,
"Record": "v=spf1 include:spf.mailpro.com -all",
"RecommendedRecord": "v=spf1 include:spf.mailpro.com -all",
"ChangeNeeded": false
},
"Dkim": {
"Valid": true,
"Records": [
{
"Host": "key._domainkey.example.com",
"Value": "v=DKIM1;k=rsa;p=MIIBIjANBgkq...",
"Validated": true
}
]
},
"Dmarc": {
"Valid": true,
"Record": "v=DMARC1; p=quarantine"
},
"Mx": {
"Valid": true,
"Record": "mail.example.com"
},
"DkimSettingsUrl": "https://app.mailpro.com/dkim/list?d=example.com"
}
/senderEmail/del.{format}Remover um endereço de remetente
Remove um endereço de email de remetente validado da conta. Os endereços de remetente utilizados por campanhas agendadas não podem ser eliminados.
Scope OAuth : email:templates:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
idEmailExp | integer | sim | ID do endereço de remetente a remover (a partir de /senderEmail/list) |
Respostas
| Código | Descrição |
|---|---|
200 | Endereço de remetente removido com sucesso |
400 | idEmailExp em falta |
401 | Credenciais inválidas |
Exemplo 200
{
"Result": "EmailSender Deleted"
}
Aceda às métricas de desempenho por campanha: aberturas, cliques, devoluções e muito mais. Estão disponíveis decomposições detalhadas por hora, dia, país, sistema operativo e cliente de email.
/stats/list.{format}Listar estatísticas de campanha
Devolve métricas globais de desempenho de todas as campanhas: número enviado, taxa de abertura, taxa de cliques, número de devoluções. Filtre por intervalo de datas ou título de campanha. Os resultados são ordenados por data de envio (mais recente primeiro).
Scope OAuth : email:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
titleCampaignFilter | query | string | Filtrar por título da campanha (correspondência parcial, sem distinção entre maiúsculas e minúsculas) | |
numberOfRecords | query | integer | Itens por página — 5000 por predefinição e no máximo (ver Paginação). | |
pageNumber | query | integer | Número da página (começa em 1). O valor predefinido é 1. | |
dateStart | query | string (date-time) | Início do filtro de intervalo de datas (ISO 8601) | |
dateEnd | query | string (date-time) | Fim do filtro de intervalo de datas (ISO 8601) |
Respostas
| Código | Descrição |
|---|---|
200 | Estatísticas de campanha devolvidas com sucesso |
401 | Credenciais inválidas |
Exemplo 200
{
"Campaigns": [
{
"IdCampaign": 8001,
"DateCampaign": "2026-04-20T09:00:01",
"TitleCampaign": "Spring Newsletter April 2026",
"NumberEmailSend": 4521,
"NumberEmailOpen": 1823,
"NumberEmailClick": 342,
"BadMail": 12,
"NumberUnsubscribers": 8,
"NumberComplaints": 1,
"SpamTrap": 0,
"DeliverabilityScore": 98
}
]
}
/stats/byHour.{format}Estatísticas por hora
Devolve a decomposição horária de aberturas e cliques de uma campanha específica. Útil para compreender o melhor horário de envio.
Scope OAuth : email:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
idCampaign | query | integer | sim | ID da campanha (a partir de /stats/list) |
Respostas
| Código | Descrição |
|---|---|
200 | Estatísticas horárias devolvidas com sucesso |
401 | Credenciais inválidas |
Exemplo 200
{
"ByHour": [
{
"Hour": 9,
"Opens": 823,
"Clicks": 142
},
{
"Hour": 10,
"Opens": 512,
"Clicks": 98
}
]
}
/stats/byDay.{format}Estatísticas por dia
Devolve a decomposição diária de aberturas e cliques de uma campanha específica.
Scope OAuth : email:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
idCampaign | query | integer | sim | ID da campanha (a partir de /stats/list) |
Respostas
| Código | Descrição |
|---|---|
200 | Estatísticas diárias devolvidas com sucesso |
401 | Credenciais inválidas |
/stats/del.{format}Eliminar estatísticas de campanha
Elimina permanentemente todos os registos de estatísticas de uma determinada campanha.
Scope OAuth : email:templates:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
IdCampaign | integer | sim | ID da campanha cujas estatísticas eliminar (a partir de /stats/list) |
Respostas
| Código | Descrição |
|---|---|
200 | Estatísticas de campanha eliminadas com sucesso |
400 | IdCampaign em falta |
401 | Credenciais inválidas |
404 | Campanha não encontrada |
Exemplo 200
{
"Result": "Statistic Deleted"
}
/stats/country.{format}Decomposição por geolocalização
Devolve a decomposição por geolocalização das aberturas de campanha — quantas aberturas vieram de cada país.
Scope OAuth : email:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
idCampaign | query | integer | sim |
Respostas
| Código | Descrição |
|---|---|
200 | Decomposição por país devolvida |
401 | Credenciais inválidas |
/stats/open.{format}Registo de eventos de abertura
Devolve o registo, por destinatário, dos eventos de abertura de uma campanha (uma linha por abertura). Utilize emailFilter para procurar um destinatário específico (correspondência parcial, sem distinção entre maiúsculas e minúsculas).
Scope OAuth : email:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
idCampaign | query | integer | sim | |
emailFilter | query | string | ||
numberOfRecords | query | integer | Itens por página — 5000 por predefinição e no máximo (ver Paginação). | |
pageNumber | query | integer | Número da página (começa em 1). O valor predefinido é 1. |
Respostas
| Código | Descrição |
|---|---|
200 | Eventos de abertura devolvidos |
401 | Credenciais inválidas |
/stats/click.{format}Registo de eventos de clique
Devolve o registo, por destinatário, dos eventos de clique de uma campanha — incluindo que hiperligação foi clicada e quando.
Scope OAuth : email:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
idCampaign | query | integer | sim | |
emailFilter | query | string | ||
numberOfRecords | query | integer | Itens por página — 5000 por predefinição e no máximo (ver Paginação). | |
pageNumber | query | integer | Número da página (começa em 1). O valor predefinido é 1. |
Respostas
| Código | Descrição |
|---|---|
200 | Eventos de clique devolvidos |
401 | Credenciais inválidas |
/stats/system.{format}Decomposição por sistema operativo
Devolve a decomposição das aberturas por sistema operativo (Windows, macOS, iOS, Android, Linux, etc.) de uma determinada campanha.
Scope OAuth : email:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
idCampaign | query | integer | sim |
Respostas
| Código | Descrição |
|---|---|
200 | Decomposição por SO devolvida |
401 | Credenciais inválidas |
/stats/emailSoftware.{format}Decomposição por cliente de email
Devolve a decomposição das aberturas por cliente de email (Gmail, Outlook, Apple Mail, Thunderbird, etc.) de uma determinada campanha.
Scope OAuth : email:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
idCampaign | query | integer | sim |
Respostas
| Código | Descrição |
|---|---|
200 | Decomposição por cliente de email devolvida |
401 | Credenciais inválidas |
/stats/bounce.{format}Registo de devoluções
Devolve a lista de destinatários devolvidos (devoluções definitivas, devoluções temporárias, queixas de spam) de uma campanha, com o motivo da falha para cada endereço.
Scope OAuth : email:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
idCampaign | query | integer | sim | |
emailFilter | query | string | ||
numberOfRecords | query | integer | Itens por página — 5000 por predefinição e no máximo (ver Paginação). | |
pageNumber | query | integer | Número da página (começa em 1). O valor predefinido é 1. |
Respostas
| Código | Descrição |
|---|---|
200 | Eventos de devolução devolvidos |
401 | Credenciais inválidas |
Exemplo 200
{
"ListBadMail": [
{
"Email": "[email protected]",
"Date": "2026-04-20T09:05:12",
"Error": "550 5.1.1 recipient rejected",
"AddressbookId": 1813318
}
]
}
Consulte o registo completo de todos os envios de email passados.
/history/list.{format}Listar histórico de envios
Devolve um registo paginado de todos os envios de email passados. Filtre por ID de campanha ou por assunto. Defina bodyHTML=true para incluir o corpo HTML (limita automaticamente a 10 por página).
Scope OAuth : email:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
subjectMessageFilter | query | string | Filtrar por assunto da campanha (correspondência parcial, sem distinção entre maiúsculas e minúsculas) | |
idCampaign | query | integer | Devolver o histórico apenas de uma campanha específica | |
numberOfRecords | query | integer | Itens por página — 5000 por predefinição e no máximo (ver Paginação). | |
pageNumber | query | integer | Número da página (começa em 1). O valor predefinido é 1. | |
bodyHTML | query | boolean | Defina como true para incluir o corpo HTML completo.
Limita automaticamente os resultados a 10 por página.
|
Respostas
| Código | Descrição |
|---|---|
200 | Histórico devolvido com sucesso |
401 | Credenciais inválidas |
Exemplo 200
{
"HistoricList": [
{
"IDHistoric": 9001,
"SubjectMessage": "Spring Newsletter — April 2026",
"DateSend": "2026-04-20T09:00:01",
"NumberSend": 4521,
"NumberOpen": 1823,
"NumberClick": 342
}
]
}
Carregue um ficheiro CSV ou XLSX para importar contactos de email para uma lista em massa. O ficheiro é colocado em fila para processamento assíncrono — acompanhe a conclusão através do ImportJobId devolvido ou do callback opcional WebhookUrl.
/import/upload.{format}Carregar um ficheiro de contactos (CSV / XLSX) para importação em massa
Carregue um ficheiro CSV ou XLSX para importar contactos de email para uma lista. O ficheiro é armazenado e colocado em fila para processamento assíncrono — o endpoint devolve imediatamente um ImportJobId.
Tipo de pedido: multipart/form-data
Campos de formulário obrigatórios:
IdClient (inteiro) — o seu ID de cliente MailproApiKey (string) — a sua chave de APIListId (inteiro) — ID da lista de destino. O alias legado AddressBookId também é aceite.file (binário) — o ficheiro CSV ou XLSX a carregarOpcional:
WebhookUrl (string) — URL HTTPS chamado quando o processamento terminar. Recebe um payload JSON com o estado final (success / failed) e contagens de linhas importadas / ignoradas / inválidas.Formato do ficheiro:
Email — sem distinção entre maiúsculas e minúsculas)Scope OAuth : contacts:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (multipart/form-data)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
ListId | integer | sim | ID da lista de destino. O alias legado AddressBookId também é aceite. |
file | string (binary) | sim | Ficheiro CSV ou XLSX (UTF-8, máx. 50 MB) |
WebhookUrl | string (uri) | URL de callback invocado quando o processamento terminar |
Respostas
| Código | Descrição |
|---|---|
200 | Ficheiro aceite e colocado em fila |
400 | Nenhum ficheiro carregado ou ListId em falta |
401 | Credenciais inválidas |
500 | Erro de servidor ou de armazenamento |
Exemplo 200
{
"Result": "OK",
"ImportJobId": 13,
"InternalName": "230575-20260420140221-contacts.csv"
}
Subscreva o seu servidor às notificações de eventos em tempo real. A Mailpro envia um POST com um payload JSON assinado por HMAC para o seu URL assim que o evento subscrito acontecer. Consulte a secção "Webhooks" na introdução para o catálogo completo de eventos, o envelope do payload, fragmentos de verificação de assinatura e a política de retentativas.
/webhooksListar webhooks
Devolve todos os webhooks configurados na conta autenticada.
Respostas
| Código | Descrição |
|---|---|
200 | Array de webhooks |
401 | Credenciais inválidas |
Exemplo 200
{
"items": [
{
"id": 14,
"url": "https://example.com/hooks/mailpro",
"description": "Integração com o Slack",
"is_active": true,
"created_at": "2026-07-01T21:09:52.43",
"updated_at": "2026-07-21T18:56:08.02",
"last_delivery_at": "2026-07-21T18:56:07.653",
"last_delivery_status": 200,
"consecutive_failures": 0,
"events": [
"email.delivered",
"email.bounced"
]
}
],
"total": 1
}
/webhooksCriar um webhook
Cria uma nova subscrição de webhook. A resposta contém um secret que é apresentado apenas uma vez — armazene-o imediatamente do lado do servidor. Utilize-o para verificar a assinatura HMAC de cada payload recebido.
Limites: máx. 20 webhooks por conta, máx. 50 eventos por webhook.
Corpo do pedido (application/json)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
url | string (uri) | sim | Endpoint HTTPS (HTTP recusado em produção) |
events | array of string | sim | Lista de tipos de eventos a subscrever (consulte o catálogo acima). Utilize ["*"] para subscrever todos os eventos desta API. |
description | string |
Exemplo
{
"url": "https://example.com/hooks/mailpro",
"events": [
"email.delivered",
"email.bounced"
],
"description": "Integração com o Slack"
}
Respostas
| Código | Descrição |
|---|---|
201 | Webhook criado — secret é devolvido apenas aqui |
400 | URL inválido, lista de eventos inválida ou limite excedido |
401 | Credenciais inválidas |
Exemplo 201
{
"id": 42,
"url": "https://example.com/hooks/mailpro",
"events": [
"email.delivered",
"email.bounced"
],
"description": "Integração com o Slack",
"isActive": true,
"consecutiveFailures": 0,
"autoDisabledAt": null,
"autoDisabledReason": null,
"createdAt": "2026-05-25T10:00:00Z",
"updatedAt": "2026-05-25T10:00:00Z",
"secret": "whsec_AbcD1234EfgH5678IjkL9012MnoP3456QrsT"
}
/webhooks/{id}Obter um webhook
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
id | path | integer (int64) | sim |
Respostas
| Código | Descrição |
|---|---|
200 | O webhook |
404 | Webhook não encontrado |
/webhooks/{id}Atualizar um webhook
Atualização parcial — só os campos enviados são modificados.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
id | path | integer (int64) | sim |
Corpo do pedido (application/json)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
url | string (uri) | ||
events | array of string | ||
description | string | ||
isActive | boolean | Defina como true para reativar um webhook desativado automaticamente depois de corrigir o seu endpoint. |
Respostas
| Código | Descrição |
|---|---|
200 | Webhook atualizado |
400 | Payload inválido |
404 | Webhook não encontrado |
/webhooks/{id}Eliminar um webhook
Elimina permanentemente o webhook e todo o seu histórico de entregas.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
id | path | integer (int64) | sim |
Respostas
| Código | Descrição |
|---|---|
204 | Eliminado |
404 | Webhook não encontrado |
/webhooks/{id}/testEnviar um evento de teste
Coloca em fila um evento ping imediato (ou qualquer outro tipo de evento através do campo eventType no corpo) para o seu endpoint. Útil para verificar a acessibilidade e a verificação de assinatura antes de depender de eventos reais.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
id | path | integer (int64) | sim |
Corpo do pedido (application/json)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
eventType | string |
Exemplo
{
"eventType": "ping"
}
Respostas
| Código | Descrição |
|---|---|
202 | Evento colocado em fila para despacho |
404 | Webhook não encontrado |
Exemplo 202
{
"deliveryId": 1234,
"eventId": "evt_8f3a9b2c4d1e5f6789abcdef01234567",
"eventType": "ping"
}
/webhooks/{id}/rotate-secretRodar o segredo HMAC
Gera um novo segredo HMAC e invalida imediatamente o antigo. O novo segredo é devolvido uma única vez na resposta — armazene-o. Todas as entregas a partir deste momento serão assinadas com o novo segredo.
Utilize esta operação se suspeitar que o seu segredo foi comprometido.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
id | path | integer (int64) | sim |
Respostas
| Código | Descrição |
|---|---|
200 | Novo segredo (visível uma única vez) |
404 | Webhook não encontrado |
Exemplo 200
{
"secret": "whsec_XyzA9876BcdE5432FghI1098JklM7654NopQ"
}
/webhooks/{id}/deliveriesListar tentativas de entrega
Devolve o histórico das tentativas de despacho deste webhook (retenção de 30 dias). Útil para depuração — que eventos foram enviados, códigos de estado recebidos, número de retentativas, mensagens de erro.
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
id | path | integer (int64) | sim | |
limit | query | integer | ||
cursor | query | integer (int64) | Cursor de paginação (= último ID de entrega visto). Devolve entregas com id < cursor. |
Respostas
| Código | Descrição |
|---|---|
200 | Array de tentativas de entrega (mais recentes primeiro) |
404 | Webhook não encontrado |
/webhooks/{id}/deliveries/{deliveryId}/replayRepetir uma entrega
Coloca em fila uma nova tentativa de entrega com o mesmo payload do original. Útil para reativar uma entrega falhada depois de corrigir o seu endpoint. É criada uma NOVA linha Webhook_Delivery (a original é preservada para auditoria). A repetição segue a política de retentativas padrão (mesmo esquema de backoff, mesma regra de desativação automática após 10 falhas).
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
id | path | integer (int64) | sim | |
deliveryId | path | integer (int64) | sim |
Respostas
| Código | Descrição |
|---|---|
202 | Repetição colocada em fila |
404 | Webhook ou entrega não encontrados |
Bounces e cancelamentos de subscrição da conta: listar, adicionar, remover.
/suppression/bounces.{format}Listar os bounces da conta
Os mais recentes primeiro. O total está no cabeçalho X-Total-Count.
Scope OAuth : email:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
type | query | string: hard, soft | hard ou soft | |
source | query | string | Origem do bounce: list, contact, api ou smtp | |
email | query | string | Endereço exato | |
dateFrom | query | string (date-time) | A partir desta data | |
dateTo | query | string (date-time) | Até esta data | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respostas
| Código | Descrição |
|---|---|
200 | Bounces devolvidos |
400 | type tem de ser hard ou soft |
401 | Credenciais inválidas |
Exemplo 200
{
"bounces": [
{
"Id": 5521,
"Source": "contact",
"BounceType": "hard",
"Email": "[email protected]",
"Date": "2026-10-12T08:30:00",
"DiagCode": "550 5.1.1 User unknown",
"IdList": 101
}
]
}
/suppression/bounces/{Id}/del.{format}Remover um bounce
Source e Type são obrigatórios, tal como devolvidos por /suppression/bounces: um Id sozinho não é único.
Scope OAuth : contacts:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Id | path | integer (int64) | sim | Id do bounce |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
Source | string | sim | list, contact, api ou smtp |
Type | string: hard, soft | sim | hard ou soft |
Respostas
| Código | Descrição |
|---|---|
200 | Bounce removido |
400 | Source ou Type em falta |
401 | Credenciais inválidas |
404 | Bounce não encontrado |
Exemplo 200
{
"Result": "OK",
"Id": 5521,
"Restored": false
}
/suppression/bounces/{Id}/restore.{format}Repor nas suas listas um contacto com hard bounce
Apenas para um hard bounce com a origem contact.
Scope OAuth : contacts:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Id | path | integer (int64) | sim | Id do bounce |
Respostas
| Código | Descrição |
|---|---|
200 | Contacto reposto |
401 | Credenciais inválidas |
404 | Hard bounce de um contacto não encontrado ou endereço já não ativo |
Exemplo 200
{
"Result": "OK",
"Id": 5521,
"Restored": true
}
/suppression/unsubscribers.{format}Listar os cancelamentos de subscrição da conta
Os mais recentes primeiro. O total está no cabeçalho X-Total-Count.
Scope OAuth : contacts:read
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
source | query | string | Origem do cancelamento: contact, list, smtp, api ou api3 | |
email | query | string | Endereço exato | |
dateFrom | query | string (date-time) | A partir desta data | |
dateTo | query | string (date-time) | Até esta data | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respostas
| Código | Descrição |
|---|---|
200 | Cancelamentos de subscrição devolvidos |
401 | Credenciais inválidas |
Exemplo 200
{
"unsubscribers": [
{
"Id": 9012,
"Source": "api",
"Email": "[email protected]",
"Date": "2026-10-20T16:05:00",
"ListName": null,
"Comment": "Asked by phone"
}
]
}
/suppression/unsubscribers/add.{format}Adicionar um cancelamento de subscrição
Sem ListId, a subscrição do endereço é cancelada para toda a conta. Com ListId, apenas nessa lista de cancelamento.
Scope OAuth : contacts:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
Email | string | sim | Endereço cuja subscrição cancelar |
Comment | string | Comentário livre | |
ListId | integer (int64) | Lista de cancelamento da conta (opcional) |
Respostas
| Código | Descrição |
|---|---|
200 | Concluído. AlreadyUnsubscribed é true quando a subscrição do endereço já estava cancelada. |
400 | É necessário um endereço válido |
401 | Credenciais inválidas |
404 | ListId não é uma lista de cancelamento desta conta |
Exemplo 200
{
"Result": "OK",
"AlreadyUnsubscribed": false
}
/suppression/unsubscribers/{Id}/del.{format}Remover um cancelamento de subscrição
Source é obrigatório, tal como devolvido por /suppression/unsubscribers: um Id sozinho não é único.
Scope OAuth : contacts:write
Parâmetros
| Nome | Onde | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
format | path | string: json, xml | sim | Formato da resposta |
Id | path | integer (int64) | sim | Id do cancelamento |
Corpo do pedido (application/x-www-form-urlencoded)
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
Source | string | sim | contact, list, smtp, api ou api3 |
Respostas
| Código | Descrição |
|---|---|
200 | Cancelamento de subscrição removido |
400 | Source é obrigatório |
401 | Credenciais inválidas |
404 | Cancelamento de subscrição não encontrado |
Exemplo 200
{
"Result": "OK",
"Removed": 9012
}