Documentação API SMS

API REST de SMS IAGENTEsms — envio via JSON com Bearer token

API REST para envio de SMS no Brasil: autenticação por token, envio individual, em lote e para grupos, consulta de status, saldo e mensagens recebidas. Exemplos em cURL, PHP, Python e Node.js.

API REST v2

A API REST v2 é a forma recomendada de integrar o envio de SMS ao seu sistema. Requisições e respostas em JSON, autenticação por Bearer token com escopos e cabeçalho Idempotency-Key para evitar envios duplicados em retries.

Base URL

https://api.iagentesms.com.br/api/v2

Todas as respostas de sucesso retornam um envelope { "data": ... } e os erros, { "error": { "code", "message", "details" } }.

Autenticação e escopos

Envie o token em cada requisição no cabeçalho Authorization:

Authorization: Bearer sk_live_...

Cada token tem escopos (abilities) que limitam o que ele pode fazer. Use o escopo mínimo necessário para a integração:

sms:send sms:read inbound:read credits:read groups:read groups:write contacts:read contacts:write *

Os tokens são gerados no painel de controle, onde você também pode restringir os IPs de origem e definir a validade de cada token.

Endpoints

Cada operação exige o escopo indicado. Tentar usar um endpoint sem o escopo correto retorna 403 insufficient_scope.

MétodoRotaEscopoDescrição
GET/healthpúblicoVerificação de disponibilidade
POST/messagessms:sendEnvia SMS individual
POST/messages/batchsms:sendEnvia SMS em lote
POST/groups/{id}/messagessms:sendEnvia para todos os contatos do grupo
GET/messagessms:readLista envios
GET/messages/{id}sms:readConsulta status de um envio
DELETE/messages/{id}sms:sendCancela um agendamento
GET/inboundinbound:readMensagens recebidas (MO)
GET/creditscredits:readConsulta saldo
GET/groupsgroups:readLista grupos
POST/groupsgroups:writeCria grupo
PUT/groups/{id}groups:writeAtualiza grupo
POST/groups/{id}/cleargroups:writeEsvazia o grupo
DELETE/groups/{id}groups:writeRemove grupo
GET/groups/{id}/contactscontacts:readLista contatos do grupo
POST/groups/{id}/contactscontacts:writeAdiciona contato
PUT/groups/{id}/contacts/{number}contacts:writeAtualiza contato
DELETE/groups/{id}/contacts/{number}contacts:writeRemove contato
GET/numbers/{number}sms:readConsulta dados de um número
POST/numbers/validatesms:readValida número(s)

Consulta de Saldo

GET /api/v2/credits Escopo: credits:read

Retorna o saldo e o consumo da conta.

curl https://api.iagentesms.com.br/api/v2/credits \
  -H "Authorization: Bearer sk_live_..."
<?php
$ctx = stream_context_create(['http' => [
    'header' => "Authorization: Bearer sk_live_..."
]]);

$response = file_get_contents('https://api.iagentesms.com.br/api/v2/credits', false, $ctx);
$data = json_decode($response, true);
echo "Saldo: {$data['data']['available']}";
?>
import requests

resp = requests.get(
    "https://api.iagentesms.com.br/api/v2/credits",
    headers={"Authorization": "Bearer sk_live_..."},
)
print("Saldo:", resp.json()["data"]["available"])
const resp = await fetch("https://api.iagentesms.com.br/api/v2/credits", {
  headers: { "Authorization": "Bearer sk_live_..." },
});
const { data } = await resp.json();
console.log("Saldo:", data.available);
Resposta 200
{
  "data": {
    "modalidade": "POS",
    "available": 99998,
    "limite_seguranca": 100000,
    "consumo_mes": 2
  }
}

Envio Individual

POST /api/v2/messages Escopo: sms:send

Envia um SMS para um destinatário. O cabeçalho opcional Idempotency-Key garante que retries da mesma requisição não gerem cobrança ou envio duplicados.

Corpo da requisição

CampoTipoObrigatórioDescrição
tostringSimCelular do destinatário com DDD (ex: 51999998888)
messagestringSimTexto da mensagem (160 caracteres por segmento de SMS)
schedule_atstring (ISO 8601)NãoAgendamento; null ou omitido = envio imediato
client_refstringNãoReferência livre do cliente, retornada nas consultas

Exemplos

curl -X POST https://api.iagentesms.com.br/api/v2/messages \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-42" \f
  -d '{
    "to": "5551999998888",
    "message": "Olá! Seu código é 1234.",
    "client_ref": "abc"
  }'
