Skip to content

Smartflow

O Smartflow é o funnel de cadastro/KYC embutido do SDK Zarv. Sua configuração é imperativa: você chama Zarv('smartflow', config), que monta o funnel como um iframe na sua página.

🎮 Abrir o playground interativo → — teste tela única, prefill, identify, complete, tema e modal ao vivo, com a versão atual do SDK.

Configuração básica

html
<div id="zarv-smartflow"></div>
<script async src="https://js.zarv.com/sdk.js"></script>
<script>
  Zarv('smartflow', {
    publicKey: 'pk_XXXXXXXX',     // pk_<flowId>
    mount: '#zarv-smartflow',     // embed inline; ou mode: 'modal'
    onComplete: ({ leadId }) => console.log('finalizou', leadId),
  });
</script>

O campo publicKey é obrigatório: é a chave pública do flow, no formato pk_<flowId>, obtida no admin Zarv.

Opções de configuração

CampoTipoDescrição
publicKeystringObrigatório. Chave pública do flow (pk_<flowId>) do admin.
mountstringSeletor CSS do elemento onde o funnel é embutido inline.
mode'inline' | 'modal'Forma de exibição: embutido na página ou em modal centralizada.
heightnumberAltura, em px, do embed inline. Por padrão há auto-resize ao conteúdo.
modal{ width?, height?, margin? }Ajustes da modal. A modal é sempre centralizada; por padrão ajusta à altura do conteúdo (auto-resize). height fixa a altura.
screen'face' | 'cnh' | 'address' | 'email' | 'phone'Embute UMA tela isolada em vez do fluxo inteiro. Omita para o fluxo completo.
leadIdstringUsa um lead existente. Omita para iniciar uma auto-sessão (um lead é criado automaticamente).
prefill{ name?, nationalId?, birthDate? }Persiste dados de identidade no lead, preenchendo a próxima tela.
theme'light' | 'dark' | 'auto'Tema da interface.
closeOnCompletebooleanFecha a modal ao finalizar. Default: true em mode: 'modal', false inline.
onStepfunctionCallback onStep(step, { progress, leadId }) a cada passo.
onProgressfunctionCallback onProgress(progress) com o progresso do funnel.
onCompletefunctionCallback onComplete({ leadId }) ao concluir.
onClosefunctionCallback onClose() quando a modal é dispensada pelo usuário.

Posicionamento

Você pode embutir o funnel inline na página ou exibi-lo em uma modal.

Inline — informe mount com o seletor do elemento alvo (ou use mode: 'inline'). Por padrão o iframe faz auto-resize, acompanhando a altura do conteúdo; use height para fixar uma altura em px:

js
Zarv('smartflow', {
  publicKey: 'pk_XXXXXXXX',
  mount: '#zarv-smartflow',
  // height: 640, // opcional; sem isso, auto-resize ao conteúdo
});

Modal — use mode: 'modal'. A modal é sempre centralizada e, por padrão, ajusta à altura do conteúdo da tela (auto-resize). Use modal para ajustar largura, altura e margem:

js
Zarv('smartflow', {
  publicKey: 'pk_XXXXXXXX',
  mode: 'modal',
  modal: { width: 480, margin: 24 }, // height fixa a altura, se informado
  onClose: () => console.log('modal fechada'),
});

modalSteps — mesmo embutido inline, você pode promover telas específicas (ex.: liveness / captura de documento) para uma modal overlay, listando os nomes das etapas:

js
Zarv('smartflow', {
  publicKey: 'pk_XXXXXXXX',
  mount: '#zarv-smartflow',
  modalSteps: ['face', 'cnh'], // essas etapas abrem em modal; as demais ficam inline
});

Tela única (componentes isolados)

Use screen para embutir uma única tela em vez do fluxo inteiro:

js
Zarv('smartflow', {
  publicKey: 'pk_XXXXXXXX',
  mount: '#zarv-smartflow',
  screen: 'face',
  onComplete: ({ leadId }) => console.log('face concluída', leadId),
});

Valores possíveis: 'face', 'cnh', 'address', 'email', 'phone'. Omita screen para rodar o fluxo inteiro.

As telas são chamadas de forma independente — elas não seguem a ordem do fluxo. Ao concluir uma tela, o SDK dispara onComplete para que você trate o próximo passo do seu lado. A ordem do funnel é respeitada apenas pela versão hosted, não pelo SDK.

Contexto do lead

Para continuar um cadastro já iniciado, passe leadId com um lead existente. Se você omitir leadId, o SDK inicia uma auto-sessão e cria um lead automaticamente — o leadId resultante é entregue nos callbacks (por exemplo, em onComplete({ leadId })).

Prefill de identidade

Use prefill para persistir dados de identidade no lead, preenchendo a próxima tela:

js
Zarv('smartflow', {
  publicKey: 'pk_XXXXXXXX',
  mount: '#zarv-smartflow',
  prefill: { name: 'Ana', nationalId: '...', birthDate: '1990-01-02' },
});

Identify em runtime

Depois de iniciar uma sessão (mesmo sem leadId), você pode identificar o usuário e anexar o seu próprio externalId:

js
Zarv('smartflow', {
  action: 'identify',
  externalId: 'id-do-parceiro-123',
  name: 'Ana', nationalId: '...', birthDate: '1990-01-02',
});

Essa chamada atualiza o lead da sessão ativa: ela preenche apenas os campos que ainda estão vazios, enquanto o externalId é sempre setado. Assim, a próxima tela já vem preenchida com os dados informados.

Complete em runtime

Quando o seu fluxo termina, chame complete para finalizar o cadastro: ele anexa metadados que você coletou no seu lado e dispara a verificação do usuário na sessão ativa.

js
Zarv('smartflow', {
  action: 'complete',
  metadata: { pedido: 'ABC-123', plano: 'pro' },   // anexado em metadata.custom no lead
  onComplete: ({ leadId, status }) => {
    // verificação disparada (a decisão chega depois via webhook da campanha)
  },
  onError: (err) => {
    if (err.error === 'basic_data_incomplete') {
      // o usuário ainda não informou os dados básicos (nome / CPF / nascimento)
    }
  },
});
CampoTipoDescrição
action'complete'Obrigatório.
metadataobjectMetadados adicionais do seu fluxo; persistidos sob metadata.custom no lead (vão também no webhook).
onComplete({ leadId, status }) => voidDisparado quando a verificação é acionada com sucesso.
onError({ error, status }) => voidDisparado em erro.

Comportamento:

  • Se o usuário não finalizou os dados básicos (IsBasicDataCompleted é falso), o complete retorna erro basic_data_incomplete (HTTP 422) no onError — nada é publicado.
  • A verificação é disparada conforme o estado do lead (ex.: após o face capture, a re-validação de liveness/face no ZarvID). É idempotente: um lead que já está em verificação/decidido não é re-enfileirado.
  • A decisão final (aprovado / em revisão / reprovado) não volta pelo onComplete — ela chega de forma assíncrona pelo webhook da campanha.

Origens de embed (frame-ancestors)

Por padrão, o funnel permite ser embutido em js.zarv.com e js.zarv.dev (as origens oficiais do SDK) e nos domínios ativos do próprio flow.

Se um parceiro embutir o funnel em um host diferente do domínio do flow, é preciso adicionar essa origem em "AllowedEmbedOrigins" do flow (no admin). Sem isso, o navegador bloqueia o iframe via frame-ancestors.