Pular para o conteúdo principal

Gerenciando resultados

Apos uma verificacao rodar, voce tem tres formas de receber o veredicto. Cada uma se encaixa numa arquitetura diferente.

Comparacao rapida

MetodoQuando usarLatenciaConfiabilidade
Eventos do widgetSPAs, feedback UX imediato<100msBoa
PollingFluxos server-side, sem URL publica de webhook2-5s tipicoBoa
WebhooksB2B em producao, processamento async1-3s tipicoMelhor

Para a maioria dos sistemas em producao, webhooks sao a opcao recomendada. Polling esta bom para prototipos.

Metodo 1 — Eventos do widget

O widget emite um evento veridia:complete no browser assim que a API aceita a verificacao. Caminho mais simples para SPAs.

O que voce recebe

{
"verificationId": "vf_AG07CDWRRFQV4T05ZXG2",
"userRef": "customer-12345",
"status": "queued" // ou "processing" ou "completed"
}

O status e o estado inicial. O veredicto ainda nao esta aqui — voce precisa fazer fetch.

Padrao

<veridia-widget id="kyc" publishable-key="qv_pub_..."></veridia-widget>

<script>
document.getElementById('kyc').addEventListener('veridia:complete', async (e) => {
const { verificationId } = e.detail;

// Enviar ao seu proprio backend, que chama GET /v1/verify/:id com a SECRET key
const response = await fetch('/api/kyc-completed', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ verificationId }),
});

const result = await response.json();
console.log('Veredicto:', result.verdict); // approved / review / rejected
});
</script>

:::warning Nunca chame /v1/verify/:id do browser A publishable key do browser (qv_pub_*) e intencionalmente limitada. Para obter veredictos, use uma request server-side com sua secret key (qv_sec_*). Caso contrario, qualquer um poderia consultar qualquer verificacao. :::

Metodo 2 — Polling GET /v1/verify/:id

Se seu backend recebeu o verificationId (do evento ou via form submission), faca polling no endpoint de status ate que seja completed.

curl

curl -X GET https://api.xxuxe.online/v1/verify/vf_AG07CDWRRFQV4T05ZXG2 \
-H "Authorization: Bearer qv_sec_SUA_SECRET_KEY"

Resposta quando pronto:

{
"verificationId": "vf_AG07CDWRRFQV4T05ZXG2",
"status": "completed",
"verdict": "approved",
"confidence": 87.4,
"scores": {
"ocrConfidence": 78.0,
"faceMatch": 96.2,
"liveness": 91.5,
"docQuality": 85.0
},
"flags": [],
"submittedAt": "2026-05-01T18:39:05Z",
"completedAt": "2026-05-01T18:39:08Z"
}

JavaScript / Node.js

async function pollVerification(verificationId, maxAttempts = 30) {
for (let i = 0; i < maxAttempts; i++) {
const response = await fetch(
`https://api.xxuxe.online/v1/verify/${verificationId}`,
{
headers: {
'Authorization': `Bearer ${process.env.VERIDIA_SECRET_KEY}`,
},
}
);

const data = await response.json();

if (data.status === 'completed' || data.status === 'failed') {
return data;
}

await new Promise(r => setTimeout(r, 1000)); // espera 1s
}
throw new Error('A verificacao nao completou a tempo');
}

const result = await pollVerification('vf_AG07CDWRRFQV4T05ZXG2');
console.log('Veredicto:', result.verdict);

Python

import os
import time
import requests

def poll_verification(verification_id, max_attempts=30):
headers = {"Authorization": f"Bearer {os.environ['VERIDIA_SECRET_KEY']}"}

for _ in range(max_attempts):
r = requests.get(
f"https://api.xxuxe.online/v1/verify/{verification_id}",
headers=headers,
timeout=10,
)
r.raise_for_status()
data = r.json()

if data["status"] in ("completed", "failed"):
return data

time.sleep(1)

raise TimeoutError("A verificacao nao completou a tempo")

result = poll_verification("vf_AG07CDWRRFQV4T05ZXG2")
print("Veredicto:", result["verdict"])

PHP

<?php
function pollVerification(string $verificationId, int $maxAttempts = 30): array {
$secretKey = $_ENV['VERIDIA_SECRET_KEY'];

for ($i = 0; $i < $maxAttempts; $i++) {
$ch = curl_init("https://api.xxuxe.online/v1/verify/$verificationId");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer $secretKey",
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);

if (in_array($data['status'], ['completed', 'failed'], true)) {
return $data;
}

sleep(1);
}

throw new RuntimeException("A verificacao nao completou a tempo");
}

$result = pollVerification("vf_AG07CDWRRFQV4T05ZXG2");
echo "Veredicto: " . $result['verdict'] . "\n";

Metodo 3 — Webhooks (recomendado para producao)

Webhooks sao push: quando uma verificacao completa, Veridia envia um POST HTTP assinado ao seu endpoint. Sem polling, sem eventos perdidos, audit trail completo.

Setup

  1. No seu dashboard, va a Webhooks
  2. Configure a webhook URL ao seu endpoint (ex: https://seuapp.com/webhooks/veridia)
  3. Copie o webhook secret — voce vai precisar para verificar assinaturas
  4. Pronto. Cada verificacao completa dispara um POST.

O que voce recebe

{
"event": "verification.review_required",
"verificationId": "vf_AG07CDWRRFQV4T05ZXG2",
"tenantId": "tn_default_demo",
"userRef": "customer-12345",
"verdict": "review",
"confidence": 77.85,
"scores": {
"faceMatch": 99.5,
"liveness": 88.0,
"ocrConfidence": 20.0,
"docQuality": 75.7
},
"flags": [
{ "level": "warn", "text": "heavy_glare" }
],
"completedAt": "2026-05-01T18:39:08Z"
}

O campo event vai ser um de:

  • verification.approved
  • verification.rejected
  • verification.review_required

A request HTTP inclui um header de assinatura que voce deve verificar (veja verificacao de assinatura para o algoritmo exato).

Por que preferir webhooks

AspectoPollingWebhooks
LatenciaPolling 1s = 1s delay medio<100ms apos completion
API callsMuitasSo a entrega
ConfiabilidadeSeu codigo precisa rodarVeridia tenta 5 vezes com backoff exponencial
Audit trailNenhumLog completo de delivery no dashboard
Cold startsAcorda serverless em cada pollDispara uma vez

Agindo sobre o veredicto

Qualquer que seja o metodo que voce use, a acao e a mesma:

function onVerdict(result) {
switch (result.verdict) {
case 'approved':
// Marcar usuario como KYC, habilitar acesso completo
enableUserAccount(result.userRef);
break;

case 'review':
// Enviar para fila de revisao manual, pausar acoes sensiveis
queueForReview(result.verificationId, result.flags);
break;

case 'rejected':
// Bloquear, pedir ao usuario que tente de novo ou contate suporte
blockUserKyc(result.userRef, result.flags);
break;

default:
// Nunca deveria acontecer, logar
console.error('Veredicto desconhecido:', result.verdict);
}
}

Proximos passos

Quickstart completo. A partir daqui, dependendo do que voce esta construindo:

Precisa de ajuda? Contatar suporte.