Saltar al contenido principal

Carga de un perfil en Compliance

En esta sección se describe el proceso para cargar y consultar perfiles de compliance mediante la API de The Sheriff.

Detalle API

  • URL: /webhook/loadProfile
  • Método: POST

Headers requeridos

Content-Type: application/json​
Authorization: Bearer {tu-token}

Ejemplo de solicitud

curl -X 'POST' \
'https://prod.api.thesheriff.cl/api/v1/webhook/loadProfile' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9EjemploDeToken123' \
-H 'x-client-identifier: SheriffSecureClient-v1'

Cuerpo de la solicitud

{
"fullName": "String (obligatorio, si es persona jurídica debe tener mínimo una palabra con 3 caracteres, mientras que si es persona natural debe tener mínimo un nombre y un apellido, es decir, al menos dos palabras.)",
"isMonitoring": "Boolean (obligatorio, debe ser true o false)",
"isJuridicalPerson": "Boolean (obligatorio, use true para persona jurídica o false para persona natural)",
"searchErrors": "Integer (obligatorio, valores permitidos: 0, 1, 2). El valor 0 indica búsqueda más precisa, mientras que 1 y 2 ofrecen búsquedas más flexibles con sugerencias de nombres parecidos."
}

Ejemplos

Ejemplo 1
{
"fullName": "Sheriff SPA",
"isMonitoring": true,
"isJuridicalPerson": true,
"searchErrors": 0
}
Ejemplo 2
{
"fullName": "Juan Sebastián Pérez García",
"isMonitoring": true,
"isJuridicalPerson": false,
"searchErrors": 1
}

Configurar un Webhook para la respuesta

El proceso de respuesta se realizará mediante un webhook proporcionado por el cliente con método POST al cual Sheriff enviará los resultados.

Requisitos del Webhook:
  1. Soporte para gzip:

    • El webhook debe aceptar datos comprimidos en formato gzip, ya que Sheriff enviará las respuestas con este formato.
    • Esto se indicará mediante el header: Content-Encoding: gzip.
    • Configuración: Asegúrese de que su servidor esté preparado para recibir y descomprimir solicitudes con este header. Esto puede requerir middleware o configuraciones adicionales según el framework que utilice.
  2. Opciones de Autenticación: Sheriff permitirá distintas formas de autenticación, más abajo se ve en detalle cómo serán los headers enviados según el método de autenticación que elijan.

  3. El cliente debe proporcionar a Sheriff el método de autenticación preferido y las credenciales correspondientes al registrar el webhook.

  4. Headers Enviados por Sheriff al Webhook:

  • Content-Type: application/json
  • Content-Encoding: gzip
  • Dependiendo del método de autenticación elegido:
    • Bearer Token: Authorization: Bearer {TOKEN_INTEGRATION}
    • Otros…
  1. Recepción del Payload: El cuerpo de la solicitud será un archivo JSON comprimido con gzip, que deberá ser descomprimido para acceder a los datos.

Categorías de búsqueda

El servidor de Sheriff procesará la solicitud del cliente y buscará coincidencias en las siguientes categorías:

  • Malla Societaria
  • PEP Chile
  • Familiares PEP
  • Listas Internacionales
  • Penal
  • Noticias

Observaciones Adicionales

  1. Plataforma Espejo:
    • Los perfiles cargados a través de la API estarán disponibles también en la plataforma:
      • Consulta: Visible por 48 horas.
      • Monitoreo: Visible hasta ser eliminado.
  2. Perfiles Existentes:
    • Si realiza una búsqueda de un perfil ya activo, los resultados se mostrarán sin costo adicional, siempre que las siguientes variables coincidan exactamente:
      • fullName
      • searchErrors
      • personType
  3. Optimización de Payload:
    • Sheriff enviará las respuestas al webhook en formato JSON comprimido (gzip) para optimizar la transferencia de datos. Es responsabilidad del cliente asegurarse de que su servidor pueda descomprimir este contenido.

Ejemplo respuesta inicial

{
"success": true,
"data": {
"message": "Su solicitud ha sido recibida y está siendo procesada",
"webhookId": 1
}
}

Una vez aceptada la solicitud, el procesamiento se realiza de forma asincrónica y se notificará el resultado a través del webhook configurado. Todas las respuestas al webhook incluirán al menos estos tres campos:

  • status: puede ser "SUCCESS" o "FAILED"
  • webhookId: el mismo ID entregado en la respuesta inicial
  • fullName: el nombre completo del perfil procesado

