IZAPP API

API REST para envio de mensagens WhatsApp via Cloud API da Meta. Multi-tenant com autenticação por API Key.

Base URL https://wb.iztec.online

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 HTTPSignificado
400Requisição inválida / erro no envio
401Autenticação necessária ou token inválido
403Empresa inativa
404Rota não encontrada
422Campos obrigatórios ausentes

Cadastrar Cliente

POST /api/clients/register X-API-Key

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)

CampoTipoDescrição
namestringobrigatórioNome ou razão social
documentstringobrigatórioCPF (11 dígitos) ou CNPJ (14 dígitos)
product_idintegerobrigatórioID do produto para gerar o token
emailstringopcionalE-mail do cliente
phonestringopcionalTelefone
cepstringopcionalCEP
streetstringopcionalRua
numberstringopcionalNúmero
complementstringopcionalComplemento
neighborhoodstringopcionalBairro
citystringopcionalCidade
statestringopcionalUF (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
  }
}
Idempotente: Se o CPF/CNPJ já existir na mesma empresa, retorna o cliente e token existentes com "is_new": false. Não duplica registros.

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)

GET /api/me X-Client-Token

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

CampoTipoDescrição
balance_sendsintegerEnvios restantes disponíveis
credits_per_unitintegerQuantos envios cada crédito comprado vale
send_rulesobject|nullRegras: limite diário, horários de disparo, timezone
templates_allowedarrayTemplates que este token pode usar para envio

Enviar Mensagem (Client Token)

Créditos: Cada envio com sucesso consome 1 do saldo de envios. Se falhar na Meta, o crédito é reembolsado automaticamente.
POST /api/send X-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)

CampoTipoDescrição
tostringobrigatórioTelefone com DDI (ex: 5531999999999)
template_namestringcondicionalNome do template. Obrigatório se o produto tiver mais de um template.
template_languagestringopcionalIdioma (default: pt_BR)
variablesarraycondicionalValores para {{1}}, {{2}}, etc. do body
header_imagestringcondicionalURL pública da imagem (se header for IMAGE)
header_videostringcondicionalURL pública do vídeo
header_documentstringcondicionalURL pública do documento
button_urlstring|arraycondicionalParte 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)

POST /api/clients/{clientId}/credits X-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âmetroTipoDescrição
clientIdintegerobrigatórioID do cliente

Body Parameters (JSON)

CampoTipoDescrição
product_idintegerobrigatórioID do produto
creditsintegerobrigatórioQuantidade 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
  }
}
Cálculo: Se o produto tem credits_per_unit = 10 e você adiciona 10 créditos, o cliente ganha 100 envios.
IZAPP API · WhatsApp Cloud API Integration · Painel Admin