SDK oficial Dart/Flutter da plataforma APIBrasil — WhatsApp, SMS, consultas de CPF/CNPJ, veículos, CEP, correios, pagamentos PIX/boleto e muito mais.
dependencies:
apigratis_sdk_flutter: ^0.1.0flutter pub getRequer Dart >= 3.5 (compatível com Flutter 3.19+ e Dart standalone).
Obtenha suas credenciais em https://apibrasil.com.br
import 'package:apigratis_sdk_flutter/apigratis_sdk_flutter.dart';
void main() async {
// Initialize with credentials
final api = ApiBrasil(
bearerToken: 'seu_bearer_token', // JWT do login
deviceToken: 'seu_device_token', // device dos serviçs device-based
);
// WhatsApp - enviar texto
final result = await api.whatsapp.sendText({
'number': '5511999999999',
'text': 'Olá! 👋'
});
// Consulta CNPJ (por créditos)
final empresa = await api.consulta.cnpj({'cnpj': '00000000000000'});
print(empresa['data']);
// QR Code WhatsApp
final qr = await api.whatsapp.qrcode();
print(qr['response']['qrcode']); // data URI base64
}As credenciais também podem vir do ambiente — ApiBrasil() lê automaticamente
APIBRASIL_BEARER_TOKEN, APIBRASIL_DEVICE_TOKEN, APIBRASIL_SECRET_KEY e APIBRASIL_BASE_URL.
Também via --dart-define no build:
flutter run --dart-define=APIBRASIL_BEARER_TOKEN=... --dart-define=APIBRASIL_DEVICE_TOKEN=...Todas as respostas são devolvidas como Map<String, dynamic> já decodificado.
O token retornado fica guardado no cliente:
final result = await ApiBrasil.login({
'email': 'voce@empresa.com.br',
'password': '******'
});
final api = result.client;
// Contas com 2FA:
final session = await api.auth.login({'email': email, 'password': password});
if (session['requires_2fa'] == true) {
await 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:
final device = await api.devices.create(
{'device_name': 'meu-bot', 'type': 'server'},
const RequestOptions(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, baseDados) |
api.fipe |
Tabela FIPE (consultarMarcas, consultarModelos, consultarAnoModelo, consultarTabelaDeReferencia...) |
api.correios |
Correios (rastreio) |
api.cep |
CEP + geolocalização (cep, bairros, cidades, cidadesPorDdd, estados, calcularDistancia) |
api.geolocation / api.geomatrix |
Geolocalização e matriz de distâncias |
api.recognize |
OCR / Google Vision (base64, uri) |
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 (create, status, list) |
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
await api.whatsapp.start({'webhook_wh_message': 'https://seu-webhook.com/mensagens'});
final qr = await api.whatsapp.qrcode();
print(qr['response']['qrcode']); // data URI base64
// Envios
await api.whatsapp.sendText({'number': '5511999999999', 'text': 'Olá!'});
await api.whatsapp.sendFile({'number': '5511999999999', 'path': 'https://exemplo.com/nota.pdf'});
await api.whatsapp.sendAudio({'number': '5511999999999', 'path': 'https://exemplo.com/audio.mp3'});
// Qualquer action da documentação, inclusive via fila
await api.whatsapp.request('sendLocation', {'number': '5511999999999', 'lat': -23.5, 'lng': -46.6});
await api.whatsapp.queue('sendText', {'number': '5511999999999', 'text': 'assíncrono 👋'});// CPF / CNPJ
final cpf = await api.consulta.cpf({'cpf': '00000000000'});
final socios = await api.consulta.cnpj({'cnpj': '00000000000000', 'tipo': 'lista-socios'});
// Veicular
final veiculo = await api.consulta.veiculos({'placa': 'ABC1234'});
// Qualquer produto do catálogo
final score = await api.consulta.consulta('cpf', {'cpf': '00000000000', 'tipo': 'serasa-score-pf'});
// Homologação (sandbox, sem cobrança)
final teste = await api.consulta.cpf({'cpf': '00000000000', 'homolog': true});final dados = await api.vehicles.dados({'placa': 'ABC1234'});
final fipe = await api.vehicles.fipe({'placa': 'ABC1234'});await api.sms.send({'number': '5511999999999', 'message': 'Seu código: 123456'});
// Ou debitando créditos da conta (sem device):
await api.sms.sendWithCredits({'number': '5511999999999', 'message': 'Olá!'});// Recargas de saldo
final pix = await api.payments.rechargePix({'amount': 100});
final boleto = await api.payments.rechargeBoleto({'amount': 150});
final cartao = await api.payments.rechargeCard({'amount': 200});
// Pagamento de faturas
await api.payments.payInvoicePix('INVOICE_ID', {});
// Histórico e métodos disponíveis
final historico = await api.payments.payments();
final metodos = await api.payments.paymentMethods();final comercial = api.withDevice('DEVICE_TOKEN_COMERCIAL');
final suporte = api.withDevice('DEVICE_TOKEN_SUPORTE');
await comercial.whatsapp.sendText({'number': '55...', 'text': 'Proposta enviada!'});
await 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 implementa Exception):
| 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 (retryAfter) |
ServerError |
5xx — erro do gateway/provedor |
NetworkError / TimeoutError |
falha antes da resposta |
import 'package:apigratis_sdk_flutter/apigratis_sdk_flutter.dart';
try {
await api.consulta.cpf({'cpf': '00000000000'});
} on InsufficientBalanceError catch (e) {
print('Recarregue seus créditos');
} on RateLimitError catch (e) {
print('Aguarde ${e.retryAfter?.inMilliseconds}ms');
} on ApiBrasilError catch (e) {
print('Erro: ${e.message} (HTTP ${e.status}, código ${e.code})');
}Todo erro expõe status (HTTP), code (código da API) e response (corpo completo).
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.
final api = ApiBrasil(
bearerToken: '...',
deviceToken: '...',
retry: RetryConfig(
retries: 3,
minDelay: Duration(milliseconds: 500),
maxDelay: Duration(seconds: 5),
retryOnStatuses: [429, 503],
),
hooks: ApiBrasilHooks(
onRequest: (info) => print('→ ${info.method.value} ${info.url} (#${info.attempt})'),
onResponse: (info) => print('← ${info.status} em ${info.duration.inMilliseconds}ms'),
onRetry: (info) => print('retry em ${info.delay.inMilliseconds}ms: ${info.reason}'),
),
);O HTTP é feito pelo package:http (HttpTransport), mas a interface Transport
permite trocar a camada inteira (proxy corporativo, Dio, mocks de teste):
import 'package:apigratis_sdk_flutter/apigratis_sdk_flutter.dart';
import 'package:http/http.dart' as http;
final api = ApiBrasil(
bearerToken: '...',
transport: HttpTransport(
client: http.Client()
..timeout = Duration(seconds: 60)
..findProxy = (uri) => 'PROXY http://proxy.local:3128',
),
);Ou implemente a sua:
import 'package:apigratis_sdk_flutter/apigratis_sdk_flutter.dart';
class MeuTransporte implements Transport {
@override
Future<TransportResponse> send(TransportRequest request) async {
// use o cliente HTTP que quiser e devolva status, headers e corpo
return TransportResponse(200, {}, {'ok': true});
}
@override
void close() {}
}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
(regenerar futuramente via tooling):
import 'package:apigratis_sdk_flutter/apigratis_sdk_flutter.dart';
Catalog.whatsappActions; // ['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:
await api.request('POST', '/consulta/cpf/credits', {'cpf': '00000000000'});
await api.request('GET', '/reports/quick-stats');Documentação completa dos endpoints: https://doc.apibrasil.io
final api = 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: Duration(seconds: 30),
headers: {'X-Custom': 'valor'}, // headers extras
retry: RetryConfig(retries: 2), // ou RetryConfig.disabled
hooks: ApiBrasilHooks(
onRetry: (info) => print(info.reason),
),
transport: null, // Transport customizado
);Opções por requisição (último parâmetro de qualquer método): query, headers,
bearerToken, deviceToken, secretKey, timeout, responseType.
await api.whatsapp.sendText(
{'number': '5511999999999', 'text': 'Olá!'},
RequestOptions(
deviceToken: 'OUTRO_DEVICE',
timeout: Duration(minutes: 1),
),
);Atenção:
timeouté em Duration (padrão Dart), diferente da interface legada do PHP que usa segundos.
As classes ApiService, WhatsAppService, CpfService, SmsService continuam funcionando exatamente como antes (resposta em Map, erros como exceção), mas estão depreciadas — prefira o cliente ApiBrasil.
// Legado (compatibilidade)
final legacy = WhatsAppService(bearerToken: '...', deviceToken: '...');
await legacy.sendText(ApiRequest(
credentials: Credentials(deviceToken: '...', bearerToken: '...'),
body: Body(text: 'Olá', number: '5511999999999', timeTyping: 1000),
));