NoviuzNoviuz Docs
SDKs e integrações

Quickstart do SDK de KYC Hospedado

Implemente a verificação de identidade em 5 minutos com os pacotes oficiais @noviuz/kyc-server e @noviuz/kyc-js.

Este guia ensina a integrar a verificação de identidade (KYC) em 5 minutos utilizando os pacotes oficiais mantidos pela Noviuz: @noviuz/kyc-server no backend e @noviuz/kyc-js no navegador.

Procurando a API pública da Conta Nexiuz? Para integrar cobranças PIX, extratos, contas e saques via API REST direta com assinatura HMAC, consulte o Quickstart da API Nexiuz. A API Nexiuz não requer SDK proprietário.


Como funciona a arquitetura

A verificação ocorre na superfície hospedada e segura da Noviuz, garantindo conformidade com a LGPD e isolando dados biométricos e documentais:

Seu Backend                  Navegador do Cliente                Noviuz KYC
    │                                  │                              │
    │ 1. mintSession(customerType)     │                              │
    ├──────────────────────────────────┼─────────────────────────────►│
    │    recebe sessionId              │                              │
    │◄─────────────────────────────────┼──────────────────────────────┤
    │                                  │                              │
    │ 2. envia sessionId               │                              │
    ├─────────────────────────────────►│                              │
    │                                  │ 3. NoviuzKyc.open(sessionId) │
    │                                  ├─────────────────────────────►│
    │                                  │    coleta identidade/selfie  │
    │                                  │    notifica onSuccess / UI   │
    │                                  │◄─────────────────────────────┤
    │ 4. getResult(sessionId)          │                              │
    ├──────────────────────────────────┼─────────────────────────────►│
    │    retorna status oficial + euid │                              │
    │◄─────────────────────────────────┼──────────────────────────────┤

1. Instale os pacotes oficiais do SDK

Instale cada pacote estritamente no ambiente onde ele deve ser executado:

# No seu serviço de backend (Node.js / Edge)
npm install @noviuz/kyc-server

# Na sua aplicação frontend (React, Next.js, Vue, Vite, etc.)
npm install @noviuz/kyc-js

Atenção: @noviuz/kyc-server utiliza a credencial confidencial e nunca deve ser importado em código que roda no navegador ou empacotado no bundle client-side.

2. Crie a sessão no servidor (Backend)

No seu backend confidencial, inicialize o cliente de sessão com sua chave secreta Bearer provisionada pela Noviuz (NOVIUZ_KYC_SECRET_KEY) e gere uma sessão vinculada à tentativa do seu usuário:

import { createSessionClient } from '@noviuz/kyc-server/bearer';

const kyc = createSessionClient({
  baseUrl: process.env.NOVIUZ_KYC_API_BASE ?? 'https://api.noviuz.com',
  secretKey: process.env.NOVIUZ_KYC_SECRET_KEY!,
});

/**
 * Endpoint do seu backend autenticado chamado pelo seu frontend.
 */
export async function handleStartVerification(userId: string, attemptId: string) {
  // Idempotência estável: repetir com o mesmo ID retorna a mesma sessão
  const idempotencyKey = `kyc:${userId}:${attemptId}`;

  const session = await kyc.mintSession(
    {
      customerType: 'individual', // 'individual' (PF) ou 'business' (PJ)
    },
    {
      idempotencyKey,
    }
  );

  // Retorne apenas o sessionId para o frontend
  return { sessionId: session.sessionId };
}
  • idempotencyKey: Chave de 16 a 255 caracteres ASCII. Garante que retries da mesma tentativa não gerem sessões duplicadas ou cobranças redundantes.
  • customerType: Define a esteira de verificação (individual para pessoa física; business para pessoa jurídica).

3. Abra o fluxo no navegador (Frontend)

Na sua aplicação web, chame NoviuzKyc.open após o usuário acionar a verificação (ex: clique de botão). Nunca invoque durante Server-Side Rendering (SSR).

import React, { useState } from 'react';
import { NoviuzKyc } from '@noviuz/kyc-js';

