Documentação interativa · Portal de programadores · Especificação OpenAPI · EN · FR · DE · IT · PT · ES

API CRM Mailpro™ v3 : Referência

URL de base : https://api.mailpro.com/v3

A API CRM do Mailpro™ v3 permite-lhe gerir programaticamente contactos, listas, etiquetas, campos personalizados, modelos de e-mail e campanhas — e enviar tanto e-mails de marketing em massa como e-mails transacionais individuais, bem como SMS.

Autenticação

Todos os endpoints (exceto POST /token e os endpoints OAuth) aceitam três métodos de autenticação. Utilize aquele que melhor se adequar à sua stack.

> O Bearer JWT legado e o IdClient+ApiKey não estão sujeitos a controlo de âmbito — mantêm > acesso total a qualquer endpoint que já podiam alcançar. Apenas os tokens de acesso > OAuth 2.0 estão sujeitos às verificações de âmbito por endpoint apresentadas em cada > operação abaixo (um token sem o âmbito necessário recebe 403 insufficient_scope).

Método 1 — OAuth 2.0 (recomendado para integrações)

O Mailpro executa um único servidor de autorização OAuth 2.0 para todas as suas APIs, disponibilizado numa superfície única, independente da versão: https://api.mailpro.com/oauth/. Um servidor, um token — o mesmo token de acesso funciona em CRM v3, Email v2 e SMS. Os endpoints que um token pode chamar são determinados pelos âmbitos do token, e não pelo URL base da API que invoca. Não existe um endpoint OAuth por versão (não há /v3/oauth, /v2/oauth nem /sms/oauth).

EndpointURL
AutorizaçãoGET https://api.mailpro.com/oauth/authorize
Token / RefreshPOST https://api.mailpro.com/oauth/token
JWKS (verificar assinaturas)GET https://api.mailpro.com/oauth/.well-known/jwks
DescobertaGET https://api.mailpro.com/oauth/.well-known/openid-configuration

Emissor (a claim iss em cada token): https://api.mailpro.com/oauth/.

Concessões suportadas

Tempos de vida dos tokens

TokenTTL
Token de acesso (JWT RS256)20 minutos
Refresh token (deslizante, utilização única)30 dias
Código de autorização60 segundos

Authorization Code + PKCE — passo a passo

   GET https://api.mailpro.com/oauth/authorize
     ?response_type=code
     &client_id=YOUR_CLIENT_ID
     &redirect_uri=https://yourapp.example.com/callback
     &scope=contacts:read contacts:write
     &state=RANDOM_CSRF_TOKEN
     &code_challenge=CODE_CHALLENGE
     &code_challenge_method=S256
   POST https://api.mailpro.com/oauth/token
   Content-Type: application/x-www-form-urlencoded

   grant_type=authorization_code&code=AUTH_CODE
   &redirect_uri=https://yourapp.example.com/callback
   &client_id=YOUR_CLIENT_ID&code_verifier=CODE_VERIFIER
   { "access_token": "eyJ…", "token_type": "Bearer",
     "expires_in": 1200, "refresh_token": "…" }

client_credentials

POST https://api.mailpro.com/oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&client_id=YOUR_CLIENT_ID
&client_secret=YOUR_CLIENT_SECRET&scope=contacts:read email:send

O mesmo token de acesso OAuth é igualmente aceite pelas APIs Email v2 (api.mailpro.com/v2) e SMS (api.mailpro.com/sms) — autentique-se uma vez, invoque qualquer API. Catálogo completo de âmbitos: ver Âmbitos OAuth 2.0 abaixo.

Teste o OAuth 2.0 em minutos — guia rápido

A forma mais rápida de experimentar o OAuth é a concessão client_credentials (servidor a servidor, sem navegador, sem utilizador). Necessita de um par client_id / client_secret (peça ao seu contacto no Mailpro, ou crie um em Definições → Acesso à API). Substitua os marcadores de posição abaixo — nunca submeta para o repositório um segredo real.

1. Obter um token de acesso

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=contacts:read"
{ "access_token": "eyJhbGciOiJSUzI1Ni…", "token_type": "Bearer",
  "expires_in": 1200 }

2. Invocar um endpoint de recurso com o token

curl https://api.mailpro.com/v3/List \
  -H "Authorization: Bearer eyJhbGciOiJSUzI1Ni…"

O mesmo token funciona também em Email v2 (…/v2/…) e SMS (…/sms/…) — desde que transporte o âmbito exigido por cada endpoint. Um token sem o âmbito necessário é rejeitado com 403 insufficient_scope.

"Connect Mailpro" interativo (authorization_code + PKCE) — quando atua em nome de um *utilizador* (Zapier/Make/n8n, aplicações parceiras): redirecione o utilizador para GET https://api.mailpro.com/oauth/authorize com response_type=code, client_id, redirect_uri, scope, state, code_challenge e code_challenge_method=S256; o utilizador dá o seu consentimento; troca o code devolvido em POST https://api.mailpro.com/oauth/token com o code_verifier correspondente. Explicação completa acima; âmbitos em Âmbitos OAuth 2.0 abaixo.

> Os tokens são JWTs RS256 — os tokens de acesso vivem 20 minutos, os refresh > tokens 30 dias (deslizantes, utilização única: cada renovação roda o token). > Verifique as assinaturas contra o JWKS em > https://api.mailpro.com/oauth/.well-known/jwks e valide o âmbito de > cada pedido contra a matriz de âmbitos abaixo.

Método 2 — Bearer JWT (legado)

Authorization: Bearer <access_token>

Obtenha um token via POST /token (ver abaixo). Válido por 30 dias por predefinição; use grant_type=refresh_token para renovar sem voltar a autenticar-se. Mais simples de configurar, mas está associado a uma única credencial de conta e não pode ter âmbitos definidos nem ser entregue a um terceiro — prefira OAuth 2.0 para qualquer integração instalável.

Método 3 — IdClient + ApiKey (mais simples)

Envie o seu ID de cliente e a sua chave de API como cabeçalhos HTTP (preferível) ou como parâmetros de query:

IdClient: 12345
ApiKey:   a1b2c3d4-e5f6-7890-abcd-ef1234567890

As mesmas credenciais das APIs v2 / SMS — copie-as a partir de Definições → Acesso à API. Sem passo de troca de token. A forma em cabeçalho é recomendada porque os URLs são registados pelo IIS / Cloudflare / proxies.

Endpoint de token (concessão password)

POST /token
Content-Type: application/x-www-form-urlencoded

grant_type=password&username=YOUR_USERNAME&password=YOUR_API_KEY

Endpoint de token (concessão client_credentials)

POST /token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&client_id=YOUR_CLIENT_ID

> O token emitido por POST /v3/token também é válido na API Email v2 > (api.mailpro.com/v2) e na API SMS (api.mailpro.com/sms). Autentique-se > uma vez, invoque qualquer API.

Âmbitos OAuth 2.0

Quando a sua aplicação pede um token de acesso OAuth, declara um conjunto de âmbitos — permissões que definem exatamente o que o token pode fazer. O utilizador vê uma descrição em linguagem corrente de cada âmbito solicitado no ecrã de consentimento. Os âmbitos são separados por espaços no parâmetro scope (scope=contacts:read email:send). Solicite apenas o que necessita.

Os âmbitos seguem <recurso>:<ação> e são independentes hierarquicamente — contacts:write não implica contacts:read; solicite ambos, se necessário.

ÂmbitoPermite
contacts:readConsultar os seus contactos, listas, etiquetas, segmentos e campos personalizados.
contacts:writeCriar, editar e apagar os seus contactos, listas, etiquetas e campos personalizados.
email:sendEnviar e-mails transacionais e de campanha em seu nome.
email:readConsultar estatísticas de entrega, aberturas, cliques e histórico de bounces.
email:templates:readConsultar os seus modelos de e-mail (assunto, HTML, corpo em texto simples).
email:templates:writeCriar, editar e apagar os seus modelos de e-mail.
sms:sendEnviar mensagens SMS transacionais e de campanha em seu nome.
sms:readConsultar o saldo de créditos SMS e o histórico de mensagens.
sms:contacts:readConsultar a sua agenda telefónica SMS.
sms:contacts:writeCriar, editar e apagar entradas na sua agenda telefónica SMS.
webhooks:manageSubscrever, editar e remover endpoints de webhook para a sua conta.
account:readConsultar os créditos, limites e estado da subscrição da sua conta.

Aplicação de âmbitos por endpoint

As verificações de âmbito são em tempo real e aplicadas por endpoint para tokens emitidos via OAuth (a autenticação legada está isenta). Cada operação nesta referência indica o seu âmbito necessário em Authorization. Resumo para a superfície CRM v3:

EndpointsÂmbito necessário
GET /Contact/{id}, GET /List, GET /List/{id}, GET /List/{id}/Contact, GET /List/{listId}/Unsubscribers, GET /Tag, GET /Tag/{id}, GET /Tag/{id}/Contact, GET /Segment, verificação de pertença a segmentocontacts:read
POST /Contact, POST /Contact/Multiple, PUT/DELETE /Contact/{id}, adicionar/remover etiqueta ou lista num contacto, POST/PUT/DELETE /List, POST/PUT/DELETE /Tagcontacts:write

> Os endpoints desta especificação que não estão listados acima (por exemplo, GET /Field, > campanhas, envio transacional, envio SMS, modelos de mensagens, informação de conta) > são atualmente acessíveis por qualquer token válido — ainda não têm controlo de âmbito na > superfície CRM v3. As APIs Email v2 e SMS aplicam adicionalmente os seus próprios > controlos nos endpoints de envio / modelos / contactos / conta (ver essas especificações).

