Autenticação Biométrica

Introdução

Este documento tem como objetivo apoiar o cliente a compreender a integração com o produto de Autenticação Biométrica. Nesse documento iremos explicar o Fluxo, a autenticação e os Endpoints da integração. Para utilização destes serviços é necessário realizar a contratação do produto.

Pré requisitos para implementação:

  • Possuir uma chave API da Celcoin, essa chave API é enviada após contratar o serviço conosco. link.

  • Ter familiaridade com APIs Rest usando o protocolo OAuth 2.0.

  • Ter o produto/solução contratada, caso queira usar a funcionalidade em ambiente produtivo, por favor entre em contato com a nossa equipe comercial através do e-mail [email protected]. Para dúvidas técnicas, basta entrar em contato com o suporte através do link.

  • Após finalizar a integração, realizar a homologação.

Importante

Sugestões de uso

Autenticação Transacional: Utilizar a solução em caso de tentativa de transação com valor diferente do costume ou valor maior que o habitual.
Autenticação de Acesso: Utilizar a solução para autenticar novo acesso dispositivo diferente.
• **Validação de Dispositivos:**Utilizar para validar novo dispositivo.
Alteração/Atualização de Dados: Utilizar em caso de alteração de dados da conta.
Contratação de Produto/Serviço: Utilizar no momento de contratar produto/serviço.

Sandbox

No ambiente de sandbox, possuímos o seguinte comportamento: (Em Desenvolvimento Mock)
Utilize o campo DocumentNumber
Final documento terminando em:
• Par - Aprovado.
• Ímpar - Reprovado.

Informações importantes para o processo em produção nasConsiderações finais

Fluxo de integração

Antes de iniciar a integração, defina em quais momentos do seu processo a autenticação biométrica será utilizada. Sempre que for necessário iniciar uma verificação biométrica, faça uma requisição ao nosso endpoint, informando os dados obrigatórios exigidos no payload.
No response da requisição, você receberá uma URL de Webview. Essa URL deve ser disponibilizada ao seu cliente final, que irá acessá-la para realizar a captura da selfie.
Após a captura e análise biométrica, enviaremos a resposta do processo (autenticação aprovada ou reprovada) através do Webhook previamente configurado.


Criar Link para Autenticação

A criação da autenticação deve ser realizada através do endpoints

Link para Autenticação Biométrica

URL Sandbox: https://sandbox.openfinance.celcoin.com.br/onboarding/v1/biometric-auth

Exemplo Request:

{
		"flow": "BIOMETRIC_LIVENESS", //Tipo de flow ("BIOMETRIC_LIVENESS" ou "BIOMETRIC_DOC_LIVENESS"
    "clientCode": "a7e9ea3f-69e4-4599-92b4-6cb8a79c3512", //código único cliente
    "fullName": "José da Silva", //Nome Completo do usuário que será autenticado
    "documentNumber": "37167700002", // CPF do usuário
    "metadata":  { //Campo aberto para envio de dados adicionais, como finalidade para realizar a autenticação.
    			"type": "TRANSACAO PIX",
   				 "paymentId": "71996290076"
  								}, 
    "expiresIn": "100000", //tempo de expiração do webview em segundos
		"notificationWebview": {
    	"phoneNumber": "11998729212", //Número de telefone para recebimento de webview
    	"notificationsChannel": [ //Canais para recebimento de webview (SMS e/ou WHATSAPP)
      "SMS"
    ]
  },
  "redirectUrlWebview": "https://www.google.com" // Url para redirecionamento
}

Exemplo Response Sucesso:

{
    "body": {
        "biometricAuthId": "786cc58b-aea1-4b24-a3e5-602a5a2ebf02",
        "clientCode": "6521e0ef-fbe8-41af-b400-92a7b4bc6795",
        "documentNumber": "06239629502",
        "urlWebview": "https://cadastro.uat.unico.app/process/1b03cdf4-aed0-422b-8c2c-07bd8f746db1?collect-shield=true&new-loader=off",
        "urlExpirationAt": "2026-04-07T18:20:10.963Z",
        "metadata": {
            "type": "TRANSACAO PIX",
            "paymentId": "71996290076"
        }
    },
    "version": "1.0.0",
    "status": "SUCCESS"
}

Exemplo Response Error:

{
    "error": {
        "errorCode": "OBE034",
        "message": "Formato do JSON esta fora do padrão. Verifique a documentação."
    },
    "version": "1.0.0",
    "status": "ERROR"
}