export function VerificationButton({ userId }: { userId: string }) {
  const [loading, setLoading] = useState(false);

  const startKyc = async () => {
    setLoading(true);
    try {
      // 1. Solicita a sessão à rota autenticada do SEU backend
      const res = await fetch('/api/kyc/start-session', { method: 'POST' });
      const { sessionId } = await res.json();

      // 2. Abre a modal hospedada oficial da Noviuz
      NoviuzKyc.open({
        sessionId,
        onSuccess: ({ sessionId }) => {
          // Notificação visual de conclusão pelo usuário
          console.log('Fluxo visual concluído pelo cliente:', sessionId);
          notifyBackendToReconcile(sessionId);
        },
        onReview: ({ sessionId }) => {
          console.log('Submetido para análise manual:', sessionId);
          notifyBackendToReconcile(sessionId);
        },
        onError: (error) => {
          console.error('Erro na experiência de verificação:', error.code, error.message);
        },
      });
    } finally {
      setLoading(false);
    }
  };

  return (
    <button onClick={startKyc} disabled={loading}>
      {loading ? 'Iniciando...' : 'Verificar Identidade'}
    </button>
  );
}

Callbacks de UI ≠ Autorização: Os eventos onSuccess e onReview do navegador são eventos de interface para atualizar o estado visual da tela. A decisão final de liberar recursos deve ser tomada exclusivamente após a consulta do resultado autoritativo pelo seu servidor.

4. Consulte o resultado oficial no servidor (Reconciliação)

Após a conclusão informada pelo cliente (ou via webhook/polling), seu backend deve consultar o endpoint de resultado e tomar as decisões de produto:

import { createSessionClient } from '@noviuz/kyc-server/bearer';

const kyc = createSessionClient({
  baseUrl: process.env.NOVIUZ_KYC_API_BASE ?? 'https://api.noviuz.com',
  secretKey: process.env.NOVIUZ_KYC_SECRET_KEY!,
});

export async function reconcileVerification(sessionId: string) {
  try {
    const result = await kyc.getResult(sessionId);

    switch (result.status) {
      case 'approved':
        // Verificação aprovada com sucesso!
        // result.euid contém o identificador patrimonial único gerado
        console.log(`✅ Usuário aprovado com EUID: ${result.euid}`);
        await activateUserAccount({ sessionId, euid: result.euid });
        return { status: 'approved', euid: result.euid };

      case 'under_review':
        // Encaminhado para a mesa de compliance (análise humana)
        console.log(`⏳ Em análise manual: ${sessionId}`);
        await markUserUnderReview({ sessionId });
        return { status: 'under_review' };

      case 'rejected':
      case 'cancelled':
      case 'expired':
        // Reprovado, cancelado pelo usuário ou sessão expirada (410)
        console.log(`❌ Verificação não concluída: ${result.status}`);
        await markUserFailed({ sessionId, status: result.status });
        return { status: result.status };
    }
  } catch (error: any) {
    if (error.status === 409) {
      // 409 NOT_TERMINAL: O usuário ainda está completando etapas
      console.log('Sessão ainda em andamento. Aguarde antes de reconsultar.');
      return { status: 'in_progress' };
    }
    throw error;
  }
}
  • 409 NOT_TERMINAL: Indica que a sessão ainda não atingiu um estado final. Aguarde alguns segundos com recuo exponencial antes de tentar novamente.
  • result.euid: O Entity Unique Identifier emitido pela Noviuz após corroborar a identidade cadastral e biométrica da Entidade.

Boas práticas essenciais

  • Segredos protegidos: A variável NOVIUZ_KYC_SECRET_KEY tem permissão de emissão e auditoria. Mantenha-a exclusivamente em variáveis de ambiente confidenciais do servidor.
  • Fail-closed em compliance: O estado under_review nunca deve conceder permissões automáticas de usuário aprovado. Trate-o de forma segregada até o fechamento da análise.
  • Ambiente de Testes (Sandbox): No ambiente de homologação/sandbox, as esteiras de teste respondem diretamente para permitir testes ponta a ponta sem a necessidade de documentos ou biometria de pessoas reais. Em produção, a verificação viva é obrigatória e rigorosa.

Próximos passos

On this page