A rejeição por âmbito devolve 403 com { "error": "insufficient_scope", "required_scope": "…" } (RFC 6750 §3.1).

Formato dos dados

Paginação

Mesma regra nas três API Mailpro (Email v2, CRM v3, SMS): 5000 itens por página, por predefinição e no máximo.

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.

Códigos de erro de negócio

As violações de regras de negócio devolvem HTTP 406 com um corpo JSON:

{ "Message": "Contact cannot be created. Email cannot be empty." }

Razões habituais para 406:

Códigos de estado devolvidos

CódigoSignificado
400Pedido malformado (JSON inválido, mensagem acima do limite de partes SMS)
401Credenciais em falta, inválidas ou expiradas
402Créditos insuficientes para efetuar o envio
403Permitido pelas suas credenciais, mas recusado — conta bloqueada para o envio de SMS
404O objeto referenciado não existe (contacto, lista, tag, campo, campanha)
406Violação de uma regra de negócio de contacto (ver a lista acima)
422Entrada rejeitada pela validação, ou limite de conta atingido

> Alteração: alguns destes casos devolviam anteriormente 404. Os créditos > insuficientes devolvem agora 402, os erros de validação e os limites de > conta devolvem 422, e uma conta bloqueada para SMS devolve 403. 404 > é agora usado apenas para «este objeto não existe», de forma coerente com a > API SMS. Se a sua integração se baseia em 404 para esses casos, atualize-a > com os códigos acima.

Formato dos números de telefone

Os números de telefone são normalizados automaticamente. Pode enviá-los em vários formatos — espaços, hífenes, pontos, barras, parênteses, sublinhados e espaços não separáveis são removidos antes da validação. Qualquer outro carácter (letras, apóstrofos, =, ;, etc.) torna o número inválido.

VálidoInválido
+41794849980 — E.164 internacional0612345678 — formato nacional (0 inicial)
0041 79 484 99 80 — prefixo 00 + espaços41'794'849'80 — apóstrofos (não removidos)
+33 6-12-34-56-78 — + com hífenestel=0041794849980 — caracteres adicionais
41794849980 — apenas dígitos1234567 — demasiado curto (< 8 dígitos)

Regras:

Especificidades de Contacto v3: o campo phone_number de um Contacto está atualmente limitado a 12 dígitos após normalização (face aos 15 dos endpoints SMS autónomos). Números de países como a Alemanha (13), o Brasil (13) ou os móveis italianos (12–13) poderão ser rejeitados em /v3/Contact com Length exceeded for Phone Number (12). Esta restrição legada poderá ser relaxada numa versão futura.

Limites

RecursoLimite
Etiquetas por conta1000
Listas por conta1000
Campos personalizados por conta50
Pedidos de API mensais por conta50 000 (5× os créditos de e-mail da subscrição)

Acompanhamento da entrega (emails transacionais)

Cada email enviado individualmente (POST /Send/Mail, a Email API v2, 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.

statusSignificadoFinal?
queuedAceite, à espera de envio.não
scheduledAgendado para mais tarde (date_planned).não
sentEntregue pelos nossos servidores, ainda sem resposta do servidor do destinatário.não
deliveredAceite pelo servidor do destinatário (diag_code = a sua resposta SMTP).sim
bouncedRecusado. bounce_type: hard = endereço inválido ou recusa definitiva; soft = recusa após novas tentativas (caixa cheia, servidor inacessível…).sim
not_foundIdentificador desconhecido ou que não pertence à sua conta.sim

Consultar sem entrar em ciclo

Os estados são conservados durante 365 dias.

Webhooks

O Mailpro™ pode notificar o seu servidor em tempo real quando ocorrem determinados eventos na sua conta (criação de um contacto, entrega de um e-mail, conclusão de uma campanha, etc.). Ao estilo Stripe — o seu URL recebe um POST assinado em HMAC-SHA256 assim que o evento é disparado.

Cada evento enviado para o seu webhook conta como 1 pedido na sua quota de pedidos à API.

Como funciona

> ⏱ Atraso de ativação — depois de criar, atualizar ou apagar um webhook, a > alteração demora até 10 minutos a propagar-se pelos servidores de API do Mailpro. > Durante esse intervalo, os eventos podem ainda não corresponder à sua nova subscrição > (ou podem ainda corresponder a uma acabada de remover). Este é o tempo necessário para > atualizar a cache de subscrições em memória em cada instância da API.

Envelope da carga útil

Todos os eventos partilham um envelope comum:

{
  "id":         "evt_8f3a9b2c4d1e5f6789abcdef01234567",
  "type":       "contact.created",
  "created":    1748194800,
  "apiVersion": "v3",
  "account":    { "id": 12345, "name": "ACME Corp" },
  "data":       { "id": "...", "email": "[email protected]", "...": "..." }
}
CampoFormatoDescrição
idevt_ + 32 hexID único do evento — use-o como chave de idempotência do seu lado.
type<domínio>.<verbo>Tipo canónico do evento (por exemplo, email.delivered, contact.created).
createdSegundos Unix UTCIncluído na assinatura HMAC.
apiVersion"v3"Qual a API do Mailpro que publicou o evento.
account.idintO seu ID de cliente Mailpro.
account.namestringO nome da sua conta (útil para depuração do lado do cliente).
dataobjectCarga útil do evento — a forma depende de type (ver catálogo abaixo).

Catálogo de eventos

EventoGatilhoForma de data
pingTeste via POST /Webhook/{id}/test{ message }
contact.createdPOST /Contact{ id, email, firstName, lastName, createdAt }
contact.updatedPUT /Contact/{id}{ id, email, firstName, lastName, updatedAt, changes }
contact.deletedDELETE /Contact/{id}{ id, email, deletedAt }
list.contact_addedContacto adicionado a uma lista{ listId, listName, contactId, contactEmail, addedAt }
list.contact_removedContacto removido de uma lista{ listId, listName, contactId, contactEmail, removedAt }
tag.appliedEtiqueta aplicada a contacto{ tag, contactId, contactEmail, appliedAt }
tag.removedEtiqueta removida{ tag, contactId, contactEmail, removedAt }
segment.matchedContacto entra num segmento{ segmentId, segmentName, contactId, contactEmail, matchedAt }
email.processedEnvio aceite pelo pipeline{ messageId, email, campaignId, processedAt }
email.deliveredUm 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.openedPixel de seguimento acionado{ messageId, email, campaignId, openedAt, ip, userAgent }
email.clickedClique em ligação seguida{ messageId, email, campaignId, clickedAt, url, ip, userAgent }
email.bouncedHard ou soft bounce{ messageId, email, campaignId, bouncedAt, bounceType, reason }
email.spam_reportReclamação FBL{ messageId, email, campaignId, reportedAt }
email.unsubscribedClique no link de remoção{ messageId, email, campaignId, unsubscribedAt }
email.droppedRecusado antes do envio{ messageId, email, campaignId, droppedAt, reason }
campaign.startedInício do envio{ campaignId, name, totalRecipients, startedAt }
campaign.finishedTodos os destinatários processados{ campaignId, name, totalSent, totalFailed, finishedAt }
import.startedTarefa de importação iniciada{ importId, fileName, totalRows, startedAt }
import.progressAos 25/50/75 %{ importId, fileName, processedRows, totalRows, progressPct }
import.completedImportação OK{ importId, fileName, totalRows, addedCount, updatedCount, errorCount, completedAt }
import.failedErro fatal durante a importação{ importId, fileName, errorMessage, failedAt }

Subscreva todos os eventos desta API passando ["*"] no array events.

Assinatura HMAC

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: contact.created
X-Mailpro-Attempt:   1

Para verificar:

Node.js
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'));
}
PHP
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']);
}
Python
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'])
C#
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"]));
}

Retentativas e desativação automática

TentativaAtraso antes da próxima
1 → 210 segundos
2 → 31 minuto
3 → 45 minutos
4 → 530 minutos
5 → 62 horas
6 → 76 horas
7abandonado (entrega marcada como failed)

Após 10 falhas consecutivas no mesmo webhook, este é automaticamente desativado (isActive: false) e recebe um e-mail de notificação. Reative-o com PUT /Webhook/{id} assim que o seu endpoint estiver corrigido.

Sucesso = HTTP 2xx

Consideramos o seu webhook bem-sucedido apenas se devolver um estado em 200–299. Qualquer 3xx/4xx/5xx ou um timeout (> 10 s) é considerado uma falha e desencadeia retentativas. Se o seu endpoint estiver permanentemente fora de serviço, devolva 410 Gone explicitamente — as retentativas continuam a acontecer, mas a razão da falha fica mais clara no seu registo de entregas.

Limites

LimiteValor
Webhooks por conta20
Eventos subscritos por webhook50
Tamanho máximo da carga útil256 KB
Timeout HTTP por tentativa10 segundos
Retenção do histórico de entregas30 dias

Índice

Authentication

Obtenha um token JWT Bearer para autenticar todas as outras chamadas à API. O endpoint de token aceita vários tipos de concessão: password, refresh_token, client_credentials e integrações de terceiros (zapier, automateio, microsoft-flow).

POST /token

Obter token de acesso

Obtém um token JWT Bearer utilizando credenciais de cliente. Envie o access_token devolvido como Authorization: Bearer <token> em todos os pedidos subsequentes.

