MozeSMS API v1.0
Referência da API REST

MozeSMS API

Integre envio de SMS, consulta de estados e gestão de saldo nas suas aplicações. Suporta envio simples, envio em massa até 10 000 destinatários e histórico completo de mensagens.

Autenticação

Todos os pedidos à API requerem um token Bearer no header Authorization. Obtenha o seu token em my.mozesms.com → Gestão de APIs.

https://api.mozesms.com
Header obrigatório
Authorization: Bearer SEU_BEARER_TOKEN
Content-Type: application/json
Onde obter o token

Aceda a my.mozesms.com, navegue para Gestão de APIs e clique em Gerar Token. Guarde-o em segurança — não será exibido novamente.

Segurança

Nunca exponha o token em código client-side. Faça sempre os pedidos à API a partir do seu servidor. Revogue tokens comprometidos imediatamente no painel.

Erros & Limites

A API usa códigos HTTP convencionais. Erros devolvem sempre um objeto JSON com success: false e uma mensagem descritiva no campo error.

CódigoSignificado
200Operação realizada com sucesso.
400Parâmetros inválidos ou em falta. Verifique o corpo do pedido.
401Token inválido ou ausente. Verifique o header Authorization.
402Créditos insuficientes. Recarregue o saldo da conta.
404Recurso não encontrado.
429Rate limit excedido. Aguarde antes de repetir o pedido.
500Erro interno do servidor. Contacte o suporte se persistir.
Rate limits

100 pedidos/min por token. Envio bulk: 1 000 SMS/min. Máx. 10 000 destinatários por pedido bulk.

Tamanho da mensagem

Até 160 caracteres = 1 SMS. De 161 a 306 caracteres = 2 SMS. Mensagens longas são concatenadas automaticamente.

POST/v1/sms/send
Enviar SMS
Envia uma mensagem SMS para um único número de destino. O número deve estar no formato internacional com código de país.
Body parameters
CampoTipoDescrição
toobrigatório string Número de destino em formato internacional.
Ex: 258847001234
messageobrigatório string Texto da mensagem. Máx. 160 chars por SMS.
fromopcional string Nome do remetente. Máx. 11 caracteres.
Default: MozeSMS
Respostas
200SMS enviado com sucesso. Retorna ID e custo da mensagem.
400Parâmetros inválidos ou em falta.
401Token inválido ou ausente.
402Créditos insuficientes.
429Rate limit excedido.
curl -X POST https://api.mozesms.com/v1/sms/send \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "258847001234",
    "message": "Olá, bem-vindo ao MozeSMS!",
    "from": "MozeSMS"
  }'
$ch = curl_init('https://api.mozesms.com/v1/sms/send');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer SEU_TOKEN',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'to'      => '258847001234',
        'message' => 'Olá, bem-vindo ao MozeSMS!',
        'from'    => 'MozeSMS',
    ]),
]);
$resp = json_decode(curl_exec($ch), true);
curl_close($ch);
const res = await fetch('https://api.mozesms.com/v1/sms/send', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer SEU_TOKEN',
    'Content-Type':  'application/json',
  },
  body: JSON.stringify({
    to:      '258847001234',
    message: 'Olá, bem-vindo ao MozeSMS!',
    from:    'MozeSMS',
  }),
});
const data = await res.json();
{
  "success": true,
  "data": {
    "id":                "msg_9k2xA7Bq",
    "to":               "258847001234",
    "status":           "enviado",
    "cost":             1.5,
    "remaining_balance": 98.50
  }
}
POST/v1/sms/bulk
Envio em massa
Envia mensagens para múltiplos destinatários num único pedido. Cada entrada pode ter um texto diferente. Máximo 1 000 mensagens por pedido.
Body parameters
CampoTipoDescrição
messagesobrigatório object[] Array de mensagens. Máx. 1 000 entradas.
Cada item: to (número) e text (mensagem)
fromopcional string Nome do remetente. Máx. 11 caracteres.
Respostas
200Envio em massa iniciado com sucesso.
400Array messages vazio, limite excedido ou parâmetros inválidos.
401Token inválido ou ausente.
402Créditos insuficientes para o volume pretendido.
curl -X POST "https://api.mozesms.com/v1/sms/bulk" \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "MozeSMS",
    "messages": [
      {"to": "258840000000", "text": "Mensagem 1"},
      {"to": "258850000000", "text": "Mensagem 2"}
    ]
  }'
