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

API SMS Mailpro™ : Referência

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

A API SMS Mailpro™ permite gerir programaticamente listas de contactos telefónicos, números de telefone e enviar SMS em massa ou individualmente.

Autenticação

Todos os endpoints aceitam três métodos de autenticação. Utilize aquele que melhor se adeque à sua stack.

> O Bearer JWT legado e o id_client+api_key continuam a funcionar sem alterações e não > são restringidos por scope. Apenas os tokens de acesso OAuth 2.0 estão sujeitos às > verificações de scope por endpoint apresentadas em cada operação abaixo.

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

A Mailpro disponibiliza um único servidor de autorização OAuth 2.0 para todas as suas APIs, 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 SMS, na CRM v3 e na Email v2. Os endpoints que poderá invocar são determinados pelos scopes do token e não pelo URL base da API. Emissor (claim iss): https://api.mailpro.com/oauth/.

EndpointURL
AuthorizeGET https://api.mailpro.com/oauth/authorize
Token / RefreshPOST https://api.mailpro.com/oauth/token
JWKSGET https://api.mailpro.com/oauth/.well-known/jwks
DiscoveryGET https://api.mailpro.com/oauth/.well-known/openid-configuration

Grants: authorization_code + PKCE (S256, obrigatório), client_credentials, refresh_token (rotação). TTL do token de acesso 20 min; refresh token 30 dias (deslizante, de uso único); código de autorização 60 s.