La estructura completa del mensaje enviado al webhook dependerá de si el procesamiento total del perfil se realiza con éxito o falla. A continuación se detallan las estructuras de respuesta correspondientes para los estados "FAILED" (Revisar Manejo de errores) y "SUCCESS" (Revisar Formato de la respuesta sin coincidencias o Formato completo de la respuesta)

Manejo de errores

Durante el flujo completo de una solicitud, pueden presentarse dos tipos de errores distintos:

  1. Errores en la Solicitud Inicial (sincrónicos)

    Estos errores ocurren antes de aceptar la solicitud para procesamiento. En estos casos, la API no retornará un webhookId y responderá directamente con un error HTTP y un cuerpo JSON con detalles.

    Errores comunes:

    • No se encontró el token de autenticación.
    • No tienes permiso para cargar perfiles de compliance por API.
    • Esta corporación no tiene permiso para cargar perfiles de compliance por API.
    • Parámetros obligatorios faltantes o inválidos (por ejemplo, fullName debe tener al menos 3 caracteres).
    • El perfil ya está activo en compliance.
  2. Errores en el Procesamiento Asincrónico

    Si la solicitud inicial fue aceptada correctamente (respuesta con webhookId), la API procesará la solicitud en segundo plano. Si ocurre un error en esta etapa, el cliente será notificado mediante un POST al webhook configurado, con el siguiente formato:

    {
    "webhookId": Number ("Igual al webhookId enviado en la respuesta inicial"),
    "status": String ("FAILED"),
    "error": String
    "details": String
    "fullName": String
    }

    Ejemplo:

    {
    "webhookId": 1,,
    "status": "FAILED",
    "error": "Error al procesar el perfil: JUAN PEREZ",
    "details": "500 - Internal Server Error",
    "fullName": "JUAN PEREZ"
    }

    Asegúrate de que tu servidor pueda manejar tanto los errores sincrónicos como las notificaciones asincrónicas de error para gestionar correctamente el ciclo de vida de las solicitudes.

Formato de la respuesta sin coincidencias

{
"webhookId": Number ("Igual al webhookId enviado en la respuesta inicial"),
"estado": String ("SUCCESS"),
"nombreCompleto": String,
"tipPersona": String ("natural" o "juridical"),
"toleranciaBusqueda": Integer (0, 1 o 2),
"esPerfilNuevo": Boolean,
"resumen": {
"pepChileFamiliares": {
"totalResults": Integer,
"riesgo": String ("free", "medium" o "critical")
},
"pepChile": {
"totalResults": Integer,
"riesgo": String ("free", "medium" o "critical")
},
"funcionariosPublicos": {
"totalResultados": 0,
"riesgo": "free"
},
"listasInternacionales": {
"totalResults": Integer,
"riesgo": String ("free", "medium" o "critical")
},
"penal": {
"totalResults": Integer,
"riesgo": String ("free", "medium" o "critical")
},
"mallaSocietaria": {
"totalResults": Integer,
"riesgo": NULL
},
"noticias": {
"totalResults": Integer,
"riesgo": NULL
}
},
"riesgo": String ("free", "medium" o "critical"),
"datosMallaSocietaria": [],
"totalMallaSocietaria": 0,
"datosPepChile": [],
"totalPepChile": 0,
"datosFuncionarioPublico": [],
"totalFuncionarioPublico": 0,
"datosFamiliarPep": [],
"totalFamiliarPep": 0,
"datosListasInternacionales": [],
"totalListasInternacionales": 0,
"datosPenal": [],
"totalPenal": 0,
"datosNoticias": [],
"totalNoticias": 0
}

Formato completo de la respuesta