$ch = curl_init('https://api.mozesms.com/v1/sms/bulk');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer SEU_TOKEN',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'from'     => 'MozeSMS',
        'messages' => [
            ['to' => '258840000000', 'text' => 'Mensagem 1'],
            ['to' => '258850000000', 'text' => 'Mensagem 2'],
        ],
    ]),
]);
$resp = json_decode(curl_exec($ch), true);
curl_close($ch);
const res = await fetch('https://api.mozesms.com/v1/sms/bulk', {
  method:  'POST',
  headers: {
    'Authorization': 'Bearer SEU_TOKEN',
    'Content-Type':  'application/json',
  },
  body: JSON.stringify({
    from:     'MozeSMS',
    messages: [
      { to: '258840000000', text: 'Mensagem 1' },
      { to: '258850000000', text: 'Mensagem 2' },
    ],
  }),
});
const data = await res.json();
import requests

response = requests.post(
    'https://api.mozesms.com/v1/sms/bulk',
    headers={'Authorization': 'Bearer SEU_TOKEN'},
    json={
        'from':     'MozeSMS',
        'messages': [
            {'to': '258840000000', 'text': 'Mensagem 1'},
            {'to': '258850000000', 'text': 'Mensagem 2'},
        ]
    }
)
data = response.json()
require 'net/http'
require 'json'

uri = URI('https://api.mozesms.com/v1/sms/bulk')
req = Net::HTTP::Post.new(uri)
req['Authorization'] = 'Bearer SEU_TOKEN'
req['Content-Type'] = 'application/json'
req.body = JSON.generate({
  from:     'MozeSMS',
  messages: [
    { to: '258840000000', text: 'Mensagem 1' },
    { to: '258850000000', text: 'Mensagem 2' },
  ]
})
data = JSON.parse(
  Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }.body
)
import requests

response = requests.post(
    'https://api.mozesms.com/v1/sms/bulk',
    headers={'Authorization': 'Bearer SEU_TOKEN'},
    json={
        'from':     'MozeSMS',
        'messages': [
            {'to': '258840000000', 'text': 'Mensagem 1'},
            {'to': '258850000000', 'text': 'Mensagem 2'},
        ]
    }
)
data = response.json()
require 'net/http'
require 'json'

uri = URI('https://api.mozesms.com/v1/sms/bulk')
req = Net::HTTP::Post.new(uri)
req['Authorization'] = 'Bearer SEU_TOKEN'
req['Content-Type'] = 'application/json'
req.body = JSON.generate({
  from:     'MozeSMS',
  messages: [
    { to: '258840000000', text: 'Mensagem 1' },
    { to: '258850000000', text: 'Mensagem 2' },
  ]
})
data = JSON.parse(
  Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }.body
)
{
  "success": true,
  "data": {
    "id":                "batch_7mRx2Kp",
    "status":           "processing",
    "cost":             3.0,
    "remaining_balance": 95.50
  }
}
GET/v1/sms/status/{id}
Estado da mensagem
Consulta o estado de entrega de uma mensagem SMS pelo seu identificador único.
Path parameters
ParâmetroTipoDescrição
idobrigatório string ID único da mensagem, retornado no envio.
Ex: msg_9k2xA7Bq
Estados possíveis
ValorSignificado
queuedNa fila de envio
sentEnviada para a operadora
deliveredEntregue ao destinatário
failedFalhou no envio
expiredExpirou sem entrega
Respostas
200Estado actual da mensagem.
404Mensagem não encontrada com esse ID.
curl -X GET "https://api.mozesms.com/v1/sms/status/MSG123456" \
  -H "Authorization: Bearer SEU_TOKEN"
$ch = curl_init(
    'https://api.mozesms.com/v1/sms/status/msg_9k2xA7Bq'
);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer SEU_TOKEN',
]);
$resp = json_decode(curl_exec($ch), true);
curl_close($ch);
const res = await fetch(
  'https://api.mozesms.com/v1/sms/status/msg_9k2xA7Bq',
  { headers: { 'Authorization': 'Bearer SEU_TOKEN' } }
);
const data = await res.json();
import requests

