Pular para o conteúdo

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 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.


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/ingest entrega o JPEG assinado inline (campo signed_image_base64), em qualquer política — sob NEVER essa é 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.


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 integrador
async 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.


← Erros · Próximo → Configuração da conta