{
"webhookId": Number ("Igual al webhookId enviado en la respuesta inicial"),
"estado": String ("SUCCESS"),
"nombreCompleto": String,
"tipPersona": String (natural o juridical),
"toleranciaBusqueda": Number (0, 1 o 2),
"esPerfilNuevo": Boolean,
"resumen": {
"pepChileFamiliares": {
"totalResultados": Number,
"riesgo": String ("free", "medium" o "critical")
},
"pepChile": {
"totalResultados": Number,
"riesgo": String ("free", "medium" o "critical")
},
"funcionariosPublicos": {
"totalResultados": 0,
"riesgo": "free"
},
"listasInternacionales": {
"totalResultados": Number,
"riesgo": String ("free", "medium" o "critical")
},
"penal": {
"totalResultados": Number,
"riesgo": String ("free", "medium" o "critical")
},
"mallaSocietaria": {
"totalResultados": Number,
"riesgo": NULL
},
"noticias": {
"totalResultados": Number,
"riesgo": NULL
}
},
"riesgo": String ("free", "medium" o "critical"),
"datosMallaSocietaria": [
{
"nombreSociedad": String,
"rutSociedad": String o NULL,
"fecha": String o NULL,
"socios": [
{
"nombre": String,
"rut": String o NULL,
"domicilio": String o NULL,
"tipoDeParticipacion": String,
"cargo": String o NULL,
"cargoEjecutivoPrincipal": String o NULL,
"fechaNombramiento": String o NULL,
"porcentajeParticipacion": String o NULL
}
],
"extractos": [
{
"actuacion": String,
"fecha": String,
"linkPdf": String o NULL
}
],
"ultimaFecha": String o NULL,
"societiesParticipant": Array o NULL,
"source": String
}
],
"totalMallaSocietaria": Number,
"datosPepChile": [
{
"name": String,
"position": String,
"institution": String,
"period": String o NULL
}
],
"totalPepChile": Number,
"datosFuncionarioPublico": [
{
"name": String,
"position": String,
"institution": String,
"link": String o NULL,
"period": String o NULL,
"relationsData": [
{
"nombre": String,
"parentesco": String
}
]
}
],
"totalFuncionarioPublico": Number,
"datosFamiliarPep": [
{
"name": String,
"position": String,
"institution": String,
"link": String o NULL,
"period": String o NULL,
"isPep": Boolean,
"relationsData": [
{
"nombre": String,
"parentesco": String
}
]
}
],
"totalFamiliarPep": Number,
"datosListasInternacionales": [
{
"name": String,
"list": String,
"link": String o NULL
}
],
"totalListasInternacionales": Number,
"dataPenal": [
{
"name": String,
"posture": String,
"role": String,
"date": String,
"infraction": String,
"status": String,
"stage": String,
"litigants": [
{
"nombre": String,
"sujeto": String,
"situacionLibertad": String o NULL
}
],
"matter": String,
"tribunal": String,
"isDenounced": Boolean
}
],
"totalPenal": Number,
"datosNoticias": [
{
"name": String,
"title": String,
"source": String,
"link": String,
"sourceLink": String,
"topic": [
String
],
"period": String
}
],
"totalNoticias": Number
}

A continuación se describen los campos devueltos en la respuesta JSON del webhook (estado SUCCESS).

CampoTipoDescripción
webhookIdNumberIdentificador del webhook (igual al entregado en la respuesta inicial)
estadoStringEstado del procesamiento
nombreCompletoStringNombre completo del perfil procesado
tipPersonaStringTipo de persona evaluada
toleranciaBusquedaNumberNivel de tolerancia aplicado en la búsqueda
esPerfilNuevoBooleanIndica si el perfil es nuevo en el sistema
resumenObjectResumen por categorías con conteos y nivel de riesgo
riesgoStringRiesgo agregado del perfil
datosMallaSocietariaArrayLista de sociedades relacionadas encontradas
totalMallaSocietariaNumberTotal de resultados en malla societaria
datosPepChileArrayResultados PEP Chile
totalPepChileNumberTotal resultados PEP Chile
datosFuncionarioPublicoArrayResultados funcionarios públicos
totalFuncionarioPublicoNumberTotal resultados funcionarios públicos
datosFamiliarPepArrayResultados familiares de PEP
totalFamiliarPepNumberTotal resultados familiares PEP
datosListasInternacionalesArrayResultados en listas internacionales
totalListasInternacionalesNumberTotal en listas internacionales
dataPenalArrayResultados penales
totalPenalNumberTotal resultados penales
datosNoticiasArrayResultados en noticias
totalNoticiasNumberTotal resultados noticias

Estructura de resumen:

CampoTipoDescripción
pepChileFamiliaresObjectResumen de resultados de PEP Chile y familiares (ver subtabla)
pepChileObjectResumen de PEP Chile (ver subtabla)
funcionariosPublicosObjectResumen funcionarios públicos — por defecto: { totalResultados: 0, riesgo: "free" }
listasInternacionalesObjectResumen listas internacionales (ver subtabla)
penalObjectResumen causas penales (ver subtabla)
mallaSocietariaObjectResumen malla societaria — { totalResultados: Number, riesgo: null }
noticiasObjectResumen noticias — { totalResultados: Number, riesgo: null }

Subestructura:

CampoTipoDescripción
totalResultadosNumberConteo de resultados en la categoría (Entero >= 0)
riesgoStringNivel de riesgo para la categoría ("free", "medium", "critical" o NULL cuando no aplica)

Estructura de datosMallaSocietaria:

CampoTipoDescripción
nombreSociedadStringNombre de la sociedad encontrada
rutSociedadStringRUT de la sociedad (formato "12345678-9") o NULL
fechaStringFecha asociada o NULL
sociosArrayLista de socios (ver subestructura)
extractosArrayExtractos / actos relacionados (ver subestructura)
ultimaFechaStringÚltima fecha conocida o NULL
societiesParticipantArray or NULLLista de sociedades participantes o NULL
sourceStringFuente del dato

Subestructura socios[]:

CampoTipoDescripción
nombreStringNombre del socio
rutStringRUT del socio o NULL
domicilioStringDomicilio registrado o NULL
tipoDeParticipacionStringTipo de participación (p.ej: "accionista")
cargoStringCargo declarado o NULL
cargoEjecutivoPrincipalStringCargo ejecutivo principal o NULL
fechaNombramientoStringFecha de nombramiento o NULL
porcentajeParticipacionStringPorcentaje (cadena) o NULL

Subestructura extractos[]:

CampoTipoDescripción
actuacionStringTipo de actuación (p.ej: "MODIFICACIÓN")
fechaStringFecha del extracto
linkPdfStringURL al PDF o NULL

Estructura de datosPepChile:

CampoTipoDescripción
nombreStringNombre completo
cargoStringCargo o posición
institucionStringInstitución asociada
periodoStringPeríodo (p.ej: "2018-2020") o NULL

Estructura de datosFuncionarioPublico:

CampoTipoDescripción
nombreStringNombre completo
cargoStringCargo
institucionStringInstitución
enlaceStringURL relacionada o NULL
periodoStringPeríodo o NULL
relationsDataArrayRelaciones relevantes (ver subestructura)

Subestructura relationsData[]:

CampoTipoDescripción
nombreStringNombre de la relación
parentescoStringParentesco

Estructura de datosFamiliarPep:

CampoTipoDescripción
nombreStringNombre completo
cargoStringCargo (si aplica)
institucionStringInstitución (si aplica)
enlaceStringURL o NULL
periodoStringPeríodo o NULL
isPepBooleanIndica si la persona es PEP
relationsDataArrayRelaciones (ver arriba)

Estructura de datosListasInternacionales:

CampoTipoDescripción
nombreStringNombre en la lista
listaStringNombre de la lista internacional
enlaceStringLink al registro o NULL

Estructura de dataPenal:

CampoTipoDescripción
nombreStringNombre involucrado
posturaStringPostura procesal
rolStringRol en la causa
fechaStringFecha relevante
infraccionStringInfracción o delito descrito
estadoStringEstado del proceso
etapaStringEtapa procesal
litigantesArrayListado de litigantes (ver subestructura)
materiaStringMateria del proceso
tribunalStringTribunal asociado
esDenunciadoBooleanIndica si existe una denuncia

Subestructura litigantes[]:

CampoTipoDescripción
nombreStringNombre del litigante
sujetoStringSujeto o rol en la causa
situacionLibertadStringSituación de libertad o NULL

Estructura de datosNoticias:

CampoTipoDescripción
nombreStringNombre relevante en la noticia
tituloStringTítulo de la noticia
fuenteStringFuente o medio
enlaceStringURL de la noticia
enlaceFuenteStringURL de la fuente
temaArrayLista de temas/tópicos
periodoStringPeríodo o fecha

Nota: En general los campos marcados como "No" pueden no estar presentes o ser null dependiendo de la disponibilidad de datos en la fuente. Los campos de tipo "Array" suelen devolverse como listas vacías cuando no hay resultados.