> For the complete documentation index, see [llms.txt](https://docs.facephi.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.facephi.com/docs.facephi-pt-br/api-rest/identity-api/identity-api-reference/country-integrations/chile/traspasos-afp/verify.md).

# Verify

Serviço que valida a identidade do usuário e gera um token de verificação para a integração com Previred.

Este serviço valida todos os resultados do onboarding e gera um token seguro que é utilizado para construir a URL de verificação compartilhada com o Previred.

### Pré-requisitos

Antes de chamar este serviço, deve-se garantir que o usuário tenha concluído o processo de Onboarding com resultados válidos:

* `facialAuthenticationResult = 3` (Autenticação facial bem-sucedida)
* `passiveLivenessResult = 3` (Teste de vida superado)
* `documentValidation = 9001` (Validação documental aprovada)

### Endpoint

```
POST /services/previred/{serviceTransactionId}/verify
```

### Cabeçalhos

| Nome          | Tipo   | Obrigatório | Descrição                         |
| ------------- | ------ | ----------- | --------------------------------- |
| **x-api-key** | string | **Sim**     | API Key de autorização de acesso. |

### Parâmetros de rota

| Parâmetro              | Tipo   | Obrigatório | Descrição                                                          |
| ---------------------- | ------ | ----------- | ------------------------------------------------------------------ |
| `serviceTransactionId` | string | **Sim**     | Identificador único de transação para o processo de transferência. |

### Corpo da solicitação

**Content-Type:** `application/json`

#### Parâmetros

| Parâmetro       | Tipo   | Obrigatório | Descrição                                                                                                  |
| --------------- | ------ | ----------- | ---------------------------------------------------------------------------------------------------------- |
| `scanReference` | string | **Sim**     | Identificador de referência do processo de Onboarding que contém os resultados de validação de identidade. |

#### Exemplo de solicitação

```json
{
  "scanReference": "550e8400-e29b-41d4-a716-446655440000"
}
```

### Respostas

#### `200` Sucesso

#### Parâmetros de resposta

| Parâmetro | Tipo   | Descrição                                                                              |
| --------- | ------ | -------------------------------------------------------------------------------------- |
| `token`   | string | Token de verificação para construir a URL de verificação compartilhada com o Previred. |

#### Exemplo de resposta

```json
{
  "token": "MUOJHSYODkRtgVENLbXXXpujiDHqGTYS"
}
```

{% hint style="warning" %}
Armazenar o token de forma segura, pois ele é necessário nas próximas etapas.
{% endhint %}

#### `400` Bad Request

```json
{
  "status": 400,
  "title": "Requisição inválida",
  "detail": "Solicitação inválida.",
  "type": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400",
  "errors": []
}
```

#### `401` Não autorizado

```json
{
  "message": "Não autorizado"
}
```

#### `403` Proibido

```json
{
  "Message": "O usuário não está autorizado a acessar este recurso com uma negação explícita"
}
```

#### `404` Não encontrado

```json
{
  "status": 404,
  "title": "Não encontrado",
  "detail": "Recurso não encontrado.",
  "type": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404"
}
```

#### `502` Bad Gateway

```json
{
  "status": 502,
  "title": "Gateway inválido",
  "detail": "O servidor recebeu uma resposta inválida.",
  "type": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/502"
}
```

#### `504` Gateway Timeout

```json
{
  "message": "A requisição do Endpoint excedeu o tempo limite"
}
```

***

### Envio de evidência de verificação ao Previred

Uma vez obtido o token, a AFP deve enviar a `url_verificacion` ao Previred como prova de validação.

#### Formato da URL de verificação

```
{host}/services/previred/{serviceTransactionId}/certificate?token={token}&apiKey={previredApiKey}
```

{% hint style="info" %}
O `apiKeyPrevired` é acompanhado de `username` e `password` para autenticação.
{% endhint %}

#### Chamada ao Previred - Solicitação de Token

```
POST {baseUrlPrevired}/tvi/solicitudTokenWS
```

**Headers:**

| Nome              | Tipo   | Obrigatório | Descrição           |
| ----------------- | ------ | ----------- | ------------------- |
| **Content-Type**  | string | **Sim**     | `application/json`  |
| **Authorization** | string | **Sim**     | `Basic {authToken}` |

**Exemplo de solicitação:**

```json
{
  "afiliado": {
    "nombre": "{nombre_afiliado}",
    "apellido_paterno": "{apellido_paterno_afiliado}",
    "apellido_materno": "{apellido_materno_afiliado}",
    "rut_numero": "{rut_numero_afiliado}",
    "dv": "{dv_afiliado}",
    "verificacion": {
      "identificacion_proveedor": "{identificacion_proveedor}",
      "fecha_verificacion": "{fecha_verificacion}",
      "url_verificacion": "{host}/services/previred/{serviceTransactionId}/certificate?token={token}&apiKey={previredApiKey}",
      "url_usuario": "{username}",
      "url_clave": "{password}",
      "tipo_verificacion": "{tipo_verificacion}",
      "codigo_verificacion": "{codigo_verificacion}"
    }
  },
  "codigo_institucion": "{codigo_institucion}",
  "requiere_segunda_verificacion": false
}
```

{% hint style="warning" %}
O campo `codigo_verificacion` deve cumprir as restrições do Previred, por isso é gerado a partir do `serviceTransactionId` em formato Base64 URL-safe. Para mais detalhes, consulte a seção [Formato de UUID para Previred](#formato-de-uuid-para-previred).
{% endhint %}

**Exemplo de resposta:**

```json
{
  "respuesta": {
    "codigo": 200,
    "mensaje": "Ticket gerado com sucesso",
    "ticket_tvi": "17416257523259999232077343926588:...",
    "fecha": "20250310 135552",
    "errores": []
  }
}
```

#### Chamada ao Previred - Obter Token

```
POST {baseUrlPrevired}/tvi/obtenerTokenWS
```

**Exemplo de solicitação:**

```json
{
  "codigo_institucion": "9999",
  "ticket_tvi": "{ticket_tvi}"
}
```

**Exemplo de resposta:**

```json
{
  "respuesta": {
    "codigo": 200,
    "mensaje": "OK",
    "token": "2N/BNwHs6kMlVKKEPsFi6fpPjf5I/x0X+IFKFk/EhWZn3vQIvY4FQbORNpzPpOFsO7Gp/jiiCzhE5EnLgjSTUg==",
    "fecha": "20250310 135555",
    "errores": []
  }
}
```

***

### Formato de UUID para Previred

Previred impõe um limite de 30 caracteres em `codigo_verificacion`. Os UUID (36 caracteres) são transformados em Base64 URL-safe sem padding.

#### Conversão de UUID para Base64 URL-safe

**Exemplo:**

| UUID original                          | UUID convertido          |
| -------------------------------------- | ------------------------ |
| `3994d0f4-77c2-4079-8fd3-ccd14e90f909` | `OTlEbw93wkCeNMzNF5D5CQ` |

**Implementação em Go:**

```go
import (
    "encoding/base64"
    "github.com/google/uuid"
)

func ShortID(ID string) string {
    tID := uuid.MustParse(ID)
    marshalled, _ := tID.MarshalBinary()
    return base64.RawURLEncoding.EncodeToString(marshalled)
}
```

{% hint style="warning" %}
Este método garante unicidade e conformidade com o Previred. Deve ser aplicado de forma consistente.
{% endhint %}