Tipos de concessão suportados
Tipo de concessãoCaso de utilização
passwordIntegração padrão — nome de utilizador + chave de API
refresh_tokenRenovar um token de acesso a expirar sem voltar a autenticar
client_credentialsServidor para servidor apenas com ID de cliente
zapier / automateio / microsoft-flowIntegrações com plataformas de terceiros
Tempo de vida do token

Utilize grant_type=refresh_token para obter um novo token de acesso sem voltar a autenticar — o seu SDK deve fazer isto automaticamente quando o token de acesso se aproximar da expiração (estratégia típica: atualizar quando faltarem menos de 24 h).

Armazenar tokens com segurança

Mesmo com um tempo de vida de 30 dias, quem obtiver um access_token pode fazer-se passar pela sua conta até este expirar. Armazene os tokens num cofre de segredos no lado do servidor (Vault, AWS Secrets Manager, Azure Key Vault, variáveis de ambiente num anfitrião reforçado). Nunca incorpore um token em:

Se um token for divulgado, revogue-o através das definições da sua conta Mailpro e solicite um novo.

Corpo do pedido (application/x-www-form-urlencoded)

NomeTipoObrigatórioDescrição
grant_typestring: password, refresh_token, client_credentials, zapier, automateio, microsoft-flowsimTipo de concessão de autenticação
usernamestringO seu nome de utilizador Mailpro (email). Obrigatório para a concessão password.
passwordstringA sua chave de API Mailpro (formato GUID). Obrigatória para a concessão password.
refresh_tokenstringToken de atualização anterior. Obrigatório para a concessão refresh_token.
client_idstringO seu ID de cliente Mailpro (inteiro). Obrigatório para a concessão client_credentials.

Respostas

CódigoDescrição
200Token emitido com sucesso
400Credenciais 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."
}

Account

Obtenha o perfil da conta, saldo de créditos e detalhes da subscrição.

GET /Account/Me

Obter detalhes da conta

Devolve os detalhes do perfil e as definições da conta Mailpro autenticada.

Respostas

CódigoDescrição
200Detalhes da conta devolvidos com sucesso
401Token inválido ou expirado

GET /Account/Credits

Obter saldo de créditos

Devolve o saldo de créditos restante de email e SMS para a conta.

Respostas

CódigoDescrição
200Saldo de créditos devolvido com sucesso
401Token inválido ou expirado

Exemplo 200

{
  "email_credits": 48500,
  "sms_credits": 1200
}

GET /Account/SubscriptionEndDate

Obter data de fim da subscrição

Devolve a data de expiração da subscrição Mailpro atual.

Respostas

CódigoDescrição
200Data de fim da subscrição devolvida com sucesso
401Token inválido ou expirado

GET /Account/Limits

Obter quota mensal da API

Devolve a quota mensal de pedidos da API para o cliente autenticado.

Cálculo da quota: o limite é calibrado a partir dos créditos da subscrição de email (tipicamente subscription_credits × 5). Para um plano de 10.000 emails/mês, isto resulta num orçamento mensal de 50.000 pedidos. O mapeamento exato é definido pela tarefa de faturação no momento da subscrição e reposto na data de aniversário da subscrição (não no dia 1 do mês civil).

O que consome créditos:

O que é GRATUITO (não consome créditos):

Respostas

CódigoDescrição
200Instantâneo da quota
401Token inválido ou expirado
404Não foi encontrado nenhum registo de quota para esta conta (conta recém-criada que nunca efetuou uma chamada à API; a linha será criada no primeiro pedido autenticado).

Contact

CRUD completo para contactos CRM. Os contactos armazenam um endereço de email, um número de telefone opcional, valores de campos personalizados e pertencem a uma ou mais Listas. Podem também ser rotulados com Etiquetas. Os IDs de contacto são UUID.

POST /Contact

Criar um contacto

Cria um novo contacto CRM com campos personalizados, atribuições de lista e etiquetas opcionais.

Obrigatório:

Números de telefone aceitam +41…, 0041… ou 41… com ou sem separadores (máximo 12 dígitos no Contact — consulte Formato do número de telefone na descrição da API).

Campos personalizados são identificados pelo seu id (de GET /Field). Os valores são validados em função do tipo do campo.

Scope OAuth : contacts:write

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
emailstringsimEndereço de email do contacto (obrigatório, tem de ser único)
phone_numberstringNúmero de telefone — aceita +41…, 0041… ou 41… com ou sem separadores. Deve começar por um código de país válido. Máximo de 12 dígitos no Contact (consulte Formato do número de telefone na descrição da API para as regras completas).
listsarray of ListRefsimListas às quais atribuir este contacto. É obrigatória pelo menos uma lista.
tagsarray of TagRefEtiquetas a atribuir a este contacto (opcional)
custom_fieldsarray of FieldValueValores de campos personalizados para este contacto (opcional)

Exemplo

{
  "email": "[email protected]",
  "phone_number": "+41791234567",
  "lists": [
    {
      "id": 101
    }
  ],
  "tags": [
    {
      "id": 5
    }
  ],
  "custom_fields": [
    {
      "id": 1,
      "value": "Alice"
    },
    {
      "id": 2,
      "value": "Dupont"
    }
  ]
}

Respostas

CódigoDescrição
200Contacto criado com sucesso
400Formato de email inválido
401Token inválido ou expirado
406Violação de regra de negócio (consulte a descrição para a lista completa)

Exemplo 406

{
  "Message": "Contact cannot be created. A contact already exist with the same Email"
}

POST /Contact/Multiple

Importar contactos (em massa)

Cria até 1.000 contactos num único pedido para uma importação em massa eficiente. A resposta inclui uma lista de contactos criados com sucesso e uma lista de erros para contactos que não puderam ser criados (ex.: email duplicado, dados inválidos).

Nota: as listas e etiquetas utilizadas em importações em massa não podem estar associadas a fluxos de trabalho de automação ativos. Se estiverem, toda a importação é rejeitada com HTTP 406.

Scope OAuth : contacts:write

Corpo do pedido (application/json)

Exemplo

[
  {
    "email": "[email protected]",
    "lists": [
      {
        "id": 101
      }
    ],
    "custom_fields": [
      {
        "id": 1,
        "value": "Alice"
      }
    ]
  },
  {
    "email": "[email protected]",
    "lists": [
      {
        "id": 101
      }
    ],
    "custom_fields": [
      {
        "id": 1,
        "value": "Bob"
      }
    ]
  }
]

Respostas

CódigoDescrição
200Importação em massa concluída (verifique o array errors para falhas parciais)
400Entrada inválida
401Token inválido ou expirado
406Violação de regra de negócio (ex.: conflito de automação, limite de lista atingido)

Exemplo 200

{
  "Added": [
    {
      "Email": "[email protected]",
      "Id": "550e8400-e29b-41d4-a716-446655440000"
    },
    {
      "Email": "[email protected]",
      "Id": "660e8400-e29b-41d4-a716-446655440001"
    }
  ],
  "Errors": []
}

GET /Contact/{id}

Obter um contacto

Devolve os detalhes de um contacto específico. Utilize includeTags=true para devolver também as etiquetas atribuídas ao contacto. Utilize includeLists=true para devolver também as listas a que o contacto pertence.

Scope OAuth : contacts:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathstring (uuid)simUUID do contacto (de POST /Contact ou GET /List/{id}/Contact)
includeTagsquerybooleanDefina como true para incluir as atribuições de etiquetas do contacto na resposta
includeListsquerybooleanDefina como true para incluir as pertenças a listas do contacto na resposta

Respostas

CódigoDescrição
200Contacto devolvido com sucesso
401Token inválido ou expirado
404Contacto não encontrado

Exemplo 200

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "email": "[email protected]",
  "phone_number": "41791234567",
  "custom_fields": [
    {
      "id": 1,
      "value": "Alice"
    },
    {
      "id": 2,
      "value": "Dupont"
    }
  ],
  "tags": [
    {
      "id": 5
    }
  ],
  "lists": [
    {
      "id": 101
    }
  ]
}

PUT /Contact/{id}

Atualizar um contacto

Atualiza o email, número de telefone, campos personalizados, atribuições de listas e etiquetas de um contacto. O corpo do pedido substitui os dados atuais do contacto — inclua todas as listas e etiquetas às quais quer que o contacto continue atribuído.

Obrigatório no corpo: email e pelo menos uma entrada em lists.

Scope OAuth : contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathstring (uuid)simUUID do contacto

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
emailstringsimEndereço de email do contacto (obrigatório, tem de ser único)
phone_numberstringNúmero de telefone — aceita +41…, 0041… ou 41… com ou sem separadores. Deve começar por um código de país válido. Máximo de 12 dígitos no Contact (consulte Formato do número de telefone na descrição da API para as regras completas).
listsarray of ListRefsimListas às quais atribuir este contacto. É obrigatória pelo menos uma lista.
tagsarray of TagRefEtiquetas a atribuir a este contacto (opcional)
custom_fieldsarray of FieldValueValores de campos personalizados para este contacto (opcional)

Respostas

CódigoDescrição
200Contacto atualizado com sucesso
401Token inválido ou expirado
404Contacto não encontrado
422Erro de validação (formato de email, número de telefone, incompatibilidade de tipo de valor de campo)

Exemplo 200

{
  "Result": "Successful operation"
}

DELETE /Contact/{id}

Eliminar um contacto

Elimina permanentemente um contacto do CRM.

Scope OAuth : contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathstring (uuid)simUUID do contacto

Respostas

CódigoDescrição
200Contacto eliminado com sucesso
401Token inválido ou expirado
404Contacto não encontrado

GET /Contact/{id}/Activity

Atividade de um contacto em 90 dias