Consultar Autenticação

É possível consultar as autenticações criadas e seus status utilizando o seguinte endpoint

É possível utilizar os seguintes filtros:
• Data início e data fim (Obrigatório caso não inclua o nº da autenticação)
• Status da autenticação
• DocumentNumber
• ClientCode
• BiometricID

Também é possível consultar os status das Propostas no Painel do Cliente através da opção Consultar Autenticação Biométrica

URL Sandbox: https://sandbox.openfinance.celcoin.com.br/onboarding/v1/biometric-auth

Exemplo Request:

biometric-auth?biometricAuthId=f773bb7f-599b-450b-93d0-0665c6d70581&clientCode=f83f55e8-77fb-4e48-a312-22a6c0f9e89a&status=PENDING &documentNumber=37138444028&dateFrom=2025-07-10T06:30:00&dateTo=2025-07-16T06:30:00

Exemplo Response:

{
    "body": {
        "limit": 1,
        "currentPage": 1,
        "limitPerPage": 200,
        "totalPages": 1,
        "totalItems": 1,
        "biometricAuthentications": [
            {
                "biometricAuthId": "786cc58b-aea1-4b24-a3e5-602a5a2ebf02",
                "clientCode": "6521e0ef-fbe8-41af-b400-92a7b4bc6795",
                "documentNumber": "06239629502",
                "status": "REPROVED",
                "createdAt": "2026-04-07T17:20:11.068Z",
                "updatedAt": "2026-04-07T18:20:16.035Z",
                "metadata": {
                    "type": "TRANSACAO PIX",
                    "paymentId": "71996290076"
                },
                "urlWebview": "https://cadastro.uat.unico.app/process/1b03cdf4-aed0-422b-8c2c-07bd8f746db1?collect-shield=true&new-loader=off",
                "urlExpirationAt": "2026-04-07T15:20:10.963Z"
            }
        ]
    },
    "version": "1.0.0",
    "status": "SUCCESS"
}

Buscar documentos: é possível buscar os documentos associados a uma autenticação biométrica endpoint

É possível utilizar os seguintes filtros:
• ClientCode
• biometricAuthId

Também é possível utilizar ambos os filtros, porém caso um dos parâmetros estejam errados não irá retornar nada.

Observação: As URLs retornadas possuem duração de 15minutos, após a expiração é necessário realizar uma nova chamada.


URL Sandbox: https://sandbox.openfinance.celcoin.com.br/onboarding/v1/biometric-auth

Exemplo Request:

biometric-auth/files?biometricAuthId=38672b6a-2440-4f5f-b3ca-fe9bf8c50017

Exemplo Response:

{
    "body": {
        "files": [
            {
                "type": "CONJUNTO_PROBATORIO",
                "url": "https://onboardingexterno.blob.core.windows.net/onboarding/biometricAuth/SANDBOX/972/06239629502/eefb6983-4f22-4904-8b34-95ad5bb84907/06239629502_eefb6983-4f22-4904-8b34-95ad5bb84907_CONJUNTO_PROBATORIO.pdf?sv=2025-05-05&se=2026-04-08T19%3A31%3A18Z&sr=b&sp=r&sig=96w2k83FssYHYFdWL4itmXQmMN2ZKLlYp82E9novfh4%3D",
                "expirationTime": "2026-04-08T16:31:18Z"
            },
            {
                "type": "SELFIE",
                "url": "https://onboardingexterno.blob.core.windows.net/onboarding/biometricAuth/SANDBOX/972/06239629502/eefb6983-4f22-4904-8b34-95ad5bb84907/06239629502_eefb6983-4f22-4904-8b34-95ad5bb84907_SELFIE.jpeg?sv=2025-05-05&se=2026-04-08T19%3A31%3A18Z&sr=b&sp=r&sig=ZrXJjZc03Ks1JGsblKwLgN0mifDPtn35VhwoRc8Vtn4%3D",
                "expirationTime": "2026-04-08T16:31:18Z"
            }
        ],
        "clientCode": "5af402e5-38ce-46f6-bcfa-94411c5fe489",
        "documentNumber": "06239629502",
        "biometricAuthId": "eefb6983-4f22-4904-8b34-95ad5bb84907"
    },
    "version": "1.0.0",
    "status": "SUCCESS"
}


Cadastrar Webhook

Nesta chamada você realizará a definição das rotas que receberão as notificações relacionados aos fluxos.

Passos para integrar

