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
{
"fullName": "Sheriff SPA",
"isMonitoring": true,
"isJuridicalPerson": true,
"searchErrors": 0
}
{
"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:
-
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.
-
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.
-
El cliente debe proporcionar a Sheriff el método de autenticación preferido y las credenciales correspondientes al registrar el webhook.
-
Headers Enviados por Sheriff al Webhook:
Content-Type: application/jsonContent-Encoding: gzip- Dependiendo del método de autenticación elegido:
- Bearer Token: Authorization:
Bearer {TOKEN_INTEGRATION} - Otros…
- Bearer Token: Authorization:
- 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
- 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.
- Los perfiles cargados a través de la API estarán disponibles también en la plataforma:
- 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:
fullNamesearchErrorspersonType
- 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:
- 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:
-
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,
fullNamedebe tener al menos 3 caracteres). - El perfil ya está activo en compliance.
-
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).
| Campo | Tipo | Descripción |
|---|---|---|
webhookId | Number | Identificador del webhook (igual al entregado en la respuesta inicial) |
estado | String | Estado del procesamiento |
nombreCompleto | String | Nombre completo del perfil procesado |
tipPersona | String | Tipo de persona evaluada |
toleranciaBusqueda | Number | Nivel de tolerancia aplicado en la búsqueda |
esPerfilNuevo | Boolean | Indica si el perfil es nuevo en el sistema |
resumen | Object | Resumen por categorías con conteos y nivel de riesgo |
riesgo | String | Riesgo agregado del perfil |
datosMallaSocietaria | Array | Lista de sociedades relacionadas encontradas |
totalMallaSocietaria | Number | Total de resultados en malla societaria |
datosPepChile | Array | Resultados PEP Chile |
totalPepChile | Number | Total resultados PEP Chile |
datosFuncionarioPublico | Array | Resultados funcionarios públicos |
totalFuncionarioPublico | Number | Total resultados funcionarios públicos |
datosFamiliarPep | Array | Resultados familiares de PEP |
totalFamiliarPep | Number | Total resultados familiares PEP |
datosListasInternacionales | Array | Resultados en listas internacionales |
totalListasInternacionales | Number | Total en listas internacionales |
dataPenal | Array | Resultados penales |
totalPenal | Number | Total resultados penales |
datosNoticias | Array | Resultados en noticias |
totalNoticias | Number | Total resultados noticias |
Estructura de resumen:
| Campo | Tipo | Descripción |
|---|---|---|
pepChileFamiliares | Object | Resumen de resultados de PEP Chile y familiares (ver subtabla) |
pepChile | Object | Resumen de PEP Chile (ver subtabla) |
funcionariosPublicos | Object | Resumen funcionarios públicos — por defecto: { totalResultados: 0, riesgo: "free" } |
listasInternacionales | Object | Resumen listas internacionales (ver subtabla) |
penal | Object | Resumen causas penales (ver subtabla) |
mallaSocietaria | Object | Resumen malla societaria — { totalResultados: Number, riesgo: null } |
noticias | Object | Resumen noticias — { totalResultados: Number, riesgo: null } |
Subestructura:
| Campo | Tipo | Descripción |
|---|---|---|
totalResultados | Number | Conteo de resultados en la categoría (Entero >= 0) |
riesgo | String | Nivel de riesgo para la categoría ("free", "medium", "critical" o NULL cuando no aplica) |
Estructura de datosMallaSocietaria:
| Campo | Tipo | Descripción |
|---|---|---|
nombreSociedad | String | Nombre de la sociedad encontrada |
rutSociedad | String | RUT de la sociedad (formato "12345678-9") o NULL |
fecha | String | Fecha asociada o NULL |
socios | Array | Lista de socios (ver subestructura) |
extractos | Array | Extractos / actos relacionados (ver subestructura) |
ultimaFecha | String | Última fecha conocida o NULL |
societiesParticipant | Array or NULL | Lista de sociedades participantes o NULL |
source | String | Fuente del dato |
Subestructura socios[]:
| Campo | Tipo | Descripción |
|---|---|---|
nombre | String | Nombre del socio |
rut | String | RUT del socio o NULL |
domicilio | String | Domicilio registrado o NULL |
tipoDeParticipacion | String | Tipo de participación (p.ej: "accionista") |
cargo | String | Cargo declarado o NULL |
cargoEjecutivoPrincipal | String | Cargo ejecutivo principal o NULL |
fechaNombramiento | String | Fecha de nombramiento o NULL |
porcentajeParticipacion | String | Porcentaje (cadena) o NULL |
Subestructura extractos[]:
| Campo | Tipo | Descripción |
|---|---|---|
actuacion | String | Tipo de actuación (p.ej: "MODIFICACIÓN") |
fecha | String | Fecha del extracto |
linkPdf | String | URL al PDF o NULL |
Estructura de datosPepChile:
| Campo | Tipo | Descripción |
|---|---|---|
nombre | String | Nombre completo |
cargo | String | Cargo o posición |
institucion | String | Institución asociada |
periodo | String | Período (p.ej: "2018-2020") o NULL |
Estructura de datosFuncionarioPublico:
| Campo | Tipo | Descripción |
|---|---|---|
nombre | String | Nombre completo |
cargo | String | Cargo |
institucion | String | Institución |
enlace | String | URL relacionada o NULL |
periodo | String | Período o NULL |
relationsData | Array | Relaciones relevantes (ver subestructura) |
Subestructura relationsData[]:
| Campo | Tipo | Descripción |
|---|---|---|
nombre | String | Nombre de la relación |
parentesco | String | Parentesco |
Estructura de datosFamiliarPep:
| Campo | Tipo | Descripción |
|---|---|---|
nombre | String | Nombre completo |
cargo | String | Cargo (si aplica) |
institucion | String | Institución (si aplica) |
enlace | String | URL o NULL |
periodo | String | Período o NULL |
isPep | Boolean | Indica si la persona es PEP |
relationsData | Array | Relaciones (ver arriba) |
Estructura de datosListasInternacionales:
| Campo | Tipo | Descripción |
|---|---|---|
nombre | String | Nombre en la lista |
lista | String | Nombre de la lista internacional |
enlace | String | Link al registro o NULL |
Estructura de dataPenal:
| Campo | Tipo | Descripción |
|---|---|---|
nombre | String | Nombre involucrado |
postura | String | Postura procesal |
rol | String | Rol en la causa |
fecha | String | Fecha relevante |
infraccion | String | Infracción o delito descrito |
estado | String | Estado del proceso |
etapa | String | Etapa procesal |
litigantes | Array | Listado de litigantes (ver subestructura) |
materia | String | Materia del proceso |
tribunal | String | Tribunal asociado |
esDenunciado | Boolean | Indica si existe una denuncia |
Subestructura litigantes[]:
| Campo | Tipo | Descripción |
|---|---|---|
nombre | String | Nombre del litigante |
sujeto | String | Sujeto o rol en la causa |
situacionLibertad | String | Situación de libertad o NULL |
Estructura de datosNoticias:
| Campo | Tipo | Descripción |
|---|---|---|
nombre | String | Nombre relevante en la noticia |
titulo | String | Título de la noticia |
fuente | String | Fuente o medio |
enlace | String | URL de la noticia |
enlaceFuente | String | URL de la fuente |
tema | Array | Lista de temas/tópicos |
periodo | String | Perí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.