Quickstart — obter um token e invocar esta API (substitua os marcadores; nunca faça commit de um secret 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=sms:send sms:read"

Depois invoque esta API com Authorization: Bearer ACCESS_TOKEN. O mesmo token funciona nas APIs CRM v3 e Email v2. Um token sem o scope exigido por um endpoint recebe 403 insufficient_scope. Para o passo a passo completo do fluxo e o catálogo de scopes, consulte a documentação da API CRM v3 › Autenticação. Scopes relevantes para SMS: sms:send, sms:read, sms:contacts:read, sms:contacts:write, account:read.

Método 2 — Bearer JWT (legado)

Authorization: Bearer <access_token>

Obtenha um token via POST /token (form-encoded, OAuth2 password grant):

POST https://api.mailpro.com/sms/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 Email v2 — autentique-se uma vez e invoque qualquer API. Os tokens são válidos por 30 dias por defeito; utilize grant_type=refresh_token para os renovar sem voltar a autenticar. Não tem scopes — prefira o OAuth 2.0 para integrações instaláveis.

Método 3 — id_client + api_key

Duas credenciais:

ParâmetroTipoDescrição
id_clientintegerO seu ID numérico de cliente Mailpro, disponível em Definições → Acesso à API
api_keystringA sua chave de API (formato GUID), disponível em Definições → Acesso à API

Envie-as num destes locais — escolha um:

Se fornecer credenciais em mais do que um local, o cabeçalho prevalece.

Aplicação de scopes OAuth por endpoint (SMS)

Para tokens emitidos via OAuth, cada grupo de endpoints exige um scope (a autenticação legada está isenta). Cada operação indica o seu scope em Authorization. Resumo:

EndpointsScope exigido
/send/* (em massa, individual, agendamento)sms:send
/history/list, /credit/getsms:read
/phone/list, /list/listsms:contacts:read
/phone/{add,edit,del}, /list/{edit,del}, /import/uploadsms:contacts:write
/account/limitsaccount:read

> O POST /list/add (criar uma lista) é atualmente acessível por qualquer > token válido — ainda não é restringido por scope. A rejeição por scope nos endpoints > restringidos devolve 403 com > { "error": "insufficient_scope", "required_scope": "…" }.

Formato da resposta

Todos os endpoints suportam json (predefinição) e xml. Especifique o formato no URL:

Os nomes dos campos nas respostas estão em PascalCase (TotalCredits, FirstName, …), enquanto os parâmetros de pedido estão em snake_case (id_client, address_book_id, …). Os endpoints de lista envolvem as suas linhas num array Items.

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.

Custo em créditos de um SMS

Um SMS custa créditos do país × número de partes.

Créditos do país — cada país de destino tem um preço de 1, 2 ou 3 créditos, com base no prefixo internacional do número. O envio para um número cujo prefixo não tarifamos é rejeitado com um 400.

Número de partes — uma mensagem mais longa do que um SMS é dividida pelo operador e cada parte é cobrada. O limite depende dos caracteres utilizados:

AlfabetoMensagem únicaPor parte quando dividida
GSM-7 (latino padrão)160 caracteres153 caracteres
Unicode (acentos fora do GSM-7, cirílico, emoji, …)70 caracteres67 caracteres

Um único carácter fora do GSM-7 passa toda a mensagem para Unicode; assim, um emoji pode levar uma mensagem de 160 caracteres de 1 para 3 partes. Os caracteres ^ { } [ ] ~ | \ e € contam como dois cada um, embora sejam GSM-7.

*Exemplo:* uma mensagem de 300 caracteres em latino padrão = 2 partes; enviada para um país de 2 créditos, custa 2 × 2 = 4 créditos por destinatário.

Formato do número 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, underscores 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:

Códigos de erro

HTTPCódigoSignificado
400103Entrada malformada — parâmetro obrigatório em falta ou inválido
202202Créditos SMS insuficientes
401id_client / api_key inválidos
500500Erro interno

Webhooks

A Mailpro™ pode notificar o seu servidor em tempo real quando ocorrem eventos SMS na sua conta (um SMS é entregue, um SMS falha, o seu saldo de créditos está baixo, etc.). Ao estilo Stripe — o seu URL recebe um POST assinado com HMAC-SHA256 assim que o evento dispara.

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 eliminar um webhook, a > alteração demora até 10 minutos a propagar-se pelos servidores da API Mailpro. > Durante essa janela, os eventos podem ainda não corresponder à sua nova subscrição > (ou continuar a corresponder a uma acabada de remover). Este é o tempo necessário para > atualizar a cache em memória de subscrições em cada instância da API.

Envelope do payload

Todos os eventos partilham um envelope comum:

{
  "id":         "evt_8f3a9b2c4d1e5f6789abcdef01234567",
  "type":       "sms.queued",
  "created":    1748194800,
  "apiVersion": "sms",
  "account":    { "id": 12345, "name": "ACME Corp" },
  "data":       {
    "messageId":   12345,
    "to":          "41791234567",
    "queuedAt":    "2026-05-27T14:32:12.0123456Z",
    "scheduledAt": "2026-05-27T14:32:12.0123456Z",
    "parts":       1
  }
}
CampoFormatoDescrição
idevt_ + 32 hexID único do evento — utilize-o como chave de idempotência do seu lado.
type<domínio>.<verbo>Tipo canónico do evento.
createdSegundos Unix UTCIncluído na assinatura HMAC.
apiVersion"sms" para eventos emitidos por POST /sms/send/add_single; "v3" para eventos emitidos por POST /v3/Sms/SingleSMS; "watcher" para eventos baseados em DLR emitidos pelo worker.Qual o componente Mailpro que publicou o evento.
account.idintO seu ID de cliente Mailpro (= id_client).
account.namestringO nome da sua conta (útil para debug do lado do cliente).
dataobjectPayload do evento — a estrutura depende do type (ver catálogo abaixo).

Catálogo de eventos

Apenas os eventos listados abaixo são efetivamente emitidos. As estruturas correspondem ao JSON literal enviado pela plataforma — utilize exatamente estes nomes de campos ao fazer parsing.

EventoDisparoEstrutura de data
pingTeste via POST /webhooks/{id}/test{ message }
sms.queuedPOST /sms/send/add_single ou POST /v3/Sms/SingleSMS aceite na fila de envio Mailpro{ messageId: int, to: string, queuedAt: ISO-8601, scheduledAt: ISO-8601, parts: int }
sms.deliveredDLR com código de operadora 004 ou 008 (códigos de sucesso){ messageId: int, phone: string, stateCode: string, dlrDate: datetime }
sms.failedDLR com qualquer outro código de operadora (timeout, não entregue, rejeitado, em lista negra, …){ messageId: int, phone: string, stateCode: string, dlrDate: datetime }
credits.sms.lowSaldo de créditos SMS desceu abaixo do seu limiar de alerta (worker CreditsLowWatcher){ remaining: int, threshold: int, alertedAt: ISO-8601 }

> Nota — não existe um evento sms.sent. O DLR da operadora é o único feedback > que a plataforma recebe entre "queued" e "delivered/failed", pelo que o próximo > evento que receberá após sms.queued será sms.delivered (sucesso) ou > sms.failed (erro). A maioria das mensagens chega à operadora em segundos e o > DLR em minutos; as condições da rede móvel podem ocasionalmente prolongar este prazo > para horas.

> Nomenclatura dos campos — sms.queued utiliza to (o destino tal como submetido > pelo invocador da API, após normalização). sms.delivered / sms.failed utilizam > phone (o destino tal como devolvido pela operadora no DLR). Na prática serão > os mesmos dígitos, mas os nomes diferem porque os eventos > têm origem em caminhos de código distintos.

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

Assinatura HMAC

Cada POST inclui um cabeçalho X-Mailpro-Signature:

X-Mailpro-Signature: t=1748194800,v1=7f9ac2b6e4d1c8a3...
X-Mailpro-Event-Id:  evt_8f3a9b2c4d1e5f6789abcdef01234567
X-Mailpro-Event-Type: sms.delivered
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"]));
}

Tentativas e desativação automática

TentativaAtraso até à próxima tentativa
1 → 210 segundos
2 → 31 minuto
3 → 45 minutos
4 → 530 minutos
5 → 62 horas
6 → 76 horas
7abandonada (entrega marcada como failed)

Após 10 falhas consecutivas no mesmo webhook, este é automaticamente desativado (isActive: false) e receberá uma notificação por email. Reative-o com PUT /webhooks/{id} assim que o seu endpoint estiver corrigido.

Sucesso = HTTP 2xx

Consideramos o seu webhook como bem-sucedido apenas se devolver um status entre 200–299. Qualquer 3xx/4xx/5xx ou um timeout (> 10 s) conta como falha e desencadeia novas tentativas. Se o seu endpoint estiver permanentemente inativo, devolva explicitamente 410 Gone — as tentativas continuam a ocorrer, mas o motivo da falha fica mais claro no seu log de entregas.

Limites

LimiteValor
Webhooks por conta20
Eventos subscritos por webhook50
Tamanho máximo do payload256 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 restantes chamadas à API. O endpoint SMS /token é um redireccionamento 307 para o emissor canónico /v3/token — o seu cliente HTTP segue o redireccionamento de forma transparente (o método POST e o corpo do pedido são preservados).

POST /token

Obter token de acesso (redireccionamento 307 para /v3/token)

Obtém um token JWT Bearer utilizando as credenciais do cliente Mailpro. Envie o access_token devolvido como Authorization: Bearer <token> em todos os pedidos subsequentes. O mesmo token é igualmente válido na API CRM v3 e na API Email v2.

> ⚙ Detalhe de implementação — POST /sms/token é um redireccionamento > temporário 307 para POST /v3/token (configurado na camada de reescrita do > web.config do IIS). 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 redireccionamento de forma transparente — continua a enviar pedidos para /sms/token e recebe > de volta um JWT válido. Não há lógica de emissão de tokens duplicada; a > API SMS nunca emite tokens por si própria.

Tipos de grant suportados
Tipo de grantCaso de uso
passwordIntegração padrão — nome de utilizador + chave de API
refresh_tokenRenovar um token de acesso que está a expirar sem reautenticação
client_credentialsServidor-a-servidor apenas com o ID de cliente
Tempo de vida do token

Utilize grant_type=refresh_token para renovar o token de acesso sem reautenticação. Guarde os tokens no 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 documentação do /token da API CRM v3 para a nota de segurança completa.

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

NomeTipoObrigatórioDescrição
grant_typestring: password, refresh_token, client_credentialssim
usernamestringO seu nome de utilizador Mailpro (email). Obrigatório para o grant password.
passwordstringA sua chave de API Mailpro (formato GUID). Obrigatório para o grant password.
refresh_tokenstringRefresh token anterior. Obrigatório para o grant refresh_token.
client_idstringO seu ID de cliente Mailpro (inteiro). Obrigatório para o grant client_credentials.

Respostas

CódigoDescrição
200Token emitido com sucesso. Devolvido por POST /v3/token após o seguimento transparente do 307 — o seu cliente HTTP vê um 200 normal com a mesma forma de corpo que receberia directamente do endpoint de token v3.
307Redireccionamento temporário para POST /v3/token, emitido pela regra de reescrita do IIS no web.config. Os clientes HTTP em conformidade com a norma seguem este redireccionamento automaticamente e preservam o método POST original + o corpo do formulário. Visível apenas para clientes que desactivam explicitamente o seguimento de redireccionamentos (p. ex. curl --max-redirs 0).
400Credenciais inválidas ou tipo de grant 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

Verifique o seu saldo de créditos SMS, a quota mensal da API e o estado da conta.

GET /account/limits.{format}

Obter quota mensal da API

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

Cálculo da quota: o limite é calibrado a partir dos créditos de 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. Reinicia na data de aniversário da subscrição (e não no dia 1 do mês de calendário).

O que consome créditos:

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

A quota é partilhada entre as 3 APIs Mailpro (v2, v3, sms) — um cliente = um orçamento mensal em toda a plataforma. Os envios SMS consomem adicionalmente o saldo de créditos SMS dedicado (GET /credit/get.{format}).

Scope OAuth : account:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta

Respostas

CódigoDescrição
200Instantâneo da quota
401Credenciais inválidas
404Nenhum 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": null
}

Send SMS

Envie mensagens SMS — quer um SMS transaccional único para um destinatário, quer uma campanha em massa para uma lista de contactos completa.

POST /send/add.{format}

Enviar SMS em massa para uma lista de contactos

Envia uma mensagem SMS para todos os números de telefone de uma lista de contactos. Suporta agendamento: defina scheduled_time para uma data futura para enviar mais tarde, ou omita-o para enviar imediatamente.

Consumo de créditos: os créditos são debitados no momento do envio. Mensagens longas (>160 caracteres GSM-7) são divididas em várias partes, cada uma consumindo créditos adicionais.

A resposta devolve { "Error": "Insufficient Credit", "Code": 202 } se a conta não tiver créditos suficientes.

Scope OAuth : sms:send

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta

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

NomeTipoObrigatórioDescrição
id_clientintegersimO seu ID de cliente Mailpro
api_keystringsimA sua chave de API (GUID)
messagestringsimTexto da mensagem SMS. Mantenha abaixo dos 160 caracteres para um SMS de parte única. Caracteres fora do alfabeto GSM-7 (p. ex. chinês, árabe, emoji) mudam a codificação para Unicode, reduzindo o limite para 70 caracteres por parte.
tointegersimID da lista de contactos para a qual enviar (obtido em /list/list)
scheduled_timestring (date-time)Agende o envio para uma data/hora futura (ISO 8601). Omita ou deixe vazio para enviar imediatamente.
shorten_urlsbooleanDefina true para substituir cada hiperligação da mensagem por uma ligação curta https://mailp.ro/m/...: menos caracteres, logo por vezes menos partes de SMS faturadas. Uma hiperligação que não possa ser encurtada fica como está.

Respostas

CódigoDescrição
200Envio SMS em massa criado com sucesso
202Créditos SMS insuficientes
400Falta um campo obrigatório
401Credenciais inválidas

Exemplo 200

{
  "Id": 6001,
  "Message": "Flash sale today only — 30% off all orders. Shop now at mailpro.com/shop",
  "ScheduledTime": "2026-04-20T10:00:00",
  "To": [
    "42"
  ]
}

Exemplo 202

{
  "Error": "Insufficient Credit",
  "Code": 202
}

Exemplo 400

{
  "Error": "Malformed Input",
  "Code": 103
}

GET /send/add_single.{format}

Enviar um SMS único (GET)

Envia um único SMS para um destinatário através de um pedido GET. Útil para integrações simples nas quais POST não está disponível. As credenciais e a mensagem são passadas como parâmetros de query.

Nota: evite utilizar GET para mensagens sensíveis — os parâmetros de query aparecem nos registos do servidor. Prefira POST /send/add_single.

Scope OAuth : sms:send

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta
toquerystringsimNú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.
messagequerystringsimTexto da mensagem SMS (máximo 160 caracteres para codificação padrão)
scheduled_timequerystring (date-time)Agende o envio (ISO 8601). Omita para enviar imediatamente.
shorten_urlsquerybooleanDefina true para substituir cada hiperligação da mensagem por uma ligação curta https://mailp.ro/m/...: menos caracteres, logo por vezes menos partes de SMS faturadas. Uma hiperligação que não possa ser encurtada fica como está.

Respostas

CódigoDescrição
200SMS enviado (ou agendado) com sucesso
202Créditos SMS insuficientes
400Falta um parâmetro obrigatório
401Credenciais inválidas

Exemplo 200

{
  "Id": 5001,
  "Message": "Your appointment is confirmed for tomorrow at 10:00.",
  "ScheduledTime": "2026-04-15T09:00:00",
  "To": "0041791234567",
  "Charge": "1"
}

POST /send/add_single.{format}

Enviar um SMS único

Envia uma única mensagem SMS para um número de telefone destinatário. Suporta agendamento através de scheduled_time.

Consumo de créditos: os créditos são debitados no momento do envio. O campo Charge na resposta mostra quantos créditos foram consumidos.

A resposta devolve { "Error": "Insufficient Credit", "Code": 202 } se a conta não tiver créditos suficientes.

Scope OAuth : sms:send

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta

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

NomeTipoObrigatórioDescrição
id_clientintegersimO seu ID de cliente Mailpro
api_keystringsimA sua chave de API (GUID)
messagestringsimTexto da mensagem SMS
tostringsimNú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.
scheduled_timestring (date-time)Agende o envio para uma hora futura. Omita para enviar imediatamente.
shorten_urlsbooleanDefina true para substituir cada hiperligação da mensagem por uma ligação curta https://mailp.ro/m/...: menos caracteres, logo por vezes menos partes de SMS faturadas. Uma hiperligação que não possa ser encurtada fica como está.

Respostas

CódigoDescrição
200SMS enviado (ou agendado) com sucesso
202Créditos SMS insuficientes
400Falta um campo obrigatório
401Credenciais inválidas

Exemplo 200

{
  "Id": 5001,
  "Message": "Your verification code is 8472. Valid for 10 minutes.",
  "ScheduledTime": "2026-04-15T14:30:00",
  "To": "0041791234567",
  "Charge": "1"
}

Exemplo 202

{
  "Error": "Insufficient Credit",
  "Code": 202
}

Exemplo 400

{
  "Error": "Malformed Input",
  "Code": 103
}

GET /send/list.{format}

Listar campanhas SMS

Devolve a lista de campanhas SMS (envios em massa) para a conta. Paginação através dos cabeçalhos NumberOfRecords e PageNumber.

Utilize type_to para filtrar por tipo de envio:

Scope OAuth : sms:send

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta
type_toqueryinteger: 0, 1Filtro do tipo de envio: - 0 (predefinição) — envios em massa para uma lista de contactos - 1 — envios únicos para números individuais

Respostas

CódigoDescrição
200Lista de campanhas SMS devolvida com sucesso
401Credenciais inválidas

Exemplo 200

[
  {
    "Id": 5001,
    "Message": "Your verification code is 8472",
    "ScheduledTime": "2026-04-15T09:00:00",
    "To": "41791234567"
  }
]

POST /send/del.{format}

Cancelar ou eliminar um envio SMS

Cancela um envio SMS agendado pendente, ou elimina um envio concluído do histórico. Apenas os envios agendados para o futuro podem ser cancelados. Os envios em curso não podem ser parados.

Scope OAuth : sms:send

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta

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

NomeTipoObrigatórioDescrição
id_clientintegersimO seu ID de cliente Mailpro
api_keystringsimA sua chave de API (GUID)
id_sendintegersimID do envio SMS a cancelar ou eliminar (obtido em /send/list)

Respostas

CódigoDescrição
200Envio SMS cancelado ou eliminado com sucesso
400Falta id_send
401Credenciais inválidas
500Falha na eliminação (envio não encontrado ou já processado)

Exemplo 200

{
  "Result": "OK"
}

Exemplo 500

{
  "Error": "Delete failed",
  "Code": 500
}

GET /send/scheduled.{format}

Listar os meus envios SMS agendados

Devolve os envios SMS (únicos ou de campanha) agendados para uma data futura que ainda não foram despachados. Útil antes de invocar /cancel ou /reschedule.

Os registos são ordenados por scheduled_time ascendente.

Scope OAuth : sms:send

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta
id_clientqueryintegersim
api_keyquerystringsim
NumberOfRecordsheaderintegerItens por página — 5000 por predefinição e no máximo (ver Paginação). Cabeçalho HTTP ou parâmetro de query.
PageNumberheaderintegerNúmero de página com base 1 para respostas paginadas. Enviado como cabeçalho HTTP.

Respostas

CódigoDescrição
200Lista de envios SMS agendados
401Credenciais inválidas

Exemplo 200

[
  {
    "Id": 9001,
    "Message": "Black Friday: 30% off until midnight.",
    "ScheduledTime": "2026-11-27T12:00:00",
    "To": "+33671234567"
  }
]

POST /send/{id_send}/cancel.{format}

Cancelar um envio SMS agendado

Cancela um SMS agendado que ainda não foi despachado. Se o envio já tiver sido processado (ou não existir / pertencer a outro cliente), devolve 409 Conflict.

Scope OAuth : sms:send

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta
id_sendpathintegersim

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

NomeTipoObrigatórioDescrição
id_clientintegersim
api_keystringsim

Respostas

CódigoDescrição
200Envio cancelado
401Credenciais inválidas
409Já despachado ou não encontrado

Exemplo 200

{
  "Result": "OK",
  "Cancelled": 9001
}

Exemplo 409

{
  "error": "conflict",
  "message": "Send not found, not owned by client, or already dispatched."
}

PATCH /send/{id_send}/reschedule.{format}

Reagendar um envio SMS agendado

Actualiza a data planeada de um SMS agendado que ainda não foi despachado. A nova data tem de estar no futuro e dentro de 90 dias.

Nome do campo de data: a API aceita scheduled_time (principal) bem como os aliases legados PlanDate, date_planned e DatePlanned. Forneça qualquer um deles — o primeiro não nulo é utilizado.

Scope OAuth : sms:send

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta
id_sendpathintegersim

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

NomeTipoObrigatórioDescrição
id_clientintegersim
api_keystringsim
scheduled_timestring (date-time)Nome do campo principal.
PlanDatestring (date-time)Alias legado aceite por compatibilidade retroactiva.
date_plannedstring (date-time)Alias legado aceite por compatibilidade retroactiva.
DatePlannedstring (date-time)Alias legado aceite por compatibilidade retroactiva.

Respostas

CódigoDescrição
200Envio reagendado
400scheduled_time em falta ou inválido
401Credenciais inválidas
409Já despachado, não encontrado, ou nova data fora do intervalo

Exemplo 200

{
  "Result": "OK",
  "Id": 9001,
  "NewScheduledTime": "2026-12-31T14:30:00"
}

Exemplo 409

{
  "error": "conflict",
  "message": "Reschedule failed — send not found, already dispatched, or new date out of range."
}

Lists

Faça a gestão das listas de contactos SMS. Uma lista de contactos agrupa números de telefone para envios em massa. Pode criar até 1000 listas por conta (mesmo limite nas três API Mailpro e na app).

GET /list/list.{format}

Listar listas de contactos telefónicos

Devolve todas as listas de contactos SMS da conta. Utilize os valores Id devolvidos ao enviar campanhas SMS em massa ou ao adicionar números de telefone.

Scope OAuth : sms:contacts:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta

Respostas

CódigoDescrição
200Listas telefónicas devolvidas com sucesso
401Credenciais inválidas

Exemplo 200

{
  "Items": [
    {
      "AddressBookId": 42,
      "Name": "Newsletter subscribers",
      "TotalNumberPhones": 1547
    },
    {
      "AddressBookId": 43,
      "Name": "Loyalty program",
      "TotalNumberPhones": 823
    }
  ]
}

POST /list/add.{format}

Criar uma lista de contactos

Cria uma nova lista de contactos SMS com o nome indicado. A lista começa vazia — adicione números de telefone com POST /phone/add. 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.

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta

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

NomeTipoObrigatórioDescrição
id_clientintegersimO seu ID de cliente Mailpro
api_keystringsimA sua chave de API (GUID)
namestringsimNome de exibição para a nova lista de contactos

Respostas

CódigoDescrição
200Lista de contactos criada com sucesso
400Falta um campo obrigatório (name)
401Credenciais inválidas

Exemplo 200

{
  "Id": 44,
  "Name": "Spring campaign 2026",
  "NumberPhones": 0
}

Exemplo 400

{
  "Error": "Malformed Input",
  "Code": 103
}

POST /list/edit.{format}

Renomear uma lista de contactos

Actualiza o nome de exibição de uma lista de contactos SMS existente. Os números de telefone na lista não são afectados.

Scope OAuth : sms:contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta

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

NomeTipoObrigatórioDescrição
id_clientintegersimO seu ID de cliente Mailpro
api_keystringsimA sua chave de API (GUID)
address_book_idintegersimID da lista de contactos a renomear (obtido em /list/list)
namestringsimNovo nome de exibição para a lista de contactos

Respostas

CódigoDescrição
200Lista de contactos renomeada com sucesso
400Falta um campo obrigatório
401Credenciais inválidas

POST /list/del.{format}

Eliminar uma lista de contactos

Elimina permanentemente uma lista de contactos SMS e todos os números de telefone que ela contém. Esta acção não pode ser anulada.

Scope OAuth : sms:contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta

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

NomeTipoObrigatórioDescrição
id_clientintegersimO seu ID de cliente Mailpro
api_keystringsimA sua chave de API (GUID)
address_book_idintegersimID da lista de contactos a eliminar

Respostas

CódigoDescrição
200Lista de contactos eliminada com sucesso
400Falta address_book_id
401Credenciais inválidas

Phone Numbers

Faça a gestão dos números de telefone individuais dentro de uma lista de contactos — adicione, actualize e remova entradas.

GET /phone/list.{format}

Listar números de telefone numa lista de contactos

Devolve uma lista paginada de números de telefone numa lista de contactos específica. Utilize address_book_id para especificar a lista a obter. Paginação: NumberOfRecords e PageNumber (5000 por página por predefinição, página 1).

Scope OAuth : sms:contacts:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta
address_book_idqueryintegersimID da lista de contactos a partir da qual obter os números de telefone
NumberOfRecordsheaderintegerItens por página — 5000 por predefinição e no máximo (ver Paginação). Cabeçalho HTTP ou parâmetro de query.
PageNumberheaderintegerNúmero de página com base 1 para respostas paginadas. Enviado como cabeçalho HTTP.
SortByNameheaderbooleanDefina como true para ordenar os resultados alfabeticamente por nome.

Respostas

CódigoDescrição
200Números de telefone devolvidos com sucesso
401Credenciais inválidas

Exemplo 200

{
  "Items": [
    {
      "Id": 1001,
      "Number": "41791234567",
      "FirstName": "Alice",
      "LastName": "Dupont"
    },
    {
      "Id": 1002,
      "Number": "33612345678",
      "FirstName": "Bob",
      "LastName": "Martin"
    }
  ]
}

POST /phone/add.{format}

Adicionar número(s) de telefone a uma lista

Adiciona um ou mais números de telefone a uma lista de contactos.

Número único: utilize o campo number.

Importação em massa: utilize o campo phone_list com os números separados por ponto e vírgula: +41791234567;+33612345678;0049301234567

Os números de telefone aceitam o formato +, 00 ou simples — consulte Formato do número de telefone na descrição da API para a lista completa de entradas aceites / rejeitadas. Os números duplicados são silenciosamente ignorados, salvo se force=1 estiver definido.

Scope OAuth : sms:contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta

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

NomeTipoObrigatórioDescrição
id_clientintegersimO seu ID de cliente Mailpro
api_keystringsimA sua chave de API (GUID)
address_book_idintegersimID da lista de contactos à qual adicionar o(s) número(s)
numberstringNúmero de telefone único. Aceita +41…, 0041… ou 41… com ou sem separadores (espaços, traços, pontos, barras, parênteses). Consulte Formato do número de telefone na descrição da API. Utilize este OU phone_list — não ambos.
phone_liststringLista de números de telefone separados por ponto e vírgula para importação em massa. Utilize este OU number — não ambos. Exemplo: 0041791234567;0033612345678
firstnamestringNome próprio do contacto (opcional, apenas para número único)
lastnamestringApelido do contacto (opcional, apenas para número único)
forceinteger: 0, 1Defina como 1 para adicionar um número mesmo que tenha sido previamente cancelado ou já exista. Predefinição: 0 (os duplicados são ignorados).

Respostas

CódigoDescrição
200Número(s) de telefone adicionado(s) com sucesso
400Falta um campo obrigatório
401Credenciais inválidas

Exemplo 200

{
  "Id": 1003,
  "Number": "0041791234567",
  "FirstName": "Alice",
  "LastName": "Dupont"
}

POST /phone/edit.{format}

Actualizar uma entrada de número de telefone

Actualiza o número de telefone e/ou os dados de contacto de uma entrada existente. Utilize number_id (obtido em /phone/list) para identificar a entrada a actualizar. Apenas os campos fornecidos no pedido são actualizados.

Scope OAuth : sms:contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta

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

NomeTipoObrigatórioDescrição
id_clientintegersimO seu ID de cliente Mailpro
api_keystringsimA sua chave de API (GUID)
number_idintegersimID da entrada do número de telefone a actualizar (obtido em /phone/list)
numberstringNovo 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.
firstnamestringNovo nome próprio para o contacto
lastnamestringNovo apelido para o contacto

Respostas

CódigoDescrição
200Entrada do número de telefone actualizada com sucesso
400Falta number_id
401Credenciais inválidas

POST /phone/del.{format}

Remover um número de telefone de uma lista

Remove permanentemente uma entrada específica de número de telefone da sua lista de contactos. Utilize number_id (obtido em /phone/list) para identificar a entrada.

Scope OAuth : sms:contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta

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

NomeTipoObrigatórioDescrição
id_clientintegersimO seu ID de cliente Mailpro
api_keystringsimA sua chave de API (GUID)
number_idintegersimID da entrada do número de telefone a eliminar (obtido em /phone/list)

Respostas

CódigoDescrição
200Número de telefone removido com sucesso
400Falta number_id
401Credenciais inválidas

Credit

Consulte o saldo de créditos SMS restante para a sua conta (separado da quota mensal de pedidos à API — consulte /account/limits).

GET /credit/get.{format}

Obter saldo de créditos SMS

Devolve o saldo actual de créditos SMS para a sua conta. Os créditos SMS são consumidos no momento do envio. Um SMS padrão (≤160 caracteres GSM-7) custa 1 crédito. Mensagens mais longas ou mensagens com caracteres especiais podem custar mais.

> Nota: isto devolve o seu saldo de créditos de envio SMS, não a sua quota de pedidos à API. > Para a quota da API consulte GET /account/limits.{format}.

Scope OAuth : sms:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta

Respostas

CódigoDescrição
200Saldo de créditos devolvido com sucesso
401Credenciais inválidas

Exemplo 200

{
  "TotalCredits": 5000
}

History

Consulte o registo completo das campanhas SMS passadas.

GET /history/list.{format}

Listar histórico de envios SMS

Devolve um registo paginado de todas as campanhas SMS passadas enviadas a partir desta conta. Os resultados estão ordenados por data descendente (mais recente primeiro). Paginação: NumberOfRecords e PageNumber (cabeçalhos ou query, 5000 por página por predefinição).

Scope OAuth : sms:read

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta

Respostas

CódigoDescrição
200Lista do histórico devolvida com sucesso
401Credenciais inválidas

Exemplo 200

{
  "Items": [
    {
      "Id": 583294,
      "DateSent": "2026-07-17T18:56:39.813",
      "Message": "Your verification code is 8472",
      "Charge": 3,
      "Parts": 1
    }
  ]
}

Import

Carregue um ficheiro CSV ou XLSX para importar números de telefone em massa para uma lista de contactos. O ficheiro é colocado em fila para processamento assíncrono — acompanhe a conclusão através do ImportJobId devolvido ou através do callback opcional webhook_url.

POST /import/upload.{format}

Carregar um ficheiro de números de telefone (CSV / XLSX) para importação em massa

Carregue um ficheiro CSV ou XLSX para importar números de telefone para uma lista de contactos. 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:

Opcional:

Formato do ficheiro:

Scope OAuth : sms:contacts:write

Parâmetros

NomeOndeTipoObrigatórioDescrição
formatpathstring: json, xmlsimFormato da resposta

Corpo do pedido (multipart/form-data)

NomeTipoObrigatórioDescrição
id_listinteger (int64)simID da lista de contactos de destino
filestring (binary)simFicheiro CSV ou XLSX (UTF-8, máximo 50 MB)
webhook_urlstring (uri)URL de callback invocado quando o processamento termina

Respostas

CódigoDescrição
200Ficheiro aceite e colocado em fila
400Nenhum ficheiro carregado ou id_list em falta
401Credenciais inválidas
500Erro de servidor ou de armazenamento

Exemplo 200

{
  "Result": "OK",
  "ImportJobId": 15,
  "InternalName": "230575-20260420142616-phones.csv"
}

Webhooks

Subscreva o seu servidor para notificações de eventos SMS em tempo real. O Mailpro envia um payload JSON assinado por HMAC 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, o envelope do payload, os excertos de verificação de assinatura e a política de repetição.

GET /webhooks

Listar webhooks

Devolve todos os webhooks configurados na conta autenticada.

Respostas

CódigoDescrição
200Array de webhooks
401Credenciais 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": [
        "sms.delivered",
        "sms.failed"
      ]
    }
  ],
  "total": 1
}

POST /webhooks

Criar um webhook

Cria uma nova subscrição de webhook. A resposta contém um secret que é mostrado apenas uma vez — guarde-o imediatamente, no lado do servidor. Utilize-o para verificar a assinatura HMAC de cada payload recebido.

Limites: máximo de 20 webhooks por conta, máximo de 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 evento a subscrever (consulte o catálogo acima). Utilize ["*"] para subscrever todos os eventos desta API.
descriptionstring

Exemplo

{
  "url": "https://example.com/hooks/mailpro",
  "events": [
    "sms.delivered",
    "sms.failed"
  ],
  "description": "Integração com o Slack"
}

Respostas

CódigoDescrição
201Webhook criado — o secret é devolvido apenas aqui
400URL, lista de eventos inválida ou limite excedido
401Credenciais inválidas

Exemplo 201

{
  "id": 42,
  "url": "https://example.com/hooks/mailpro",
  "events": [
    "sms.delivered",
    "sms.failed"
  ],
  "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"
}

GET /webhooks/{id}

Obter um webhook

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Respostas

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

PUT /webhooks/{id}

Actualizar um webhook

Actualizaçã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 reactivar um webhook desactivado automaticamente após o seu endpoint ter sido corrigido.

Respostas

CódigoDescrição
200Webhook actualizado
400Payload inválido
404Webhook não encontrado

DELETE /webhooks/{id}

Eliminar um webhook

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

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Respostas

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

POST /webhooks/{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 no corpo) para o seu endpoint. Útil para verificar a acessibilidade e a verificação da assinatura antes de confiar em eventos reais.

Parâmetros

NomeOndeTipoObrigatórioDescrição
idpathinteger (int64)sim

Corpo do pedido (application/json)

NomeTipoObrigatórioDescrição
eventTypestring

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 /webhooks/{id}/rotate-secret

Rotacionar o segredo HMAC

Gera um novo segredo HMAC e invalida o antigo imediatamente. O novo segredo é devolvido uma vez na resposta — guarde-o. Todas as entregas a partir deste momento serão assinadas com o novo segredo.

Utilize esta opção 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 única vez)
404Webhook não encontrado

Exemplo 200

{
  "secret": "whsec_XyzA9876BcdE5432FghI1098JklM7654NopQ"
}

GET /webhooks/{id}/deliveries

Listar tentativas de entrega

Devolve o histórico de tentativas de despacho para este webhook (retenção de 30 dias). Útil para depuração — que eventos foram enviados, códigos de estado recebidos, contagens de 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 /webhooks/{id}/deliveries/{deliveryId}/replay

Repetir uma entrega

Coloca em fila uma nova tentativa de entrega com o mesmo payload do original. Útil para voltar a desencadear uma entrega que falhou após corrigir o seu endpoint. É criada uma NOVA linha Webhook_Delivery (o original é preservado para fins de auditoria). A repetição segue a política de repetição padrão (mesmo agendamento de backoff, mesma regra de desactivação automática às 10 falhas).

Parâmetros

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

Respostas

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