Pular para o conteúdo

API Backend

Endpoints REST para criação de sessões e consulta de resultados.

Todas as chamadas à API devem ser feitas a partir do backend do integrador — a API Key nunca deve ser exposta no frontend.

api.provvi.com.br

A API usa autenticação via header x-api-key. A chave é gerada no Admin Console na seção “API Keys” do cliente.

x-api-key: pvv_api_SuaChaveAqui

Cada cliente recebe sua própria API Key (formato pvv_api_*). A chave é exibida uma única vez ao ser criada — armazene-a com segurança no backend.

A API Key é diferente da License Key do SDK. Veja Licenciamento para entender a diferença.


Cria uma nova sessão de captura. Retorna um token com validade de 30 minutos.

Headers:

HeaderValor
Content-Typeapplication/json
x-api-keySua API Key

Request Body:

CampoTipoObrigatórioDescrição
reference_idstringSimID do recurso no sistema do integrador (anúncio, veículo, apólice)
redirect_uristringSimURL de retorno após captura concluída
webhook_urlstringSimURL que receberá POST ao concluir a captura
profilestringSimPerfil de captura — valores definidos no contrato (ex: vehicle_inspection, demo)

Exemplo:

Terminal window
curl -X POST https://api.provvi.com.br/web/sessions \
-H "Content-Type: application/json" \
-H "x-api-key: SUA_API_KEY" \
-d '{
"reference_id": "VIN-9BWZZZ377VT004251",
"redirect_uri": "https://seusite.com/captura/retorno",
"webhook_url": "https://seusite.com/api/provvi/webhook",
"profile": "vehicle_inspection"
}'

Response (201):

{
"token": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"expires_at": "2026-04-13T12:30:00Z"
}

Erros:

HTTPCausaBody
400Payload inválido ou campo ausente{ "error": "Payload inválido: ..." }
400Profile não reconhecido{ "error": "profile inválido — ..." }
401API Key ausente ou inválida{ "error": "API key inválida ou ausente" }

Consulta os resultados completos de uma sessão após a captura. Use este endpoint no seu backend para obter as URLs das fotos assinadas.

Parâmetros de URL:

ParâmetroDescrição
tokenToken retornado na criação da sessão

Response (200):

{
"reference_id": "VIN-9BWZZZ377VT004251",
"profile": "vehicle_inspection",
"status": "captured",
"total_photos": 3,
"captured_count": 3,
"created_at": "2026-04-13T12:00:00Z",
"photos": [
{
"order": 1,
"label": "Frente do veículo",
"status": "captured",
"session_id": "sess_abc123",
"gps_lat": -23.5505,
"gps_lon": -46.6333,
"gps_accuracy": 12.5,
"captured_at_ms": 1681394400000,
"authenticated_jpeg_url": "https://s3.amazonaws.com/..."
}
]
}

Campos de status da sessão:

StatusDescrição
pendingNenhuma foto capturada ainda
partialAlgumas fotos capturadas
capturedTodas as fotos capturadas

Erros:

HTTPCausaBody
400Token ausente{ "error": "token ausente no path" }
404Token não encontrado{ "error": "Sessão não encontrada" }

Nota: As URLs presigned do S3 têm validade de 7 dias. Armazene o conteúdo antes da expiração se precisar de acesso permanente.


Quando todas as fotos de uma sessão são capturadas, o backend Provvi envia um POST para o webhook_url configurado na criação da sessão.

Payload:

{
"session_id": "sess_abc123",
"reference_id": "VIN-9BWZZZ377VT004251",
"status": "signed",
"authenticated_jpeg_url": "https://s3.amazonaws.com/...",
"processed_at": "2026-04-13T12:05:30Z",
"icp_brasil": true,
"recapture_risk": "NONE"
}

Campos do webhook:

CampoTipoDescrição
session_idstringID único da captura
reference_idstringID do recurso (passado na criação)
statusstring"signed"
authenticated_jpeg_urlstringURL do JPEG com manifesto C2PA + ICP-Brasil embutidos (autoverificável)
processed_atstringTimestamp ISO 8601 do processamento
icp_brasilbooleanSe foi assinado com certificado ICP-Brasil
recapture_riskstring"NONE", "UNKNOWN" ou "HIGH"

Tratamento:

  • O webhook é enviado de forma assíncrona (fire-and-forget)
  • Não há retry automático em caso de falha
  • Seu endpoint deve responder com status 2xx em até 30 segundos
  • Em caso de falha no webhook, use GET /web/session-results/:token como fallback

1. Seu backend ──→ POST /web/sessions (com x-api-key)
← token + expires_at
2. Seu frontend ──→ Redireciona usuário para captura (com token)
(SDK ou Hosted Flow fazem o resto)
3. Provvi ──→ POST webhook_url (quando captura conclui)
Seu backend recebe session_id + URLs assinadas
4. Seu backend ──→ GET /web/session-results/:token
← Fotos com URLs, GPS, timestamps

Todas as timestamps são RFC 3339. Coordenadas são WGS84 (latitude/longitude).