Skip to content

Biometría - APIs WEB para los procesos de identificación

V0.0.3V0.0.3

A continuación, se describen las principales funciones del servicio biométrico de TOC Perú para la administración de los procesos de identificación por parte del cliente.

El funcionamiento de los procesos de identificación está pensado para ser usados de manera simple y flexible, y, a su vez, entregando la confianza del resultado de estos soportados por tecnologías biométricas certificadas. La creación y resolución de un proceso de identificación se puede resumir en 3 pasos:

graph TD;
    A[Autenticación] --> B[Creación de proceso de ID];
    B --> C[Resolución de biometría];

Los 2 primeros pasos son gestionados mediante las APIs WEB del sistema de biometría de TOC Perú, por lo que la presente documentación explica el uso de los recursos necesarios para dichas etapas. El tercer paso del flujo anteriormente mostrado consiste en la resolución del proceso biométrico, el cual es gestionado por el cliente web o los SDKs de la integración de la biometría a los procesos del cliente.

Ambientes

El sistema de biometría cuenta con 3 ambientes de trabajo: desarrollo, calidad y producción. Esto se traduce en que cada ambiente tiene una URL base distinto (base URL):

  • Desarrollo: https://apifacialdev.identia.pe
  • Calidad: https://apifacialqa.identia.pe
  • Producción: https://apifacialprod.identia.pe

Estos 3 ambientes se encuentran aislados entre sí, por lo que los datos de una cuenta creada en un ambiente no estarán presentes en los otros (por ende, se requieren credenciales distintas para cada ambiente).

Autenticación

Para poder acceder a las APIs del backend y a sus recursos, el cliente deberá primero obtener un token de acceso, el cual debe ser presentado a al backend dentro del parámetro Authorization en los headers de las llamadas a las APIs. Para obtener el token de acceso, el cliente debe llamar al endpoint /api/auth/login con un método POST, dentro del cual debe incluir las credenciales que se deben autorizar. El token de acceso tiene un tiempo de vida de 15 minutos.

Método POST

En el body del request POST, el cliente debe presentar las credenciales de acceso. Cada credencial de acceso que el cliente posea podría tener scopes distintos, por lo que pueden ser usadas para casos de uso específicos, limitando el acceso a los recursos que no sean necesarios para dichos casos y así mejorar la seguridad y trazabilidad.

Los parámetros a incluir dentro del body son los siguientes:

  • username: El nombre de la entidad dueña de los recursos administrados por el backend (posee parámetros, procesos de identificación, usuarios). Formato: Dominio de la entidad
  • clientname: Identificador de la credencial que se utilizará para acceder a los recursos del usuario establecidos al momento de crear la credencial. Formato: Correo electrónico
  • password: Es el secret establecido para la credencial que se utilizará

Si las credenciales son correctas, el backend emitirá un token de acceso para que pueda ser usado por el cliente y así acceder a sus recursos.

Ejemplo de solicitud:

Tipo de request:\ POST raw

Body:

{
  "username": "bn_qa",
  "clientname": "cred001",
  "password": "11##aa.."
}

Ejemplo de respuesta (código 200):

Tipo de contenido:\ application/json

Body:

{
  "access_token": "aaa.bbb.ccc",
  "expires_in": 3600,
  "scope": "id_process:write id_process:read",
  "token_type": "jwt-bearer"
}
Nota

El encabezado de autorización debe incluir el token en el siguiente formato: jwt-bearer aa.bb.cc

Ejemplo de respuesta (código 404):

Tipo de contenido:\ raw/text

Body:\ not found

Proceso de identificación

Los procesos de identificación son gestionados desde el endpoint /api/id_process. Este endpoint le permitirá al cliente crear procesos de identificación, así como también consultarlos y obtener un detalle de estos.

Método PUT

El cliente podrá crear un proceso de identificación llamando al endpoint /api/id_process con el método PUT. Este método sólo puede ser utilizado presentando un token de acceso que incluya el scope id_process:put.

En el body del request, el cliente deberá pasar todos los parámetros que permitan configurar de la manera deseada el proceso de identificación. A continuación, se describen los parámetros configurables:

  • challenges: Array (JSON string) que indica las validaciones que deben superar los datos de la persona a identificar. En el Anexo 1 se definen los distintos tipos de validaciones.
  • built_challenge_keyword: Al igual que el parámetro challenges, este parámetro permite definir las validaciones que se hacen sobre los datos de la persona a identificar. Sin embargo, el arreglo de validaciones es determinado de acuerdo con un lookup basado en palabras claves previamente definido por el integrador (mapeo de strings a arrays de challenges). Para hacer uso de esta función, debe configurar modalidades y procesos en el backoffice de su cuenta.(Parámetro opcional)
  • description: Información relativa al proceso de identificación reconocible por el cliente. Le permitirá al cliente hacer búsquedas parciales o totales sobre el valor de este parámetro.(Parámetro opcional)
  • expires: Este parámetro define el tiempo de expiración (en segundos) después del cual el proceso de validación expira. Una vez alcanzado este límite, la persona a identificar no podrá completar la validación, y el proceso finalizará con un resultado negativo por expiración. Si no se especifica un valor para este parámetro, se aplicará el valor por defecto de 900 segundos (15 minutos). (Parámetro opcional)
  • doc_id: Número o texto identificador de la persona que deberá superar el proceso de identificación (ej.: DNI). Este valor debe coincidir con el ID que se logre obtener desde el documento de identidad, RENIEC u otras fuentes de datos con las que se haga una comparación.
  • nat: Código que le indica al sistema el tipo de número de identificación (país emisor y/o contexto) para las validaciones durante el proceso de identificación.

    Tipos de NAT Formato de ID Descripción
    PER 12345678 Número de identidad nacional Peruano (DNI)
    CHL 12345678-9 Número de identidad nacional Chileno (RUN)
    PERPASS 1234567891 Número de pasaporte peruano
    PERCE 123456789123 Número del carnet de extranjeria peruano
    Nota

    Los códigos de país utilizados en el sistema se basan en el estándar internacional ISO 3166, que proporciona códigos únicos para identificar países y territorios a nivel mundial. Lista de códigos

  • urlCallback: URL de un servicio del integrador (endpoint, webhook, URL firmada, etc) a la que el backend de TOC Perú realizará un request POST una vez haya concluido el proceso de identificación. La data biométrica es adjuntada en el cuerpo del request(revisar urlCallback).(Parámetro opcional)

Ejemplo de datos enviados en el POST:

{
  "id": "aaa.123.bbb",
  "msg": "success",
  "result": true,
  "description": "Aplicativo:1 Canal:2",
  "images": {
    "selfie": "base64",
    "doc": { "front": "base64", "back": "base64" }
  },
  "confidence": 1.0,
  "details": {
    "liveness": {
      "selfie": {
        "confidence": 1.0,
        "result": true
      }
    }
  }
}
Nota

La sección details dentro del POST es variable según los challenges seteados en el proceso biométrico

Nota

Es posible agregar una cabecera HTTP personalizada a la solicitud POST. Esta cabeceras debe cumplir con lo siguiente:

- Comenzar con el prefijo "X-"
- Contener valores alfanuméricos
- Pueden incluir los símbolos guion (-), guion bajo (_) y punto (.)
  • urlRedirect: Para las integraciones WEB, el cliente podrá establecer una URL de redirección a la cual será redirigida la persona a identificar luego de finalizar el proceso de identificación. (Parámetro opcional)

  • personal_info: El integrador podrá proveer la información personal de la persona a identificar si el proceso de validación que se esté creando requiere de una comparación de datos personales contra una fuente. De lo contrario, esta información será consultada a la persona a identificar. La data de este parámetro es un string JSON que puede contener tanto el nombre de la persona (given_name) como el apellido (family_name). (Parámetro opcional)

