Tabela completa de códigos de erro, classes e tratamento recomendado.
Programático : use instanceof (Web) ou when/switch por tipo (Android/iOS) para tratamento específico
Código numérico : use error.code (Web) ou error.type (nativos) para tratamento granular
Serialização : error.toJSON() (Web) retorna objeto sem stack trace — seguro para telemetria
Causa raiz : error.cause (Web) ou error.exception (Android) preserva o erro original
Código Constante Classe Quando ocorre 1000 UNKNOWNProvviErrorErro genérico não classificado 2001 CAMERA_NOT_SUPPORTEDProvviUserAgentErrorBrowser não suporta getUserMedia 3001 STREAM_OPEN_FAILEDProvviStreamErrorFalha ao abrir câmera (permissão negada, câmera em uso) 3002 STREAM_CAPTURE_FAILEDProvviStreamErrorFalha ao capturar frame (canvas, encoding JPEG) 4001 SESSION_FETCH_FAILEDProvviAPIErrorSessão não encontrada, expirada ou já capturada 4002 INGEST_FAILEDProvviAPIErrorErro no envio da captura (rejeição do servidor) 5001 CAPTURE_FAILEDProvviCaptureErrorErro na orquestração do pipeline 5002 TOKEN_REQUIREDProvviCaptureErroropen() chamado sem token6001 GPS_UNAVAILABLEProvviGeolocationErrorAPI de geolocalização não disponível 6002 GPS_DENIEDProvviGeolocationErrorUsuário negou permissão de localização 6003 GPS_TIMEOUTProvviGeolocationErrorTimeout na aquisição de GPS 7001 UPLOAD_FAILEDProvviUploadErrorFalha no upload da captura 8001 LICENSE_KEY_MISSINGProvviLicenseErrorlicenseKey não informada8002 LICENSE_INVALIDProvviLicenseErrorLicença rejeitada — código genérico, ver details.reason abaixo 8003 LICENSE_NETWORK_ERRORProvviLicenseErrorFalha de rede na validação
O código LICENSE_INVALID (8002) cobre múltiplas situações. O motivo específico é acessível via error.details.reason (Web) ou pelo campo reason na resposta de /validate:
details.reasonSituação INVALID_KEYChave não encontrada no banco REVOKEDLicença desativada pelo administrador EXPIREDContrato expirado VOLUME_EXCEEDEDLimite mensal de capturas atingido CLIENT_SUSPENDEDConta do cliente suspensa PACKAGE_NOT_ALLOWEDBundle/package não autorizado para esta licença
import { EVENTS, ProvviLicenseError, ProvviStreamError, CODES } from ' provvi-camera.es.js ' ;
camera . addEventListener ( EVENTS . ERROR , ( e ) => {
const err = e . detail . error ;
if ( err instanceof ProvviLicenseError ) {
// err.details.reason → INVALID_KEY, REVOKED, EXPIRED, etc.
showLicenseError ( err . details . reason );
if ( err instanceof ProvviStreamError ) {
showCameraError ( err . message );
case CODES . TOKEN_REQUIRED :
console . error ( ' Token não fornecido ' );
reportToSentry ( err . toJSON ());
Tipo Descrição Recuperável Permissões PERMISSION_DENIEDCâmera ou localização negada Sim — solicitar novamente Integridade DEVICE_COMPROMISEDRoot/emulador detectado Não STRONGBOX_UNAVAILABLEStrongBox ausente (não bloqueante) N/A ATTESTATION_ERRORPlay Integrity API inacessível Sim — retry Câmera CAMERA_NOT_FOUNDSem câmera física Não CAMERA_IN_USECâmera em uso por outro app Sim — fechar outro app CAMERA_TIMEOUTSem frame em 10 segundos Sim — retry CAMERA_ERRORErro genérico de câmera Sim — retry Localização MOCK_LOCATION_DETECTEDGPS falso detectado Não LOCATION_UNAVAILABLESem fonte de localização Depende do perfil Recaptura RECAPTURE_SUSPECTEDFoto de tela detectada Não Assinatura SIGNING_FAILEDFalha C2PA (c2pa-rs) Sim — retry MANIFEST_INVALIDManifesto corrompido Sim — retry FRAME_HASH_FAILEDFalha SHA-256 Sim — retry Rede NETWORK_UNAVAILABLESem conectividade Sim — verificar rede BACKEND_UNAVAILABLEUpload falhou Sim — retry via retryUpload() BACKEND_AUTH_FAILEDAPI Key inválida (401) Verificar credenciais BACKEND_TIMEOUTTimeout no upload Sim — retry TSA_UNAVAILABLETimestamp Authority offline Sim — retry automático (3x) Relógio CLOCK_SUSPICIOUSDrift > 300s (cliente) ou > 600s (servidor) Não Licenciamento LICENSE_KEY_MISSINGlicenseKey vazio no configConfigurar a chave LICENSE_NOT_VALIDATEDvalidateLicense() não chamadoChamar antes de capture() LICENSE_INVALIDChave não reconhecida Verificar no Admin Console LICENSE_REVOKEDLicença revogada Contatar Provvi LICENSE_EXPIREDContrato expirado Renovar contrato LICENSE_VOLUME_EXCEEDEDLimite mensal atingido Ampliar volume LICENSE_NETWORK_ERRORSem rede para validar Verificar conexão LICENSE_CLIENT_SUSPENDEDConta suspensa Contatar Provvi LICENSE_PACKAGE_NOT_ALLOWEDPackage não autorizado Verificar licença Genérico UNKNOWNErro não classificado Depende
is CaptureOutcome.LicenseError -> {
when (outcome.error.type) {
ProvviErrorType.LICENSE_EXPIRED -> showRenewDialog ()
ProvviErrorType.LICENSE_VOLUME_EXCEEDED -> showUpgradeDialog ()
ProvviErrorType.LICENSE_REVOKED -> blockCapture ()
else -> showGenericError (outcome.error.message)
is CaptureOutcome.BackendError -> {
when (outcome.errorType) {
BackendErrorType.TSA_UNAVAILABLE -> scheduleRetry (outcome.result)
BackendErrorType.AUTH_FAILED -> checkCredentials ()
else -> showRetryDialog (outcome.message)
Caso Enum Descrição Chave vazia .keyMissinglicenseKey não configuradoChave inválida .invalidKey("INVALID_KEY")Não encontrada no backend Revogada .invalidKey("REVOKED")Desativada pelo admin Expirada .invalidKey("EXPIRED")Contrato vencido Volume excedido .invalidKey("VOLUME_EXCEEDED")Limite mensal Conta suspensa .invalidKey("CLIENT_SUSPENDED")Cliente suspenso Rede .networkError(error)Falha de rede + sem cache válido
case . licenseError ( let reason ) :
case " EXPIRED " : showRenewDialog ()
case " VOLUME_EXCEEDED " : showUpgradeDialog ()
case " REVOKED " , " CLIENT_SUSPENDED " : blockCapture ()
default: showAlert ( " Licença: \( reason ) " )
case . backendError ( let message, let session ) :
if let session = session {
// Captura local OK — agendar retry
showAlert ( " Dispositivo comprometido. Captura bloqueada. " )
HTTP Endpoint Causa Body 400 /web/sessionsPayload inválido { "error": "Payload inválido: ..." }400 /web/sessionsProfile inválido { "error": "profile inválido — use: ..." }400 /web/ingestImagem estática { "error": "Imagem estática detectada..." }401 /web/sessionsAPI Key inválida { "error": "API key inválida ou ausente" }403 /web/ingestClock drift > 600s { "error": "Relógio do dispositivo fora de sincronia..." }404 /web/sessions/:tokenSessão não encontrada { "error": "Sessão não encontrada" }409 /web/ingestHash duplicado (replay) { "error": "Imagem duplicada detectada na sessão" }410 /web/sessions/:tokenSessão expirada { "error": "Sessão expirada ou já utilizada" }502 /web/ingestErro na assinatura { "error": "Erro de assinatura: ..." }
Quando /validate retorna { "valid": false, "reason": "..." }:
Reason Descrição Ação recomendada INVALID_KEYChave não encontrada no banco Verificar chave no Admin Console REVOKEDLicença desativada pelo admin Contatar Provvi EXPIREDData de expiração do contrato ultrapassada Renovar contrato VOLUME_EXCEEDEDCapturas excederam o limite mensal Aguardar reset ou ampliar volume CLIENT_SUSPENDEDConta do cliente suspensa Contatar Provvi PACKAGE_NOT_ALLOWEDBundle/package não está na whitelist Registrar package no Admin Console