response = requests.get(
    'https://api.mozesms.com/v1/sms/status/msg_9k2xA7Bq',
    headers={'Authorization': 'Bearer SEU_TOKEN'}
)
data = response.json()
require 'net/http'
require 'json'

uri = URI(
  'https://api.mozesms.com/v1/sms/status/msg_9k2xA7Bq'
)
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer SEU_TOKEN'

data = JSON.parse(
  Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }.body
)
{
  "success": true,
  "data": {
    "id":           "msg_9k2xA7Bq",
    "to":           "258847001234",
    "status":       "delivered",
    "delivered_at": "2025-01-15T10:30:02Z"
  }
}
GET/sms/history
Histórico de mensagens
Retorna a lista paginada das mensagens enviadas pela conta. Suporta filtros por estado, intervalo de datas e paginação.
Query parameters
ParâmetroTipoDescrição
limitopcional integer Resultados por página. Default: 20. Máx: 100.
offsetopcional integer Posição inicial para paginação. Default: 0.
statusopcional string Filtrar por estado: sent · delivered · failed
start_dateopcional date Data inicial (YYYY-MM-DD).
end_dateopcional date Data final (YYYY-MM-DD).
Respostas
200Lista paginada de mensagens com totais.
401Token inválido ou ausente.
curl 'https://api.mozesms.com/sms/history?limit=20&offset=0' \
  -H "Authorization: Bearer SEU_TOKEN"
$ch = curl_init(
    'https://api.mozesms.com/sms/history?limit=20&offset=0'
);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer SEU_TOKEN',
]);
$resp = json_decode(curl_exec($ch), true);
curl_close($ch);
const params = new URLSearchParams({
  limit:  20,
  offset: 0,
  status: 'delivered',
});
const res = await fetch(
  `https://api.mozesms.com/sms/history?${params}`,
  { headers: { 'Authorization': 'Bearer SEU_TOKEN' } }
);
const data = await res.json();
import requests

response = requests.get(
    'https://api.mozesms.com/sms/history',
    headers={'Authorization': 'Bearer SEU_TOKEN'},
    params={
        'limit':  20,
        'offset': 0,
        'status': 'delivered',
    }
)
data = response.json()
require 'net/http'
require 'json'

uri = URI('https://api.mozesms.com/sms/history')
uri.query = URI.encode_www_form(
  limit: 20, offset: 0, status: 'delivered'
)
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer SEU_TOKEN'
data = JSON.parse(
  Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }.body
)
{
  "success": true,
  "data": [
    {
      "id":         "msg_9k2xA7Bq",
      "to":         "258847001234",
      "message":    "Olá, bem-vindo!",
      "status":     "delivered",
      "cost":       1.5,
      "created_at": "2025-01-15T10:28:00Z"
    }
  ],
  "total":  142,
  "limit":  20,
  "offset": 0
}
GET/v1/account/balance
Consultar saldo
Retorna o saldo disponível em MZN, a moeda e o plano activo da conta.

Este endpoint não requer parâmetros. Apenas o token Bearer no header Authorization.

Respostas
200Saldo actual, moeda e plano da conta.
401Token inválido ou ausente.
curl -X GET "https://api.mozesms.com/v1/account/balance" \
  -H "Authorization: Bearer SEU_TOKEN"
$ch = curl_init(
    'https://api.mozesms.com/v1/account/balance'
);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer SEU_TOKEN',
]);
$resp = json_decode(curl_exec($ch), true);
curl_close($ch);
const res = await fetch(
  'https://api.mozesms.com/v1/account/balance',
  { headers: { 'Authorization': 'Bearer SEU_TOKEN' } }
);
const data = await res.json();
import requests

response = requests.get(
    'https://api.mozesms.com/v1/account/balance',
    headers={'Authorization': 'Bearer SEU_TOKEN'}
)
data = response.json()
require 'net/http'
require 'json'

uri = URI(
  'https://api.mozesms.com/v1/account/balance'
)
req = Net::HTTP::Get.new(uri)
req['Authorization'] = 'Bearer SEU_TOKEN'

data = JSON.parse(
  Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }.body
)
{
  "success": true,
  "data": {
    "balance":  4820.00,
    "currency": "MZN",
    "plan":     "Profissional"
  }
}