<?php
$ch = curl_init('https://api.iagentesms.com.br/api/v2/messages');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer sk_live_...',
        'Content-Type: application/json',
        'Idempotency-Key: pedido-42',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'to'         => '5551999998888',
        'message'    => 'Olá! Seu código é 1234.',
        'client_ref' => 'abc',
    ]),
]);

$response = curl_exec($ch);
$status   = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

$body = json_decode($response, true);
echo $status === 201 ? "Enviado: {$body['data']['id']}" : "Erro: {$body['error']['code']}";
?>
import requests

resp = requests.post(
    "https://api.iagentesms.com.br/api/v2/messages",
    headers={
        "Authorization": "Bearer sk_live_...",
        "Idempotency-Key": "pedido-42",
    },
    json={
        "to": "5551999998888",
        "message": "Olá! Seu código é 1234.",
        "client_ref": "abc",
    },
)

data = resp.json()
if resp.status_code == 201:
    print("Enviado:", data["data"]["id"])
else:
    print("Erro:", data["error"]["code"])
const resp = await fetch("https://api.iagentesms.com.br/api/v2/messages", {
  method: "POST",
  headers: {
    "Authorization": "Bearer sk_live_...",
    "Content-Type": "application/json",
    "Idempotency-Key": "pedido-42",
  },
  body: JSON.stringify({
    to: "5551999998888",
    message: "Olá! Seu código é 1234.",
    client_ref: "abc",
  }),
});

const data = await resp.json();
if (resp.status === 201) {
  console.log("Enviado:", data.data.id);
} else {
  console.error("Erro:", data.error.code);
}
Resposta 201
{
  "data": {
    "id": x8Sju8sff8,
    "status": "queued",
    "accepted": 1,
    "rejected": [],
    "credits_charged": 1,
    "idempotent_replay": false
  }
}

Envio em Lote

POST /api/v2/messages/batch Escopo: sms:send

Envia a mesma mensagem para vários destinatários em uma única requisição.

curl -X POST https://api.iagentesms.com.br/api/v2/messages/batch \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "to": ["5551999998888", "5551988887777"],
    "message": "Promoção especial só hoje!"
  }'
<?php
$ctx = stream_context_create(['http' => [
    'method'  => 'POST',
    'header'  => "Authorization: Bearer sk_live_...\r\nContent-Type: application/json",
    'content' => json_encode([
        'to'      => ['5551999998888', '5551988887777'],
        'message' => 'Promoção especial só hoje!',
    ]),
]]);

echo file_get_contents('https://api.iagentesms.com.br/api/v2/messages/batch', false, $ctx);
?>
import requests

resp = requests.post(
    "https://api.iagentesms.com.br/api/v2/messages/batch",
    headers={"Authorization": "Bearer sk_live_..."},
    json={
        "to": ["5551999998888", "5551988887777"],
        "message": "Promoção especial só hoje!",
    },
)
print(resp.json())
const resp = await fetch("https://api.iagentesms.com.br/api/v2/messages/batch", {
  method: "POST",
  headers: {
    "Authorization": "Bearer sk_live_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    to: ["5551999998888", "5551988887777"],
    message: "Promoção especial só hoje!",
  }),
});
console.log(await resp.json());

Envio para Grupo

POST /api/v2/groups/{id}/messages Escopo: sms:send

Envia uma mensagem para todos os contatos de um grupo.

curl -X POST https://api.iagentesms.com.br/api/v2/groups/42/messages \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "message": "Mensagem para todo o grupo!" }'
<?php
$ctx = stream_context_create(['http' => [
    'method'  => 'POST',
    'header'  => "Authorization: Bearer sk_live_...\r\nContent-Type: application/json",
    'content' => json_encode(['message' => 'Mensagem para todo o grupo!']),
]]);

echo file_get_contents('https://api.iagentesms.com.br/api/v2/groups/42/messages', false, $ctx);
?>
import requests

