> 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/api-rest/identity-api/identity-api-reference/country-integrations/chile/traspasos-afp/verify.md).

# Verify

Servicio que valida la identidad del usuario y genera un token de verificación para la integración con Previred.

Este servicio valida todos los resultados del onboarding y genera un token seguro que se utiliza para construir la URL de verificación compartida con Previred.

### Prerequisitos

Antes de llamar a este servicio, se debe asegurar que el usuario haya completado el proceso de Onboarding con resultados válidos:

* `facialAuthenticationResult = 3` (Autenticación facial exitosa)
* `passiveLivenessResult = 3` (Prueba de vida superada)
* `documentValidation = 9001` (Validación documental aprobada)

### Endpoint

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

### Headers

| Nombre        | Tipo   | Requerido | Descripción                        |
| ------------- | ------ | --------- | ---------------------------------- |
| **x-api-key** | string | **Sí**    | API key de autorización de acceso. |

### Parámetros de ruta

| Parámetro              | Tipo   | Requerido | Descripción                                                     |
| ---------------------- | ------ | --------- | --------------------------------------------------------------- |
| `serviceTransactionId` | string | **Sí**    | Identificador único de transacción para el proceso de traspaso. |

### Cuerpo de la solicitud

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

#### Parámetros

| Parámetro       | Tipo   | Requerido | Descripción                                                                                                   |
| --------------- | ------ | --------- | ------------------------------------------------------------------------------------------------------------- |
| `scanReference` | string | **Sí**    | Identificador de referencia del proceso de Onboarding que contiene los resultados de validación de identidad. |

#### Ejemplo de solicitud

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

### Respuestas

#### `200` Éxito

#### Parámetros de respuesta

| Parámetro | Tipo   | Descripción                                                                          |
| --------- | ------ | ------------------------------------------------------------------------------------ |
| `token`   | string | Token de verificación para construir la URL de verificación compartida con Previred. |

#### Ejemplo de respuesta

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

{% hint style="warning" %}
Almacenar el token de manera segura, ya que es requerido en los siguientes pasos.
{% endhint %}

#### `400` Bad Request

```json
{
  "status": 400,
  "title": "Bad Request",
  "detail": "Invalid request.",
  "type": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400",
  "errors": []
}
```

#### `401` Unauthorized

```json
{
  "message": "Unauthorized"
}
```

#### `403` Forbidden

```json
{
  "Message": "User is not authorized to access this resource with an explicit deny"
}
```

#### `404` Not Found

```json
{
  "status": 404,
  "title": "Not Found",
  "detail": "Resource not found.",
  "type": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404"
}
```

#### `502` Bad Gateway

```json
{
  "status": 502,
  "title": "Bad Gateway",
  "detail": "Server got an invalid response.",
  "type": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/502"
}
```

#### `504` Gateway Timeout

```json
{
  "message": "Endpoint request timed out"
}
```

***

### Envío de evidencia de verificación a Previred

Una vez obtenido el token, la AFP debe enviar la `url_verificacion` a Previred como prueba de validación.

#### Formato de la URL de verificación

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

{% hint style="info" %}
El `apiKeyPrevired` se acompaña de `username` y `password` para autenticación.
{% endhint %}

#### Llamada a Previred - Solicitud de Token

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

**Headers:**

| Nombre            | Tipo   | Requerido | Descripción         |
| ----------------- | ------ | --------- | ------------------- |
| **Content-Type**  | string | **Sí**    | `application/json`  |
| **Authorization** | string | **Sí**    | `Basic {authToken}` |

**Ejemplo de solicitud:**

```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" %}
El campo `codigo_verificacion` debe cumplir con las restricciones de Previred, por lo que se genera a partir del `serviceTransactionId` en formato Base64 URL-safe. Para más detalles, consulta la sección [Formato de UUID para Previred](#formato-de-uuid-para-previred).
{% endhint %}

**Ejemplo de respuesta:**

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

#### Llamada a Previred - Obtener token

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

**Ejemplo de solicitud:**

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

**Ejemplo de respuesta:**

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

***

### Formato de UUID para Previred

Previred impone un límite de 30 caracteres en `codigo_verificacion`. Los UUID (36 caracteres) se transforman a Base64 URL-safe sin padding.

#### Conversión de UUID a Base64 URL-safe

**Ejemplo:**

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

**Implementación en 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 garantiza unicidad y cumplimiento con Previred. Debe aplicarse de manera consistente.
{% endhint %}
