Passo 5 · Resultados
Quando o usuário conclui a captura, a foto é assinada server-side com ICP-Brasil A1 e o componente emite o evento uploaded com o session_id e, sob a política ALWAYS, a URL do JPEG autenticado. Não há webhook. Sob NEVER (o default) o evento traz só o session_id, e o sidecar do manifesto é buscado pelo seu backend — ver abaixo.
O que você recebe
Seção intitulada “O que você recebe”O componente emite o evento uploaded (ver Passo 3 · Ciclo de captura) com o resultado da captura:
| Campo | Descrição |
|---|---|
authenticated_jpeg_url |
URL presigned do JPEG autenticado — o manifesto C2PA e a assinatura ICP-Brasil vão embutidos no próprio arquivo (auto-verificável). O evento não traz URL de manifesto; o sidecar fica disponível ao seu backend (ver abaixo). Pode vir null — ver JPEG ausente. |
session_id |
ID único da captura concluída. |
Quando a URL vem preenchida (ALWAYS), a prova é autocontida no JPEG: baixe e guarde o arquivo no seu próprio storage assim que receber o resultado — a URL presigned expira em 7 dias; não dependa dela a longo prazo. Sob NEVER, guarde o manifesto que o seu backend obtém como descrito abaixo.
Quando authenticated_jpeg_url é null
Seção intitulada “Quando authenticated_jpeg_url é null”Contas em modo zero-knowledge (store_asset_policy = NEVER, o default) não retêm o JPEG — a Provvi não o armazena, então authenticated_jpeg_url vem null. Isso é esperado, não um erro.
Nesse modo, o componente não entrega artefato algum no evento: nem o JPEG, nem URL de manifesto. O manifesto assinado existe como sidecar, e o seu backend o obtém em GET /web/session-results/:token (campo manifest_url de cada foto). Busque e guarde o manifesto no seu storage logo após o uploaded: a URL vale 7 dias, e a rota não é garantida depois dos 30 minutos de validade da sessão. Contrato em Referência da API Web.
O JPEG autenticado não fica com ninguém sob NEVER: o componente não devolve os bytes e a Provvi não os retém. Para capturas a partir de 2026-09-16, em qualquer política, a imagem enviada pelo navegador passa por um armazenamento temporário da Provvi só para ser assinada: não é servida a ninguém; desde 2026-09-18 a imagem da captura aceita é apagada na hora, ainda dentro da mesma captura, e a varredura automática do provedor de nuvem (diária, sem hora exata garantida) segue como rede para os casos em que a captura não chega a ser aceita — ver Passo 6 · Configuração. Se o seu laudo precisa exibir a imagem, configure a política da sua licença como ALWAYS — mesma página. A política de armazenamento é derivada da sua licença (não é um parâmetro do integrador).
Nota (2026-09-21). Desde 2026-09-20 a resposta do
POST /web/ingestentrega o JPEG assinado inline (camposigned_image_base64), em qualquer política — sobNEVERessa é a única cópia, e a Provvi continua sem retê-la. O componente<provvi-camera>publicado não expõe esse campo ao seu código: o que está acima continua valendo para a integração pelo componente. Quando o componente passar a expô-lo, esta página será atualizada. Contrato do campo na Referência da API Web.
Renovando URLs expiradas
Seção intitulada “Renovando URLs expiradas”A URL presigned (authenticated_jpeg_url) vale por 7 dias. Se ela expirou e você precisa de acesso novamente, gere uma nova chamando GET /web/image/:session_id (backend-only) com o session_id da captura:
// Backend do integradorasync function renovarUrl(sessionId) { const res = await fetch( `${process.env.PROVVI_SESSIONS_URL}/web/image/${sessionId}` ); if (!res.ok) throw new Error(`web/image ${res.status}`); return res.json(); // devolve uma URL presigned fresca para o JPEG autenticado}Onde PROVVI_SESSIONS_URL é a base da API de sessões — a mesma do Passo 1. Em contas NEVER (sem JPEG armazenado), não há asset a servir.