Emails recebidos, abertos e clicados, cliente de email preferido e últimas campanhas do contacto.

Scope OAuth : contacts:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathstring (uuid)simGUID do contacto

Respostas

CódigoDescrição
200Atividade devolvida
401Token inválido ou expirado
404O contacto pedido não existe

Exemplo 200

{
  "period_days": 90,
  "email_received": 12,
  "email_opened": 7,
  "email_clicked": 2,
  "favorite_email_client": "Gmail",
  "last_campaigns": [
    {
      "id": 5001,
      "name": "Spring Sale 2026",
      "date": "2026-10-01T09:00:00"
    }
  ]
}

PUT /Contact/{id}/Tag/{tagid}

Adicionar etiqueta ao contacto

Atribui uma etiqueta a um contacto. Se a etiqueta já estiver atribuída, a operação não tem efeito.

Scope OAuth : contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathstring (uuid)simUUID do contacto
tagidpathinteger (int64)simID da etiqueta (de GET /Tag)

Respostas

CódigoDescrição
200Etiqueta atribuída com sucesso
401Token inválido ou expirado
404Contacto ou etiqueta não encontrados

DELETE /Contact/{id}/Tag/{tagid}

Remover etiqueta do contacto

Remove a atribuição de uma etiqueta a um contacto.

Scope OAuth : contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathstring (uuid)simUUID do contacto
tagidpathinteger (int64)simID da etiqueta

Respostas

CódigoDescrição
200Etiqueta removida com sucesso
401Token inválido ou expirado
404Contacto ou etiqueta não encontrados

PUT /Contact/{id}/List/{listid}

Adicionar contacto à lista

Adiciona um contacto a uma lista específica. Devolve HTTP 404 se o contacto tiver previamente cancelado a subscrição desta lista.

Scope OAuth : contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathstring (uuid)simUUID do contacto
listidpathinteger (int64)simID da lista (de GET /List)

Respostas

CódigoDescrição
200Contacto adicionado à lista com sucesso
401Token inválido ou expirado
404Contacto, lista não encontrados, ou contacto cancelou a subscrição desta lista

DELETE /Contact/{id}/List/{listid}

Remover contacto da lista

Remove um contacto de uma lista específica. O próprio contacto não é eliminado.

Scope OAuth : contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathstring (uuid)simUUID do contacto
listidpathinteger (int64)simID da lista

Respostas

CódigoDescrição
200Contacto removido da lista com sucesso
401Token inválido ou expirado
404Contacto ou lista não encontrados

List

Gerir listas de contactos. As listas agrupam contactos para campanhas e segmentação. Máximo de 1.000 listas por conta (mesmo limite nas três API Mailpro e na app). Máximo de 1.000.000 contactos por lista.

GET /List

Listar listas de contactos

Devolve todas as listas de contactos da conta. Filtre por nome ou data de criação. Ordene alfabeticamente com sortByName=true. Inclua a contagem total de contactos por lista com includeTotalContacts=true.

Scope OAuth : contacts:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
namequerystringFiltrar pelo nome da lista (correspondência parcial)
dateCreationFromquerystring (date-time)Filtrar por data de criação (a partir de, ISO 8601)
dateCreationToquerystring (date-time)Filtrar por data de criação (até, ISO 8601)
numberOfRecordsqueryintegerItens por página — 5000 por predefinição e no máximo
pageNumberqueryintegerNúmero de página (com base em 1)
sortByNamequerybooleanDefina como true para ordenar alfabeticamente pelo nome
includeTotalContactsquerybooleanDefina como true para incluir a contagem total_contacts em cada resultado

Respostas

CódigoDescrição
200Listas devolvidas com sucesso
401Token inválido ou expirado

Exemplo 200

[
  {
    "id": 101,
    "name": "Newsletter subscribers",
    "total_contacts": 4521,
    "date_creation": "2025-01-15T10:30:00"
  }
]

POST /List

Criar uma lista de contactos

Cria uma nova lista de contactos. Máximo de 1.000 listas por conta.

Scope OAuth : contacts:write

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
namestringsimNome a apresentar para a lista

Exemplo

{
  "name": "Spring Campaign 2026"
}

Respostas

CódigoDescrição
200Lista criada com sucesso
401Token inválido ou expirado
406Limite de listas (1.000) atingido

Exemplo 200

{
  "id": 102,
  "name": "Spring Campaign 2026",
  "date_creation": "2026-04-14T12:00:00"
}

GET /List/{id}

Obter uma lista de contactos

Devolve os detalhes de uma lista de contactos específica.

Scope OAuth : contacts:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)simID da lista

Respostas

CódigoDescrição
200Lista devolvida com sucesso
401Token inválido ou expirado
404Lista não encontrada

PUT /List/{id}

Atualizar uma lista de contactos

Renomeia uma lista de contactos existente.

Scope OAuth : contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)simID da lista

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
namestringsimNome a apresentar para a lista

Exemplo

{
  "name": "Newsletter subscribers — Europe"
}

Respostas

CódigoDescrição
200Lista atualizada com sucesso
401Token inválido ou expirado
404Lista não encontrada

DELETE /List/{id}

Eliminar uma lista de contactos

Elimina permanentemente uma lista de contactos. Os próprios contactos não são eliminados — apenas a sua pertença a esta lista é removida. As listas utilizadas por fluxos de trabalho de automação ativos não podem ser eliminadas.

Scope OAuth : contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)simID da lista

Respostas

CódigoDescrição
200Lista eliminada com sucesso
401Token inválido ou expirado
404Lista não encontrada
406A lista é utilizada por um fluxo de trabalho de automação ativo

GET /List/{id}/Contact

Listar contactos numa lista

Devolve os contactos que pertencem a uma lista específica. Filtre por email ou data de adição. Inclua etiquetas e pertenças a listas com os respetivos sinalizadores.

Scope OAuth : contacts:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)simID da lista
emailquerystringFiltrar por email (correspondência parcial)
numberOfRecordsqueryintegerItens por página — 5000 por predefinição e no máximo
pageNumberqueryinteger
sortByEmailquerybooleanOrdenar alfabeticamente por email
includeTagsquerybooleanIncluir atribuições de etiquetas nos resultados
includeListsquerybooleanIncluir pertenças a listas nos resultados

Respostas

CódigoDescrição
200Contactos devolvidos com sucesso
401Token inválido ou expirado
404Lista não encontrada ou nenhum contacto corresponde aos critérios

GET /List/{listId}/Unsubscribers

Listar cancelamentos de subscrição

Devolve os contactos que cancelaram a subscrição de uma lista específica.

Scope OAuth : contacts:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
listIdpathinteger (int64)simID da lista

Respostas

CódigoDescrição
200Cancelamentos de subscrição devolvidos com sucesso
401Token inválido ou expirado
404Lista não encontrada

Tag

Gerir etiquetas para rotulagem e segmentação de contactos. As etiquetas são rótulos planos (ex.: "VIP", "Churned", "B2B"). Máximo de 1.000 etiquetas por conta.

GET /Tag

Listar etiquetas

Devolve todas as etiquetas da conta.

Scope OAuth : contacts:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
namequerystringFiltrar por nome (correspondência parcial)
numberOfRecordsqueryinteger
pageNumberqueryinteger
sortByNamequeryboolean

Respostas

CódigoDescrição
200Etiquetas devolvidas com sucesso
401Token inválido ou expirado

Exemplo 200

[
  {
    "id": 5,
    "name": "VIP customers"
  },
  {
    "id": 6,
    "name": "Newsletter openers"
  }
]

POST /Tag

Criar uma etiqueta

Cria uma nova etiqueta. Máximo de 1.000 etiquetas por conta.

Scope OAuth : contacts:write

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
namestringsimNome a apresentar para a etiqueta

Exemplo

{
  "name": "VIP customers"
}

Respostas

CódigoDescrição
200Etiqueta criada com sucesso
401Token inválido ou expirado
406Limite de etiquetas (1.000) atingido

GET /Tag/{id}

Obter uma etiqueta

Devolve uma etiqueta específica pelo seu ID.

Scope OAuth : contacts:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)simID da etiqueta

Respostas

CódigoDescrição
200Etiqueta devolvida com sucesso
401Token inválido ou expirado
404Etiqueta não encontrada

PUT /Tag/{id}

Atualizar uma etiqueta

Renomeia uma etiqueta existente.

Scope OAuth : contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
namestringsimNome a apresentar para a etiqueta

Exemplo

{
  "name": "VIP customers — updated"
}

Respostas

CódigoDescrição
200Etiqueta atualizada com sucesso
401Token inválido ou expirado
404Etiqueta não encontrada

DELETE /Tag/{id}

Eliminar uma etiqueta

Elimina permanentemente uma etiqueta. A etiqueta é removida de todos os contactos. As etiquetas utilizadas por fluxos de trabalho de automação ativos não podem ser eliminadas.

Scope OAuth : contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Respostas

CódigoDescrição
200Etiqueta eliminada com sucesso
401Token inválido ou expirado
404Etiqueta não encontrada
406A etiqueta é utilizada por um fluxo de trabalho de automação ativo

GET /Tag/{id}/Contact

Listar contactos com uma etiqueta

Devolve os contactos aos quais foi atribuída uma etiqueta específica.

Scope OAuth : contacts:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)simID da etiqueta
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Contactos devolvidos com sucesso
401Token inválido ou expirado
404Etiqueta não encontrada

Field

Gerir campos personalizados de contacto. Os campos permitem armazenar dados adicionais em cada contacto (ex.: primeiro nome, cidade, nível de fidelização). Máximo de 50 campos por conta. Tipos de campo: text, number, date.

