SDK oficial C++ da plataforma APIBrasil — WhatsApp, SMS, consultas CPF/CNPJ, veículos, CEP, correios, pagamentos PIX/boleto e muito mais.
- C++17, portável (Linux, macOS, Windows/MSVC).
- Transporte HTTP baseado em libcurl; JSON via nlohmann/json.
- Retry com backoff, hooks de observabilidade e hierarquia de erros tipados.
- Compilador C++17 (GCC 8+, Clang 7+, MSVC 2019+).
- CMake ≥ 3.16.
- libcurl (desenvolvimento).
- nlohmann/json — encontrado no sistema ou
baixado automaticamente via
FetchContent.
No Ubuntu/Debian: sudo apt install libcurl4-openssl-dev cmake g++.
No macOS: brew install curl cmake.
No Windows: use vcpkg (vcpkg install curl nlohmann-json)
ou o Visual Studio com CMake.
Copie/clone este repositório para dentro do seu projeto e no seu CMakeLists.txt:
add_subdirectory(apigratis-sdk-cpp)
target_link_libraries(seu_app PRIVATE apibrasil::apibrasil)include(FetchContent)
FetchContent_Declare(apibrasil
GIT_REPOSITORY https://github.com/jhowbhz/apigratis-sdk-cpp.git
GIT_TAG v0.0.2)
FetchContent_MakeAvailable(apibrasil)
target_link_libraries(seu_app PRIVATE apibrasil::apibrasil)Depois, no código:
#include <apibrasil/apibrasil.hpp>Pegue suas credenciais em https://apibrasil.com.br. Existem dois tipos de serviço:
| Família | Headers enviados | Serviços |
|---|---|---|
| Device-based | Authorization: Bearer <token> + DeviceToken: <token> |
whatsapp, sms, dados, vehicles, cep, correios, ... |
| Credit-based | apenas Authorization: Bearer <token> (debita saldo) |
consulta.* |
#include <apibrasil/apibrasil.hpp>
using namespace apibrasil;
Config cfg;
cfg.bearerToken = "seu_bearer_token"; // JWT do login
cfg.deviceToken = "seu_device_token"; // serviços device-based
ApiBrasil api(cfg);Ou deixe o SDK ler as variáveis de ambiente automaticamente
(APIBRASIL_BEARER_TOKEN, APIBRASIL_DEVICE_TOKEN, APIBRASIL_SECRET_KEY,
APIBRASIL_BASE_URL):
ApiBrasil api; // lê do ambienteauto result = ApiBrasil::login({{"email", "voce@x.com"}, {"password", "******"}});
auto& api = *result.client; // o token já está no cliente
// 2FA:
try {
auto r = ApiBrasil::login({{"email", email}, {"password", senha}});
} catch (const ApiBrasilError& e) {
// e.code() == "requires_2fa" -> conclua com auth.send2fa()/verify2fa()
}RequestOptions o;
o.secretKey = "SUA_SECRET_KEY";
Json device = api.devices.store({{"device_name", "meu-bot"}, {"type", "server"}}, o);
api.setDeviceToken(device["device"]["device_token"].get<std::string>());Todas as respostas voltam como apibrasil::Json (alias de nlohmann::json).
// WhatsApp (device-based)
api.whatsapp.start({{"webhook_wh_message", "https://.../mensagens"}});
Json qr = api.whatsapp.qrcode(); // qr["response"]["qrcode"]
api.whatsapp.sendText({{"number", "5511999999999"}, {"text", "Olá!"}});
api.whatsapp.sendFile({{"number", "..."}, {"path", "https://.../nota.pdf"}});
// Chamada genérica de qualquer action + fila (assíncrono)
api.whatsapp.request("sendLocation", {{"number", "..."}, {"lat", -23.5}, {"lng", -46.6}});
api.whatsapp.queue("sendText", {{"number", "..."}, {"text", "assíncrono"}});
// Consultas por crédito
Json cpf = api.consulta.cpf({{"cpf", "00000000000"}});
Json socios = api.consulta.cnpj({{"cnpj", "..."}, {"tipo", "lista-socios"}});
Json score = api.consulta.generic("cpf", {{"cpf", "..."}, {"tipo", "serasa-score-pf"}});
Json teste = api.consulta.cpf({{"cpf", "..."}, {"homolog", true}}); // sandbox, sem cobrança
// Veículos (device-based) / SMS / Pagamentos
api.vehicles.dados({{"placa", "ABC1234"}});
api.sms.send({{"number", "..."}, {"message", "codigo: 123456"}});
Json pix = api.payments.pixGenerate("mercadopago", {{"amount", 100}});
// Boleto em PDF (bytes brutos)
std::string pdf = api.payments.boletoPdf("inter", "BOLETO_ID");auto comercial = api.withDevice("DEVICE_TOKEN_COMERCIAL");
comercial->whatsapp.sendText({{"number", "..."}, {"text", "..."}});Json r1 = api.request("POST", "/consulta/cpf/credits", Json{{"cpf", "..."}});
Json r2 = api.request("GET", "/reports/quick-stats");Toda resposta com status >= 400 lança uma exceção da hierarquia
apibrasil::ApiBrasilError:
try {
api.consulta.cpf({{"cpf", "00000000000"}});
} catch (const InsufficientBalanceError& e) {
// saldo insuficiente (HTTP 402) -> recarregar
} catch (const RateLimitError& e) {
long ms = e.retryAfterMs().value_or(0); // aguardar antes de repetir
} catch (const ValidationError& e) {
// 400/422
} catch (const ApiBrasilError& e) {
std::cerr << e.what() << " (status " << e.status().value_or(0) << ")\n";
}| Exceção | Status |
|---|---|
ValidationError |
400, 422 |
AuthenticationError |
401 |
InsufficientBalanceError |
402 |
PermissionError |
403 |
NotFoundError |
404, 410 |
RateLimitError (tem retryAfterMs()) |
429 |
ServerError |
≥ 500 |
NetworkError / TimeoutError |
falha de conexão / timeout |
Config cfg;
cfg.bearerToken = "...";
cfg.deviceToken = "...";
cfg.baseUrl = "https://gateway.apibrasil.io/api/v2"; // padrão
cfg.timeoutMs = 30000; // padrão (ms)
// Retry (padrão: 2 tentativas, apenas em 429 e falhas de conexão)
RetryConfig r;
r.retries = 3;
r.retryOnStatuses = {429, 503};
cfg.retry = r; // ou RetryConfig::disabled()
// Hooks de observabilidade
cfg.hooks.onRequest = [](const RequestHookInfo& i) { /* log */ };
cfg.hooks.onResponse = [](const ResponseHookInfo& i) { /* log */ };
cfg.hooks.onRetry = [](const RetryHookInfo& i) { /* log */ };
ApiBrasil api(cfg);Timeouts nunca são repetidos automaticamente (para evitar cobranças/envios
duplicados). Não há URL separada de sandbox — a "homologação" das consultas por
crédito é feita por chamada com {"homolog", true} no corpo.
Todo método aceita um RequestOptions opcional no fim:
RequestOptions o;
o.query["page"] = "2";
o.headers["X-Id"] = "abc";
o.bearerToken = "token_de_uma_chamada";
o.timeoutMs = 60000;
api.reports.recentRequests(o);- Portal: https://apibrasil.com.br
- Docs: https://doc.apibrasil.io
MIT © APIBrasil.