Realizar autenticação na API - [API Reference]
Cadastrar Webhook - [API Reference]

Disponibilizamos duas opções de autenticação nas notificações, Basic Auth ou OAuth 2.0. A definição será feita através da requisição, conforme os exemplos abaixo:

Utilizando Basic Authentication:

Neste formato o basic auth definido será enviado nas notificações.

cURL da Chamada

curl --location --request POST 'https://sandbox.openfinance.celcoin.dev/common/v1/webhook/subscription' \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--header 'Authorization: Bearer {{access_token}}' \
--data '
{
  "entity": "onboarding-biometric-auth", //Incluir evento que deseja cadastrar webhook
  "context": "ONBOARDING",
  "webhookUrl": "string",
  "auth": {
    "login": "string",
    "pwd": "string",
    "type": "string",
    "urlAuth": "string",
    "requestType": "string",
    "responsePathToken": "string",
    "requestAuth": [
      {
        "key": "string",
        "value": "string",
        "type": "string"
      }
    ]
  }
}

Eventos

Evento: onboarding-biometric-auth

Evento que informa a resposta da autenticação biométrica realizada.

{
  "biometricAuthId": "609f429b-3112-4938-bc6e-72658c89a7b8", //ID único gerado pela Celcoin
  "clientCode": "7affe105-1186-4534-a42d-7bd136b1c32d", //Código único cliente
  "documentNumber": "02147645087", //CPF do usuário autenticado
  "status": "REPROVED", //status
  "metadata": { //Campo aberto para envio de dados adicionais, como finalidade para realizar a autenticação.
    "type": "TRANSACAO PIX",
    "paymentId": "71996290076"
  },
  "webhookId": "b95f1c05-198a-452d-a0cb-7be24ff1924c" //ID do webhook
}

Evento: onboarding-biometric-auth-file

Evento que informa os documentos gerados por aquela autenticação biométrica realizada.

{
  "biometricAuthId": "609f429b-3112-4938-bc6e-72658c89a7b8", //ID único gerado pela Celcoin
  "clientCode": "7affe105-1186-4534-a42d-7bd136b1c32d", //Código único cliente
  "documentNumber": "02147645087", //CPF do usuário autenticado
  "files": [ //documentos
    {
      "type": "CONJUNTO_PROBATORIO", //documento tipo conjunto probatório
      "url": "https://onboardingexterno.blob.core.windows.net/onboarding/02147645087_609f429b-3112-4938-bc6e-72658c89a7b8_CONJUNTO_PROBATORIO?sv=2025-05-05&se=2025-05-27T21%3A15%3A22Z&sr=b&sp=r&sig=dDj5%2BAuu0KD3T5h2%2BwFU0Dah%2B2tFKxRO%2BO7H%2Bn1LBV0%3D", //URL onde está disponível o documento.
      "expirationTime": "2025-05-27T18:15:22Z" //tempo de expiração
    },
    {
      "type": "SELFIE", //documento tipo selfie
      "url": "https://onboardingexterno.blob.core.windows.net/onboarding/02147645087_609f429b-3112-4938-bc6e-72658c89a7b8_SELFIE?sv=2025-05-05&se=2025-05-27T21%3A15%3A22Z&sr=b&sp=r&sig=qY8vzDInSTFPg8WyWRHRRv%2FJv88lLC3Yo8d6fcMJl8o%3D", //URL onde está disponível o documento.
      "expirationTime": "2025-05-27T18:15:22Z" //tempo de expiração
    }
  ],
  "webhookId": "5f851e6f-6ea0-401a-8c48-e9c730968332" //ID do Webhook
}

Integração com o Webview

Esta seção oferecerá suporte à integração do WebView, a jornada que o seu cliente envia os documentos.

Recomendamos a utilização do Webview nos seguintes navegadores: Google Chrome, Mozilla Firefox e Safari.

Android

Para que as integrações para Android funcionem corretamente, é necessário que setDomStorageEnabled esteja definido como true. Exemplo abaixo:

myWebView.getSettings().setDomStorageEnabled(true);

iOS

Para que as integrações para iOS funcionem corretamente, é necessário customizar a configuração para permitir a reprodução de mídia sem solicitação de ação do usuário e para reproduzir a mídia. Exemplo abaixo:

let webView: WKWebView