GET /Field

Listar campos personalizados

Devolve todos os campos personalizados de contacto definidos para a conta. Utilize os valores id devolvidos ao criar ou atualizar contactos.

Parâmetros

NomeOndeTipoObrigatórioDescrição
namequerystringFiltrar pelo nome do campo
idFieldTypequeryintegerFiltrar pelo ID do tipo de campo
numberOfRecordsqueryinteger
pageNumberqueryinteger
sortByNamequeryboolean

Respostas

CódigoDescrição
200Campos personalizados devolvidos com sucesso
401Token inválido ou expirado

Exemplo 200

[
  {
    "id": 1,
    "name": "first_name",
    "personalisation_key": "first_name",
    "field_type": "text"
  },
  {
    "id": 2,
    "name": "last_name",
    "personalisation_key": "last_name",
    "field_type": "text"
  }
]

POST /Field

Criar um campo personalizado

Cria um novo campo personalizado de contacto. Máximo de 50 campos por conta. Utilize o id devolvido ao atribuir valores a contactos.

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
namestringsimNome apresentado do campo
id_field_typeintegersimID do tipo de campo (tipos disponíveis via GET /Field/Types): - 1 = texto - 2 = número inteiro - 3 = data e hora - 4 = sim / não - 12 = número decimal
personalize_keystringsimChave de variável do modelo, para inserir o campo numa mensagem
sortintegerOrdem de apresentação (0 a 255). Obrigatório para alterar um campo (PUT /Field/{id}).

Exemplo

{
  "name": "First name",
  "id_field_type": 1,
  "personalize_key": "first_name"
}

Respostas

CódigoDescrição
200Campo criado com sucesso
401Token inválido ou expirado
406Limite de campos (50) atingido

GET /Field/Types

Listar tipos de campo

Devolve os identificadores de tipo de campo disponíveis para utilizar ao criar um campo personalizado. Tipos comuns: 1 = texto, 2 = número, 3 = data.

Respostas

CódigoDescrição
200Tipos de campo devolvidos com sucesso
401Token inválido ou expirado

GET /Field/{id}

Obter um campo personalizado

Devolve a definição e os metadados de um campo personalizado específico.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)simID do campo

Respostas

CódigoDescrição
200Campo devolvido com sucesso
401Token inválido ou expirado
404Campo não encontrado

PUT /Field/{id}

Atualizar um campo personalizado

Atualiza o nome ou a chave de personalização de um campo personalizado.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
namestringsimNome apresentado do campo
id_field_typeintegersimID do tipo de campo (tipos disponíveis via GET /Field/Types): - 1 = texto - 2 = número inteiro - 3 = data e hora - 4 = sim / não - 12 = número decimal
personalize_keystringsimChave de variável do modelo, para inserir o campo numa mensagem
sortintegerOrdem de apresentação (0 a 255). Obrigatório para alterar um campo (PUT /Field/{id}).

Respostas

CódigoDescrição
200Campo atualizado com sucesso
401Token inválido ou expirado
404Campo não encontrado

DELETE /Field/{id}

Eliminar um campo personalizado

Elimina permanentemente um campo personalizado e remove o seu valor de todos os contactos. Esta ação não pode ser anulada.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Respostas

CódigoDescrição
200Campo eliminado com sucesso
401Token inválido ou expirado
404Campo não encontrado

Campaign

Consultar estatísticas de campanhas e gerir campanhas agendadas. As campanhas podem ser editadas ou eliminadas até 5 minutos antes da hora de envio agendada.

GET /Campaign

Listar campanhas

Devolve uma lista paginada das campanhas de email da conta.

Parâmetros

NomeOndeTipoObrigatórioDescrição
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Campanhas devolvidas com sucesso
401Token inválido ou expirado

Exemplo 200

[
  {
    "id": 8001,
    "title": "Spring Newsletter April 2026",
    "date_planned": "2026-04-20T09:00:01",
    "count_open": 1823,
    "count_sent": 4521,
    "count_click": 342,
    "count_badmail": 12,
    "count_unsubscription": 8,
    "count_clicking_users": 289,
    "count_complaints": 1,
    "spam_trap": 0,
    "deliverability_score": 98
  }
]

GET /Campaign/{id}

Obter uma campanha

Devolve a configuração e o resumo de estatísticas de uma campanha específica.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Respostas

CódigoDescrição
200Campanha devolvida com sucesso
401Token inválido ou expirado
404Campanha não encontrada

PUT /Campaign/{id}

Atualizar uma campanha

Atualiza o título ou a data de envio de uma campanha agendada. As campanhas só podem ser modificadas até 5 minutos antes da hora de envio agendada.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
campaign_titlestringNome a apresentar para a campanha
date_plannedstring (date-time)Hora de envio agendada (ISO 8601). Omita para enviar de imediato.

Respostas

CódigoDescrição
200Campanha atualizada com sucesso
401Token inválido ou expirado
404Campanha não encontrada

DELETE /Campaign/{id}

Eliminar uma campanha

Cancela e elimina permanentemente uma campanha através do seu identificador.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Respostas

CódigoDescrição
200Campanha eliminada com sucesso
401Token inválido ou expirado
404Campanha não encontrada

GET /Campaign/Scheduled

Listar as minhas campanhas agendadas

Devolve as campanhas com date_planned no futuro que ainda não foram despachadas. Ordenadas por date_planned ascendente.

Parâmetros

NomeOndeTipoObrigatórioDescrição
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Lista de campanhas agendadas
401Token inválido ou expirado

Exemplo 200

[
  {
    "id": 5001,
    "id_client": 12345,
    "subject": "Spring Sale 2026",
    "date_planned": "2026-05-01T09:00:00",
    "title": "Spring Sale",
    "id_campaign": 7001,
    "id_list": 101,
    "id_segment": null,
    "number_email": 1250
  }
]

POST /Campaign/{id}/Cancel

Cancelar uma campanha agendada

Cancela uma campanha agendada no futuro. Devolve 409 Conflict se a campanha já tiver sido despachada ou não existir.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Respostas

CódigoDescrição
200Campanha cancelada
401Token inválido ou expirado
409Já despachada ou não encontrada

Exemplo 200

{
  "result": "ok",
  "cancelled": 5001
}

PATCH /Campaign/{id}/Reschedule

Reagendar uma campanha agendada

Atualiza a data de envio planeada de uma campanha agendada. A nova data tem de estar no futuro e dentro de 90 dias.

Nome do campo no corpo: a API aceita date_planned (snake_case, primário), bem como os aliases legados PlanDate e scheduled_time. Forneça qualquer um deles — é utilizado o primeiro que não seja nulo.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
date_plannedstring (date-time)Nome do campo primário.
PlanDatestring (date-time)Alias legado aceite por compatibilidade retroativa.
scheduled_timestring (date-time)Alias legado aceite por compatibilidade retroativa.

Respostas

CódigoDescrição
200Campanha reagendada
400Data em falta — forneça um de date_planned / PlanDate / scheduled_time
401Token inválido ou expirado
409Já despachada

Exemplo 200

{
  "result": "ok",
  "id": 5001,
  "date_planned": "2026-12-31T14:30:00"
}

GET /Campaign/{id}/ByHour

Estatísticas por hora

Devolve a divisão horária de aberturas e cliques da campanha.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Respostas

CódigoDescrição
200Estatísticas horárias devolvidas com sucesso
401Token inválido ou expirado

GET /Campaign/{id}/ByDay

Estatísticas por dia

Devolve a divisão diária de aberturas e cliques da campanha.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Respostas

CódigoDescrição
200Estatísticas diárias devolvidas com sucesso
401Token inválido ou expirado

GET /Campaign/{id}/Openings

Listar aberturas de email

Devolve uma lista paginada de contactos que abriram o email da campanha.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim
emailquerystringFiltrar pelo email do destinatário
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Lista de aberturas devolvida com sucesso
401Token inválido ou expirado

GET /Campaign/{id}/Clicks

Listar cliques em ligações

Devolve uma lista paginada de contactos que clicaram numa ligação na campanha.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim
emailquerystring
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Lista de cliques devolvida com sucesso
401Token inválido ou expirado

GET /Campaign/{id}/HardBounces

Listar devoluções permanentes

Devolve os endereços de email que tiveram devolução permanente durante esta campanha.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim
emailquerystring
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Lista de devoluções permanentes devolvida com sucesso
401Token inválido ou expirado

Listar ligações monitorizadas

Devolve dados de desempenho de cliques para cada ligação monitorizada na campanha.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim
linkquerystringFiltrar pelo URL da ligação (correspondência parcial)
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Estatísticas de ligações devolvidas com sucesso
401Token inválido ou expirado

GET /Campaign/{id}/OS

Estatísticas por SO / dispositivo

Devolve a divisão de aberturas e cliques por sistema operativo e tipo de dispositivo.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Respostas

CódigoDescrição
200Estatísticas de SO devolvidas com sucesso
401Token inválido ou expirado

GET /Campaign/{id}/EmailClients

Estatísticas por cliente de email

Devolve a divisão de aberturas por cliente de email (Gmail, Outlook, Apple Mail…).

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Respostas

CódigoDescrição
200Estatísticas de cliente de email devolvidas com sucesso
401Token inválido ou expirado

GET /Campaign/{id}/Countries

Estatísticas por país

Devolve a distribuição geográfica das aberturas e cliques.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Respostas

CódigoDescrição
200Estatísticas por país devolvidas com sucesso
401Token inválido ou expirado