Ejemplo en el que integrador incluye ambos datos:

    {
        personal_info:{
            "given_name":"Nombre1 Nombre2", 
            "family_name":"Apellido1 Apellido2"
        }
    }
  • urlWebSdkUiOrigin: URL del dominio de origen que se encuentre integrando el SDK web (ej.: https://your.domain). Este parámetro es opcional y sólo debe usarse cuando se trate de integraciones con el SDK web. (Parámetro opcional)

  • max_tries: El parámetro permite al integrador especificar el número máximo de intentos permitidos para completar uno o varios desafíos dentro de un proceso biométrico. Si no se proporciona un valor, el sistema asumirá un intento único por defecto. Este parámetro controla la cantidad de oportunidades internas para superar los desafíos antes de considerar el proceso como fallido. (Valor recomendable 3) revisar Número de intento

Ejemplo de solicitud:

Tipo de request:\ PUT x-www-form-urlencoded

Headers:

  • Authorization: jwt-bearer aaa.bbb.ccc

Body:

{
  "doc_id": 11111111,
  "nat": "PER",
  "challenges": ["liveness:selfie", "match:db:selfie"],
  "description": "Aplicativo:PCA Canal:WEB Proceso:SVIG",
  "urlCallback": "https://your.domain/login/callback"
}

Como resultado del método PUT, el cliente recibirá el ID del nuevo proceso de identificación creado. Este ID es único para cada proceso de identificación, y sólo podrá ser resuelto (por la persona a quién se pretende identificar) previo al tiempo de expiración y mientras se encuentre en estado pending.

Ejemplo de respuesta (código 200):

Tipo de contenido:\ application/json

Body:

{
  "id": "aaa.111.bbb"
}

Consumo de proceso de validación

Este ID debe ser usado en las integraciones móviles (SDKs Android/iOS) así como también en la integración WEB para iniciar el proceso de identificación. En esta última, la persona a identificar deberá ser redirigida a {baseURL}/ui/id_process/{ID}. Ejemplo de URL para el usuario final: https://apifacialdev.identia.pe/ui/id_process/aa.12.bb

Personalización gráfica

Si has creado una personalización de la interfaz en el Backoffice, puedes agregarlo a la URL final, simplemente agrega el PERSONALIZATION_ID como valor de del parametro styles_id de la siguiente manera {baseURL}/ui/id_process/{ID}?styles_id={PERSONALIZATION_ID}&v=2a, Ejemplo de URL para el usuario final: https://apifacialdev.identia.pe/ui/id_process/aa.12.bb?styles_id=cccccc....cccccc&v=2a

Error por bloqueo de número de identidad

Un error 423 podrá ser entregado al crear un proceso de validación si el número de identidad indicado en los parámetros (doc_id) ha sido bloqueado por exceder el número máximo de validaciones fallidas según lo configurado en los parámetros de las reglas de negocio de la blacklist en el backoffice.

En el cuerpo de la respuesta se encuentran presentes las siguientes propiedades:

  • msg: indica la regla de negocio de la blacklist que ha gatillado el bloqueo del número de identidad. Esta puede tomar el valor de manual si el bloqueo se realizó manualmente. De lo contrario, msg comenzará con params:blacklist_id: y continuará con el nombre de la regla de bloqueo.
  • until: fecha de expiración del bloqueo de la identidad en formato AAAAMMDDThh:mm:ss+00:00.

Ejemplo de respuesta (código 423):

Tipo de contenido:\ application/json

Body:

{
  "msg": "params:blacklist_id:limit",
  "until": "20230613T12:00:00+00:00"
}

Método GET

El cliente podrá acceder a la información de uno o varios procesos de identificación mediante una llamada al endpoint /api/id_process con el método GET. Sólo puede ser consumido con un token de acceso que incluya el scope id_process:read. Mediante los parámetros incluidos en el body de la solicitud, el cliente podrá filtrar los procesos de identificación que sean retornados con esta llamada.

Los parámetros a incluir dentro de la búsqueda son opcionales y pueden ser los siguientes:

  • creation_start: el backend retornará solo aquellos procesos de identificación cuya fecha de creación sea mayor o igual a la establecida en este parámetro. La fecha debe ir en formato AAAAMMDDThh:mm:ss+00:00. Los últimos 6 caracteres del formato de la fecha corresponden a la zona horaria (GMT), por lo que deben ser reemplazados por la correspondiente al contexto del cliente.
  • creation_end: el backend retornará solo aquellos procesos de identificación cuya fecha de creación sea menor a la establecida en este parámetro. La fecha debe ir en formato AAAAMMDDThh:mm:ss+00:00. Los últimos 6 caracteres del formato de la fecha corresponden a la zona horaria (GMT), por lo que deben ser reemplazados por la correspondiente al contexto del cliente.
  • status: el cliente podrá filtrar los procesos de identificación según el estado en el que estos se encuentren. Este parámetro sólo puede tomar los valores "pending" o "finished".
  • result: el cliente podrá filtrar los procesos de identificación según el resultado de este. Este parámetro sólo puede tomar los valores true o false.
  • description: El cliente podrá filtrar según el texto presente en la propiedad description de los procesos de identificación. Se deben declarar dentro de un arreglo (string de tipo JSON) los valores a buscar los valores que el sistema debe buscar dentro del description de los procesos de identificación.
  • per_id: si el proceso de identificación incluye el ID de la persona (ej.: DNI), el cliente podrá obtener estos procesos filtrando por el ID nacional de una determinada persona.
  • process_id: permite buscar un proceso de identificación en específico mediante su coincidencia exacta con el ID establecido en este parámetro. Si este parámetro es usado, todos los demás parámetros de búsqueda son ignorados.
  • limit: Número máximo de procesos de identificación a reportar.
  • order: los procesos de identificación son ordenados según la fecha de creación. Este parámetro booleano permite que la búsqueda ocurra de mayor a menor fecha de creación (false) o viceversa (true).
  • last_item: este parámetro corresponde a la representación json (string) del proceso de identificación desde el cual se quiere realizar la búsqueda. Este parámetro es útil cuando la búsqueda realizada retorna más procesos de los permitidos por el límite, por lo que, si dentro de los elementos retornados no se encuentra el deseado, un nuevo llamado para realizar la búsqueda conservando los parámetros, pero incluyendo este, permitirá hacer que la búsqueda sea realizada desde el last_item en adelante.
  • tz: Este parámetro indica el formato de zona horaria que se utilizará para las fechas en el campo date. Por ejemplo, para la hora peruana se debe especificar -05:00. Si no se proporciona un valor para este parámetro, se utilizará el valor por defecto de 0:00.

En base a los parámetros, el backend retornará una colección de procesos de identificación coincidentes con la búsqueda (completa o incompleta).

Ejemplo de solicitud:

Tipo de request:\ GET

Parámetros de la query (URL):

{
creation_start: "20230101T12:00:00+00:00",
result: true,
last_item:{"id":"abcxyz", "fecha_creac":" 20230122T11:43:53+00:00"},
description: ["Aplicativo:PCDI"]
}

Ejemplo de respuesta (código 200):

Tipo de contenido:\ application/json

Body:

{
  "id_process": [
    {
      "access_counter": 1,
      "challenges": [
        ["liveness:selfie", "match:ocr:id", "match:portrait:selfie"]
      ],
      "challenges_retries": {
        "liveness:selfie": 0,
        "match:ocr:id": 0,
        "match:portrait:selfie": 0
      },
      "client_id": "2cf5Jc....N6Ghkyp",
      "confidence": 0.7178097,
      "date": "2024-11-28T18:25:04-05:00",
      "description": "Aplicativo:PCDI Canal:test",
      "details": {
        "liveness": {
          "selfie": {
            "confidence": 0.7178097,
            "result": true
          }
        },
        "match": {
          "ocr": {
            "id": {
              "confidence": 1,
              "result": true
            }
          },
          "portrait": {
            "selfie": {
              "confidence": 0.9734558868408203,
              "result": true
            }
          }
        }
      },
      "doc_id": "11111111",
      "doc_type": "",
      "exp": "2024-11-28T18:40:04-05:00",
      "fec_result": "2024-11-28T18:25:51-05:00",
      "id": "dddddd.eeeeeee.ffffff",
      "max_tries": 3,
      "msg": "success",
      "nat": "PERCE",
      "resolve_ip": "0.0.0.0",
      "result": true,
      "status": "finished",
      "user_agent": "Mozilla/5.0"
    },
    {
      "access_counter": 1,
      "challenges": [["liveness:selfie"]],
      "challenges_retries": {
        "liveness:selfie": 0
      },
      "confidence": 0.7977935,
      "date": "2024-11-28T12:47:26-05:00",
      "description": "Aplicativo:PCDI Canal:test",
      "details": {
        "liveness": {
          "selfie": {
            "confidence": 0.7977935,
            "result": true
          }
        }
      },
      "doc_id": "11111111",
      "doc_type": "",
      "exp": "2024-11-28T13:02:26-05:00",
      "fec_result": "2024-11-28T12:47:46-05:00",
      "id": "aaaaaa.bbbbbbb.ccccc",
      "max_tries": 3,
      "msg": "success",
      "nat": "PER",
      "resolve_ip": "0.0.0.0",
      "result": true,
      "status": "finished",
      "urlCallback": "",
      "urlWebSdkUiOrigin": "",
      "user_agent": "Mozilla/5.0"
    }
  ],
  "last_item": {
    "date": 1732835467,
    "id": "2331rtgwbe",
    "usr_id": "ecd...878"
  }
}
Nota
  • Si en una búsqueda inicial no se identifican procesos coincidentes con los atributos enviados, el sistema retornará un parámetro last_item en la respuesta. Este valor debe incluirse en el siguiente request utilizando el formato encodeURIComponent.

  • El procedimiento debe repetirse en cada iteración, enviando el nuevo valor de last_item retornado, hasta que el sistema devuelva un valor null, lo que indicará que no hay más elementos por procesar.

  • El API GET no incluye las imágenes en la respuesta. Esto es debido a que no almacenamos imágenes resultantes en nuestra base de datos.

Ejemplo de respuesta (código 200):

Tipo de contenido:\ application/json

Body:

{
  "id_process": [
    {
      "access_counter": 1,
      "challenges": [["liveness:selfie"]],
      "challenges_retries": {
        "liveness:selfie": 0
      },
      "confidence": 0.7977935,
      "date": "2024-11-28T12:47:26-05:00",
      "description": "Aplicativo:PCDI Canal:test",
      "details": {
        "liveness": {
          "selfie": {
            "confidence": 0.7977935,
            "result": true
          }
        }
      },
      "doc_id": "11111111",
      "doc_type": null,
      "exp": "2024-11-28T13:02:26-05:00",
      "fec_result": "2024-11-28T12:47:46-05:00",
      "id": "aaaaaa.bbbbbbb.ccccc",
      "max_tries": 3,
      "msg": "success",
      "nat": "PER",
      "resolve_ip": "0.0.0.0",
      "result": true,
      "status": "finished",
      "urlCallback": "",
      "urlWebSdkUiOrigin": "",
      "user_agent": "Mozilla/5.0"
    }
  ],
  "last_item": null
}

Propiedades de un proceso de identificación

En la descripción anterior, se pueden observar las propiedades asociadas a cada proceso de identificación. A continuación, se detalla el significado de cada una:

  • access_counter: Número de intentos de iniciar el proceso de identificación del lado del usuario final
  • challenges: Arreglo que enlista las validaciones realizadas en el proceso de validación
  • challenges_retries: Diccionario donde se contabiliza el número de intentos por challegen
  • confidence : El valor mínimo de los confidence de los challenges
  • date: Fecha de creación del proceso de identificación en formato AAAAMMDDThh:mm:ss+00:00.
  • description: Texto asociados por el cliente al proceso de identificación.
  • detail: Es un conjunto de datos que detalla sobre el resultado de las distintas validaciones realizadas durante el proceso de identificación. Este detalle incluye tanto el resultado como el grado de confianza (escala continua del 0 al 1) por cada tipo validación hecho en el proceso de identificación.
  • doc_id: Identificador nacional (ej.: DNI) de la persona cuyo documento o ficha RENIEC debió coincidir en los procesos de comparación de datos
  • doc_type: Tipo de documento usado por la persona a identificar para pasar por el proceso de identificación.
  • exp: Fecha de expiración del proceso biométrico en formato AAAAMMDDThh:mm:ss+00:00.
  • fec_result: Fecha en la que se resolvió el proceso biométrico en formato AAAAMMDDThh:mm:ss+00:00.
  • id: Identificador único del proceso de identificación
  • max_tries : Número de intentos seteado al momento de crear el proceso biométrico
  • msg: Texto que entrega el motivo del resultado del proceso de validación en caso de que este sea negativo. Ver sección Mensajes de error
  • nat: Código que le indica al sistema el tipo de número de identificación (país emisor y/o contexto) para las validaciones durante el proceso de identificación.
  • resolve_ip: IP desde la cual se resolvió el proceso de identificación (posiblemente más de una IP si hubo un proxy de por medio)
  • result: Resultado del proceso de identificación. Cuando toma el valor true, quiere decir que el proceso de identificación finalizó con éxito, mientras que un valor false significa que la persona no pudo ser identificada correctamente. Si el valor es null, esto indica que el proceso de identificación ha expirado.
  • status: Estado del proceso de identificación. Puede tomar los valores "pending" o "finished".
  • urlCallback: la urlCallback que se seteó al crear el proceso biométrico
  • user-agent: Información del dispositivo en el cual se resolvió el proceso de identificación

Registros faciales

El integrador podrá indexar rostros a su registro facial para posteriormente utilizar dicho registro en una validación biométrica.

Un rostro es indexado luego de un proceso de verificación biométrica exitoso, siempre y cuando el integrador haya establecido que dicho proceso de validación debe incluir dicho proceso. En otras palabras, el proceso de validación debe incluir el challenge register:face (ver Anexo 1).

La API /api/face_db de los registros faciales le permitirán al integrador realizar búsquedas en sus registros faciales, ver los detalles de cada registro (fecha de creación, token facial, entre otros), y también eliminar un registro facial.

Método GET

Este método le permite al integrador acceder a sus registros faciales para revisar los detalles de cada uno de estos. Una vez finalizado el proceso de verificación biométrica que instruye el indexado del rostro, este index es asociado al número de identificación del usuario final (ej.: DNI). En otras palabras, los registros faciales son una relación 1 a 1 entre los números de identificación y los usuarios finales.

Los parámetros opcionales que se pueden incluir en la búsqueda son los siguientes:

  • creation_start: el backend retornará solo aquellos registros faciales cuya fecha de creación sea mayor o igual a la establecida en este parámetro. La fecha debe ir en formato AAAAMMDDThh:mm:ss+00:00. Los últimos 6 caracteres del formato de la fecha corresponden a la zona horaria (GMT), por lo que deben ser reemplazados por la correspondiente al contexto del cliente.
  • creation_end: el backend retornará solo aquellos registros faciales cuya fecha de creación sea menor a la establecida en este parámetro. La fecha debe ir en formato AAAAMMDDThh:mm:ss+00:00. Los últimos 6 caracteres del formato de la fecha corresponden a la zona horaria (GMT), por lo que deben ser reemplazados por la correspondiente al contexto del cliente.
  • limit: Número máximo de registros faciales a reportar.
  • order: los registros faciales son ordenados según la fecha de creación. Este parámetro booleano permite que la búsqueda ocurra de mayor a menor fecha de creación (false) o viceversa (true). Es ignorado si se utiliza el parámetro per_id.
  • last_item: este parámetro corresponde a la representación json (string) del registro facial desde el cual se quiere realizar la búsqueda. Este parámetro es útil cuando la búsqueda realizada retorna más registros de los permitidos por el límite, por lo que, si dentro de los elementos retornados no se encuentra el deseado, un nuevo llamado para realizar la búsqueda conservando los parámetros, pero incluyendo este, permitirá hacer que la búsqueda sea realizada desde el last_item en adelante.
  • per_id: la búsqueda se podrá filtrar recogiendo sólo aquellos registros faciales asociados a DNIs que comiencen con el texto descrito con este parámetro. Sólo puede ser utilizado si se estableció el parámetro nat.
  • nat: Nacionalidad/contexto de identificación del número de identidad asociado al registro facial (para un DNI de Perú, este valor debe ser PER)

En base a los parámetros, el backend retornará una colección de registros faciales coincidentes con la búsqueda (completa o incompleta).

Ejemplo de solicitud:

Tipo de request:\ GET

Parámetros de la query (URL):

{
creation_start: "20230101T12:00:00+00:00",
nat: "PER",
per_id: 012345678,
last_item:{"id":"abcxyz"},
limit: 10
}

Ejemplo de respuesta (código 200):

Tipo de contenido:\ application/json

Body:

{
  "face_db": [
    {
      "date": "20230613T12:00:00+00:00",
      "nat": "PER",
      "per_id": "012345678",
      "face_id": " a1b2c3d4-a1b2-a1b2-a1b2-a1b2c3d4e5f6",
      "process_id": "98uy32h9u4irn"
    }
  ],
  "last_item": null
}

Propiedades de un registro facial

En la descripción anterior, se pueden observar las propiedades asociadas a cada registro facial. A continuación, se detalla el significado de cada una:

  • date: Fecha de creación del registro facial en formato AAAAMMDDThh:mm:ss+00:00.
  • process_id: ID del proceso de validación biométrico que instruyó el indexado del rostro.
  • per_id: Número de identidad (DNI) del usuario final cuyo rostro fue indexado al registro facial del integrador.
  • nat: nacionalidad/sistema de identificación correspondiente al número de identidad del usuario final cuyo rostro fue indexado al registro facial del integrador.
  • face_id: Token que representa el mapa facial del rostro indexado en el registro facial del integrador.

Método DELETE

Este método le permitirá al integrador eliminar un determinado rostro de su registro facial.

Los parámetros que se deben incluir en el body del request son los siguientes:

  • nat: Nacionalidad/sistema de identificación al que pertenece el número de identificación del usuario final cuyo registro facial será eliminado.
  • per_id: Número de identificación del usuario final cuyo registro facial será eliminado.

El sistema buscará y eliminará el registro facial perteneciente al ID usuario final determinado por el integrador, entregando un bool del resultado final de dicha operación (una respuesta positiva significa que la eliminación fue exitosa).

Ejemplo de solicitud:

Tipo de request:\ DELETE x-www-form-urlencoded

Headers:

  • Authorization: jwt-bearer aaa.bbb.ccc

Body:

{
per_id: "12345678",
nat: "PER"
}

Ejemplo de respuesta (código 200):

Tipo de contenido:\ raw/text

Body:\ ok

Registros de actividad

La API /api/logs permite al integrador poder consultar los registros de actividad de la cuenta. Estos registros se agrupan en distintas categorías, y se pueden filtrar por fecha, por resultado de actividad, entre otros.

Método GET

Este método le permitirá al integrador parametrizar la consulta de los registros de actividad. Como parámetro obligatorio, el integrador debe definir el tipo de registro de actividad que se quiere consultar mediante el parámetro group.

Los parámetros que se deben incluir en la query (URL) del request son los siguientes:

Parámetros generales

  • group (requerido): Define el tipo de registros que se retornan. Este parámetro puede tomar los valores "access_logs", "reniec", "img_logs", "urlcallback" o "telemetry". Ver más detalles en la sección Tipos de grupos de logs.
  • creation_start: El backend retornará solo aquellos registros de actividad cuya fecha de creación sea mayor o igual a la establecida en este parámetro. La fecha debe ir en formato AAAAMMDDThh:mm:ss+00:00. Los últimos 6 caracteres del formato de la fecha corresponden a la zona horaria (GMT), por lo que deben ser reemplazados por la correspondiente al contexto del cliente.
  • creation_end: El backend retornará solo aquellos registros de actividad cuya fecha de creación sea menor a la establecida en este parámetro. La fecha debe ir en formato AAAAMMDDThh:mm:ss+00:00. Los últimos 6 caracteres del formato de la fecha corresponden a la zona horaria (GMT), por lo que deben ser reemplazados por la correspondiente al contexto del cliente.
  • limit: Número máximo de registros a reportar. Debe ser un valor entre 0 y 100. El valor por defecto es 10. Si se especifica limit=0, la respuesta será un archivo CSV descargable en lugar de JSON.
  • order: Los registros son ordenados según la fecha de creación. Este parámetro booleano permite que la búsqueda ocurra de mayor a menor fecha de creación (false) o viceversa (true).
  • last_item: Este parámetro corresponde a la representación json (string) del registro desde el cual se quiere realizar la búsqueda. Este parámetro es útil cuando la búsqueda realizada retorna más registros de los permitidos por el límite, por lo que, si dentro de los elementos retornados no se encuentra el deseado, un nuevo llamado para realizar la búsqueda conservando los parámetros, pero incluyendo este, permitirá hacer que la búsqueda sea realizada desde el last_item en adelante.
  • result: El cliente podrá filtrar los registros de actividad por el resultado de la acción registrada. Este parámetro solo puede tomar los valores true o false.
  • tz: Zona horaria para formatear las fechas en la respuesta. Debe estar en formato "+HH:MM" o "-HH:MM" (por ejemplo: "-05:00" para Perú, "+03:00" para Arabia). Si no se especifica, las fechas se retornan en UTC.
  • error_text: Permite filtrar registros que contengan un texto específico en el campo msg (mensaje de error).

Parámetros específicos por grupo

  • client_id: Permite filtrar por un cliente específico. Aplica a los grupos access_logs e img_logs.
  • per_id: Permite filtrar por un identificador de persona específico. Aplica al grupo reniec.
  • process_id: Permite filtrar por un identificador de proceso específico. Aplica a los grupos img_logs, urlcallback y telemetry. Es requerido para los grupos urlcallback (cuando se consulta un proceso específico) y telemetry.

Tipos de grupos de logs

access_logs

Registra los intentos de autenticación y acceso a la API mediante tokens OAuth2.

Propósito: Auditoría de accesos autenticados (login) de los clientes del integrador.

Campos principales en la respuesta:

  • usr_id: Identificador del usuario propietario de la cuenta
  • client_id: Identificador del cliente OAuth2 que realizó el acceso
  • date: Fecha y hora del registro (formateada según el parámetro tz)
  • result: Booleano que indica si el acceso fue exitoso (true) o fallido (false)
  • msg: Mensaje descriptivo del resultado (ej: "ok", razón del fallo)
  • resolve_ip: Dirección IP del cliente que realizó la solicitud
  • user_agent: User agent del navegador/cliente

Parámetros de filtro aplicables: client_id, result


reniec

Registra las consultas realizadas al servicio RENIEC (Registro Nacional de Identificación y Estado Civil de Perú) para validación de documentos de identidad peruanos.

Propósito: Auditoría de validaciones de DNI contra la base de datos oficial de RENIEC.

Campos principales en la respuesta:

  • usr_id: Identificador del usuario propietario de la cuenta
  • per_id: Número de documento de identidad consultado
  • process_id: Identificador del proceso biométrico asociado
  • date: Fecha y hora del registro (formateada según el parámetro tz)
  • result: Booleano que indica si la consulta fue exitosa (true) o fallida (false)
  • msg: Mensaje descriptivo del resultado
  • description: Descripción adicional del proceso
  • fec_fin: Timestamp de finalización

Parámetros de filtro aplicables: per_id, result


img_logs

Registra el procesamiento de imágenes (selfies, documentos) durante los procesos de verificación biométrica.

Propósito: Trazabilidad del procesamiento de imágenes capturadas durante los flujos de verificación.

Campos principales en la respuesta:

  • usr_id: Identificador del usuario propietario de la cuenta
  • client_id: Identificador del cliente asociado
  • process_id: Identificador del proceso biométrico
  • date: Fecha y hora del registro (formateada según el parámetro tz)
  • email: Email asociado al proceso (si aplica)

Parámetros de filtro aplicables: client_id, process_id


urlcallback

Registra los errores ocurridos al intentar enviar notificaciones (webhooks) a las URLs de callback configuradas por el integrador.

Propósito: Depuración de problemas en la entrega de notificaciones asíncronas.

Campos principales en la respuesta:

  • usr_id: Identificador del usuario propietario de la cuenta
  • source_id / process_id: Identificador del proceso que generó el callback
  • date: Fecha y hora del registro
  • msg: Mensaje de error detallado

Parámetros de filtro aplicables: process_id (requerido para consultas específicas)

Nota
  • Únicamente se registran los casos en los que se presentó algún inconveniente durante el envío de la urlcallback.
  • Estos registros se conservan por un máximo de 35 días.
  • Cuando se consulta con process_id, se ignoran los filtros de fecha (creation_start, creation_end) y error_text, y el límite se fija automáticamente en 2 registros.

telemetry

Registra eventos de telemetría y métricas detalladas de los procesos de verificación biométrica.

Propósito: Análisis de rendimiento, seguimiento de eventos y depuración avanzada de procesos.

Campos principales en la respuesta:

  • process_id: Identificador del proceso (requerido para consultar este grupo)
  • date: Fecha y hora del evento
  • session_id: Identificador de la sesión
  • event_type: Tipo de evento registrado
  • interface_id: Identificador de la interfaz que generó el evento
  • event_data: Datos adicionales del evento en formato JSON

Parámetros de filtro aplicables: process_id (requerido)

Importante

El grupo telemetry requiere obligatoriamente el parámetro process_id. No es posible realizar consultas generales sin especificar un proceso.


Formato de respuesta

La API puede retornar los datos en dos formatos según el valor del parámetro limit:

Respuesta JSON (cuando limit > 0 o no especificado)

El backend retornará una colección de registros de actividad coincidentes con la búsqueda en formato JSON.

Estructura de la respuesta:

{
  "<nombre_del_grupo>": [
    { /* registro 1 */ },
    { /* registro 2 */ },
    ...
  ],
  "last_item": { /* objeto para paginación */ } | null
}
  • El campo con el nombre del grupo contiene el array de registros encontrados
  • last_item: Contiene el último elemento de la página actual. Si es null, indica que no hay más registros. Este valor debe usarse como parámetro last_item en la siguiente consulta para obtener la siguiente página.

Códigos de respuesta:

  • 200: Consulta exitosa, todos los resultados fueron retornados
  • 206: Consulta exitosa parcial, existen más resultados disponibles (usar last_item para continuar)
  • 404: No se encontraron registros que coincidan con los criterios de búsqueda

Respuesta CSV (cuando limit = 0)

Cuando se especifica limit=0, la respuesta es un archivo CSV descargable con todos los registros que coincidan con los criterios de búsqueda.

Campos incluidos según el grupo:

  • access_logs: client_id, date, result, msg
  • reniec: per_id, date, process_id, result, msg
  • img_logs: client_id, process_id, date, email
  • telemetry: process_id, date, session_id, event_type, interface_id, event_data

Ejemplos

Ejemplo 1: Consulta de registros RENIEC

Solicitud:

Tipo de request:\ GET

Parámetros de la query (URL):

{
  creation_start: "20230101T12:00:00+00:00",
  group: "reniec",
  last_item: {"usr_id":"abcxyz", "date":12345678},
  limit: 10
}

Respuesta (código 200):

Tipo de contenido:\ application/json

Body:

{
  "reniec": [
    {
      "date": "2024-05-31T22:21:11+00:00",
      "description": "abc",
      "fec_fin": 1717194074,
      "msg": "ok",
      "per_id": "12345678",
      "process_id": "abc.123.def",
      "result": true,
      "usr_id": "abc",
      "usr_idPer_id": "abc:12345678",
      "usr_idPer_idResult": "abc:12345678:True",
      "usr_idResult": "abc:True"
    }
  ],
  "last_item": null
}

Ejemplo 2: Consulta de registros de acceso por cliente

Solicitud:

Tipo de request:\ GET

Parámetros de la query (URL):

{
  group: "access_logs",
  client_id: "my_client_id_123",
  result: "true",
  limit: 20,
  tz: "-05:00"
}

Respuesta (código 200):

Tipo de contenido:\ application/json

Body:

{
  "access_logs": [
    {
      "usr_id": "user123",
      "client_id": "my_client_id_123",
      "date": "2024-05-31T17:21:11-05:00",
      "result": true,
      "msg": "ok",
      "resolve_ip": "192.168.1.100",
      "user_agent": "Mozilla/5.0...",
      "usr_idResult": "user123:True",
      "usr_idClient_id": "user123:my_client_id_123",
      "usr_idClient_idResult": "user123:my_client_id_123:True"
    }
  ],
  "last_item": null
}

Ejemplo 3: Consulta de telemetría de un proceso específico

Solicitud:

Tipo de request:\ GET

Parámetros de la query (URL):

{
  group: "telemetry",
  process_id: "proc_abc_123_def",
  limit: 50
}

Respuesta (código 200):

Tipo de contenido:\ application/json

Body:

{
  "telemetry": [
    {
      "process_id": "proc_abc_123_def",
      "date": "2024-05-31T22:21:11+00:00",
      "session_id": "sess_xyz_456",
      "event_type": "document_capture_completed",
      "interface_id": "webcam_interface_v1",
      "event_data": "{\"quality\": 0.95, \"duration_ms\": 1250}"
    }
  ],
  "last_item": null
}

Ejemplo 4: Descarga de registros en formato CSV

Solicitud:

Tipo de request:\ GET

Parámetros de la query (URL):

{
  group: "img_logs",
  client_id: "my_client_id_123",
  creation_start: "20240501T00:00:00+00:00",
  creation_end: "20240531T23:59:59+00:00",
  limit: 0
}

Respuesta (código 200):

Tipo de contenido:\ text/csv

Archivo descargado: query.csv

Contenido del archivo:

client_id,process_id,date,email
my_client_id_123,proc_001,2024-05-15T10:30:00+00:00,user@example.com
my_client_id_123,proc_002,2024-05-20T14:45:00+00:00,user2@example.com

Gestión de clientes

El sistema de biometría de TOC Perú permite al integrador gestionar clientes y roles para el control de acceso a los recursos del backend mediante APIs especializadas. Este sistema se basa en el protocolo OAuth 2.0 con tokens JWT, permitiendo una administración granular de permisos a través de scopes específicos.

La gestión de clientes se divide en dos componentes principales:

  • Roles: Conjuntos de permisos (scopes) que definen qué operaciones pueden realizarse
  • Credenciales de acceso (Clientes): Aplicaciones o usuarios que se autentican con roles asignados

El sistema proporciona trazabilidad completa de todas las operaciones realizadas, registrando quién creó y modificó cada recurso, así como las fechas correspondientes.

APIs de roles

La API /api/roles permite gestionar roles de usuario. Los roles definen conjuntos de scopes (permisos) que pueden asignarse a credenciales de acceso para controlar el acceso a los recursos del sistema.

Método GET

El integrador podrá acceder a sus roles mediante una llamada al endpoint /api/roles con el método GET. Sólo puede ser consumido con un token de acceso que incluya el scope roles:read. Este método retorna una lista paginada de roles del usuario autenticado.

Los parámetros opcionales que se pueden incluir en la búsqueda son los siguientes:

Parámetro Tipo Descripción
rol_nombre string Filtra roles que comiencen con un determinado texto
limit number Límite de resultados. Rango: 1-100. Valor por defecto: 10
last_item object Token de paginación para obtener la siguiente página de resultados

En base a los parámetros, el backend retornará una colección de roles coincidentes con la búsqueda (completa o incompleta).

Ejemplo de solicitud:

Tipo de request:\ GET

Headers:

  • Authorization: jwt-bearer aaa.bbb.ccc

Parámetros de la query (URL):

{
  rol_nombre: "admin",
  limit: 10
}

Ejemplo de respuesta (código 200):

Tipo de contenido:\ application/json

Body:

{
  "roles": [
    {
      "rol": "admin",
      "scopes": ["users:read", "users:write"],
      "description": "Rol administrativo",
      "fec_creado": "2023-01-01T00:00:00Z",
      "fec_editado": "2023-01-01T00:00:00Z",
      "created": "client_id_creador",
      "edited": "client_id_editor"
    }
  ],
  "last_item": {
    "usr_id": "123",
    "rol": "ultimo_rol"
  }
}

Ejemplo de respuesta (código 206):

Tipo de contenido:\ application/json

Body:

{
  "roles": [
    {
      "rol": "editor",
      "scopes": ["content:read", "content:write"],
      "description": "Rol editorial",
      "fec_creado": "2023-02-01T00:00:00Z",
      "fec_editado": "2023-02-01T00:00:00Z",
      "created": "client_id_creador",
      "edited": "client_id_editor"
    }
  ],
  "last_item": {
    "usr_id": "123",
    "rol": "editor"
  }
}

Nota: El código de respuesta 206 (Partial Content) indica que se devuelve una página de resultados y que existen más registros disponibles. El campo last_item contiene el token de paginación que debe incluirse en la siguiente solicitud para obtener la próxima página de resultados.

Propiedades de un rol

En la descripción anterior, se pueden observar las propiedades asociadas a cada rol. A continuación, se detalla el significado de cada una:

  • rol: Nombre del rol
  • scopes: Lista de permisos asignados al rol que determinan las operaciones permitidas
  • description: Descripción del rol
  • fec_creado: Fecha de creación del rol en formato ISO 8601
  • fec_editado: Fecha de última edición del rol en formato ISO 8601
  • created: Identificador del cliente que creó el rol
  • edited: Identificador del cliente que editó por última vez el rol

Método POST

El integrador podrá crear un nuevo rol o modificar uno existente mediante una llamada al endpoint /api/roles con el método POST. Sólo puede ser consumido con un token de acceso que incluya el scope roles:write.

Los parámetros que se deben incluir en el body del request son los siguientes:

Parámetro Tipo Requerido Descripción
rol_nombre string Nombre del rol. Máximo 128 caracteres. No puede ser root
scopes JSON Condicional Lista de scopes en formato JSON. Requerido si se está creando un rol o se desea modificar los scopes. Los scopes no pueden incluir root
description string Condicional Descripción del rol. Máximo 200 caracteres. Requerido si se está creando un rol o se desea modificar la descripción

Validaciones importantes:

  • Debe incluir al menos scopes o description además de rol_nombre
  • El parámetro scopes debe ser una lista válida en formato JSON
  • Los scopes asignados deben estar dentro de los scopes del cliente que hace la solicitud, excepto si el cliente tiene el scope security:escape_scopes
  • No puede ser utilizado para auto-modificar el cliente actual

Ejemplo de solicitud:

Tipo de request:\ POST x-www-form-urlencoded

Headers:

  • Authorization: jwt-bearer aaa.bbb.ccc
  • Content-Type: application/x-www-form-urlencoded

Body:

{
  rol_nombre: "editor",
  scopes: ["content:read", "content:write"],
  description: "Rol editorial"
}

Ejemplo de respuesta (código 200):

Tipo de contenido:\ text/plain

Body:\ ok

Ejemplo de respuesta (código 409):

Tipo de contenido:\ application/json

Body:

{
  "error": "Conflict",
  "message": "El rol está en uso y no puede ser modificado"
}

Nota: El código de respuesta 409 (Conflict) se devuelve cuando el rol que se intenta modificar está siendo utilizado activamente por algún cliente. No se puede modificar un rol en estas circunstancias para garantizar la integridad del sistema de permisos.

Método DELETE

El integrador podrá eliminar un rol existente mediante una llamada al endpoint /api/roles con el método DELETE. Sólo puede ser consumido con un token de acceso que incluya el scope roles:delete.

Los parámetros que se deben incluir en el body del request son los siguientes:

Parámetro Tipo Requerido Descripción
rol_nombre string Nombre del rol a eliminar. No puede ser root

Validaciones importantes:

  • No se permite eliminar el rol root del sistema
  • El rol no debe estar asignado a ningún cliente activo
  • El cliente debe tener todos los scopes del rol que intenta eliminar, a menos que tenga el scope security:escape_scopes

Ejemplo de solicitud:

Tipo de request:\ DELETE x-www-form-urlencoded

Headers:

  • Authorization: jwt-bearer aaa.bbb.ccc
  • Content-Type: application/x-www-form-urlencoded

Body:

{
  rol_nombre: "editor"
}

Ejemplo de respuesta (código 200):

Tipo de contenido:\ text/plain

Body:\ ok

Ejemplo de respuesta (código 409):

Tipo de contenido:\ application/json

Body:

{
  "error": "Conflict",
  "message": "El rol está en uso y no puede ser eliminado"
}

Nota: El código de respuesta 409 (Conflict) se devuelve cuando el rol que se intenta eliminar está asignado a uno o más clientes activos. Para eliminar el rol, primero debe removerse de todos los clientes que lo utilicen o dichos clientes deben ser eliminados.

APIs de credenciales de acceso

La API /api/clients permite gestionar credenciales de acceso (clientes OAuth) del integrador. Los clientes pueden ser de tipo bot (aplicaciones) o human (usuarios humanos). Cada cliente cuenta con un client_id y un client_secret que se utilizan para autenticarse con el sistema.

Método GET

El integrador podrá acceder a sus clientes mediante una llamada al endpoint /api/clients con el método GET. Sólo puede ser consumido con un token de acceso que incluya el scope clients:read. Este método retorna una lista paginada de clientes (credenciales de acceso).

Los parámetros opcionales que se pueden incluir en la búsqueda son los siguientes:

Parámetro Tipo Descripción
client_id string Filtra por identificador de cliente específico
client_name string Filtra clientes cuyo nombre comience con este texto
rol_nombre string Filtra clientes con roles que comiencen con este texto
given_name string Filtra por nombre de pila (solo para clientes tipo human)
family_name string Filtra por apellido (solo para clientes tipo human)
limit number Límite de resultados. Rango: 0-100. Valor por defecto: 10. Si es 0, devuelve todos los resultados en formato CSV
last_item object Token de paginación para obtener la siguiente página de resultados
order boolean Ordenamiento. true: ascendente, false: descendente

En base a los parámetros, el backend retornará una colección de clientes coincidentes con la búsqueda (completa o incompleta).

Ejemplo de solicitud:

Tipo de request:\ GET

Headers:

  • Authorization: jwt-bearer aaa.bbb.ccc

Parámetros de la query (URL):

{
  client_name: "mi_app",
  limit: 10,
  order: true
}

Ejemplo de respuesta (código 200):

Tipo de contenido:\ application/json

Body:

{
  "clients": [
    {
      "client_id": "a1b2c3d4",
      "client_name": "mi_app",
      "rol": "admin",
      "type": "bot",
      "active": true,
      "given_name": "Juan",
      "family_name": "Pérez",
      "fec_creado": "2023-01-01T00:00:00Z",
      "fec_exp": "2024-01-01T00:00:00Z"
    }
  ],
  "last_item": {
    "usr_id": "123",
    "client_id": "ultimo_cliente"
  }
}

Respuesta en formato CSV (cuando limit=0):

Tipo de contenido:\ text/csv

Archivo descargado: clients.csv

Contenido del archivo:

client_id,client_name,rol,type,active,given_name,family_name,fec_creado,fec_exp
a1b2c3d4,mi_app,admin,bot,true,,,2023-01-01T00:00:00Z,2024-01-01T00:00:00Z
b2c3d4e5,usuario_prueba,editor,human,true,Juan,Pérez,2023-02-01T00:00:00Z,2024-02-01T00:00:00Z

Propiedades de un cliente

En la descripción anterior, se pueden observar las propiedades asociadas a cada cliente. A continuación, se detalla el significado de cada una:

  • client_id: Identificador único del cliente generado automáticamente por el sistema
  • client_name: Nombre del cliente
  • rol: Rol asignado al cliente que determina sus permisos
  • type: Tipo de cliente. Puede ser bot (aplicación) o human (usuario humano)
  • active: Estado activo del cliente. true indica que el cliente puede autenticarse, false que está deshabilitado
  • given_name: Nombre de pila del usuario (solo aplicable para clientes tipo human)
  • family_name: Apellido del usuario (solo aplicable para clientes tipo human)
  • fec_creado: Fecha de creación del cliente en formato ISO 8601
  • fec_exp: Fecha de expiración del cliente en formato ISO 8601. Después de esta fecha, el cliente no podrá autenticarse

Método POST

El integrador podrá crear un nuevo cliente o modificar uno existente mediante una llamada al endpoint /api/clients con el método POST. Sólo puede ser consumido con un token de acceso que incluya el scope clients:write.

Los parámetros que se pueden incluir en el body del request son los siguientes:

Parámetro Tipo Requerido Descripción
client_name string Condicional Nombre del cliente. Obligatorio para creación
rol_nombre string Condicional Nombre del rol a asignar. Obligatorio para creación
type string Condicional Tipo de cliente: bot o human. Obligatorio para creación
given_name string No Nombre de pila del cliente (recomendado para tipo human)
family_name string No Apellido del cliente (recomendado para tipo human)
password_reset string No Si es true, restablece el client_secret del cliente
franja_cron string No Expresión cron para definir franja horaria permitida de acceso
franja_duration string No Duración de la franja horaria en segundos
active_switch string No Cambia estado activo. Valores: true o false
active_switch_undo_date string No Fecha para revertir automáticamente el cambio de estado (formato ISO 8601)
expires string No Fecha de expiración del cliente (formato ISO 8601)

Validaciones importantes:

  • Para crear un cliente: son obligatorios client_name, rol_nombre y type
  • Para modificar un cliente: al menos un parámetro debe ser proporcionado además del client_name
  • Los tipos válidos son únicamente bot o human
  • El cliente debe tener suficientes scopes para asignar el rol especificado
  • No puede ser utilizado para auto-modificar el cliente actual
  • El formato de las fechas debe ser ISO 8601

Ejemplo de solicitud (crear cliente):

Tipo de request:\ POST x-www-form-urlencoded

Headers:

  • Authorization: jwt-bearer aaa.bbb.ccc
  • Content-Type: application/x-www-form-urlencoded

Body:

{
  client_name: "mi_app",
  rol_nombre: "editor",
  type: "bot"
}

Ejemplo de respuesta (código 200 - creación exitosa):

Tipo de contenido:\ application/json

Body:

{
  "client_id": "a1b2c3d4",
  "client_secret": "nuevo_secret_generado",
  "client_name": "mi_app"
}

Nota importante: El client_secret solo se devuelve al crear un nuevo cliente o al usar password_reset=true. Este valor debe guardarse de forma segura, ya que es la credencial que se utilizará junto con el client_id para autenticarse. No será posible recuperarlo posteriormente.

Ejemplo de solicitud (modificar cliente):

Tipo de request:\ POST x-www-form-urlencoded

Headers:

  • Authorization: jwt-bearer aaa.bbb.ccc
  • Content-Type: application/x-www-form-urlencoded

Body:

{
  client_name: "mi_app",
  rol_nombre: "admin",
  expires: "2025-12-31T23:59:59Z"
}

Ejemplo de respuesta (código 200 - modificación exitosa):

Tipo de contenido:\ text/plain

Body:\ ok

Método DELETE

El integrador podrá eliminar un cliente existente mediante una llamada al endpoint /api/clients con el método DELETE. Sólo puede ser consumido con un token de acceso que incluya el scope clients:write.

Los parámetros que se deben incluir en el body del request son los siguientes:

Parámetro Tipo Requerido Descripción
client_name string Nombre del cliente a eliminar

Validaciones importantes:

  • Un cliente no se puede eliminar a sí mismo (auto-eliminación prohibida)
  • No se puede eliminar un cliente con rol root
  • El cliente debe tener todos los scopes del rol del cliente a eliminar, a menos que tenga el scope security:escape_scopes

Ejemplo de solicitud:

Tipo de request:\ DELETE x-www-form-urlencoded

Headers:

  • Authorization: jwt-bearer aaa.bbb.ccc
  • Content-Type: application/x-www-form-urlencoded

Body:

{
  client_name: "mi_app"
}

Ejemplo de respuesta (código 200):

Tipo de contenido:\ text/plain

Body:\ ok

Ejemplo de respuesta (código 403):

Tipo de contenido:\ application/json

Body:

{
  "error": "Forbidden",
  "message": "No se permite la auto-eliminación del cliente actual"
}

Anexo 1

Tipos de validaciones:

Como se definió anteriormente, el integrador podrá definir qué validaciones se harán sobre los datos de la persona a identificar en cada proceso de validación. Si bien con esto se busca entregar un mayor control al integrador, en el Anexo 2 entregamos una serie de recomendaciones a seguir para robustecer una validación de identidad usando combinaciones de estas validaciones.

  • liveness:selfie: Esta validación implica que la persona a identificar deberá tomarse una selfie, la cual posteriormente será analizada en una prueba de vida, corroborando (según un umbral) que dicha foto no corresponda a un ataque fraudulento (imagen tomada de una pantalla o foto impresa).
  • liveness:doc:front: Esta validación implica que la persona a identificar deberá tomar una foto a la parte frontal de su documento de identidad, para posteriormente ser analizada en una prueba de fraude, corroborando así (según un umbral) que dicha foto no corresponda a un documento fraudulento (imagen tomada de una pantalla, documento impreso, adulteración de foto de perfil)
  • liveness:doc:back: Esta validación implica que la persona a identificar deberá tomar una foto a la parte trasera de su documento de identidad, para posteriormente ser analizada en una prueba de fraude, corroborando así (según un umbral) que dicha foto no corresponda a un documento fraudulento (imagen tomada de una pantalla, documento impreso, adulteración de foto de perfil)
  • match:ocr:id: Esta validación implica que la persona a identificar deberá tomar una foto a la parte frontal de su documento de identidad, para posteriormente extraer los datos de dicho documento y comprobar que la identidad definida en este coincida con la identidad definida en el proceso de validación.
  • match:mrz:id: Esta validación implica que la persona a identificar deberá tomar una foto de la parte frontal de su documento de identidad, para posteriormente extraer el código MRZ de dicho documento y comprobar que estos coincidan con la identidad definida en el proceso de validación. Este tipo de validación tiene una tasa de falsos negativos menor que match:ocr:id, pero sólo puede ser utilizada en documentos que cuenten con un código MRZ.
  • match:portrait:selfie: Esta validación implica que la persona a identificar deberá tomarse una selfie junto con una foto de la parte de su documento de identidad que contenga la foto de perfil. Posteriormente, se extraerá la foto de perfil desde el documento y se comparará con la selfie mencionada, corroborando así (según un umbral) que ambas sean coincidentes (match facial).
  • match:db:selfie: Esta validación implica que la persona a identificar deberá tomarse una selfie, la cual posteriormente será contrastada con la base de datos de indexación de rostros dentro del contexto del integrador, corroborando así (según un umbral) que haya una coincidencia entre los rostros de ambas fuentes. Es necesario que el rostro de la persona a identificar haya sido previamente indexado a la base de datos dentro del contexto del integrador.
  • match:ocr:reniec: Esta validación implica que la persona a identificar deberá tomar una foto de la parte frontal de su documento de identidad, para posteriormente extraer los datos de dicho documento y comprobar que estos coincidan con los datos obtenidos de una consulta a RENIEC de la ficha de la persona a identificar. El integrador deberá contar con una trama en RENIEC, con TOC como proveedor de tecnología para realizar la conexión.
  • match:mrz:reniec: Esta validación implica que la persona a identificar deberá tomar una foto de la parte frontal de su documento de identidad, para posteriormente extraer el código MRZ de dicho documento y comprobar que estos coincidan con los datos obtenidos de una consulta a RENIEC de la ficha de la persona a identificar. El integrador deberá contar con una trama en RENIEC, con TOC como proveedor de tecnología para realizar la conexión. Este tipo de validación tiene una tasa de falsos negativos menor que match:ocr:reniec, pero sólo puede ser utilizada en documentos que cuenten con un código MRZ.
  • match:selfie:reniec: Esta validación implica que la persona a identificar deberá tomarse una selfie, la cual posteriormente será contrastada con la foto de perfil obtenida de una consulta a RENIEC de la ficha de la persona a identificar, comprobando así (según un umbral) que haya una coincidencia entre los rostros de ambas fuentes. El integrador deberá contar con una trama en RENIEC, con TOC como proveedor de tecnología para realizar la conexión.
  • register:face: Esta validación implica que la persona a identificar se deberá tomar una selfie y el proceso deberá contar con el ID de la persona a identificar. Con estos datos, el sistema realizará una indexación en la base de datos del rostro de la persona en el contexto del integrador, quedando registrada para posteriores comprobaciones contra dicha base de datos de rostros indexados por parte del integrador. El registro facial debe ir acompañado de un liveness:selfie.
  • match:pinfo:reniec:gname: La validación permitirá validar los nombres de la persona a identificar que esta misma haya entregado (o entregados por el integrador) contra RENIEC. El integrador deberá contar con una trama en RENIEC, con TOC como proveedor de tecnología para realizar la consulta a dicha fuente.
  • match:pinfo:reniec:fname: La validación permitirá validar los apellidos de la persona a identificar que esta misma haya entregado (o entregados por el integrador) contra RENIEC. El integrador deberá contar con una trama en RENIEC, con TOC como proveedor de tecnología para realizar la consulta a dicha fuente.

Anexo 2

Recomendaciones en la definición de las validaciones

Si bien TOC entrega la flexibilidad para que el integrador personalice las validaciones de los datos de una persona a identificar, recomendamos fuertemente seguir las siguientes indicaciones para dar seguridad a los procesos de validación:

  • Coincidencias entre rostros: Si dentro de las comprobaciones definidas por el integrador se utiliza alguna que involucre un contraste entre la selfie tomada por la persona a identificar y el rostro obtenido desde alguna otra fuente, recomendamos usar dicha validación en conjunto con la validación de prueba de vida de la selfie. De esta manera, el integrador podrá tener mayor certeza de la veracidad de la selfie entregada por la persona a identificar. Ejemplo: ["match:db:selfie", "liveness:selfie"]

  • Coincidencias contra datos presentes en el documento de identidad: Si dentro de las comprobaciones definidas por el integrador se utiliza alguna que involucre un contraste entre los datos obtenidos del documento de identidad de la persona a identificar y los datos obtenidos desde alguna otra fuente, recomendamos usar dicha validación en conjunto con la validación de fraude de documento de identidad. De esta manera, el integrador podrá tener mayor certeza de la veracidad de la foto del documento entregada por la persona a identificar. Ejemplo: ["match:ocr:id", "liveness:doc:front"]

Anexo 3

Flujo de datos biométricos entregados

Los datos de un flujo biométrico se entregan de 3 maneras: URL Callback, función callback de SDK, e historial de procesos de identificación. Tanto en la URL callback como en la función callback de SDK se entregan los datos completos de la biometría (esto es, resultado de validación junto a las imágenes capturadas), mientras que los datos entregados por el historial de procesos de identificación (GET a la API /api/id_process) sólo entrega los resultados de la biometría (sin las imágenes capturadas).

graph TD;
    A[URL callback / SDK] --> B[Resultado];
    A --> C[Imágenes capturadas];
    D[Historial] --> B;
## Mensajes de Error Cuando se entrega el resultado biométrico al integrador, la propiedad msg proporciona el motivo del error. Los mensajes de error se agrupan en dos categorías principales: "Procesos Biométricos No Superados" y "Procesos Biométricos No Finalizados". ### Identificación No Superada Estos mensajes indican que la validación biométrica no resultó positiva debido a que uno o varios `challenges` de identificación no se superaron en los intentos permitidos por el integrador. Ejemplo 1: >
{
  msg: "failed challenges"
}
???+ note "Nota" Este mensaje se puede visualizar al obtener la información mediante el método GET en el endpoint `/api/id_process` o mediante el POST enviado a la urlCallback especificada en el momento de al crear el proceso biométrico. Ejemplo 2: >
{
  msg: "Max_tries_exceeded"
}
???+ note "Nota" Este mensaje se muestra en el front-end cuando se agotan todos los intentos permitidos por el integrador. Los diferentes tipos de `challenges` se describen en [Anexo 1](#anexo-1). ### Procesos de Identificación No Finalizados Estos mensajes se devuelven cuando el proceso de identificación no fue iniciado por la persona o expiró sin concluir todos los `challenges` del proceso biométrico. Ejemplo: >
{
  msg: "expired"
}
## Colección Postman - API de Biometría ### Descripción Se proporciona una colección de Postman que contiene todos los endpoints disponibles del API de Biometría. Esta colección le permitirá probar y validar las diferentes funcionalidades antes de realizar su integración. ???+ tip "Nota" Sugerimos validar el comportamiento de la aplicación utilizando esta colección de Postman. Esto ayudará a identificar si cualquier posible incidencia está relacionada con su implementación o con el servicio. ### Recursos Disponibles [:octicons-download-16:{ .download } Descargar Colección Postman](assets/postman/api_biometria.json){ .md-button download="biometria-postman-collection.json"} ???+ warning "Nota" Por favor, revise detenidamente la sección de "Recomendaciones" que se encuentra a continuación antes de comenzar a integrar. ## Recomendaciones ### UrlCallback Se recomienda verificar los siguientes puntos para asegurar el correcto funcionamiento en su integración: - **Firewall o Proxy:** Si está utilizando un firewall o proxy, verifique que no se esté generando un bloqueo de tráfico debido a reglas de seguridad que impidan que las solicitudes `POST` lleguen a su servicio. - **Políticas CORS:** Si ha configurado políticas CORS en el endpoint establecido como `urlCallback`, asegúrese de que estas políticas permitan realizar solicitudes `POST` hacia la `urlCallback` establecida. - **Limitaciones de recepción:** Si su `urlCallback` está diseñado para recibir únicamente ciertos tipos de información con una estructura o tamaño específico, esto podría estar causando que solicitudes `POST` no sean aceptadas. ### Número de intentos Es recomendable configurar hasta 3 (`max_tries: 3`) ([método PUT](#metodo-put)) intentos para disminuir la probabilidad de error humano por parte del usuario (por iluminación deficiente, cámara movida, ingreso incompleto de datos etc) ???+ success "Importante" Configurar esta característica aumenta la probabilidad de completar el flujo exitosamente. ### Uso de la cámara Para los procesos que incluyan desafíos de captura o escaneo de documentos de identidad, se recomienda: 1. **Evitar el uso de cámaras web**, ya que estas cámaras suelen carecer de autofoco, lo que dificulta un registro correcto. 2. Si el usuario final emplea una cámara web, es recomendable notificarle que debe usar un dispositivo móvil mediante un mensaje emergente o similar. 3. Alternativamente, puede proporcionarse un código QR que permita al usuario continuar el proceso desde un dispositivo móvil. ???+ warning "Importante" No seguir estas recomendaciones puede aumentar significativamente el porcentaje de procesos negativos o expirados. ### Ejecución de la creación del proceso biométrico Los procesos biométricos deben enviarse a los usuarios **sin forzar su inicio**. La creación e inicio del proceso debe ocurrir en el momento en que el usuario interactúa con el enlace o botón correspondiente. Si el proceso se crea e inicia automáticamente antes de que el usuario lo abra, existe el riesgo de que este haya expirado cuando el usuario intente completarlo. ???+ warning "Importante" No seguir estas recomendaciones puede aumentar significativamente el porcentaje de procesos negativos o expirados. ### Reutilización de Procesos Biométricos Activos Se recomienda que, en caso de que el sistema del integrador permita acciones como retroceder, actualizar la página, salir, o cualquier otra que pueda resultar en la creación de un nuevo proceso biométrico por parte del cliente final, el sistema del integrador pueda verificar previamente si el cliente ya cuenta con un proceso biométrico activo. Si existe un proceso biométrico activo, este debe ser reutilizado en lugar de crear uno nuevo. ???+ warning "Importante" La emisión sucesiva de varios procesos biométricos para un mismo usuario provocará que solo uno de esos procesos (el último) sea utilizado. Los procesos no utilizados expirarán y causarán distorsiones en la estadística de uso del sistema. ### Obtención de los resultados biométricos Se recomienda que los resultados biométricos se obtengan a través de la `urlCallback` ([método PUT](#metodo-put)) o mediante la [API GET](#metodo-get). ???+ warning "Importante" No se deben obtener resultados desde el front end, ya que esto puede generar riesgos de seguridad de la información. ### Integración mediante sdk. Para garantizar una integración correcta, se debe usar el **SDK específico para el sistema operativo correspondiente**: - **Android:** [Documentación SDK Android](android.md) - **iOS:** [Documentación SDK iOS](ios.md) - **Web:** [Documentación SDK Web](js.md) ???+ warning "Importante" Recomendamos considerar que los SDKs están diseñados específicamente para garantizar integraciones fluidas y sin problemas con nuestros servicios para los sistemas operativos Android, iOS y los entornos web. TOC no puede dar soporte a integraciones que usen métodos alternativos a los recomendados.