resp = requests.post(
    "https://api.iagentesms.com.br/api/v2/groups/42/messages",
    headers={"Authorization": "Bearer sk_live_..."},
    json={"message": "Mensagem para todo o grupo!"},
)
print(resp.json())
const resp = await fetch("https://api.iagentesms.com.br/api/v2/groups/42/messages", {
  method: "POST",
  headers: {
    "Authorization": "Bearer sk_live_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ message: "Mensagem para todo o grupo!" }),
});
console.log(await resp.json());

Status e Listagem

GET /api/v2/messages/{id} Escopo: sms:read

Consulta o status de entrega de um envio. O status reflete o ciclo do motor de entrega (com confirmação DLR das operadoras).

# Status de um envio
curl https://api.iagentesms.com.br/api/v2/messages/123 \
  -H "Authorization: Bearer sk_live_..."

# Listar envios
curl https://api.iagentesms.com.br/api/v2/messages \
  -H "Authorization: Bearer sk_live_..."
<?php
$ctx = stream_context_create(['http' => [
    'header' => "Authorization: Bearer sk_live_...",
]]);

// Status de um envio
$response = file_get_contents('https://api.iagentesms.com.br/api/v2/messages/123', false, $ctx);
$data = json_decode($response, true);
echo "Status: {$data['data']['status']}";
?>
import requests

# Status de um envio
resp = requests.get(
    "https://api.iagentesms.com.br/api/v2/messages/123",
    headers={"Authorization": "Bearer sk_live_..."},
)
print("Status:", resp.json()["data"]["status"])
// Status de um envio
const resp = await fetch("https://api.iagentesms.com.br/api/v2/messages/123", {
  headers: { "Authorization": "Bearer sk_live_..." },
});
const { data } = await resp.json();
console.log("Status:", data.status);
DELETE /api/v2/messages/{id} Escopo: sms:send

Cancela um envio agendado que ainda não entrou em processamento (o status passa a Pausado).

Status de entrega: a confirmação (DLR) das operadoras fica disponível na consulta GET /messages/{id}. O webhook nativo de entrega da API REST será publicado em breve.

Grupos e Contatos

Gerencie listas de contatos para envios segmentados. Operações de leitura exigem groups:read/contacts:read; de escrita, groups:write/contacts:write. Remoções são soft delete.

# Criar grupo
curl -X POST https://api.iagentesms.com.br/api/v2/groups \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "nome": "Clientes VIP" }'

# Adicionar contato ao grupo 42
curl -X POST https://api.iagentesms.com.br/api/v2/groups/42/contacts \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "nome": "João Silva", "celular": "5551999998888" }'

# Listar contatos do grupo
curl https://api.iagentesms.com.br/api/v2/groups/42/contacts \
  -H "Authorization: Bearer sk_live_..."

# Esvaziar o grupo (mantém o grupo, remove os contatos)
curl -X POST https://api.iagentesms.com.br/api/v2/groups/42/clear \
  -H "Authorization: Bearer sk_live_..."
<?php
$base  = 'https://api.iagentesms.com.br/api/v2';
$token = 'sk_live_...';

function api($method, $url, $token, $body = null) {
    $opts = ['http' => [
        'method' => $method,
        'header' => "Authorization: Bearer $token\r\nContent-Type: application/json",
        'ignore_errors' => true,
    ]];
    if ($body !== null) $opts['http']['content'] = json_encode($body);
    return json_decode(file_get_contents($url, false, stream_context_create($opts)), true);
}

// Criar grupo
$grupo = api('POST', "$base/groups", $token, ['nome' => 'Clientes VIP']);

// Adicionar contato ao grupo 42
api('POST', "$base/groups/42/contacts", $token, [
    'nome' => 'João Silva', 'celular' => '5551999998888',
]);

// Listar contatos
$contatos = api('GET', "$base/groups/42/contacts", $token);

// Esvaziar o grupo
api('POST', "$base/groups/42/clear", $token);
?>
import requests

base = "https://api.iagentesms.com.br/api/v2"
headers = {"Authorization": "Bearer sk_live_..."}

# Criar grupo
grupo = requests.post(f"{base}/groups", headers=headers,
                      json={"nome": "Clientes VIP"}).json()

# Adicionar contato ao grupo 42
requests.post(f"{base}/groups/42/contacts", headers=headers,
              json={"nome": "João Silva", "celular": "5551999998888"})

# Listar contatos
contatos = requests.get(f"{base}/groups/42/contacts", headers=headers).json()

# Esvaziar o grupo
requests.post(f"{base}/groups/42/clear", headers=headers)
const base = "https://api.iagentesms.com.br/api/v2";
const headers = {
  "Authorization": "Bearer sk_live_...",
  "Content-Type": "application/json",
};

// Criar grupo
const grupo = await (await fetch(`${base}/groups`, {
  method: "POST", headers, body: JSON.stringify({ nome: "Clientes VIP" }),
})).json();

// Adicionar contato ao grupo 42
await fetch(`${base}/groups/42/contacts`, {
  method: "POST", headers,
  body: JSON.stringify({ nome: "João Silva", celular: "5551999998888" }),
});

// Listar contatos
const contatos = await (await fetch(`${base}/groups/42/contacts`, { headers })).json();

// Esvaziar o grupo
await fetch(`${base}/groups/42/clear`, { method: "POST", headers });

Mensagens Recebidas (MO)

GET /api/v2/inbound Escopo: inbound:read

Lista as mensagens recebidas (Mobile Originated) nos seus números/short codes — útil para SMS interativo e respostas de campanhas.

curl https://api.iagentesms.com.br/api/v2/inbound \
  -H "Authorization: Bearer sk_live_..."
<?php
$ctx = stream_context_create(['http' => [
    'header' => "Authorization: Bearer sk_live_..."
]]);

echo file_get_contents('https://api.iagentesms.com.br/api/v2/inbound', false, $ctx);
?>
import requests

resp = requests.get(
    "https://api.iagentesms.com.br/api/v2/inbound",
    headers={"Authorization": "Bearer sk_live_..."},
)
print(resp.json())
const resp = await fetch("https://api.iagentesms.com.br/api/v2/inbound", {
  headers: { "Authorization": "Bearer sk_live_..." },
});
console.log(await resp.json());

Validação de Número

POST /api/v2/numbers/validate Escopo: sms:read

Valida o formato e a elegibilidade de um ou mais números antes do envio. Use GET /numbers/{number} para consultar os dados de um número específico.

curl -X POST https://api.iagentesms.com.br/api/v2/numbers/validate \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "numbers": ["5551999998888", "5551988887777"] }'
<?php
$ctx = stream_context_create(['http' => [
    'method'  => 'POST',
    'header'  => "Authorization: Bearer sk_live_...\r\nContent-Type: application/json",
    'content' => json_encode([
        'numbers' => ['5551999998888', '5551988887777'],
    ]),
]]);

echo file_get_contents('https://api.iagentesms.com.br/api/v2/numbers/validate', false, $ctx);
?>
import requests

resp = requests.post(
    "https://api.iagentesms.com.br/api/v2/numbers/validate",
    headers={"Authorization": "Bearer sk_live_..."},
    json={"numbers": ["5551999998888", "5551988887777"]},
)
print(resp.json())
const resp = await fetch("https://api.iagentesms.com.br/api/v2/numbers/validate", {
  method: "POST",
  headers: {
    "Authorization": "Bearer sk_live_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ numbers: ["5551999998888", "5551988887777"] }),
});
console.log(await resp.json());

Erros

Erros usam códigos HTTP padrão e um envelope JSON consistente:

{
  "error": {
    "code": "insufficient_credits",
    "message": "Saldo insuficiente para concluir o envio.",
    "details": { "available": 0 }
  }
}
HTTPcodeDescrição
401unauthenticatedToken ausente ou inválido
402insufficient_creditsSaldo insuficiente
403insufficient_scopeO token não tem o escopo exigido pelo endpoint
403ip_not_allowedIP de origem fora da lista permitida do token
403account_blockedConta bloqueada
404not_foundRecurso inexistente
409not_cancelableEnvio já processado, não pode ser cancelado
409idempotency_conflictIdempotency-Key reusada com conteúdo diferente
422validation_failedCorpo inválido (veja details)
422all_recipients_blockedTodos os destinatários estão bloqueados/optout
422daily_limitLimite diário de envios da conta atingido
422user_monthly_limitLimite mensal do usuário atingido
422empty_groupGrupo sem contatos ativos
429rate_limitedLimite de requisições do token excedido
500Erro interno do servidor

E-mail para SMS (SMTP)

O IAGENTEsms também permite o envio de SMS por e-mail. Basta enviar um e-mail para o endereço especial, e o conteúdo será convertido em SMS.

Formato do Endereço

NUMERO@sms.iagentesms.com.br

Onde NUMERO é o celular do destinatário com DDD (ex: 5551999999999@sms.iagentesms.com.br).

Configuração

Campo Valor
Para NUMERO@sms.iagentesms.com.br
De E-mail cadastrado no painel do IAGENTEsms
Assunto Será ignorado
Corpo Texto da mensagem SMS (máx. 160 caracteres)

O e-mail remetente deve estar previamente cadastrado e autorizado no painel para que o envio por SMTP funcione.

Precisa de ajuda? Entre em contato com nosso suporte técnico pelo WhatsApp ou acesse a Central de Ajuda.