Send

Enviar campanhas de email em massa (para listas de contactos) e emails transacionais individuais. As campanhas podem ser agendadas ou enviadas de imediato.

POST /Send/Mail

Enviar email transacional

Envia um email transacional pontual para um único destinatário.

Destinatário: forneça email (endereço em linha) OU id_contact (contacto do CRM) — não ambos. Utilizar id_contact permite a personalização automática com os valores dos campos personalizados do contacto.

Conteúdo: forneça body_html (HTML em linha) OU id_message (modelo guardado) — não ambos. Se ambos forem indicados, prevalece id_message.

Obrigatórios: id_sender_email, subject e um de (email ou id_contact), e um de (body_html ou id_message).

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
id_sender_emailintegerID do endereço de email do remetente (de GET /SenderEmail). Obrigatório.
emailstringEndereço de email do destinatário (inline). Forneça isto OU id_contact. Se ambos forem fornecidos, id_contact tem precedência. A parte local (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.
id_contactstring (uuid)ID do contacto CRM do destinatário. Forneça este OU email. Utilizar id_contact permite a personalização com os valores dos campos personalizados do contacto.
subjectstringAssunto do email (máximo 255 caracteres). Obrigatório.
body_htmlstringConteúdo HTML em linha. Forneça este OU id_message. Se ambos forem indicados, prevalece id_message.
id_messageintegerID de um modelo de mensagem guardado (de GET /Message). Forneça este OU body_html.
reply_tostringEndereço de resposta (predefinição: endereço do remetente)
fieldsarray of FieldValueCampos de personalização personalizados (utilizados apenas com email em linha, não com id_contact)
date_plannedstring (date-time)Agendar o envio para uma hora futura. Omita para enviar de imediato.
attachmentsarray of EmailAttachmentAnexos opcionais (máx. 5). Cada item é um objeto com um filename e um content codificado em Base64. Limites: 10 MB por arquivo e 15 MB no total, medidos após a decodificação Base64. 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).
keep_in_my_filesbooleanfalse (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.

Exemplo

{
  "id_sender_email": 201,
  "email": "[email protected]",
  "subject": "Your order #12345 has shipped",
  "body_html": "<p>Hello {{first_name}}, your order is on its way!</p>",
  "reply_to": "[email protected]",
  "fields": [
    {
      "id": 1,
      "value": "Alice"
    }
  ],
  "attachments": [
    {
      "filename": "invoice.pdf",
      "content": "JVBERi0xLjQKJVBERi0xLjQK..."
    }
  ]
}

Respostas

CódigoDescrição
200Email enviado ou agendado com sucesso
400Formato de email inválido ou campo obrigatório em falta
401Token inválido ou expirado
404Remetente, mensagem ou contacto não encontrados; ou destinatário cancelou a subscrição
422Erro de validação (assunto demasiado longo, corpo e mensagem ambos vazios, etc.)

Exemplo 200

{
  "message": "Successful operation",
  "id_single_send": 8001
}

Exemplo 404

{
  "Message": "Not enough credit available"
}

GET /Send/{id}/Status

Obter o estado de entrega de um e-mail transacional

Devolve o estado de entrega atual de um e-mail transacional enviado com POST /Send/Mail. Passe o id_single_send que essa chamada devolveu.

Valores possíveis: delivered (aceite pelo servidor do destinatário, ver diag_code), bounced (recusado — bounce_type: 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, date_planned 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.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)simO id_single_send retornado por POST /Send/Mail.

Respostas

CódigoDescrição
200Estado de entrega atual
401Token inválido ou expirado
404Nenhum envio transacional encontrado com este id para este cliente

Exemplo 200

{
  "id_single_send": 8001,
  "email": "[email protected]",
  "status": "delivered",
  "date_planned": "2026-04-15T14:30:00",
  "status_date": "2026-04-15T14:30:07",
  "diag_code": "2.0.0 (success)",
  "bounce_type": null
}

POST /Send/Campaign

Enviar campanha de email

Envia uma campanha de email em massa para uma ou mais listas de contactos.

Obrigatório:

Segmento: opcionalmente filtre destinatários por um segmento guardado (id_segment). O segmento filtra contactos dentro das listas especificadas.

Agendamento: defina date_planned para uma data/hora futura ISO 8601. As campanhas podem ser editadas ou canceladas até 5 minutos antes da hora agendada.

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
id_messageintegersimID do modelo de mensagem a utilizar (de GET /Message)
id_sender_emailintegersimID do endereço do remetente (de GET /SenderEmail)
id_email_reply_tointegerID do endereço de remetente para resposta (obtido em GET /SenderEmail). Tem de ser um dos endereços de remetente da sua conta, caso contrário o pedido é recusado. Predefinição: id_sender_email.
listsarray of ListRefsimListas de contactos alvo (pelo menos uma é obrigatória)
id_segmentintegerFiltrar destinatários por um segmento guardado (opcional)
campaign_titlestringsimNome a apresentar para esta campanha (máximo 150 caracteres)
date_plannedstring (date-time)Hora de envio agendada (ISO 8601). Omita para enviar de imediato.
id_automationintegerAssociar este envio a um fluxo de trabalho de automação (opcional)

Exemplo

{
  "id_message": 501,
  "id_sender_email": 201,
  "lists": [
    {
      "id": 101
    }
  ],
  "campaign_title": "Spring Newsletter April 2026",
  "date_planned": "2026-04-20T09:00:00"
}

Respostas

CódigoDescrição
200Campanha agendada ou enviada com sucesso
401Token inválido ou expirado
402Créditos insuficientes
404Mensagem, remetente, lista ou segmento não encontrados; ou créditos insuficientes
422Título da campanha vazio ou demasiado longo (máximo 150 caracteres)

Exemplo 200

{
  "Message": "Successful operation. Campaigns can be edited or deleted until 5 minutes prior to send.",
  "IdCampaign": 8001
}

GET /Send

Listar envios agendados

Devolve a lista de campanhas de email à espera de serem enviadas (agendadas, ainda não processadas).

Parâmetros

NomeOndeTipoObrigatórioDescrição
subjectMessagequerystringFiltrar pelo assunto (correspondência parcial)
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Envios em espera devolvidos com sucesso
401Token inválido ou expirado

DELETE /Send/{id}

Cancelar um envio agendado

Cancela e elimina um envio de email agendado que ainda não foi processado. Não é possível cancelar envios que estejam a ser processados atualmente.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)simID do envio (de GET /Send)

Respostas

CódigoDescrição
200Envio agendado cancelado com sucesso
401Token inválido ou expirado
404Envio agendado não encontrado

GET /Send/Mail/Scheduled

Listar os emails individuais agendados

Devolve os emails individuais enviados com POST /Send/Mail e uma data futura, ainda não expedidos. As campanhas são listadas por GET /Campaign/Scheduled.

Scope OAuth : email:send

Respostas

CódigoDescrição
200Emails agendados devolvidos
401Token inválido ou expirado

Exemplo 200

[
  {
    "id_single_send": 880123,
    "email": "[email protected]",
    "subject": "Your invoice",
    "date_planned": "2026-12-01T09:00:00"
  }
]

POST /Send/Mail/{id}/Cancel

Cancelar um email individual agendado

Cancela o email enquanto não tiver sido expedido.

Scope OAuth : email:send

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)simid_single_send devolvido por POST /Send/Mail

Respostas

CódigoDescrição
200Email cancelado
401Token inválido ou expirado
409Envio não encontrado ou já expedido

Exemplo 200

{
  "result": "ok",
  "cancelled": 880123
}

PATCH /Send/Mail/{id}/Reschedule

Reagendar um email individual agendado

Altera a data de envio. A nova data tem de ser futura e dentro de 90 dias. POST também é aceite.

Scope OAuth : email:send

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)simid_single_send devolvido por POST /Send/Mail

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
date_plannedstring (date-time)simNova data de envio (ISO 8601)

Respostas

CódigoDescrição
200Email reagendado
400Data em falta
401Token inválido ou expirado
409Envio não encontrado, já expedido ou data fora dos limites

Exemplo 200

{
  "result": "ok",
  "id": 880123,
  "date_planned": "2026-12-15T09:00:00"
}

Sender Addresses

Gerir endereços de email de remetente validados. Apenas endereços verificados podem ser utilizados como From.

GET /SenderEmail

Listar endereços de remetente

Devolve os endereços de email de remetente validados configurados para a conta.

Parâmetros

NomeOndeTipoObrigatórioDescrição
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Endereços de remetente devolvidos com sucesso
401Token inválido ou expirado

Exemplo 200

[
  {
    "id": 201,
    "email": "[email protected]",
    "sender_name": "Your Company Newsletter",
    "is_validated": true
  }
]

POST /SenderEmail

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

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
emailstringsimEndereço do remetente
sender_namestringsimNome apresentado aos destinatários

Respostas

CódigoDescrição
200Endereço adicionado. domain_has_mx é false quando o domínio não tem registo MX.
400email ou sender_name em falta
401Token inválido ou expirado
422Endereç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.
503Temporariamente indisponível, tente novamente

Exemplo 200

{
  "result": "ok",
  "confirmation_sent": true,
  "domain_has_mx": true
}

POST /SenderEmail/{id}/ResendValidation

Enviar novamente o email de validação

Para um endereço ainda a aguardar validação.

Scope OAuth : email:templates:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathintegersimid_sender_email de GET /SenderEmail

Respostas

CódigoDescrição
200Email enviado novamente
401Token inválido ou expirado
404Remetente não encontrado
409Este remetente já está validado
503Temporariamente indisponível, tente novamente

