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.
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.
https://api.iagentesms.com.br/api/v2
Todas as respostas de sucesso retornam um envelope { "data": ... } e os erros, { "error": { "code", "message", "details" } }.
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:
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.
Cada operação exige o escopo indicado. Tentar usar um endpoint sem o escopo correto retorna 403 insufficient_scope.
| Método | Rota | Escopo | Descrição |
|---|---|---|---|
| GET | /health | público | Verificação de disponibilidade |
| POST | /messages | sms:send | Envia SMS individual |
| POST | /messages/batch | sms:send | Envia SMS em lote |
| POST | /groups/{id}/messages | sms:send | Envia para todos os contatos do grupo |
| GET | /messages | sms:read | Lista envios |
| GET | /messages/{id} | sms:read | Consulta status de um envio |
| DELETE | /messages/{id} | sms:send | Cancela um agendamento |
| GET | /inbound | inbound:read | Mensagens recebidas (MO) |
| GET | /credits | credits:read | Consulta saldo |
| GET | /groups | groups:read | Lista grupos |
| POST | /groups | groups:write | Cria grupo |
| PUT | /groups/{id} | groups:write | Atualiza grupo |
| POST | /groups/{id}/clear | groups:write | Esvazia o grupo |
| DELETE | /groups/{id} | groups:write | Remove grupo |
| GET | /groups/{id}/contacts | contacts:read | Lista contatos do grupo |
| POST | /groups/{id}/contacts | contacts:write | Adiciona contato |
| PUT | /groups/{id}/contacts/{number} | contacts:write | Atualiza contato |
| DELETE | /groups/{id}/contacts/{number} | contacts:write | Remove contato |
| GET | /numbers/{number} | sms:read | Consulta dados de um número |
| POST | /numbers/validate | sms:read | Valida número(s) |
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);
{
"data": {
"modalidade": "POS",
"available": 99998,
"limite_seguranca": 100000,
"consumo_mes": 2
}
}
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.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
to | string | Sim | Celular do destinatário com DDD (ex: 51999998888) |
message | string | Sim | Texto da mensagem (160 caracteres por segmento de SMS) |
schedule_at | string (ISO 8601) | Não | Agendamento; null ou omitido = envio imediato |
client_ref | string | Não | Referência livre do cliente, retornada nas consultas |
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);
}
{
"data": {
"id": x8Sju8sff8,
"status": "queued",
"accepted": 1,
"rejected": [],
"credits_charged": 1,
"idempotent_replay": false
}
}
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());
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());
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);
sms:send
Cancela um envio agendado que ainda não entrou em processamento (o status passa a Pausado).
GET /messages/{id}. O webhook nativo de entrega da API REST será publicado em breve.
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 });
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());
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 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 }
}
}
| HTTP | code | Descrição |
|---|---|---|
401 | unauthenticated | Token ausente ou inválido |
402 | insufficient_credits | Saldo insuficiente |
403 | insufficient_scope | O token não tem o escopo exigido pelo endpoint |
403 | ip_not_allowed | IP de origem fora da lista permitida do token |
403 | account_blocked | Conta bloqueada |
404 | not_found | Recurso inexistente |
409 | not_cancelable | Envio já processado, não pode ser cancelado |
409 | idempotency_conflict | Idempotency-Key reusada com conteúdo diferente |
422 | validation_failed | Corpo inválido (veja details) |
422 | all_recipients_blocked | Todos os destinatários estão bloqueados/optout |
422 | daily_limit | Limite diário de envios da conta atingido |
422 | user_monthly_limit | Limite mensal do usuário atingido |
422 | empty_group | Grupo sem contatos ativos |
429 | rate_limited | Limite de requisições do token excedido |
500 | — | Erro interno do servidor |
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.
NUMERO@sms.iagentesms.com.br
Onde NUMERO é o celular do destinatário com DDD (ex: 5551999999999@sms.iagentesms.com.br).
| 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.