> For the complete documentation index, see [llms.txt](https://docs.caf.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.caf.io/caf-sdk/caf-sdk-pt-br/web-javascript/getting-started/face-liveness-and-face-authenticator.md).

# Face Liveness e Face Authenticator

Permite a integração de verificação facial em aplicativos, proporcionando uma experiência de autenticação de usuários segura e fluida.

## Vivacidade facial e autenticador facial

O CafFaceLiveness Web SDK oferece detecção de vivacidade facial com suporte a vários provedores, cada um com recursos e capacidades diferentes. O SDK direciona automaticamente para o provedor apropriado com base na configuração do seu token móvel.

### Provedores suportados

| Provedor    | Descrição                                            |
| ----------- | ---------------------------------------------------- |
| **Caf**     | Validação de vivacidade 2D usando as soluções da Caf |
| **FaceTec** | Tecnologia de detecção de vivacidade 2D da FaceTec   |
| **iProov**  | Detecção de vivacidade com as tecnologias GPA e LA   |
| **Payface** | Tecnologia de verificação facial da Payface          |

### Início rápido

#### 1. Instalação

Inclua o script do SDK no seu arquivo HTML:

```html
<script src="https://repo.combateafraude.com/javascript/release/caf-face-liveness/0.18.0/caf-face-liveness_0.18.0.umd.js"></script>
```

Ou inclua-o via JavaScript:

```javascript
const sdkScript = document.createElement("script");
sdkScript.src =
  "https://repo.combateafraude.com/javascript/release/caf-face-liveness/0.18.0/caf-face-liveness_0.18.0.umd.js";
document.body.appendChild(sdkScript);
```

{% hint style="info" %}
Você também pode baixar o arquivo do SDK a partir da [CDN da Caf](https://repo.combateafraude.com/javascript/release/caf-face-liveness/0.18.0/caf-face-liveness_0.18.0.umd.js) e então incluí-lo diretamente no seu projeto. Isso é útil se você preferir hospedar o arquivo do SDK ou se quiser evitar carregá-lo de uma CDN.
{% endhint %}

#### 2. Uso básico

```javascript
const CafFaceLivenessSdk = window["CafFaceLiveness"];

// Inicialize o SDK
await CafFaceLivenessSdk.init("your-sdk-token", "user-person-id", {
  htmlContainerId: "your-container-id",
});

// Execute a detecção de vivacidade facial
try {
  const result = await CafFaceLivenessSdk.run();
  console.log("Resultado da vivacidade:", result);
} catch (error) {
  console.error("Falha na vivacidade:", error);
} finally {
  // Faça a limpeza ao finalizar com sucesso ou em caso de erro
  CafFaceLivenessSdk.dispose();
}
```

#### Exemplo completo

Aqui está um exemplo HTML pronto para uso:

```html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Exemplo CafFaceLiveness</title>
  </head>
  <body>
    <h1>Exemplo do SDK CafFaceLiveness</h1>

    <div id="status"></div>

    <div>
      <button id="initBtn">Inicializar SDK</button>
      <button id="runBtn" disabled>Executar</button>
      <button id="disposeBtn" disabled>Descartar SDK</button>
    </div>

    <div id="your-container-id"></div>

    <script>
      // Elementos da interface
      const statusDiv = document.getElementById("status");
      const initBtn = document.getElementById("initBtn");
      const runBtn = document.getElementById("runBtn");
      const disposeBtn = document.getElementById("disposeBtn");

      function setStatus(message) {
        statusDiv.textContent = message;
      }

      function updateButtons(init = false, run = false, dispose = false) {
        initBtn.disabled = !init;
        runBtn.disabled = !run;
        disposeBtn.disabled = !dispose;
      }

      // Estado inicial dos botões
      updateButtons(false, false, false);

      // Instalação do SDK
      let CafFaceLivenessSdk;
      const loadSdkScript = async (src) => {
        return new Promise((resolve, reject) => {
          const existingScript = document.querySelector(`script[src="${src}"]`);
          if (existingScript) {
            resolve();
            return;
          }

          const script = document.createElement("script");
          script.src = src;
          script.async = true;
          script.onload = resolve;
          script.onerror = () =>
            reject(new Error(`Falha ao carregar o script: ${src}`));
          document.body.appendChild(script);
        });
      };
      loadSdkScript(
        "https://repo.combateafraude.com/javascript/release/caf-face-liveness/0.18.0/caf-face-liveness_0.18.0.umd.js"
      )
        .then(() => {
          CafFaceLivenessSdk = window["CafFaceLiveness"];
          setStatus("O SDK foi carregado e está pronto para ser inicializado");
          updateButtons(true, false, false); // Ativar botão de inicialização
        })
        .catch((error) => {
          console.error("Erro ao carregar o script do SDK CafFaceLiveness:", error);
          setStatus(`Erro ao carregar o SDK: ${error.message}`);
        });

      // Inicialize o SDK
      initBtn.addEventListener("click", async () => {
        try {
          setStatus("Inicializando o SDK...");
          updateButtons(false, false, false);

          await CafFaceLivenessSdk.init(
            "your-sdk-token-here", // Substitua pelo seu token real do SDK
            "user-person-id-here", // Substitua pelo ID da pessoa que você quer usar
            {
              htmlContainerId: "your-container-id", // Substitua pelo ID do seu contêiner HTML
              performFaceAuthentication: false, // Defina como true se quiser realizar autenticação facial junto com a detecção de vivacidade
            },
            {
              loader: {
                enabled: true,
                color: "#5FC213",
              },
              startButton: {
                label: "Iniciar escaneamento facial",
                backgroundColor: "#154EF7",
                color: "#ffffff",
              },
            }
          );

          setStatus("SDK inicializado com sucesso!");
          updateButtons(false, true, true);
        } catch (error) {
          setStatus(`Falha na inicialização: ${error.message}`);
          updateButtons(true, false, false);
          console.error("Erro de inicialização:", error);
        }
      });

      // Execute a detecção de vivacidade
      runBtn.addEventListener("click", async () => {
        try {
          setStatus("Executando a detecção de vivacidade...");
          updateButtons(false, false, false);

          const result = await CafFaceLivenessSdk.run();

          setStatus("Detecção de vivacidade concluída com sucesso!");
          updateButtons(false, false, true);

          console.log("Resultado da vivacidade:", result);
        } catch (error) {
          setStatus(`Falha na detecção de vivacidade: ${error.message}`);
          console.error("Erro de vivacidade:", error);

          CafFaceLivenessSdk.dispose(); // Descarte o SDK em caso de erro

          updateButtons(true, false, false);
        }
      });

      // Descarte o SDK
      disposeBtn.addEventListener("click", () => {
        try {
          CafFaceLivenessSdk.dispose();
          setStatus("SDK descartado com sucesso");
          updateButtons(true, false, false);
        } catch (error) {
          setStatus(`Falha ao descartar: ${error.message}`);
          console.error("Erro ao descartar:", error);
        }
      });
    </script>
  </body>
</html>
```

### Referência do SDK

#### Inicialização

```typescript
async init(sdkToken: string, personId: string, config?: object, customization?: object): Promise<void>
```

Inicializa o SDK com a configuração fornecida.

| Parâmetro de inicialização | Tipo   | Obrigatório ou opcional | Descrição                                                                                                                                                      |
| -------------------------- | ------ | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `sdkToken`                 | string | **Obrigatório**         | Token do SDK para autenticação                                                                                                                                 |
| `personId`                 | string | Obrigatório             | Identificador único do usuário                                                                                                                                 |
| `config`                   | object | Opcional                | <p>Opções de configuração do SDK.</p><p>Consulte a <a href="#configuration-options">Opções de configuração</a> seção para mais detalhes.</p>                   |
| `customization`            | object | Opcional                | <p>Opções de personalização de aparência e texto.</p><p>Consulte a <a href="#customization-options">Opções de personalização</a> seção para mais detalhes.</p> |

**Opções de configuração**

| Parâmetro de configuração   | Tipo    | Obrigatório ou opcional | Descrição                                                                                                                                                                                                                                                                                                                 | Suporte a provedores |
| --------------------------- | ------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
| `htmlContainerId`           | string  | Obrigatório (iProov)    | ID do contêiner HTML para a interface do SDK. Obrigatório apenas quando o provedor selecionado for **iProov**.                                                                                                                                                                                                            | iProov               |
| `enableDebugMode`           | boolean | Opcional                | Ativar modo de depuração para desenvolvimento                                                                                                                                                                                                                                                                             | Todos os provedores  |
| `performFaceAuthentication` | boolean | Opcional                | <p>Se deve realizar autenticação facial junto com a detecção de vivacidade</p><p>Ativar a autenticação facial requer um rosto previamente cadastrado para o <code>personId</code>. Consulte a <a href="#face-authentication">Autenticação facial</a> seção para mais detalhes.</p>                                        | Todos os provedores  |
| `idioma`                    | string  | Opcional                | Idioma da interface. Valores suportados: "en\_US", "es\_MX", "pt\_BR"                                                                                                                                                                                                                                                     | Todos os provedores  |
| `disableAnalytics`          | boolean | Opcional                | Desativar o rastreamento de análises                                                                                                                                                                                                                                                                                      | Todos os provedores  |
| `cameraPreviewFilter`       | string  | Opcional                | <p>Filtro para a pré-visualização da câmera. Valores suportados: "shaded", "classic", "vibrant", "clear", "blur"</p><p>Ao usar o filtro de câmera "clear" com GPA ativado, o SDK não poderá ser executado e lançará um erro. Se o GPA estiver ativado, certifique-se de usar uma opção diferente de filtro de câmera.</p> | iProov               |
| `reverseProxy`              | object  | Opcional                | <p>Configuração de proxy reverso.</p><p>Consulte a <a href="#reverse-proxy-configuration">Configuração de proxy reverso</a> seção para mais detalhes.</p>                                                                                                                                                                 | iProov               |

**Opções de personalização**

| Parâmetro de personalização     | Tipo    | Descrição                                                                                                                     | Suporte a provedores |
| ------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------- | -------------------- |
| `appearance.captureButtonIcon`  | string  | URL do ícone do botão de captura                                                                                              | Caf, FaceTec         |
| `appearance.captureIconSize`    | string  | Tamanho do ícone do botão de captura                                                                                          | Caf, FaceTec         |
| `appearance.captureButtonColor` | string  | Cor do botão de captura                                                                                                       | Caf, FaceTec         |
| `appearance.fontFamily`         | string  | Família de fontes da interface                                                                                                | Caf, FaceTec         |
| `loader.enabled`                | boolean | Mostre uma sobreposição de carregamento (apenas o spinner) enquanto a interface de captura do iProov carrega. Padrão: `false` | iProov               |
| `loader.color`                  | string  | Cor do spinner. Se omitido, recorre a `startButton.backgroundColor`, depois `#666666`.                                        | iProov               |
| `startButton.label`             | string  | Texto do botão Iniciar                                                                                                        | iProov               |
| `startButton.color`             | string  | Cor do texto do botão Iniciar                                                                                                 | iProov               |
| `startButton.backgroundColor`   | string  | Cor de fundo do botão Iniciar                                                                                                 | iProov               |
| `startButton.borderRadius`      | string  | Raio da borda do botão Iniciar                                                                                                | iProov               |
| `startButton.border`            | string  | Estilo da borda do botão Iniciar                                                                                              | iProov               |
| `startButton.padding`           | string  | Preenchimento do botão Iniciar                                                                                                | iProov               |
| `startButton.margin`            | string  | Margem do botão Iniciar                                                                                                       | iProov               |
| `messages.title`                | string  | Texto do título da interface                                                                                                  | Caf, FaceTec         |
| `messages.loading`              | string  | Mensagem de carregamento durante a captura                                                                                    | Caf, FaceTec         |
| `messages.errors.captureFailed` | string  | Mensagem de erro quando a captura falha                                                                                       | Caf, FaceTec         |

**Tratamento de erros de inicialização**

{% hint style="warning" %}
**Importante**: A partir da versão 0.13.0, o tratamento de erros do SDK mudou. Revise e atualize sua integração para se alinhar aos novos nomes e comportamento dos erros.
{% endhint %}

Erros que podem ocorrer durante o `init()` método:

| Nome do erro         | Descrição                                                                                                                          |
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `CafSdkInitError`    | Ocorreu um erro durante a inicialização do SDK (por exemplo, parâmetros obrigatórios ausentes).                                    |
| `CafSdkSessionError` | Erro ao criar a sessão para realizar a vivacidade ou a autenticação facial. Verifique se o token fornecido é válido e não expirou. |
| `CafUnknownError`    | Ocorreu um erro interno desconhecido                                                                                               |

{% hint style="info" %}
Quaisquer outros erros inesperados serão lançados como o padrão do JavaScript `Erro` classe.
{% endhint %}

**Exemplo:**

```javascript
try {
  await CafFaceLivenessSdk.init("your-sdk-token", "user-person-id", {
    htmlContainerId: "your-container-id",
  });
  console.log("SDK inicializado com sucesso!");
} catch (error) {
  switch (error.name) {
    case "CafSdkInitError":
      console.error("Erro de inicialização do SDK:", error.message);
      break;
    case "CafSdkSessionError":
      console.error("Erro de sessão:", error.message);
      break;
    case "CafUnknownError":
      console.error("Erro interno:", error.message);
      break;
    default:
      console.error("Erro de inicialização inesperado:", error.name, error.message);
  }
}
```

#### Execução

```typescript
async run(options?: object): Promise<string>
```

Executa o processo de detecção de vivacidade facial.

| Parâmetro de execução | Tipo   | Obrigatório ou opcional | Descrição                                                                                                                 |
| --------------------- | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| `options`             | object | Opcional                | <p>Opções para o método run.</p><p>Consulte a <a href="#run-options">Opções de execução</a> seção para mais detalhes.</p> |

**Opções de execução**

| Opção de execução          | Tipo            | Descrição                                                     |
| -------------------------- | --------------- | ------------------------------------------------------------- |
| `cancelPromise`            | `Promise<void>` | Promise que é resolvida quando a operação deve ser cancelada. |
| `onCaptureProcessingStart` | function        | Callback chamado quando o processamento da captura começa.    |
| `onCaptureProcessingEnd`   | function        | Callback chamado quando o processamento da captura termina.   |

**Retorno**

O método retorna um `Promise<string>` que é resolvido com um **string de token JWT** contendo o resultado da execução.

**Importante**: Os campos descritos abaixo estão contidos no **payload decodificado** deste token JWT. Você deve decodificar e verificar o token JWT para acessar esses campos.

**Estrutura do payload JWT**

Após decodificar o JWT, o payload contém um objeto com as seguintes propriedades:

* `imageUrl` (string): URL temporária da imagem capturada
* `isAlive` (boolean): Indica se a verificação de vivacidade foi bem-sucedida
* `isMatch` (boolean): Indica se a autenticação facial foi bem-sucedida (se ativada)
* `sessionId` (string): Identificador único da sessão para a execução
* `personId` (string): O ID da pessoa usado para a execução

**Tratamento de erros na execução**

{% hint style="warning" %}
**Importante**: A partir da versão 0.13.0, o tratamento de erros do SDK mudou. Revise e atualize sua integração para se alinhar aos novos nomes e comportamento dos erros.
{% endhint %}

Erros que podem ocorrer durante o `run()` método:

| Nome do erro                           | Descrição                                                                  |
| -------------------------------------- | -------------------------------------------------------------------------- |
| `CafCameraPermissionError`             | Erro ao obter permissão da câmera                                          |
| `CafCameraPermissionDeniedError`       | Permissão da câmera negada pelo usuário                                    |
| `CafCameraUnsupportedError`            | A câmera não é suportada pelo navegador/dispositivo                        |
| `CafSdkRunError`                       | Ocorreu um erro ao executar o SDK                                          |
| `CafSdkCanceledError`                  | Execução do SDK cancelada pelo usuário ou `cancelPromise`                  |
| `CafFaceLivenessError`                 | Erro durante a validação de vivacidade                                     |
| `CafFaceAuthenticationError`           | Erro durante a autenticação facial                                         |
| `CafFaceNotFoundError`                 | Nenhum rosto cadastrado foi encontrado para o usuário                      |
| `CafUnknownError`                      | Ocorreu um erro interno desconhecido                                       |
| `CafUnsupportedError`                  | O SDK não é suportado neste dispositivo, navegador ou sistema operacional. |
| `CafDeviceMotionPermissionDeniedError` | Permissão de movimento do dispositivo negada pelo usuário.                 |

{% hint style="info" %}
Quaisquer outros erros inesperados serão lançados como o padrão do JavaScript `Erro` classe.
{% endhint %}

**Exemplo:**

```javascript
try {
  const result = await CafFaceLivenessSdk.run();
  console.log("Resultado da vivacidade:", result);
} catch (error) {
  switch (error.name) {
    case "CafCameraPermissionError":
      console.error("Erro geral de permissão da câmera:", error.message);
      break;
    case "CafCameraPermissionDeniedError":
      console.error("Erro de permissão de câmera negada:", error.message);
      break;
    case "CafCameraUnsupportedError":
      console.error("Erro de câmera não suportada:", error.message);
      break;
    case "CafSdkRunError":
      console.error("Erro durante a execução do SDK:", error.message);
      break;
    case "CafSdkCanceledError":
      console.error("Erro de cancelamento do SDK:", error.message);
      break;
    case "CafFaceLivenessError":
      console.error("Erro de vivacidade:", error.message);
      break;
    case "CafFaceAuthenticationError":
      console.error("Erro de autenticação facial:", error.message);
      break;
    case "CafFaceNotFoundError":
      console.error("Nenhum rosto registrado foi encontrado para o usuário:", error.message);
      break;
    case "CafUnsupportedError":
      console.error("Erro não suportado:", error.message);
      break;
    case "CafDeviceMotionPermissionDeniedError":
      console.error("Erro de permissão de movimento do dispositivo negada:", error.message);
      break;
    case "CafUnknownError":
      console.error("Erro interno:", error.message);
      break;
    default:
      console.error("Erro inesperado durante a execução:", error.name, error.message);
  }
}
```

#### Descartar

```typescript
dispose(): void
```

Libera os recursos do SDK. Ele deve ser chamado quando o SDK não for mais necessário.

**Exemplo**

```javascript
try {
  CafFaceLivenessSdk.dispose();
  console.log("SDK descartado com sucesso");
} catch (error) {
  console.error("Erro ao descartar:", error.name, error.message);
}
```

### Produtos

#### Detecção de vivacidade facial

O SDK fornece detecção de vivacidade facial para garantir que o usuário esteja vivo e presente durante o processo.

**Como a detecção de vivacidade facial funciona**

1. **Acesso à câmera**: O SDK solicita acesso à câmera do usuário
2. **Captura do rosto**: O SDK captura uma foto do rosto do usuário
3. **Validação de vivacidade**: O SDK analisa o rosto capturado para verificar se o usuário está vivo
4. **Resultado**: A carga útil do token JWT inclui o `isAlive` campo que indica se o usuário está vivo

**Interpretação do resultado da Detecção de vivacidade facial**

| isAlive | Significado                                                      |
| ------- | ---------------------------------------------------------------- |
| `true`  | ✅ O usuário está vivo e a verificação de vivacidade foi aprovada |
| `false` | ❌ A detecção de vivacidade falhou                                |

#### Autenticação facial

O SDK oferece autenticação facial para ser realizada בנוסף à detecção de vivacidade. Quando ativado, após a validação de vivacidade, o SDK comparará o rosto capturado com um rosto registrado anteriormente para verificar a identidade do usuário.

Para ativar a autenticação facial, defina o `performFaceAuthentication` parâmetro como `true` durante a inicialização do SDK:

```javascript
await CafFaceLivenessSdk.init("your-sdk-token", "user-person-id", {
  htmlContainerId: "your-container-id",
  performFaceAuthentication: true, // Ativar autenticação facial
});
```

**Como a autenticação facial funciona**

1. **Registro do rosto**: O rosto do usuário deve ser registrado previamente usando o `personId`
2. **Detecção de vivacidade facial**: O SDK captura o rosto do usuário e realiza a validação de vivacidade
3. **Autenticação facial**: O rosto capturado é comparado com o rosto registrado para o dado `personId`
4. **Resultado**: A carga útil do token JWT inclui o `isMatch` campo que indica se há correspondência com o rosto registrado

**Interpretação do resultado da autenticação facial**

| isAlive | isMatch | Significado                                                     |
| ------- | ------- | --------------------------------------------------------------- |
| `true`  | `true`  | ✅ O usuário está vivo e o rosto corresponde ao rosto registrado |
| `true`  | `false` | ⚠️ O usuário está vivo, mas o rosto não corresponde             |
| `false` | -       | ❌ A detecção de vivacidade falhou                               |

### Configuração de proxy reverso

Se você optar por usar um proxy reverso, deverá configurá-lo para encaminhar corretamente as solicitações para os endpoints apropriados. Abaixo está o mapeamento para redirecionamento:

* `/v1/` → `https://web.us.prd.caf.io/bff/`
* `/std/` → `https://us.rp.secure.iproov.me/`
* `/std/ws/` → `wss://us.rp.secure.iproov.me/ws/`
* `/assets/` → `https://cdn.iproov.app/`

#### Exemplo de configuração de proxy reverso

Supondo que seu domínio seja `my.proxy.io`, a configuração do seu SDK ficaria assim:

```javascript
reverseProxy: {
  authenticationBaseUrl: "https://my.proxy.io/v1/",
  faceLivenessBaseUrl: "https://my.proxy.io/std/",
  assetsBaseUrl: "https://my.proxy.io/assets/"
}
```

**Observação:** Os caminhos fornecidos neste exemplo servem apenas como referência. Você pode configurar seu proxy e os caminhos de acordo com seus padrões de boas práticas.

### Opções de integração

{% tabs %}
{% tab title="iframe" %}
Para realizar a integração por meio de um `iframe`, as permissões de câmera e tela cheia devem ser concedidas.

```html
<iframe
  src="https://your-iframe-target.example"
  style="width: 100vw; height: 100vh; border: 0"
  allow="camera;fullscreen;accelerometer;gyroscope;magnetometer;"
  allowfullscreen="true"
></iframe>
```

#### Requisitos de permissão do sensor no iOS

As versões recentes do iOS 26 introduziram mudanças que quebraram o fluxo de permissão do sensor de movimento para integrações em iframe. A solução alternativa que dependia de um botão de permissão prévia deixou de funcionar e foi descontinuada.

A partir da versão `0.14.1`, o **iProov** provedor incluído foi atualizado, o que lida nativamente com os novos requisitos do iOS quando o Web SDK é executado dentro de um iframe. O único caminho suportado é atualizar sua integração para CafFaceLiveness `0.14.1` (ou superior). Versões anteriores não funcionarão nos dispositivos mais recentes com iOS 26, mesmo que você mantenha a solução alternativa anterior.

Após a atualização, você pode incorporar o iframe exatamente como mostrado acima. Não são necessários botões extras nem fluxos de permissão personalizados.
{% endtab %}

{% tab title="WebView" %}
Para usar o SDK por meio de uma WebView, a permissão de câmera deve ser concedida no seu aplicativo nativo.

Exemplo de implementação no Android:

`AndroidManifest.xml`

```java
  <uses-permission android:name="android.permission.CAMERA" />
  <uses-feature
    android:name="android.hardware.camera"
    android:required="true" />
```

`MainActivity`

```java
  @Override
  public void onPermissionRequest(final PermissionRequest request) {
    request.grant(request.getResources());
  }
```

Exemplo [android](https://github.com/combateafraude/android-webview-example) projeto para implementação em WebView; além disso, é necessário conseguir abrir o aplicativo em tela cheia, e o exemplo mostra como configurá-lo corretamente.
{% endtab %}
{% endtabs %}

### Eventos do SDK

O SDK dispara vários eventos durante seu ciclo de vida para lidar com diferentes cenários do processo de detecção de vivacidade e proporcionar uma melhor experiência ao usuário.

Ouça os eventos usando o padrão de listener de eventos do DOM:

```javascript
document.addEventListener("event-name", (event) => {
  console.log("Dados do evento:", event.detail);
});
```

{% hint style="info" %}
Atualmente, os eventos estão disponíveis apenas ao usar o **iProov** provedor. O suporte a eventos para outros provedores está planejado para versões futuras.
{% endhint %}

{% tabs %}
{% tab title="iProov" %}

#### Eventos disponíveis

| Nome do evento       | Descrição                                           | Suporte a provedores |
| -------------------- | --------------------------------------------------- | -------------------- |
| `started`            | O processo de detecção de vivacidade começa         | iProov               |
| `sdk-button-ready`   | O botão de início do SDK está pronto para interação | iProov               |
| `sdk-button-clicked` | O usuário clicou no botão de início do SDK          | iProov               |
| `streaming`          | A transmissão começou, permanecendo em tela cheia   | iProov               |
| `streamed`           | Fim da transmissão e saída da tela cheia            | iProov               |
| `passed`             | A detecção de vivacidade foi bem-sucedida           | iProov               |
| `failed`             | A detecção de vivacidade falha                      | iProov               |
| `canceled`           | O usuário cancela o processo                        | iProov               |
| `error`              | Ocorreu um erro durante o processo                  | iProov               |
| `unsupported`        | O navegador não suporta o SDK                       | iProov               |

#### Detalhes do evento: evento "failed" do iProov

Quando a detecção de vivacidade falha, o `failed` evento fornece um retorno específico:

```javascript
document.addEventListener("failed", (event) => {
  console.log("Motivo: ", event.detail.reason);
  console.log("Retorno: ", event.detail.feedback);
});
```

A tabela abaixo resume os possíveis `failed` detalhes do evento:

| Retorno             | Motivo                                                               | LA | GPA |
| ------------------- | -------------------------------------------------------------------- | -- | --- |
| eyes\_closed        | Mantenha os olhos abertos                                            | ✅  | ✅   |
| face\_too\_far      | Aproxime o rosto da tela                                             | ❌  | ✅   |
| face\_too\_close    | Afaste o rosto da tela                                               | ❌  | ✅   |
| misaligned\_face    | Mantenha o rosto no oval                                             | ❌  | ✅   |
| multiple\_faces     | Certifique-se de que apenas uma pessoa esteja visível                | ✅  | ✅   |
| obscured\_face      | Remova qualquer cobertura facial                                     | ✅  | ✅   |
| sunglasses          | Remova os óculos de sol                                              | ✅  | ✅   |
| too\_bright         | A luz ambiente está muito forte ou o brilho da tela está muito baixo | ✅  | ✅   |
| too\_dark           | Seu ambiente parece escuro demais                                    | ✅  | ✅   |
| too\_much\_movement | Por favor, fique parado                                              | ❌  | ✅   |
| unknown             | Tente novamente                                                      | ✅  | ✅   |

#### Detalhes do evento: evento "error" do iProov

Quando ocorre um erro durante o processo de detecção de vivacidade, o `error` evento fornece detalhes adicionais sobre o erro:

```javascript
document.addEventListener("error", (event) => {
  console.log("Motivo: ", event.detail.reason);
  console.log("Retorno: ", event.detail.feedback);
});
```

A tabela abaixo resume os possíveis `error` detalhes do evento:

| Retorno                            | Motivo                                                                             |
| ---------------------------------- | ---------------------------------------------------------------------------------- |
| unknown                            | Tente novamente                                                                    |
| client\_camera                     | Houve um erro ao obter vídeo da câmera                                             |
| client\_error                      | Ocorreu um erro desconhecido                                                       |
| error\_asset\_fetch                | Não foi possível obter os recursos                                                 |
| error\_camera                      | A câmera não pode ser iniciada por motivos desconhecidos                           |
| error\_camera\_in\_use             | A câmera já está em uso e não pode ser acessada                                    |
| error\_camera\_not\_supported      | A resolução da câmera é muito baixa                                                |
| error\_camera\_permission\_denied  | O usuário negou nossa solicitação de permissão de câmera                           |
| error\_device\_motion\_denied      | O usuário negou nossa solicitação de permissão de movimento do dispositivo         |
| error\_device\_motion\_unsupported | Seu dispositivo aparentemente não informa completamente o movimento do dispositivo |
| error\_fullscreen\_change          | Saiu da tela cheia sem concluir o iProov                                           |
| error\_invalid\_token              | O token interno do SDK é inválido                                                  |
| error\_network                     | Erro de rede                                                                       |
| error\_no\_face\_found             | Nenhum rosto pôde ser encontrado                                                   |
| error\_not\_supported              | O dispositivo ou a integração não consegue executar o Web SDK                      |
| error\_server                      | Ocorreu um erro ao se comunicar com os servidores do iProov                        |
| error\_token\_timeout              | O token foi solicitado muito tempo depois de ter sido criado                       |
| error\_too\_many\_requests         | O serviço está sob alta carga e o usuário deve tentar novamente                    |
| error\_user\_timeout               | O usuário iniciou a solicitação, mas não fez streaming a tempo                     |
| integration\_unloaded              | O SDK foi desmontado do DOM antes de terminar                                      |
| sdk\_unsupported                   | O SDK atingiu o fim de vida útil e não é mais suportado                            |
| {% endtab %}                       |                                                                                    |
| {% endtabs %}                      |                                                                                    |

## Notas de versão

### CafFaceLiveness v0.18.0

#### Funcionalidades

* **Sobreposição de carregamento do iProov**: Adicionada uma sobreposição de carregamento opcional (apenas um spinner) que cobre a interface de captura do iProov enquanto os recursos são carregados, evitando uma tela em branco entre `run()` e a janela de captura. Ative-a com `customization.loader.enabled`.

#### Melhorias

* **Dependências atualizadas**: O provedor Payface foi atualizado com importantes melhorias de segurança e aprimoramentos na captura facial.

### CafFaceLiveness v0.17.2

#### Correções

* **Provedor iProov**: Corrigido o problema de comportamento de zoom em tablets no modo paisagem, garantindo o dimensionamento correto da exibição em todos os dispositivos.
* **Provedor Payface**: Ampliado o intervalo de tempo limite de carregamento do SDK e adicionado registro diagnóstico para melhorar a confiabilidade da inicialização em conexões de rede lentas.

### CafFaceLiveness v0.17.1

#### Melhorias

* **Dependências atualizadas**: O provedor Payface foi atualizado com importantes melhorias de segurança e aprimoramentos na captura facial.

#### Correções

* **Provedor iProov**: Corrigido um problema em que a tela de captura facial não era exibida corretamente em tela cheia em dispositivos móveis iOS.

### CafFaceLiveness v0.17.0

#### Novas funcionalidades

* **Tratamento específico para rosto não registrado**: Adicionado `CafFaceNotFoundError`. Quando nenhum rosto estiver registrado para o `personId`, o SDK agora lança este erro específico em vez de um genérico, melhorando significativamente o tratamento de erros no frontend.

#### Melhorias

* Melhor tratamento dos erros de falha do usuário, incluindo rosto não encontrado, permissão de câmera negada e erros de movimento do dispositivo.
* **Dependências atualizadas**: Dependências internas atualizadas para melhorar a segurança e a estabilidade.
* **Registro**: Registro interno e análises aprimorados para melhor depuração e monitoramento.

### CafFaceLiveness v0.16.0

#### Funcionalidades

* **Evento de clique no botão de início**: Adicionado um novo `sdk-button-clicked` evento, disparado quando o usuário clica no botão de início do iProov. Use-o junto com o existente `sdk-button-ready` evento para acompanhar o engajamento do usuário durante o fluxo de verificação.

#### Correções

* Corrigido um erro que podia ocorrer ao chamar `dispose()` após o fluxo de vivacidade já ter sido concluído.

### CafFaceLiveness v0.15.1

#### Melhorias

* **Dependências atualizadas**: O provedor iProov e as dependências internas foram atualizados para melhorar o desempenho e a estabilidade.
* **Tratamento de erros**: Melhorado o tratamento de erros para o provedor iProov.
* **Registro**: Registro interno e análises aprimorados para melhor depuração e monitoramento.

#### Funcionalidades

* **Análises**: Adicionados novos eventos ao sistema interno de análise para rastrear melhor a compatibilidade e o suporte do navegador.

### CafFaceLiveness v0.14.3

#### Correções

* Foram adicionados erros para navegadores não suportados e permissões negadas de movimento do dispositivo: `CafUnsupportedError` e `CafDeviceMotionPermissionDeniedError`.
* Melhoradas as análises ao adicionar registros mais específicos para erros e falhas usando o provedor iProov.

### CafFaceLiveness v0.14.2

#### Análises aprimoradas do SDK

* Melhorado o registro ao adicionar informações sobre tentativas de captura e métricas de qualidade específicas.
* Adicionado **rastreamento de abandono**: quando um usuário sai abruptamente da jornada antes da conclusão, como fechar a janela do navegador, minimizar a aba ou navegar para outra página, o SDK rastreará esse evento para fornecer melhores insights sobre a jornada do usuário e possíveis motivos de abandono.

### CafFaceLiveness v0.14.1

{% hint style="warning" %}
**Importante para o provedor iProov**: A atualização para a versão `0.14.1` ou superior é necessária para integrações em iframe nas versões mais recentes do iOS.
{% endhint %}

#### Correções

* Atualizamos o **iProov** mecanismo do provedor, corrigindo a inicialização do iframe em dispositivos com iOS 26.x e eliminando a solução alternativa anterior de permissão do sensor de movimento.

### CafFaceLiveness v0.14.0

#### Melhorias

Esta versão inclui uma atualização no nosso provedor Payface que aprimora a experiência do usuário, resultando em maiores taxas de sucesso. As principais melhorias incluem:

* **Orientação ao usuário aprimorada**: Novos alertas de iluminação ajudam os usuários a encontrar as condições ideais para uma captura bem-sucedida.
* **Acessibilidade aprimorada**: Instruções mais claras criam uma jornada do usuário mais fluida e inclusiva.
* **Experiência mais responsiva**: Cancelar a captura agora é mais rápido, melhorando a usabilidade.

#### Funcionalidades

* **Impressão digital do dispositivo**: Coleta a impressão digital do dispositivo durante a verificação para fortalecer a prevenção a fraudes e a análise de risco. Desativado por padrão; entre em contato com nossa equipe para ativar.

### CafFaceLiveness v0.13.0

{% hint style="warning" %}
**Alteração incompatível**: Os nomes dos erros mudaram na v0.13.0. Recomendamos fortemente revisar a [Referência do SDK](#sdk-reference) seção antes de atualizar para esta versão para manter a compatibilidade.
{% endhint %}

* **Tratamento de erros simplificado com base em nomes**: Tipos de erro consolidados em nomes claros e descritivos para melhorar a consistência.
* **Dependências atualizadas**: Estabilidade, segurança e compatibilidade aprimoradas do SDK.

### CafFaceLiveness v0.12.1

* **Sistema de captura de imagem mais robusto**: O SDK agora apresenta um mecanismo de fallback inteligente, garantindo que a captura de imagem funcione de forma mais confiável em diferentes dispositivos e navegadores, mesmo em cenários com limitações técnicas.
* **Validação aprimorada da qualidade da imagem**: Novas validações foram implementadas para evitar imagens de baixa qualidade, aumentando a confiabilidade do processo de captura.
* **Otimização de desempenho na inicialização**: O processo de inicialização do SDK agora está mais rápido e leve, reduzindo o tempo de espera do usuário.
* **Feedback visual aprimorado**: Novos eventos e mensagens de status permitem que a interface do usuário informe com mais precisão o usuário sobre o momento da captura.

### CafFaceLiveness v0.12.0

#### Funcionalidades

* **Seleção de câmera aprimorada**: Detecção inteligente de rótulo/modo de orientação com seleção heurística da melhor câmera (Caf e FaceTec).
* **Descoberta unificada e reutilização de fluxo**: Descoberta única de mídia do usuário com reutilização de fluxo e fallback automático de câmera, reduzindo solicitações de permissão e acelerando a inicialização (Caf e FaceTec).
* **Troca de câmera mais rápida**: Troca de câmera quase instantânea com seleções em cache (Caf e FaceTec).

### CafFaceLiveness v0.11.2

#### Melhorias

**Experiência do usuário aprimorada durante interrupções**: Comportamento do Face Liveness aprimorado quando os usuários sofrem alterações de foco ou interrupções durante sessões de captura facial usando o provedor Payface.

* Adicionada funcionalidade de pausar/retomar quando o foco do navegador é perdido (troca de abas, minimização etc.)
* Os usuários agora podem se recuperar de interrupções em vez de reiniciar todo o processo de captura
* Redução das taxas de abandono de sessão devido a interrupções acidentais

### CafFaceLiveness v0.11.1

#### Correções

**Compatibilidade aprimorada com dispositivos**: Estabilidade e compatibilidade do Face Liveness aprimoradas em vários dispositivos e navegadores, reduzindo significativamente falhas de sessão e melhorando a experiência do usuário durante o processo de verificação facial usando o provedor Payface.

* Corrigidos problemas de compatibilidade que causavam erros de "não suportado" em determinados dispositivos
* Confiabilidade da inicialização da câmera aprimorada em diferentes dispositivos móveis e navegadores
* Redução das taxas de abandono durante sessões de Face Liveness

### CafFaceLiveness v0.11.0

#### Funcionalidades

**Inicialização da câmera aprimorada**: A inicialização da câmera foi refatorada ao usar os provedores Caf ou FaceTec, movendo a configuração da câmera da inicialização do SDK para a fase de execução, resultando em inicialização mais rápida e melhor gerenciamento de recursos.

#### Correções

* Corrigido um problema em que o fluxo da câmera não era reproduzido automaticamente ao inicializar o SDK dentro de um WebView móvel.

### CafFaceLiveness v0.10.1

#### Correções

* Garante que o SDK seja encerrado corretamente após erros de captura ao usar os provedores Caf ou FaceTec, evitando estados inconsistentes e permitindo que o usuário tente novamente o processo.

### CafFaceLiveness v0.10.0

#### Funcionalidades

**Rastreamento de analytics aprimorado**: Melhor rastreamento de eventos de analytics, oferecendo melhor monitoramento de erros e capacidades de depuração do SDK.

#### Correções

* Corrigidas falhas na inicialização da câmera e problemas de sobreposição em tela cheia ao usar os provedores Caf ou FaceTec.
* Corrigida a configuração do reverse proxy para encaminhar corretamente as solicitações aos endpoints desejados.

### CafFaceLiveness v0.9.0

#### Funcionalidades

* **Modo tela cheia**: Ative o modo tela cheia ao usar os provedores Caf ou FaceTec para melhorar a experiência do usuário.
* **Melhorias no Payface**: Provedor Payface atualizado para melhorar a observabilidade e a compatibilidade com WebView.

### CafFaceLiveness v0.7.3

#### Correções

Corrigido um problema em que o SDK não habilitava a autenticação facial ao usar o provedor Payface. O SDK agora realiza corretamente a autenticação facial quando a `performFaceAuthentication` opção está definida como `true` durante a inicialização.

### CafFaceLiveness v0.7.2

Apresentando **CafFaceLiveness**, um SDK Web para detecção de liveness facial e autenticação em aplicações web.

#### Funcionalidades

* **Detecção de Face Liveness**: Validação em tempo real para garantir a presença do usuário
* **Autenticação facial**: Verificação opcional de identidade em relação a rostos cadastrados
* **Suporte a múltiplos provedores**: Roteamento automático entre os provedores Caf, FaceTec, iProov e Payface
* **Configuração flexível**: Opções de personalização para a interface e o comportamento
* **Multilíngue**: Suporte nativo para inglês, espanhol e português
* **Reverse Proxy**: Tráfego de API seguro por meio da configuração de reverse proxy

{% hint style="info" %}
**Observação**: Esta é a versão inicial do CafFaceLiveness Web SDK. Versões futuras incluirão recursos adicionais, melhorias e suporte expandido a provedores.
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.caf.io/caf-sdk/caf-sdk-pt-br/web-javascript/getting-started/face-liveness-and-face-authenticator.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
