SDK oficial PHP da plataforma APIBrasil — WhatsApp, SMS, consultas de CPF/CNPJ, veículos, CEP, correios, pagamentos PIX/boleto e muito mais.
composer require jhowbhz/apigratis-sdk-phpRequer PHP >= 8.0. Usa Guzzle quando disponível e cai automaticamente para cURL — a camada de transporte é plugável.
Obtenha suas credenciais em https://apibrasil.com.br
<?php
require_once 'vendor/autoload.php';
use ApiBrasil\ApiBrasil;
$api = new ApiBrasil([
'bearerToken' => getenv('APIBRASIL_BEARER_TOKEN'), // JWT do login
'deviceToken' => getenv('APIBRASIL_DEVICE_TOKEN'), // device dos serviços device-based
]);
// WhatsApp
$api->whatsapp->sendText(['number' => '5511999999999', 'text' => 'Olá! 👋']);
// Consulta CNPJ (por créditos)
$empresa = $api->consulta->cnpj(['cnpj' => '00000000000000']);
print_r($empresa['data']);As credenciais também podem vir só do ambiente — new ApiBrasil() lê automaticamente
APIBRASIL_BEARER_TOKEN, APIBRASIL_DEVICE_TOKEN, APIBRASIL_SECRET_KEY e APIBRASIL_BASE_URL.
Todas as respostas são devolvidas como array associativo já decodificado.
Também é possível autenticar por email/senha — o token retornado fica guardado no cliente:
$api = new ApiBrasil();
$api->auth->login(['email' => 'voce@empresa.com.br', 'password' => '******']);
// contas com 2FA:
$session = $api->auth->login(['email' => $email, 'password' => $password]);
if (!empty($session['requires_2fa'])) {
$api->auth->send2fa(['challenge' => $session['challenge'], 'method' => 'email']);
$api->auth->verify2fa(['challenge' => $session['challenge'], 'code' => '000000']);
}A API Brasil tem duas famílias de serviços:
| Família | Autenticação | Exemplos |
|---|---|---|
| Device-based | Authorization: Bearer + header DeviceToken |
WhatsApp, SMS, veículos, CEP, correios, DDD, feriados, tradução, clima, OCR |
| Por créditos | apenas Authorization: Bearer (debita saldo) |
consulta->cpf, consulta->cnpj, consulta->veiculos, Serasa, CNH, telefone |
Para os serviços device-based, crie um device com a SecretKey da API desejada (painel APIBrasil) e use o device_token retornado:
$device = $api->devices->store(
['device_name' => 'meu-bot', 'type' => 'server'],
['secretKey' => 'SUA_SECRET_KEY']
);
$api->setDeviceToken($device['device']['device_token']);| Módulo | Descrição |
|---|---|
$api->whatsapp |
WhatsApp: start, qrcode, sendText, sendFile, sendAudio, sendVideo, fila (queue)... |
$api->evolution |
Evolution API: request($controller, $action, $body) |
$api->whatsmeow |
WhatsMeow: request($action, $body) |
$api->sms |
SMS device-based (send) e por créditos (sendWithCredits) |
$api->dados |
Dados cadastrais device-based (cpf, cnpj) |
$api->vehicles |
Veículos por placa (dados, fipe, consultaFipe) |
$api->fipe |
Tabela FIPE (request($action, $body)) |
$api->correios |
Correios (rastreio, request) |
$api->cep |
CEP + geolocalização (cep, request) |
$api->geolocation / $api->geomatrix |
Geolocalização e matriz de distâncias |
$api->recognize |
OCR / Google Vision |
$api->ddd / $api->holidays / $api->translate / $api->weather |
DDD, feriados, tradução, clima |
$api->databaseIp |
GeoIP (ip) |
$api->consulta |
Consultas por créditos: cpf, cnpj, cnh, cep, veiculos, telefone, generic($service, $body) |
$api->ura / $api->chipVirtual |
URA reversa e chip virtual |
$api->bulk |
Execução em lote (direct, queue) |
$api->auth |
Login, 2FA, cadastro, recuperação de senha, perfil |
$api->devices |
CRUD de devices |
$api->catalog |
Catálogo de APIs, planos, documentações, servidores |
$api->account |
Saldo, faturas, notificações, tickets |
$api->payments |
Recargas e pagamentos PIX/boleto/cartão (Santander, Inter, Mercado Pago, Sicoob) |
$api->ipWhitelist / $api->bearerRateLimit |
Segurança da conta |
$api->reports |
Relatórios e dashboard de consumo |
// iniciar sessão e obter QR Code
$api->whatsapp->start(['webhook_wh_message' => 'https://seu-webhook.com/mensagens']);
$qr = $api->whatsapp->qrcode();
echo $qr['response']['qrcode']; // data URI base64
// envios
$api->whatsapp->sendText(['number' => '5511999999999', 'text' => 'Olá!']);
$api->whatsapp->sendFile(['number' => '5511999999999', 'path' => 'https://exemplo.com/nota.pdf']);
$api->whatsapp->sendAudio(['number' => '5511999999999', 'path' => 'https://exemplo.com/audio.mp3']);
// qualquer action da documentação, inclusive via fila
$api->whatsapp->request('sendLocation', ['number' => '5511999999999', 'lat' => -23.5, 'lng' => -46.6]);
$api->whatsapp->queue('sendText', ['number' => '5511999999999', 'text' => 'assíncrono 🚀']);// CPF / CNPJ
$cpf = $api->consulta->cpf(['cpf' => '00000000000']);
$socios = $api->consulta->cnpj(['cnpj' => '00000000000000', 'tipo' => 'lista-socios']);
// veicular
$veiculo = $api->consulta->veiculos(['placa' => 'ABC1234']);
// qualquer produto do catálogo
$score = $api->consulta->generic('cpf', ['cpf' => '00000000000', 'tipo' => 'serasa-score-pf']);
// homologação (sandbox, sem cobrança)
$teste = $api->consulta->cpf(['cpf' => '00000000000', 'homolog' => true]);$dados = $api->vehicles->dados(['placa' => 'ABC1234']);
$fipe = $api->vehicles->fipe(['placa' => 'ABC1234']);$api->sms->send(['number' => '5511999999999', 'message' => 'Seu código: 123456']);
// ou debitando créditos da conta (sem device):
$api->sms->sendWithCredits(['number' => '5511999999999', 'message' => 'Olá!']);$pix = $api->payments->pixGenerate('inter', ['amount' => 100]);
$status = $api->payments->pixStatus('inter', $pix['txId']);
$boleto = $api->payments->boletoGenerate('sicoob', ['amount' => 150]);
$pdf = $api->payments->boletoPdf('sicoob', $boleto['id']); // conteúdo binário$comercial = $api->withDevice('DEVICE_TOKEN_COMERCIAL');
$suporte = $api->withDevice('DEVICE_TOKEN_SUPORTE');
$comercial->whatsapp->sendText(['number' => '55...', 'text' => 'Proposta enviada!']);
$suporte->whatsapp->sendText(['number' => '55...', 'text' => 'Como posso ajudar?']);Cada categoria de falha tem a sua própria classe — todas estendem ApiBrasilError
(que por sua vez estende RuntimeException):
| Classe | Quando |
|---|---|
ValidationError |
400/422 — payload inválido |
AuthenticationError |
401 — token ausente/expirado |
InsufficientBalanceError |
402 — sem saldo/créditos |
PermissionError |
403 — sem permissão (ex: exige PJ) |
NotFoundError |
404/410 — sem dados / rota desativada |
RateLimitError |
429 — limite atingido (getRetryAfterMs) |
ServerError |
5xx — erro do gateway/provedor |
NetworkError / TimeoutError |
falha antes da resposta |
use ApiBrasil\Core\Errors\InsufficientBalanceError;
use ApiBrasil\Core\Errors\RateLimitError;
try {
$api->consulta->cpf(['cpf' => '00000000000']);
} catch (InsufficientBalanceError $e) {
echo 'Recarregue seus créditos';
} catch (RateLimitError $e) {
echo "Aguarde {$e->getRetryAfterMs()}ms";
}Todo erro expõe getStatus() (HTTP), getErrorCode() (código da API) e
getResponse() (corpo completo da resposta).
Por padrão a SDK refaz a chamada em HTTP 429 e em falhas de conexão (2 tentativas extras, backoff exponencial, respeitando Retry-After). Timeouts e erros de negócio nunca são refeitos — evita duplicar cobranças e envios.
$api = new ApiBrasil([
'retry' => ['retries' => 3, 'minDelayMs' => 500, 'retryOnStatuses' => [429, 503]], // ou 'retry' => false
'hooks' => [
'onRequest' => fn (array $i) => printf("→ %s %s (#%d)\n", $i['method'], $i['url'], $i['attempt']),
'onResponse' => fn (array $i) => printf("← %d em %dms\n", $i['status'], $i['durationMs']),
'onRetry' => fn (array $i) => printf("retry em %dms: %s\n", $i['delayMs'], $i['reason']),
],
]);O HTTP é feito pelo Guzzle (com fallback para cURL), mas a interface TransportInterface
permite trocar a camada inteira (proxy corporativo, outro cliente, mocks de teste):
use ApiBrasil\ApiBrasil;
use ApiBrasil\Core\Transport\GuzzleTransport;
// Guzzle com opções próprias (proxy, verify, handler...)
$api = new ApiBrasil([
'transport' => new GuzzleTransport(null, [
'proxy' => 'http://proxy.local:3128',
'verify' => true,
]),
]);Ou implemente a sua:
use ApiBrasil\Core\Transport\TransportInterface;
use ApiBrasil\Core\Transport\TransportRequest;
use ApiBrasil\Core\Transport\TransportResponse;
final class MeuTransporte implements TransportInterface
{
public function request(TransportRequest $request): TransportResponse
{
// use o cliente HTTP que quiser e devolva status, headers e corpo
return new TransportResponse(200, [], ['ok' => true]);
}
}As actions de WhatsApp/Evolution/WhatsMeow e os 210+ tipo de consulta estão
disponíveis em constantes geradas do catálogo real da plataforma
(composer codegen atualiza):
use ApiBrasil\Generated\Catalog;
Catalog::WHATSAPP_ACTIONS; // ['sendText', 'sendFile', ...]
Catalog::serviceActions('whatsmeow'); // actions documentadas do serviço
Catalog::consultaTipo('lista-socios'); // ['service' => 'cnpj', 'fields' => ['cnpj']]Todo o gateway fica acessível pela porta de saída genérica, já com seus headers de autenticação:
$api->request('POST', '/consulta/cpf/credits', ['cpf' => '00000000000']);
$api->request('GET', '/reports/quick-stats');Documentação completa dos endpoints: https://doc.apibrasil.io
$api = new ApiBrasil([
'bearerToken' => '...', // ou APIBRASIL_BEARER_TOKEN
'deviceToken' => '...', // ou APIBRASIL_DEVICE_TOKEN
'secretKey' => '...', // usada em devices->store (ou APIBRASIL_SECRET_KEY)
'baseURL' => 'https://gateway.apibrasil.io/api/v2', // padrão (ou APIBRASIL_BASE_URL)
'timeout' => 30000, // milissegundos
'headers' => ['X-Custom' => 'valor'], // headers extras
'retry' => ['retries' => 2], // ou false
'hooks' => ['onRetry' => fn (array $i) => error_log($i['reason'])],
'transport' => null, // TransportInterface customizado
]);Opções por requisição (último parâmetro de qualquer método): query, headers,
bearerToken, deviceToken, secretKey, timeout, responseType.
$api->whatsapp->sendText(
['number' => '5511999999999', 'text' => 'Olá!'],
['deviceToken' => 'OUTRO_DEVICE', 'timeout' => 60000]
);Atenção:
timeouté em milissegundos (igual à SDK Node), diferente da interface legada, que usa segundos.
Os métodos estáticos Service::WhatsApp(), Service::CEP(), Service::CNPJ() e
companhia continuam funcionando exatamente como antes (resposta em stdClass,
erros devolvidos no corpo em vez de exceções), mas estão deprecados — prefira
o cliente ApiBrasil.
Exemplos da interface legada
$login = Service::Auth("login", [
"body" => [
"email" => "jhondoe@gmail.com",
"password" => "123456"
]
]);
$logout = Service::Auth("logout", [
"Bearer" => "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.....",
]);$store = Service::Device("store", [
"Bearer" => "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.....",
"SecretKey" => "f87eb607-a8cc-43ea-b439.....",
"body" => [
"type" => "cellphone",
"device_name" => "zap1",
"device_key" => "zapzap1",
"device_ip" => "198.29.10.50",
"server_search" => "341d6f36-b888....",
"webhook_wh_message" => "",
"webhook_wh_status" => ""
]
]);
$show = Service::Device("show", [
"Bearer" => "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.....",
"method" => "GET",
"query" => ["search" => "82faab0a-24f4-4b8b-9926-455ea9b3cdb7"],
]);$servers = Service::Server(["Bearer" => "...", "method" => "GET"]);
$profile = Service::Profile(["Bearer" => "...", "method" => "GET"]);
$plans = Service::Plan("all", ["Bearer" => "...", "method" => "GET"]);
$plan = Service::Plan("me", ["Bearer" => "...", "method" => "GET"]);$sendText = Service::WhatsApp("sendText", [
"Bearer" => "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.....",
"DeviceToken" => "d019580b-3c8c-40e3-b9a0....",
"body" => [
"number" => "5531994359434",
"text" => "🟢 Bem vindo ao APIBrasil"
]
]);$dados = Service::Vehicles("dados", [
"Bearer" => "...",
"DeviceToken" => "...",
"body" => ["placa" => "HBM6603"]
]);
$fipe = Service::Vehicles("fipe", [
"Bearer" => "...",
"DeviceToken" => "...",
"body" => ["placa" => "HBM6603"]
]);
// Vehicles Base (tipo como chave principal)
$base = Service::Vehicles("base/000/dados", [
"Bearer" => "...",
"timeout" => 120,
"body" => [
"tipo" => "fipe",
"placa" => "HBM6603",
"homolog" => false,
]
]);
// equivalente — a SDK normaliza o tipo automaticamente
$base = Service::Vehicles("base/000/dados", [
"Bearer" => "...",
"timeout" => 120,
"body" => [
"fipe" => ["placa" => "HBM6603", "homolog" => false],
]
]);$rastreio = Service::Correios("rastreio", [
"Bearer" => "...", "DeviceToken" => "...",
"body" => ["code" => "NL249695552BR"]
]);
$cnpj = Service::CNPJ("cnpj", [
"Bearer" => "...", "DeviceToken" => "...",
"body" => ["cnpj" => "44.959.669/0001-80"]
]);
$cep = Service::CEP("cep", [
"Bearer" => "...", "DeviceToken" => "...",
"body" => ["cep" => "32146057"]
]);
$ddd = Service::DDD("ddd", [
"Bearer" => "...", "DeviceToken" => "...",
"body" => ["ddd" => "31"]
]);
$feriados = Service::HoliDays("feriados", [
"Bearer" => "...", "DeviceToken" => "...",
"body" => ["type" => "facultativo", "date" => "07/09", "year" => "2024"]
]);timeout(segundos): equivalente ao--max-timedo curlconnect_timeout(segundos): timeout de conexãoverify(bool): valida SSL (padrão atual:false)query(array): querystring (GET/POST)