IZAPP API
API REST para envio de mensagens WhatsApp via Cloud API da Meta. Multi-tenant com autenticação por API Key.
Autenticação
A API suporta duas formas de autenticação, dependendo do endpoint:
1. API Key da Empresa
Para rotas administrativas e de gestão. Header: X-API-Key
X-API-Key: token_da_empresa
2. Client Token (Produtos/Envio)
Para clientes que compram créditos e enviam mensagens. Header: X-Client-Token
Cada token é único por combinação cliente + produto, gerado no painel admin.
X-Client-Token: token_do_cliente_produto
Respostas de erro de autenticação:
// 401 - Token ausente
{"success": false, "error": "API key is required (X-API-Key header)"}
{"success": false, "error": "X-Client-Token header is required"}
// 401 - Token inválido
{"success": false, "error": "Invalid API key"}
{"success": false, "error": "Invalid client token"}
// 403 - Empresa/cliente/produto inativo
{"success": false, "error": "Company is inactive"}
{"success": false, "error": "Token is inactive"}
{"success": false, "error": "Client is inactive"}
{"success": false, "error": "Product is inactive"}
Erros
Todas as respostas de erro seguem o formato padrão:
{
"success": false,
"error": "Descrição do erro"
}
| Código HTTP | Significado |
|---|---|
| 400 | Requisição inválida / erro no envio |
| 401 | Autenticação necessária ou token inválido |
| 403 | Empresa inativa |
| 404 | Rota não encontrada |
| 422 | Campos obrigatórios ausentes |
Cadastrar Cliente
Cadastra um cliente (por CPF ou CNPJ) e gera um token vinculado ao produto informado. Se o documento já existir na empresa, retorna o token existente sem duplicar.
Body Parameters (JSON)
| Campo | Tipo | Descrição | |
|---|---|---|---|
name | string | obrigatório | Nome ou razão social |
document | string | obrigatório | CPF (11 dígitos) ou CNPJ (14 dígitos) |
product_id | integer | obrigatório | ID do produto para gerar o token |
email | string | opcional | E-mail do cliente |
phone | string | opcional | Telefone |
cep | string | opcional | CEP |
street | string | opcional | Rua |
number | string | opcional | Número |
complement | string | opcional | Complemento |
neighborhood | string | opcional | Bairro |
city | string | opcional | Cidade |
state | string | opcional | UF (2 letras) |
Exemplo
curl -X POST "https://wb.iztec.online/api/clients/register" \
-H "Content-Type: application/json" \
-H "X-API-Key: token_da_empresa" \
-d '{
"name": "Auto Center Silva",
"document": "12345678901",
"product_id": 2,
"email": "contato@autosilva.com",
"phone": "31999999999"
}'
const res = await fetch('https://wb.iztec.online/api/clients/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': 'token_da_empresa',
},
body: JSON.stringify({
name: 'Auto Center Silva',
document: '12345678901',
product_id: 2,
email: 'contato@autosilva.com',
phone: '31999999999',
}),
});
const data = await res.json();
$ch = curl_init('https://wb.iztec.online/api/clients/register');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-API-Key: ' . $empresaToken,
],
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Auto Center Silva',
'document' => '12345678901',
'product_id' => 2,
'email' => 'contato@autosilva.com',
'phone' => '31999999999',
]),
]);
$response = json_decode(curl_exec($ch), true);
// $response['data']['token'] → token do cliente
curl_close($ch);
Resposta de Sucesso (200)
{
"success": true,
"data": {
"client_id": 5,
"product_id": 2,
"document": "12345678901",
"document_type": "cpf",
"token": "a1b2c3d4e5f6...",
"balance_sends": 0,
"is_new": true
}
}
Erros
// 422 - Campos obrigatórios
{"success": false, "error": "Fields \"name\", \"document\" and \"product_id\" are required"}
// 422 - Documento inválido
{"success": false, "error": "Document must be a valid CPF (11 digits) or CNPJ (14 digits)"}
// 404 - Produto não encontrado
{"success": false, "error": "Product not found or not yours"}
Meu Token (Informações do Cliente)
Retorna informações do cliente autenticado: saldo de envios, produto vinculado, templates disponíveis e regras de envio.
Exemplo
curl -X GET "https://wb.iztec.online/api/me" \ -H "X-Client-Token: seu_token_de_cliente"
const res = await fetch('https://wb.iztec.online/api/me', {
headers: { 'X-Client-Token': 'seu_token_de_cliente' },
});
const data = await res.json();
Resposta de Sucesso (200)
{
"success": true,
"data": {
"client_id": 1,
"client_name": "Auto Center Silva",
"product_id": 2,
"product_name": "izcar",
"balance_sends": 47,
"credits_per_unit": 10,
"send_rules": {
"daily_limit": 500,
"schedules": ["08:00", "12:00", "18:00"],
"timezone": "America/Sao_Paulo"
},
"templates_allowed": [
{"name": "izcar", "language": "pt_BR"},
{"name": "izcar_promo", "language": "pt_BR"}
]
}
}
Campos da Resposta
| Campo | Tipo | Descrição |
|---|---|---|
balance_sends | integer | Envios restantes disponíveis |
credits_per_unit | integer | Quantos envios cada crédito comprado vale |
send_rules | object|null | Regras: limite diário, horários de disparo, timezone |
templates_allowed | array | Templates que este token pode usar para envio |
Enviar Mensagem (Client Token)
Envia um template WhatsApp para um número. O token define qual produto/empresa será usado. Se o produto tiver mais de um template, especifique qual usar.
Body Parameters (JSON)
| Campo | Tipo | Descrição | |
|---|---|---|---|
to | string | obrigatório | Telefone com DDI (ex: 5531999999999) |
template_name | string | condicional | Nome do template. Obrigatório se o produto tiver mais de um template. |
template_language | string | opcional | Idioma (default: pt_BR) |
variables | array | condicional | Valores para {{1}}, {{2}}, etc. do body |
header_image | string | condicional | URL pública da imagem (se header for IMAGE) |
header_video | string | condicional | URL pública do vídeo |
header_document | string | condicional | URL pública do documento |
button_url | string|array | condicional | Parte dinâmica da URL do botão |
Exemplo
curl -X POST "https://wb.iztec.online/api/send" \
-H "Content-Type: application/json" \
-H "X-Client-Token: token_do_cliente" \
-d '{
"to": "5531999999999",
"template_name": "izcar",
"variables": ["João Silva", "Honda Civic 2020"],
"header_image": "https://exemplo.com/foto_carro.jpg"
}'
const res = await fetch('https://wb.iztec.online/api/send', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Client-Token': 'token_do_cliente',
},
body: JSON.stringify({
to: '5531999999999',
template_name: 'izcar',
variables: ['João Silva', 'Honda Civic 2020'],
header_image: 'https://exemplo.com/foto_carro.jpg',
}),
});
const data = await res.json();
$ch = curl_init('https://wb.iztec.online/api/send');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-Client-Token: ' . $clientToken,
],
CURLOPT_POSTFIELDS => json_encode([
'to' => '5531999999999',
'template_name' => 'izcar',
'variables' => ['João Silva', 'Honda Civic 2020'],
'header_image' => 'https://exemplo.com/foto_carro.jpg',
]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
Resposta de Sucesso (200)
{
"success": true,
"data": {
"messaging_product": "whatsapp",
"contacts": [{"input": "5531999999999", "wa_id": "5531999999999"}],
"messages": [{"id": "wamid.HBgNNTUzMQ..."}],
"_meta": {
"template_name": "izcar",
"template_language": "pt_BR",
"credits_remaining": 46
}
}
}
Erros Comuns
// 402 - Sem créditos
{"success": false, "error": "Insufficient credits"}
// 422 - Template não permitido
{"success": false, "error": "Template not allowed for this product"}
// 422 - Produto com vários templates
{"success": false, "error": "Specify template_name (product has multiple templates)"}
// 429 - Limite diário atingido
{"success": false, "error": "Daily send limit reached"}
// 429 - Fora do horário
{"success": false, "error": "Outside allowed send window"}
Adicionar Créditos (API Key)
Adiciona créditos a um cliente para um produto específico. Autenticado pela API Key da empresa. Cada crédito vale X envios conforme configuração do produto.
URL Parameters
| Parâmetro | Tipo | Descrição | |
|---|---|---|---|
clientId | integer | obrigatório | ID do cliente |
Body Parameters (JSON)
| Campo | Tipo | Descrição | |
|---|---|---|---|
product_id | integer | obrigatório | ID do produto |
credits | integer | obrigatório | Quantidade de créditos a adicionar (min: 1) |
Exemplo
curl -X POST "https://wb.iztec.online/api/clients/5/credits" \
-H "Content-Type: application/json" \
-H "X-API-Key: token_da_empresa" \
-d '{
"product_id": 2,
"credits": 10
}'
const res = await fetch('https://wb.iztec.online/api/clients/5/credits', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': 'token_da_empresa',
},
body: JSON.stringify({ product_id: 2, credits: 10 }),
});
const data = await res.json();
Resposta de Sucesso (200)
{
"success": true,
"data": {
"client_id": 5,
"product_id": 2,
"credits_added": 10,
"sends_added": 100,
"balance_sends": 147
}
}