Autenticação
Toda chamada precisa do header Authorization: Bearer cap_live_…. Você gera a chave no painel da empresa em /empresa/api. O hash SHA-256 da chave é o que guardamos no banco — você só vê o texto puro uma vez.
# Header padrão Authorization: Bearer cap_live_a1b2c3d4e5f6g7h8... # Alternativa x-api-key: cap_live_a1b2c3d4e5f6g7h8...
Base URL
https://suacapivara.com.br/api/v1
Toda resposta é application/json; charset=utf-8. Os timestamps são ISO 8601 em UTC.
POST /consultations
Cria uma consulta nova. Debita o preço B2B do plano do saldo em R$ da empresa (companies.balance_cents). Retorna 201 Created com o registro.
Request body
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| plan_id* | string | ID do plano (ex: "cpf-investigacao", "cnpj-premium", "veicular-total") | |
| target* | string | CPF (11 dígitos), CNPJ (14 dígitos) ou placa (Mercosul ou antiga) | |
| external_reference | string | ID do seu lado. Reenviar a mesma ref devolve a consulta existente (idempotência) | |
| callback_url | string | URL específica pra essa consulta (opcional, sobrescreve webhook global) | |
| cost_center | string | Centro de custo pra relatório financeiro interno | |
| finality | string | Finalidade LGPD. Default: "due_diligence" | |
Exemplo
curl -X POST https://suacapivara.com.br/api/v1/consultations \
-H "Authorization: Bearer cap_live_..." \
-H "Content-Type: application/json" \
-d '{
"plan_id": "cpf-investigacao",
"target": "12345678900",
"external_reference": "ticket-42",
"cost_center": "comercial-sp"
}'Response (201)
{
"id": "a1b2c3d4-...",
"status": "paid",
"category": "cpf",
"plan_id": "cpf-investigacao",
"target": "12345678900",
"external_reference": "ticket-42",
"pdf_url": null,
"created_at": "2026-05-22T15:43:00.000Z",
"completed_at": null
}status começa em paid (saldo já debitado) e vira processing → completed. Quando ficar completed, o pdf_url é populado e disparamos o webhook consultation.completed.
GET /consultations/:id
Retorna o status atual e o PDF (quando pronto).
curl https://suacapivara.com.br/api/v1/consultations/a1b2c3d4-... \ -H "Authorization: Bearer cap_live_..." # Pra incluir o JSON estruturado do resultado: curl 'https://suacapivara.com.br/api/v1/consultations/a1b2c3d4-...?include=result' \ -H "Authorization: Bearer cap_live_..."
Response (200)
{
"id": "a1b2c3d4-...",
"status": "completed",
"category": "cpf",
"plan_id": "cpf-investigacao",
"target": "12345678900",
"external_reference": "ticket-42",
"pdf_url": "https://...supabase.co/storage/.../report.pdf?signed=...",
"amount_cents": 990,
"folhas_used": 0,
"created_at": "2026-05-22T15:43:00.000Z",
"completed_at": "2026-05-22T15:43:08.000Z",
"result": {
/* presente apenas se ?include=result */
}
}amount_cents é o preço B2B do plano debitado do saldo (em centavos). O campo legado folhas_used continua na resposta apenas pra retrocompatibilidade — sempre 0 no modelo atual.
GET /consultations
Lista paginada de consultas da empresa. Filtros opcionais por status e ref.
| Query param | Tipo | Descrição | |
|---|---|---|---|
| limit | number | Máx por página. Default 25, máx 100 | |
| offset | number | Paginação. Default 0 | |
| status | string | paid | processing | completed | error | |
| external_reference | string | Filtra por ref específica | |
curl 'https://suacapivara.com.br/api/v1/consultations?status=completed&limit=50' \ -H "Authorization: Bearer cap_live_..."
Status de consulta
| Status | Significado | ||
|---|---|---|---|
| paid | Pagamento confirmado (saldo debitado). Vai pra fila de processamento. | ||
| processing | Edge function rodando. Geralmente <30s. | ||
| completed | PDF gerado + webhook disparado. pdf_url disponível. | ||
| error | Falha em alguma API externa. Saldo devolvido automaticamente. | ||
Idempotência
Envie external_reference com um valor único do seu lado (UUID, ID interno, ticket, etc). Se você reenviar a mesma external_reference pra mesma empresa, devolvemos a consulta existente com status 200 OK em vez de criar uma nova.
Rate limits
Padrão: 60 chamadas / minuto por chave. Configurável por chave no painel. Acima do limite retorna 429 Too Many Requests com header retry-after em segundos.
Códigos de erro
| Code | HTTP | Significado | |
|---|---|---|---|
| unauthorized:missing | 401 | Header Authorization ausente | |
| unauthorized:format | 401 | Chave não começa com "cap_live_" | |
| unauthorized:not_found | 401 | Chave não existe | |
| unauthorized:revoked | 401 | Chave foi revogada | |
| unauthorized:expired | 401 | Chave expirou | |
| scope_required | 403 | Chave não tem o scope necessário | |
| missing_fields | 400 | plan_id ou target faltando | |
| invalid_target | 422 | CPF/CNPJ/placa inválido (dígito verificador) | |
| plan_not_found | 404 | plan_id não existe | |
| insufficient_balance | 402 | Empresa sem saldo suficiente em balance_cents | |
| invalid_json | 400 | Body não é JSON válido | |
IDs de plano e preço B2B
Cada chamada da API debita o precoB2B do plano consultado direto do saldo da empresa em balance_cents. Para reduzir o custo efetivo, escolha pacotes Manada maiores (mais bônus em saldo).
| plan_id | Categoria | Preço B2B (R$) |
|---|---|---|
| cpf-espiadinha | cpf | R$ 4,90 |
| cpf-investigacao | cpf | R$ 9,90 |
| cpf-avancada | cpf | R$ 19,90 |
| cpf-premium | cpf | R$ 39,90 |
| cpf-raio-x | cpf | R$ 64,90 |
| cnpj-espiadinha | cnpj | R$ 3,90 |
| cnpj-socios | cnpj | R$ 24,90 |
| cnpj-premium | cnpj | R$ 49,90 |
| cnpj-total | cnpj | R$ 74,90 |
| veicular-espiadinha | veicular | R$ 4,90 |
| veicular-completo | veicular | R$ 14,90 |
| veicular-avancado | veicular | R$ 29,90 |
| veicular-premium | veicular | R$ 59,90 |
| veicular-total | veicular | R$ 124,90 |
Webhooks
Pra receber eventos em tempo real (consulta pronta, falha, pagamento confirmado), cadastre um endpoint em /empresa/webhooks.
Documentação de webhooks