Exemplo 200

{
  "result": "ok",
  "confirmation_sent": true
}

GET /SenderEmail/{id}/Authentication

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: dkim_settings_url abre o ecrã certo.

Scope OAuth : email:templates:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathintegersimid_sender_email de GET /SenderEmail

Respostas

CódigoDescrição
200Estado do domínio. spf.recommended_record é criado a partir do seu registo atual: publique-o apenas se spf.change_needed for true.
401Token inválido ou expirado
404Remetente não encontrado
503Temporariamente indisponível, tente novamente

Exemplo 200

{
  "domain": "example.com",
  "spf": {
    "valid": true,
    "record": "v=spf1 include:spf.mailpro.com -all",
    "recommended_record": "v=spf1 include:spf.mailpro.com -all",
    "change_needed": 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"
  },
  "dkim_settings_url": "https://app.mailpro.com/dkim/list?d=example.com"
}

History

Navegar pelo registo de envios anteriores de email e SMS.

GET /History/Email

Listar histórico de envios de email

Devolve o registo de envios de email anteriores da conta.

Parâmetros

NomeOndeTipoObrigatórioDescrição
subjectMessagequerystringFiltrar pelo assunto (correspondência parcial)
idCampaignqueryintegerFiltrar pelo ID da campanha
includeBodyHTMLquerybooleanIncluir o corpo HTML completo na resposta (mais lento)
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Histórico de email devolvido com sucesso
401Token inválido ou expirado

GET /History/SMS

Listar histórico de envios de SMS

Devolve o registo de envios de SMS anteriores da conta.

Parâmetros

NomeOndeTipoObrigatórioDescrição
dateSendquerystring (date-time)Filtrar a partir desta data (ISO 8601)
dateSendEndquerystring (date-time)Filtrar até esta data (ISO 8601)
phoneNumberquerystringFiltrar pelo telefone do destinatário (parcial)
typequeryintegerFiltro de tipo de SMS
statusCodequeryintegerFiltro de código de estado DLR
sortByStatusqueryboolean
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Histórico de SMS devolvido com sucesso
401Token inválido ou expirado

Segment

Gerir segmentos dinâmicos — regras de filtragem guardadas que selecionam automaticamente contactos com base em valores de campo, comportamento ou pertença a listas.

GET /Segment

Listar segmentos

Devolve todos os segmentos dinâmicos guardados da conta.

Scope OAuth : contacts:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Segmentos devolvidos com sucesso
401Token inválido ou expirado

GET /Segment/{id}/Contact

Listar os contactos de um segmento

Com id_list, devolve apenas os contactos dessa lista que entram no segmento: os que uma campanha lista + segmento alcançaria. O total está no cabeçalho X-Total-Count.

Scope OAuth : contacts:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)simID do segmento
id_listqueryinteger (int64)Limitar a esta lista (opcional)
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Contactos devolvidos
401Token inválido ou expirado
404Segmento ou lista não encontrados

GET /Segment/{id}/Count

Contar os contactos de um segmento

Apenas o número, para conhecer antecipadamente a dimensão de um envio. Com id_list, conta apenas os contactos dessa lista que entram no segmento.

Scope OAuth : contacts:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)simID do segmento
id_listqueryinteger (int64)Limitar a esta lista (opcional)

Respostas

CódigoDescrição
200Número de contactos
401Token inválido ou expirado
404Segmento ou lista não encontrados

Exemplo 200

{
  "total": 1250
}

GET /Segment/{id}/contact/{contactId}/check

Verificar se um contacto corresponde a um segmento

Verifica se um contacto específico (por GUID) corresponde atualmente às regras de um determinado segmento. Útil para acionar lógica de automação a pedido.

Scope OAuth : contacts:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)simID do segmento
contactIdpathstring (uuid)simGUID do contacto

Respostas

CódigoDescrição
200Devolve o resultado da correspondência
401Token inválido ou expirado
404Segmento ou contacto não encontrados

SMS

Enviar mensagens SMS para contactos individuais ou para listas inteiras de contactos. Utiliza o campo phone_number de cada contacto.

POST /Sms/SingleSMS

Enviar SMS único

Envia um SMS único para um número de telefone diretamente. Utilize-o para mensagens transacionais (OTPs, confirmações de encomenda, alertas). O número de telefone aceita +41…, 0041… ou 41… com ou sem separadores — consulte Formato do número de telefone na descrição da API para entradas aceites / rejeitadas.

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
phone_numberstringsimNúmero de telefone do destinatário — aceita +41…, 0041… ou 41… com ou sem separadores. Consulte Formato do número de telefone na descrição da API.
messagestringsimTexto da mensagem SMS (máximo 160 caracteres para codificação padrão)
date_plannedstring (date-time)Agendar o envio. Omita para enviar de imediato.

Exemplo

{
  "phone_number": "+41791234567",
  "message": "Your verification code is 9473. Valid for 10 minutes."
}

Respostas

CódigoDescrição
200SMS enviado ou agendado com sucesso
401Token inválido ou expirado
422Formato de número de telefone inválido

POST /Sms/Campaign

Enviar campanha de SMS

Envia uma mensagem SMS para o campo phone_number de todos os contactos em uma ou mais listas. Os contactos sem número de telefone são ignorados.

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
listsarray of ListRefsimListas de contactos alvo (utiliza o campo phone_number de cada contacto)
messagestringsimTexto da mensagem SMS
date_plannedstring (date-time)Agendar o envio. Omita para enviar de imediato.

Exemplo

{
  "lists": [
    {
      "id": 101
    }
  ],
  "message": "Flash sale today — 20% off. Shop at mailpro.com",
  "date_planned": "2026-04-20T10:00:00"
}

Respostas

CódigoDescrição
200Campanha de SMS enviada ou agendada com sucesso
401Token inválido ou expirado

GET /Sms

Listar histórico de SMS

Devolve o registo de envios de SMS (único e em campanha) da conta.

Parâmetros

NomeOndeTipoObrigatórioDescrição
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Histórico de SMS devolvido com sucesso
401Token inválido ou expirado

DELETE /Sms/{id}

Cancelar um SMS agendado

Cancela um envio de SMS agendado pendente.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)simID do envio de SMS

Respostas

CódigoDescrição
200SMS agendado cancelado com sucesso
401Token inválido ou expirado
404Envio de SMS não encontrado

GET /Sms/Scheduled

Listar envios de SMS agendados

Devolve envios de SMS com date_planned futuro (ainda não despachados), ordenados por data ascendente.

Parâmetros

NomeOndeTipoObrigatórioDescrição
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Envios de SMS agendados devolvidos com sucesso
401Token inválido ou expirado

POST /Sms/{id}/Cancel

Cancelar um SMS agendado

Cancela um envio de SMS agendado apenas se ainda não tiver sido despachado.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathintegersimID do envio de SMS

Respostas

CódigoDescrição
200SMS agendado cancelado com sucesso
401Token inválido ou expirado
409Envio de SMS não encontrado, não pertence ao cliente, ou já despachado

PATCH /Sms/{id}/Reschedule

Reagendar um SMS agendado

Atualiza a data de envio planeada de um SMS agendado. A nova data tem de estar no futuro e dentro de 90 dias. Falha se o SMS já tiver sido despachado.

Nome do campo no corpo: a API aceita date_planned (snake_case, primário), bem como os aliases legados PlanDate e scheduled_time. Forneça qualquer um deles.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathintegersimID do envio de SMS

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
date_plannedstring (date-time)Nome do campo primário.
PlanDatestring (date-time)Alias legado aceite por compatibilidade retroativa.
scheduled_timestring (date-time)Alias legado aceite por compatibilidade retroativa.

Respostas

CódigoDescrição
200SMS agendado reagendado com sucesso
400Data em falta — forneça um de date_planned / PlanDate / scheduled_time
401Token inválido ou expirado
409Reagendamento falhou (não encontrado, já despachado ou data fora de intervalo)

Folders

Organizar modelos de mensagens em pastas.

GET /FolderList

Listar pastas de listas

Devolve as pastas utilizadas para organizar as listas de contactos.

Parâmetros

NomeOndeTipoObrigatórioDescrição
namequerystringFiltrar pelo nome da pasta (parcial)
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Pastas de listas devolvidas com sucesso
401Token inválido ou expirado

GET /FolderList/{id}

Obter uma única pasta de listas

Devolve os detalhes de uma pasta de listas pelo seu ID.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathintegersimID da pasta

Respostas

CódigoDescrição
200Pasta devolvida com sucesso
401Token inválido ou expirado
404Pasta não encontrada

GET /FolderMessage

Listar pastas de mensagens

Devolve as pastas utilizadas para organizar os modelos de mensagens de email.

Parâmetros

NomeOndeTipoObrigatórioDescrição
namequerystringFiltrar pelo nome da pasta
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Pastas de mensagens devolvidas com sucesso
401Token inválido ou expirado

Import

Carregar um ficheiro CSV ou XLSX para importar contactos em massa para uma lista. O ficheiro é colocado em fila para processamento assíncrono — acompanhe a conclusão através do import_job_id devolvido ou através do callback opcional webhook_url.

POST /Import/Upload

Carregar um ficheiro de contactos (CSV / XLSX) para importação em massa

Carregue um ficheiro CSV ou XLSX para importar contactos para uma lista. O ficheiro é armazenado e colocado em fila para processamento assíncrono — o endpoint devolve um import_job_id de imediato.

Tipo de pedido: multipart/form-data

Campos de formulário obrigatórios:

Opcional:

Formato do ficheiro:

Corpo do pedido (multipart/form-data)

NomeTipoObrigatórioDescrição
id_listinteger (int64)simID da lista de destino
filestring (binary)simFicheiro CSV ou XLSX (UTF-8, máximo 50 MB)
json_match_fieldsstringsimCorrespondência JSON entre as colunas do ficheiro e os campos do contacto
webhook_urlstring (uri)URL de callback invocado quando o processamento termina

Respostas

CódigoDescrição
200Ficheiro aceite e colocado em fila
400Nenhum ficheiro carregado, id_list em falta, ou json_match_fields ausente / inválido
401Token inválido ou expirado
500Erro de servidor ou de armazenamento

Exemplo 200

{
  "result": "OK",
  "import_job_id": 14,
  "internal_name": "230575-20260420142615-contacts.csv"
}

Webhooks

Subscreva o seu servidor a notificações de eventos em tempo real. O Mailpro envia uma carga útil JSON assinada com HMAC via POST para o seu URL assim que o evento subscrito ocorrer. Consulte a secção "Webhooks" na introdução para o catálogo completo de eventos, envelope de carga útil, fragmentos de verificação de assinatura e política de novas tentativas.

GET /Webhook

Listar webhooks

Devolve todos os webhooks configurados na conta autenticada.

Respostas

CódigoDescrição
200Array de webhooks
401Token inválido ou expirado

POST /Webhook

Criar um webhook

Cria uma nova subscrição de webhook. A resposta contém um secret que is apresentado apenas uma vez — armazene-o imediatamente, no lado do servidor. Utilize-o para verificar a assinatura HMAC de cada carga útil recebida.

Limites: máximo 20 webhooks por conta, máximo 50 eventos por webhook.

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
urlstring (uri)simEndpoint HTTPS (HTTP recusado em produção)
eventsarray of stringsimLista de tipos de eventos a subscrever (consulte o catálogo acima). Utilize ["*"] para subscrever todos os eventos desta API.
descriptionstringDescrição livre para sua referência

Exemplo

{
  "url": "https://example.com/hooks/mailpro",
  "events": [
    "email.delivered",
    "email.bounced",
    "contact.created"
  ],
  "description": "Integração Slack"
}

Respostas

CódigoDescrição
201Webhook criado — secret é devolvido apenas aqui
400URL, lista de eventos inválidos ou limite excedido
401Token inválido ou expirado

Exemplo 201

{
  "id": 42,
  "url": "https://example.com/hooks/mailpro",
  "events": [
    "email.delivered",
    "email.bounced",
    "contact.created"
  ],
  "description": "Integraçã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"
}

GET /Webhook/{id}

Obter um webhook

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Respostas

CódigoDescrição
200O webhook
404Webhook não encontrado

PUT /Webhook/{id}

Atualizar um webhook

Atualização parcial — apenas os campos enviados são modificados.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
urlstring (uri)
eventsarray of string
descriptionstring
isActivebooleanDefina true para reativar um webhook desativado automaticamente assim que o seu endpoint estiver corrigido.

Respostas

CódigoDescrição
200Webhook atualizado
400Carga útil inválida
404Webhook não encontrado

DELETE /Webhook/{id}

Eliminar um webhook

Elimina permanentemente o webhook e todo o seu histórico de entregas.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Respostas

CódigoDescrição
204Eliminado
404Webhook não encontrado

POST /Webhook/{id}/test

Enviar um evento de teste

Coloca em fila um evento ping imediato (ou qualquer outro tipo de evento através do campo eventType do corpo) para o seu endpoint. Útil para verificar a acessibilidade e a verificação de assinatura antes de depender de eventos reais.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
eventTypestringSubstituir o tipo de evento (deve estar subscrito por este webhook). ping funciona sempre.

Exemplo

{
  "eventType": "ping"
}

Respostas

CódigoDescrição
202Evento colocado em fila para despacho
404Webhook não encontrado

Exemplo 202

{
  "deliveryId": 1234,
  "eventId": "evt_8f3a9b2c4d1e5f6789abcdef01234567",
  "eventType": "ping"
}

POST /Webhook/{id}/rotate-secret

Rodar o segredo HMAC

Gera um novo segredo HMAC e invalida o antigo de imediato. O novo segredo é devolvido uma única vez na resposta — armazene-o. Cada entrega a partir deste momento será assinada com o novo segredo.

Utilize isto se suspeitar que o seu segredo foi comprometido.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Respostas

CódigoDescrição
200Novo segredo (visível uma vez)
404Webhook não encontrado

Exemplo 200

{
  "secret": "whsec_XyzA9876BcdE5432FghI1098JklM7654NopQ"
}

GET /Webhook/{id}/deliveries

Listar tentativas de entrega

Devolve o histórico de tentativas de despacho deste webhook (retenção de 30 dias). Útil para depuração — quais eventos foram enviados, códigos de estado recebidos, contagens de novas tentativas, mensagens de erro.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim
limitqueryinteger
cursorqueryinteger (int64)Cursor de paginação (= último ID de entrega visto). Devolve entregas com id < cursor.

Respostas

CódigoDescrição
200Array de tentativas de entrega (mais recentes primeiro)
404Webhook não encontrado

POST /Webhook/{id}/deliveries/{deliveryId}/replay

Reproduzir uma entrega

Coloca em fila uma nova tentativa de entrega com a mesma carga útil do original. Útil para reacionar uma entrega falhada após corrigir o seu endpoint. Uma NOVA linha Webhook_Delivery é criada (a original é preservada para auditoria). A reprodução passa pela política de novas tentativas padrão (10s → 1min → 5min → 30min → 2h → 6h → 24h, depois abandonada).

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim
deliveryIdpathinteger (int64)sim

Respostas

CódigoDescrição
202Reprodução colocada em fila
404Webhook ou entrega não encontrados

Suppression

Bounces e cancelamentos de subscrição da conta: listar, adicionar, remover.

GET /Suppression/Bounces

Listar os bounces da conta

Os mais recentes primeiro. O total está no cabeçalho X-Total-Count.

Scope OAuth : email:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
typequerystring: hard, softhard ou soft
sourcequerystringOrigem do bounce: list, contact, api ou smtp
emailquerystringEndereço exato
dateFromquerystring (date-time)A partir desta data
dateToquerystring (date-time)Até esta data
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Bounces devolvidos
400type tem de ser hard ou soft
401Token inválido ou expirado

Exemplo 200

[
  {
    "id": 5521,
    "source": "contact",
    "type": "hard",
    "email": "[email protected]",
    "date": "2026-10-12T08:30:00",
    "diag_code": "550 5.1.1 User unknown",
    "id_list": 101
  }
]

DELETE /Suppression/Bounces/{id}

Remover um bounce

source e type são obrigatórios, tal como devolvidos por GET /Suppression/Bounces: um id sozinho não é único.

Scope OAuth : contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)simid do bounce
sourcequerystringsimlist, contact, api ou smtp
typequerystring: hard, softsimhard ou soft

Respostas

CódigoDescrição
200Bounce removido
400source ou type em falta
401Token inválido ou expirado
404Bounce não encontrado

Exemplo 200

{
  "result": "ok",
  "id": 5521,
  "restored": false
}

POST /Suppression/Bounces/{id}/Restore

Repor nas suas listas um contacto com hard bounce

Apenas para um hard bounce com a origem contact.

Scope OAuth : contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)simid do bounce

Respostas

CódigoDescrição
200Contacto reposto
401Token inválido ou expirado
404Hard bounce de um contacto não encontrado ou endereço já não ativo

Exemplo 200

{
  "result": "ok",
  "id": 5521,
  "restored": true
}

GET /Suppression/Unsubscribers

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

NomeOndeTipoObrigatórioDescrição
sourcequerystringOrigem do cancelamento: contact, list, smtp, api ou api3
emailquerystringEndereço exato
dateFromquerystring (date-time)A partir desta data
dateToquerystring (date-time)Até esta data
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respostas

CódigoDescrição
200Cancelamentos de subscrição devolvidos
401Token inválido ou expirado

Exemplo 200

[
  {
    "id": 9012,
    "source": "api3",
    "email": "[email protected]",
    "date": "2026-10-20T16:05:00",
    "list_name": null,
    "comment": "Asked by phone"
  }
]

POST /Suppression/Unsubscribers

Adicionar um cancelamento de subscrição

Sem id_list, a subscrição do endereço é cancelada para toda a conta. Com id_list, apenas nessa lista de cancelamento.

Scope OAuth : contacts:write

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
emailstringsimEndereço cuja subscrição cancelar
commentstringComentário livre
id_listinteger (int64)Lista de cancelamento da conta (opcional)

Respostas

CódigoDescrição
200Concluído. already_unsubscribed é true quando a subscrição do endereço já estava cancelada.
400É necessário um endereço válido
401Token inválido ou expirado
404id_list não é uma lista de cancelamento desta conta

Exemplo 200

{
  "result": "ok",
  "already_unsubscribed": false
}

DELETE /Suppression/Unsubscribers/{id}

Remover um cancelamento de subscrição

source é obrigatório, tal como devolvido por GET /Suppression/Unsubscribers: um id sozinho não é único.

Scope OAuth : contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)simid do cancelamento
sourcequerystringsimcontact, list, smtp, api ou api3

Respostas

CódigoDescrição
200Cancelamento de subscrição removido
400source é obrigatório
401Token inválido ou expirado
404Cancelamento de subscrição não encontrado

Exemplo 200

{
  "result": "ok",
  "removed": 9012
}