SDK RUST - APIGratis by API BRASIL 🦀
SDK oficial Rust da plataforma APIBrasil — WhatsApp, SMS, consultas de CPF/CNPJ, veículos, CEP, correios, pagamentos PIX/boleto e muito mais.
Canais de suporte (Comunidade)
Instalação
Requer Rust >= 1.82. TLS via rustls por padrão — sem depender de OpenSSL instalado.
Obtenha suas credenciais em https://apibrasil.com.br
Começando
use ;
use json;
async
As credenciais também podem vir só do ambiente — ApiBrasil::from_env() lê automaticamente APIBRASIL_BEARER_TOKEN, APIBRASIL_DEVICE_TOKEN, APIBRASIL_SECRET_KEY e APIBRASIL_BASE_URL.
Também é possível autenticar por email/senha — o token retornado fica guardado no cliente:
let = login
.await?;
// contas com 2FA:
let api = from_env;
let sessao = api.auth.login.await?;
if requires_2fa
Como a plataforma funciona
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 |
Para os serviços device-based, crie um device com a SecretKey da API desejada (painel APIBrasil) e use o device_token retornado:
use RequestOptions;
let device = api
.with_options
.devices
.store
.await?;
api.set_device_token;
Serviços disponíveis
| Módulo | Descrição |
|---|---|
api.whatsapp() |
WhatsApp: start, qrcode, send_text, send_file, send_audio, send_video, fila (queue)... |
api.evolution() |
Evolution API: request(controller, action, body) |
api.whatsmeow() |
WhatsMeow: request(action, body), send_text, instance_qr... |
api.sms() |
SMS device-based (send) e por créditos (send_with_credits) |
api.dados() |
Dados cadastrais device-based (cpf, cnpj, lista_socios...) |
api.vehicles() |
Veículos por placa (dados, fipe, consulta_fipe, base_dados) |
api.fipe() |
Tabela FIPE (consultar_marcas, consultar_modelos...) |
api.correios() |
Correios (rastreio, request) |
api.cep() |
CEP + geolocalização (cep, cidades, estados, calcular_distancia) |
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.loterias() |
Loterias (latest, resultado) |
api.database_ip() |
GeoIP (ip) |
api.consulta() |
Consultas por créditos: cpf, cnpj, cnh, cep, veiculos, telefone, generic(service, body) |
api.ura() / api.chip_virtual() |
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.ip_whitelist() / api.bearer_rate_limit() |
Segurança da conta |
api.reports() |
Relatórios e dashboard de consumo |
Todo método é async e aceita o body como json!({...}), None ou ().
// iniciar sessão e obter QR Code
api.whatsapp
.start
.await?;
let qr = api.whatsapp.qrcode.await?;
println!; // data URI base64
// envios
api.whatsapp.send_text.await?;
api.whatsapp
.send_file
.await?;
api.whatsapp
.send_location
.await?;
// qualquer action do catálogo
api.whatsapp.request.await?;
// fila assíncrona
api.whatsapp
.queue
.await?;
O envelope device-based tem acessores tipados — e continua sendo um JSON:
let res = api.whatsapp.send_text.await?;
res.is_error; // bool
res.message; // Option<&str>
res.response; // Option<&Json>
res.api_limit; // Option<&Json>
res; // acesso direto por chave
let enviado: Enviado = res.decode?; // decodifica o campo `response`
Consultas por créditos
use Consulta;
let cpf = api.consulta.cpf.await?;
println!;
// o campo `tipo` define o produto consultado
api.consulta
.cnpj
.await?;
// modo homologação (sandbox, sem cobrança)
api.consulta
.cnpj
.await?;
// qualquer serviço do catálogo
api.consulta.generic.await?;
Veículos e FIPE (device-based)
api.vehicles.dados.await?;
api.vehicles.fipe.await?;
api.fipe.consultar_marcas.await?;
SMS
api.sms.send.await?;
api.sms.send_with_credits.await?;
Pagamentos e recargas
api.payments.recharge.await?;
api.payments.pix_generate.await?;
api.payments.pix_status.await?;
let pdf = api.payments.boleto_pdf.await?; // Vec<u8>
write?;
Múltiplos devices
let bot1 = api.with_device;
let bot2 = api.with_device;
bot1.whatsapp.send_text.await?;
bot2.whatsapp.send_text.await?;
Tratamento de erros
Toda chamada devolve apibrasil::Result<T>; a falha carrega a categoria em error.kind():
ErrorKind |
Quando |
|---|---|
Validation |
400/422 — payload inválido |
Authentication |
401 — token ausente/expirado |
InsufficientBalance |
402 — sem saldo/créditos |
Permission |
403 — sem permissão (ex: exige PJ) |
NotFound |
404/410 — sem dados / rota desativada |
RateLimit |
429 — limite atingido (error.retry_after) |
Server |
5xx — erro do gateway/provedor |
Network / Timeout |
falha antes da resposta |
Api |
qualquer outra falha da API |
use ErrorKind;
match api.consulta.cpf.await
Cada categoria também tem o seu predicado: error.is_insufficient_balance(), error.is_rate_limit(), error.is_network()...
Retry e observabilidade
Por padrão a SDK refaz a chamada em HTTP 429 e em falhas de conexão (2 tentativas extras, backoff exponencial com jitter, respeitando Retry-After). Timeouts e erros de negócio nunca são refeitos — evita duplicar cobranças e envios.
use Duration;
use ;
let api = new;
Para cancelar ou limitar uma chamada, use as ferramentas do próprio runtime:
let envio = timeout
.await;
Opções por requisição
with_options devolve um cliente (ou serviço) que usa as opções em todas as chamadas, compartilhando a mesma conexão e credenciais:
use RequestOptions;
api.with_options
.devices
.store
.await?;
// também por serviço
api.whatsapp
.with_options
.send_text
.await?;
Cliente síncrono
Sem async/await, com a feature blocking:
= { = "1", = ["blocking"] }
use ApiBrasil;
Transporte plugável
O HTTP é feito pelo reqwest, mas o trait Transport permite trocar a camada inteira (proxy corporativo, instrumentação, mocks de teste):
use ;
;
let api = new;
Para apenas configurar proxy, TLS ou pool de conexões, reaproveite o transporte padrão:
use ReqwestTransport;
let http = builder
.proxy
.build?;
let api = new;
Módulos
use ; // cliente + tipos do dia a dia
use core; // HTTP, transporte, erros, retry, hooks
use messaging; // WhatsApp, SMS, Evolution, WhatsMeow
use data; // consultas, veículos, CEP, FIPE...
use platform; // auth, devices, pagamentos, relatórios
use generated; // catálogo gerado
use legacy; // interface legada
use blocking; // cliente síncrono (feature = "blocking")
Cada serviço também pode ser usado isoladamente sobre o mesmo cliente HTTP:
use Arc;
use ;
let http = new;
let api = with_http;
Catálogo gerado
As actions de WhatsApp/Evolution/WhatsMeow e os 210+ tipo de consulta são gerados do catálogo real da plataforma:
use generated;
WHATSAPP_ACTIONS; // &[&str] com todas as actions
service_actions_for; // ["bairros", "cep", "cidades", ...]
has_action; // true
let meta = consulta_tipo.unwrap;
// meta.service = "cpf", meta.fields = ["cpf"]
Endpoint sem método dedicado?
Todo o gateway fica acessível pela porta de saída genérica, já com seus headers de autenticação:
use Method;
api.request.await?;
api.request.await?;
Documentação completa dos endpoints: https://doc.apibrasil.io
Configuração avançada
let api = new;
Licença
MIT — veja LICENSE.