init() {
    let audioVisualMediaType: WKAudiovisualMediaTypes = []
    let configuration = WKWebViewConfiguration()
    configuration.mediaTypesRequiringUserActionForPlayback = audioVisualMediaType
    configuration.allowsInlineMediaPlayback = true

    webView = WKWebView(frame: .zero, configuration: configuration)
}

Outras plataformas

Em outras plataformas, por exemplo, Flutter e React Native, você deve procurar as configurações do WebView para permitir a reprodução de mídia sem exigir gestos do usuário e para reproduzir o vídeo da câmera inline, não no controlador nativo de tela cheia.

Tabelas para apoio

Regras Campos

CampoRegrasTamanho máximo
clientCode*Obrigatório
Valor único
fullName*Obrigatório
Regex = ("^([A-Za-zÀ-ÖØ-öø-ÿ' -]+)$"));
120 caracteres
documentNumber*Obrigatório
Valida se é um CPF Válido
11 caracteres
metadataOpcional
Campo aberto (objeto) para envio de dados adicionais, como ID interno, contexto, referência, etc.
N/A
expiresInOpcional
Tempo em segundos até a expiração do webview.
flow*Tipo de flow ("BIOMETRIC_LIVENESS"(validação em cima da selfie) ou "BIOMETRIC_DOC_LIVENESS"(validação em cima da selfie e documentos)
notificationWebviewOpcional
notificationWebview.phoneNumber (Número de telefone para recebimento do webview)
notificationWebview.notificationsChannel (Canais para recebimento do webview
"SMS" e/ou "WHATSAPP")Opcional
redirectUrlWebviewOpcional
Url de redirecionamento

Tabela de erros

CódigoMensagem
OBE001Token de autorização não enviado.
OBE002Token enviado está no formato incorreto.
OBE003Token inválido.
OBE004Token expirado.
OBE005Usuario não encontrado.
OBE006Cliente não possui produto Onboarding ativo.
OBE007O campo clientCode é obrigatório.
OBE008O campo documentNumber é obrigatório e deve ser um CPF válido.
OBE009O campo documentNumber é obrigatório e deve ser um CNPJ válido.
OBE010O campo phoneNumber ou contactNumber é obrigatório e deve ser um telefone válido.
OBE011O campo email é obrigatório e deve ser um email válido.
OBE012O campo motherName é obrigatório e deve ser completo.
OBE013O campo fullName é obrigatório e deve ser completo.
OBE014O campo fullName possui tamanho máximo de 120 caracteres.
OBE015socialName inválido.
OBE016O campo birthDate é obrigatório e deve ser no formato (DD-MM-YYYY).
OBE017O campo address é obrigatório.
OBE018O campo onboardingType é obrigatório e deve conter um tipo válido.
OBE019O campo postalCode é obrigatório e deve ser um CEP existente.
OBE020O campo street é obrigatório deve respeitar o limite de caracteres e conter um formato de texto válido.
OBE021Number inválido.
OBE022AddressComplement inválido.
OBE023O campo neighborhood é obrigatório e deve conter um formato de texto válido.
OBE024O campo city é obrigatório e deve conter um formato de texto válido.
OBE025O campo state é obrigatório e deve ser uma estado valido.
OBE026O campo businessEmail é obrigatório e deve ser um email válido.
OBE027O campo businessName é obrigatório e deve conter um formato de texto válido.
OBE028O campo tradingName é obrigatório deve respeitar o limite de caracteres e conter um formato de texto válido.
OBE029O campo owner.documentNumber é obrigatório e deve ser um CPF ou CNPJ válido.
OBE030O campo owner.name é obrigatório e deve ser completo.
OBE031O campo owner.email é obrigatório e deve ser um email válido.
OBE032O campo owner.address é obrigatório.
OBE033Cadastro não permitido para menores de idade.
OBE034Formato do JSON esta fora do padrão. Verifique a documentação.
OBE035Não foi possivel realizar essa operação. Tente novamente mais tarde.
OBE036CompanyType inválido.
OBE037O campo Owners deve conter um array de no mínimo 1 e máximo 10.
OBE038Owners não podem ser duplicados.
OBE039O campo businessAddress é obrigatório.
OBE040O campo ownerType é obrigatório e deve conter um valor válido.
OBE041BackgroundCheck não encontrado ou com status diferente de pendente.
OBE042Erro ao atualizar backgroundCheck.
OBE043Documentscopy não encontrado ou com status diferente de pendente.
OBE044Erro ao atualizar documentscopy.
OBE045Status da proposta inexistente verifique a documentação por favor.
OBE046Data inválida.
OBE047Limite inserido inválido. Os campos limit ou limitPerPage devem ter valores entre 1 e 200.
OBE048O campo documentNumber deve ser um CPF ou CNPJ válido.
OBE049Não foi encontrada nenhuma proposta referente aos dados informados.
OBE050A data inicial não pode ser maior que a data final.
OBE051Ao não enviar o proposalId os campos data inicial e a data final são obrigatórios.
OBE052O intervalo de dias entre a data inicial e a data final não deve ser maior que 0 dias.
OBE053O campo ownerType deve conter pelo menos um sócio ou representante
OBE054ProposalId e clientCode não enviados. Ao menos um desses parametros deve ser enviado.
OBE055Não foram encontrados arquivos para o proposalId ou clientCode informado(s).
OBE056Não foram encontradas documentoscopias referentes ao proposalId ou clientCode enviado.
OBE057Ocorreu um erro ao buscar documentos.
OBE058ClientType inválido.
OBE059SourceType inválido.
OBE060O campo clientId é obrigatório.
OBE061Source inválido.
OBE062ClientCode já vinculado a outra proposta, esse campo deve ser único por proposta.
OBE063Não foram encontrados registros para a sua requisição.
OBE064Já existe uma proposta em aberto para esse documentNumber.
OBE065O campo dateFrom é obrigatório.
OBE066O campo dateTo é obrigatório.
OBE067O campo partner.partnerName deve conter um valor válido.
OBE068O campo partner.parameter deve ser preenchido.
OBE069Ao enviar os campos partner.parameters, o campo partner.partnerName deve ser obrigatório.
OBE070Não foram encontrados dados, pois o usuário ainda não iniciou a jornada webview. Tente novamente mais tarde.
OBE071Ocorreu um erro ao consultar parceiro. Favor tentar novamente mais tarde.
OIE999Ocorreu um erro interno durante a chamada da api

Customização

📚

Customização

O webview é passível de customização, permitindo alterar a logotipo, cor e formato do botão.

• Envie o logotipo preferencialmente no formato de logo ícone, devido à sua melhor legibilidade em tamanhos reduzidos.

• Certifique-se de que o logotipo seja quadrado, respeite o grid proporcional e garanta que seja exportado com no mínimo 192x192 pixels.

• Formatos aceitos: SVG, PNG e JPEG.

Entre em contato com nosso time para solicitar alteração.

Considerações finais

🚧

Quantidade de autenticação por documentos.

Quantidade de autenticação por documentos
Temos uma validação onde é permitido criar 1 autenticação por documento a cada 1 minuto.
Logo não é possível criar várias autenticações para o mesmo documento no mesmo instante.

Não temos um limitante de aberturas de autenticação, apenas se atente todas as regras e orientações descritas nessa documentação.

❗️

Responsabilidade

A responsabilidade sobre a tomada de decisão com base na resposta da autenticação biométrica é exclusivamente sua. Nossa solução fornece a análise técnica, mas a decisão final sobre aceitar ou recusar determinada operação é de sua responsabilidade.

📘

Resultados

Em produção, o resultado das análises, podem levar até 1 minuto após a conclusão do envio da selfie.

❗️

Testes em produção

Evite realizar testes repetitivos em ambiente de produção. A simulação de cenários negativos, especialmente quando envolve a utilização de um documento vinculado a outra face. Tal ação pode acionar alertas automáticos de fraude e impactar a integridade do sistema.

Recomendamos que todos os testes deste tipo sejam conduzidos em ambientes de sandbox.

👍

Importante

Webhooks

Para cadastrar os webhooks basta acessar a seguinte documentação aqui

Em caso de não receber o webhook é possível realizar uma chamada para receber o reenvio, para mais informações acesse a documentação de reenvio clicando aqui.

ClientCode e Biometric

ClientCode é um identificador único por transação criado por você.
biometricAuthId é um identificador único que geramos após a criação da autenticação, esse identificador será utilizado para realizar consultas.Recomendamos você guardar esses campos.

Consultar Autenticação no Painel do Cliente

É possível consultar os status no Painel do Cliente através da opção Consultar Autenticação Biométrica

Boas Práticas

Evite a criação de "polling" com períodos curtos nos endpoints de consulta, o fluxo de onboarding é todo via webhook orientando sempre as alterações de status e em qual etapa do processo a proposta se encontra.

Não utilize emuladores para realizar a jornada do Webview, caso utilize será bloqueado