DataRisk API
Integra los análisis de Carpeta Tributaria SII directamente en tu ERP, CRM o cualquier sistema. JSON limpio, tipado y con estructura jerárquica clara.
Quick Start
Genera tu API Key
Inicia sesión → Cuenta → API → Nueva API Key. Guárdala — no se volverá a mostrar.
Envía una Carpeta Tributaria
Llama a POST /api/v1/datarisk/evaluate con el PDF y los datos requeridos. Recibes un documentId de inmediato.
Consulta el estado (polling)
Haz polling a GET /api/v1/datarisk/reports/:id/status cada 2.5 segundos hasta obtener completed o failed.
Obtén el informe completo
El informe completo viene inline en el status completed, o consulta GET /api/v1/datarisk/reports/:id cuando lo necesites.
curl -X POST \
-H "Authorization: Bearer TU_API_KEY" \
-F "file=@carpeta.pdf" \
-F "rut=76.123.456-7" \
-F "creditoSolicitado=50000000" \
-F "deterioroComercial=0" \
https://api.prismal.cl/api/v1/datarisk/evaluatecurl -H "Authorization: Bearer TU_API_KEY" \
https://api.prismal.cl/api/v1/datarisk/reports/DOCUMENT_ID/statuscurl -H "Authorization: Bearer TU_API_KEY" \
https://api.prismal.cl/api/v1/datarisk/reports?limit=5Autenticación
Los endpoints autenticados requieren una API Key que se genera desde la plataforma. Solo cuentas de empresa pueden crear keys (máximo 5 activas).
Envía la key en cualquiera de estos headers:
Authorization: Bearer prml_...X-Api-Key: prml_...
El endpoint público (/api/public/datarisk/:code) no requiere autenticación.
Authorization: Bearer prml_abc123def456...
# Alternativa:
X-Api-Key: prml_abc123def456...429 con Retry-After: 60.Evaluar Carpeta Tributaria
/api/v1/datarisk/evaluateSube un PDF de Carpeta Tributaria y lanza la evaluación. Requiere API Key.
Content-Type: multipart/form-data. La respuesta es inmediata (HTTP 202) — la extracción corre en background.
¿Qué es la Carpeta Tributaria?
La Carpeta Tributaria es un documento PDF oficial emitido por el Servicio de Impuestos Internos (SII) de Chile. Contiene información financiera y tributaria detallada de una empresa o persona natural:
- Identificación: RUT, razón social, domicilio, actividad económica, fecha de inicio
- Formulario 29 (F29): Declaraciones mensuales de IVA — ventas, compras, márgenes
- Formulario 22 (F22): Declaraciones anuales de renta — ingresos, activos, pasivos, utilidad
- Datos del contribuyente: Tramo de ventas, número de trabajadores
Se obtiene desde www.sii.cl → Servicios online → Carpeta tributaria electrónica. Debe descargarse como PDF nativo (no escaneado/imagen).
Cómo enviar el PDF
El archivo se envía como multipart/form-data, exactamente igual que un formulario HTML con <input type="file">. El campo debe llamarse file.
Requisitos del PDF:
- Formato: PDF (
application/pdf) - Tamaño máximo: 15 MB
- Debe ser texto seleccionable (no imagen escaneada)
- Descargado directamente del SII (no modificado ni re-exportado)
Flujo completo paso a paso
POST /evaluate → Envías el PDF + datos. Respuesta inmediata: {"documentId": "...", "status": "processing"}
Polling → Cada 2.5s haz GET /reports/:id/status. El backend extrae F29, F22, calcula score y ratios.
status: "completed" → El campo report contiene el informe completo con empresa, score, capacidad, F29, F22, alertas y ratios.
status: "failed" → El PDF no pudo procesarse. Revisa error.code y error.recommendation. No se descontó crédito.
Campos del formulario
| Campo | Tipo | Descripción |
|---|---|---|
| file | File (PDF) | PDF de Carpeta Tributaria descargado del SII (máx 15 MB). Obligatorio. |
| rut | string | RUT del evaluado (ej. "76.123.456-7"). Obligatorio. Debe coincidir con el RUT del PDF. |
| creditoSolicitado | number | Monto del crédito solicitado en CLP (ej. 50000000). Obligatorio. |
| deterioroComercial | number | Monto de deterioro comercial en CLP. Usar 0 si no tiene. Obligatorio si deterioroComercialDesconocido no es true. |
| deterioroComercialDesconocido | boolean | Enviar "true" si no se conoce el deterioro. El scoring se penaliza levemente. Opcional. |
| deudaVigente | number | Deuda vigente del evaluado en CLP. Opcional, default 0. |
E_EMPTY_EXTRACTION. Siempre usa el PDF original descargado del SII.curl -X POST \
-H "Authorization: Bearer TU_API_KEY" \
-F "file=@carpeta_tributaria.pdf" \
-F "rut=76.123.456-7" \
-F "creditoSolicitado=50000000" \
-F "deterioroComercial=0" \
-F "deudaVigente=5000000" \
https://api.prismal.cl/api/v1/datarisk/evaluate{
"ok": true,
"data": {
"documentId": "664a1b2c3d4e5f6a7b8c9d0e",
"status": "processing"
}
}Consultar estado
/api/v1/datarisk/reports/:id/statusEstado de una evaluación individual. Requiere API Key.
/api/v1/datarisk/reports/statusEstado de múltiples evaluaciones (máx 20 IDs). Requiere API Key.
Estados posibles
| Campo | Tipo | Descripción |
|---|---|---|
| processing | string | La extracción está en curso. Sigue consultando cada 2.5 segundos. |
| completed | string | Evaluación lista. El campo "report" contiene el informe completo. |
| failed | string | Extracción fallida. Revisa "error.recommendation" para resolver. |
Batch status (múltiples IDs)
Envía un JSON con un array de IDs para consultar el estado de varias evaluaciones en una sola llamada:
{
"ids": ["664a1b2c...", "664a1b2d...", "664a1b2e..."]
}{
"ok": true,
"data": {
"documentId": "664a1b2c...",
"status": "processing",
"timing": {
"uploadedAt": "2025-02-01T12:00:00Z",
"extractStartedAt": "2025-02-01T12:00:01Z"
}
}
}{
"ok": true,
"data": {
"documentId": "664a1b2c...",
"status": "completed",
"report": { /* informe completo */ },
"timing": {
"uploadedAt": "...",
"extractStartedAt": "...",
"extractedAt": "..."
}
}
}{
"ok": true,
"data": {
"documentId": "664a1b2c...",
"status": "failed",
"error": {
"code": "E_EMPTY_EXTRACTION",
"message": "El documento no contiene datos extraíbles.",
"recommendation": "Re-descargar desde el SII."
}
}
}Evaluaciones múltiples simultáneas
El backend soporta múltiples evaluaciones simultáneas. Cada petición POST /evaluate retorna inmediatamente con un documentId. Las extracciones se procesan en paralelo (hasta 10 simultáneas) con un semáforo interno.
¿Cómo funciona internamente?
- Cada request HTTP se procesa en <100ms (crea el documento y responde).
- La extracción del PDF corre en background como proceso Python.
- Un semáforo limita a 10 procesos Python simultáneos.
- Si hay más de 10, las siguientes esperan en cola (no se pierden).
- Usa el endpoint batch status para consultar múltiples evaluaciones en una sola llamada.
const API_KEY = "prml_tu_api_key";
const files = ["ct1.pdf", "ct2.pdf", "ct3.pdf", "ct4.pdf", "ct5.pdf"];
// 1. Enviar todas las evaluaciones en paralelo
const uploads = await Promise.all(
files.map(async (file) => {
const form = new FormData();
form.append("file", fs.createReadStream(file));
form.append("rut", "76.123.456-7");
form.append("creditoSolicitado", "50000000");
form.append("deterioroComercial", "0");
const res = await fetch(
`${BASE}/v1/datarisk/evaluate`,
{ method: "POST", headers: { Authorization: `Bearer ${API_KEY}` }, body: form }
);
return (await res.json()).data.documentId;
})
);
// 2. Polling con batch status
let pending = [...uploads];
while (pending.length > 0) {
await new Promise(r => setTimeout(r, 2500));
const res = await fetch(`${BASE}/v1/datarisk/reports/status`, {
method: "POST",
headers: { Authorization: `Bearer ${API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ ids: pending }),
});
const { data } = await res.json();
for (const r of data) {
if (r.status !== "processing") {
console.log(`${r.documentId}: ${r.status}`);
pending = pending.filter(id => id !== r.documentId);
}
}
}import asyncio, aiohttp
API_KEY = "prml_tu_api_key"
BASE = "https://api.prismal.cl/api"
headers = {"Authorization": f"Bearer {API_KEY}"}
async def evaluate(session, path, rut):
data = aiohttp.FormData()
data.add_field("file", open(path, "rb"), filename=path)
data.add_field("rut", rut)
data.add_field("creditoSolicitado", "50000000")
data.add_field("deterioroComercial", "0")
async with session.post(f"{BASE}/v1/datarisk/evaluate", headers=headers, data=data) as r:
return (await r.json())["data"]["documentId"]
async def main():
async with aiohttp.ClientSession() as s:
ids = await asyncio.gather(
evaluate(s, "ct1.pdf", "76.123.456-7"),
evaluate(s, "ct2.pdf", "77.654.321-0"),
)
# Polling con batch status
pending = list(ids)
while pending:
await asyncio.sleep(2.5)
async with s.post(f"{BASE}/v1/datarisk/reports/status",
headers={**headers, "Content-Type": "application/json"},
json={"ids": pending}) as r:
data = (await r.json())["data"]
for d in data:
if d["status"] != "processing":
print(f'{d["documentId"]}: {d["status"]}')
pending.remove(d["documentId"])
asyncio.run(main())Endpoints de lectura
/api/public/datarisk/:verificationCodeInforme público por código de verificación (DR-XXXXX). Sin autenticación.
/api/v1/datarisk/reportsListar informes con paginación y filtros. Requiere API Key.
/api/v1/datarisk/reports/:idDetalle completo de un informe (JSON limpio y tipado). Requiere API Key.
Sandbox (sin autenticación)
/api/sandbox/evaluateEvaluar mock (sin PDF, sin auth). Respuesta inmediata con datos ficticios.
/api/sandbox/status/:idEstado mock (siempre completed). Sin autenticación.
/api/sandbox/statusEstado batch mock. Sin autenticación.
/api/sandbox/reportsListar reportes mock. Sin autenticación.
/api/sandbox/reports/:idReporte mock completo. Sin autenticación.
Parámetros del listado
| Campo | Tipo | Descripción |
|---|---|---|
| limit | number | Cantidad por página (1–100, default 20) |
| offset | number | Desplazamiento (default 0) |
| rut | string | Filtrar por RUT del evaluado |
| from | string | Fecha desde (ISO 8601) |
| to | string | Fecha hasta (ISO 8601) |
{
"ok": true,
"data": [
{
"documentId": "664a1b2c...",
"rut": "76.123.456-7",
"razonSocial": "Mi Empresa S.A.",
"fechaEmisionCarpeta": "2025-01-15",
"scoreValor": 0.72,
"nivelRiesgo": "MODERADO",
"resultadoCredito": "APROBADO",
"createdAt": "2025-02-01T12:00:00Z"
}
],
"pagination": {
"total": 150,
"limit": 20,
"offset": 0,
"hasMore": true
}
}Esquema del informe (DatariskReport)
Cada informe sigue esta estructura jerárquica. Todos los montos están en CLP salvo donde se indique UF. Las fechas siguen ISO 8601. Los campos null indican dato no disponible.
meta
| Campo | Tipo | Descripción |
|---|---|---|
| version | string | Versión de la API (ej. "1.0") |
| generatedAt | string | ISO 8601 datetime de generación |
| documentId | string | ID único del documento |
| verificationCode | string | null | Código de verificación DR-XXXXX |
{
"meta": { ... },
"empresa": { ... },
"score": { ... },
"capacidadCredito": { ... },
"f29": { ... },
"f22": { ... },
"propiedades": { ... },
"ponderaciones": { ... },
"alertas": [ ... ],
"sociedadYRepresentantes": { ... }
}empresa
| Campo | Tipo | Descripción |
|---|---|---|
| rut | string | RUT del contribuyente |
| razonSocial | string | Nombre legal |
| domicilio | string | null | Dirección registrada |
| actividadEconomica | string | null | Actividad económica principal (texto resumen) |
| actividadesDetalle | object[] | Desglose de actividades económicas (nuevo formato CT) |
| actividadesDetalle[].codigo | string | Código SII de la actividad |
| actividadesDetalle[].actividad | string | Descripción de la actividad |
| actividadesDetalle[].categoria | string | null | Categoría tributaria |
| actividadesDetalle[].desde | string | null | Fecha de inicio de la actividad |
| sucursales | string[] | Sucursales registradas en el SII (nuevo formato CT) |
| anotaciones | object[] | Anotaciones y observaciones tributarias vigentes (nuevo formato CT) |
| anotaciones[].fecha | string | null | Fecha de la anotación |
| anotaciones[].glosa | string | null | Código/glosa de la anotación |
| anotaciones[].descripcion | string | null | Texto descriptivo de la anotación |
| fechaInicioActividades | string | null | Fecha ISO (YYYY-MM-DD) |
| fechaEmisionCarpeta | string | null | Fecha/hora ISO de emisión |
| antiguedadAnios | number | null | Años desde inicio de actividades |
| tamanoEmpresa | enum | null | "micro" | "pequena" | "mediana" | "grande" |
| tramoVentas | object | null | { codigo: number, descripcion: string } |
| trabajadores | number | null | Cantidad de trabajadores |
"empresa": {
"rut": "76.123.456-7",
"razonSocial": "Mi Empresa S.A.",
"domicilio": "Av. Providencia 1234, Santiago",
"actividadEconomica": "Venta al por mayor",
"actividadesDetalle": [
{ "codigo": "466302", "actividad": "VENTA AL POR MAYOR...", "categoria": "Primera Categoría", "desde": "27/12/2005" }
],
"sucursales": ["M. BAQUEDANO 655, NATALES", "..."],
"anotaciones": [
{ "fecha": "01/01/2025", "glosa": "RETENEDOR", "descripcion": "C.S. PARA CUMPLIMIENTO DE IVA..." }
],
"fechaInicioActividades": "2015-03-20",
"fechaEmisionCarpeta": "2025-01-15T10:30:00",
"antiguedadAnios": 9.8,
"tamanoEmpresa": "pequena",
"tramoVentas": { "codigo": 5, "descripcion": "..." },
"trabajadores": 12
}score (Prismal Score)
| Campo | Tipo | Descripción |
|---|---|---|
| valor | number | null | Score entre 0.000 y 1.000 |
| nivelRiesgo | string | null | Nivel de riesgo textual |
| modeloVersion | string | null | Versión del modelo de scoring |
| interpretacion | string | null | Texto interpretativo |
| variables | object | null | Mapa de variables del score |
Cada variable del score
| Campo | Tipo | Descripción |
|---|---|---|
| normalizado | number | Valor normalizado (0–1) |
| peso | number | Peso en el modelo |
| puntajeParcial | number | Contribución al score final |
| detalle.justificacion | string | Explicación textual |
| detalle.formula | string | Fórmula aplicada |
| detalle.advertencias | string[] | Advertencias (si aplican) |
Variables: antiguedad, tamano_empresa, capital_propio, deterioro_comercial, ventas_f29, margen_f29, f29_sin_pago, solvencia_f22, postergacion_iva
"score": {
"valor": 0.72,
"nivelRiesgo": "MODERADO",
"modeloVersion": "PS0-DR-v2",
"interpretacion": "Riesgo moderado...",
"variables": {
"antiguedad": {
"normalizado": 0.85,
"peso": 0.12,
"puntajeParcial": 0.102,
"detalle": {
"justificacion": "9.8 años...",
"formula": "min(años/15, 1)",
"advertencias": []
}
}
}
}capacidadCredito
| Campo | Tipo | Descripción |
|---|---|---|
| resultado | enum | "APROBADO" | "DISMINUIDO" | "SIN_CAPACIDAD" |
| capacidadSugeridaCLP | number | Capacidad de crédito sugerida (CLP) |
| creditoSolicitadoCLP | number | Crédito solicitado (CLP) |
| deudaVigenteCLP | number | Deuda vigente informada (CLP) |
| notaRiesgoLegacy | number | null | Nota de riesgo legacy (0–7) |
| mesesEvaluados | number | Meses evaluados |
"capacidadCredito": {
"resultado": "APROBADO",
"capacidadSugeridaCLP": 25000000,
"creditoSolicitadoCLP": 15000000,
"deudaVigenteCLP": 3000000,
"notaRiesgoLegacy": 5.2,
"mesesEvaluados": 12
}f29 (Declaraciones mensuales IVA)
Las series están indexadas por periodo. periodos[0] corresponde a series.ventasCLP[0], etc.
| Campo | Tipo | Descripción |
|---|---|---|
| periodos[].fecha | string | ISO date primer día del mes |
| periodos[].label | string | Nombre legible (ej. "Enero 2025") |
| series.ventasCLP | number[] | Base imponible por periodo |
| series.comprasCLP | number[] | Compras por periodo |
| series.margenCLP | number[] | Margen por periodo |
| series.remanenteCLP | number[] | Remanente IVA |
| series.ivaCreditoCLP | number[] | IVA crédito |
| series.postergacionCLP | number[] | IVA postergado |
| series.ivaPagadoCLP | number[] | IVA pagado / determinado |
| tipoDeclaracion | string[] | Tipo de declaración por periodo |
| pagoEstado | string[] | Estado de pago por periodo |
| promedios.ventaCLP | number | Promedio de ventas |
"f29": {
"periodos": [
{ "fecha": "2025-01-01", "label": "Enero 2025" },
{ "fecha": "2025-02-01", "label": "Febrero 2025" }
],
"series": {
"ventasCLP": [12500000, 13200000],
"comprasCLP": [8300000, 9100000],
"margenCLP": [4200000, 4100000],
...
},
"promedios": {
"ventaCLP": 12850000,
"compraCLP": 8700000,
"margenCLP": 4150000
}
}f22 (Declaración anual de renta)
| Campo | Tipo | Descripción |
|---|---|---|
| series.ingresosCLP | number[] | Ingresos por periodo |
| series.totalActivoCLP | number[] | Total activo |
| series.totalPasivoCLP | number[] | Total pasivo |
| series.utilidadCLP | number[] | Utilidad |
| series.perdidaCLP | number[] | Pérdida |
| series.capitalPropioPosUF | number[] | Capital propio positivo (UF) |
| series.capitalPropioNegUF | number[] | Capital propio negativo (UF) |
| ratios.solvencia | number | null | Ratio de solvencia |
| ratios.endeudamiento | number | null | Ratio de endeudamiento |
| ratios.margenUtilidadPct | number | null | Margen de utilidad (%) |
| ratios.rentabilidadSobreActivoPct | number | null | Rentabilidad sobre activo (%) |
| ratios.rotacionActivo | number | null | Rotación del activo |
| ratios.variacionVentasPct | number | null | Variación de ventas (%) |
"f22": {
"periodos": [
{ "fecha": "2024-01-01", "label": "AT 2024" }
],
"series": {
"ingresosCLP": [180000000],
"totalActivoCLP": [95000000],
"totalPasivoCLP": [42000000],
"utilidadCLP": [22000000],
"perdidaCLP": [0],
"capitalPropioPosUF": [1350],
"capitalPropioNegUF": [0]
},
"ratios": {
"solvencia": 2.26,
"endeudamiento": 0.44,
"margenUtilidadPct": 12.2,
...
}
}alertas
Array de alertas detectadas. Cada una tiene codigo, severidad y mensaje.
| Código | Sev. | Descripción |
|---|---|---|
| TENDENCIA_POSITIVA | info | Tendencia positiva en ventas |
| TENDENCIA_NEGATIVA | warning | Tendencia negativa en ventas |
| CARPETA | warning | Carpeta tributaria desactualizada (más de 30 días de su emisión) |
| CREDITO | warning | Alertas de capacidad crediticia |
| RUT_DISTINTO | danger | RUT distinto al informado |
| MARGEN_NEGATIVO | danger | Margen operacional negativo |
| CAPACIDAD_MENOR_DEUDA | danger | Capacidad menor a deuda vigente |
| CARPETA_MAS_180_DIAS | warning | Carpeta con más de 180 días de antigüedad |
| PERDIDA_EJERCICIO | danger | Pérdida en el ejercicio |
"alertas": [
{
"codigo": "TENDENCIA_NEGATIVA",
"severidad": "warning",
"mensaje": "Tendencia negativa en ventas"
},
{
"codigo": "MARGEN_NEGATIVO",
"severidad": "danger",
"mensaje": "Margen operacional negativo"
}
]Otros campos
propiedades
| Campo | Tipo | Descripción |
|---|---|---|
| cantidad | number | Cantidad de propiedades registradas |
| avaluoTotalCLP | number | Avalúo total (CLP) |
| bienes | object[] | Detalle de cada bien raíz (nuevo formato CT) |
| bienes[].comuna | string | Comuna donde está ubicado el bien |
| bienes[].rol | string | Rol SII del bien raíz |
| bienes[].direccion | string | Dirección del bien |
| bienes[].destino | string | Destino (Habitacional, Comercial, etc.) |
| bienes[].avaluoFiscalCLP | string | Avalúo fiscal (string formateado CLP) |
| bienes[].condicion | string | null | "Afecto" o "Exento" de contribuciones |
| bienes[].porcentajeDerecho | string | null | % de derecho sobre el bien |
| bienes[].fojasNumeroAnoInscripcion | string | null | Referencia Fojas/Nº/Año de inscripción |
| bienes[].numeroCuotas | string | null | Número de cuotas contribuciones |
| bienes[].vencidasPorPagar | string | null | Cuotas vencidas por pagar |
| bienes[].vigentesPorPagar | string | null | Cuotas vigentes por pagar |
| bienes[].valorContribucionSemestral | string | null | Valor contribución semestral ($) |
ponderaciones
| Campo | Tipo | Descripción |
|---|---|---|
| antiguedad | number | null | Ponderación antigüedad |
| tamano | number | null | Ponderación tamaño |
| ventas | number | null | Ponderación ventas |
| desempenoVentas | number | null | Ponderación desempeño ventas |
| deudaVigente | number | null | Ponderación deuda vigente |
sociedadYRepresentantes
Los campos representantes y socios mantienen el formato legacy. Los tres campos nuevos solo se populan en documentos procesados con el extractor de nuevo formato CT.
| Campo | Tipo | Descripción |
|---|---|---|
| representantes | object[] | Lista legacy: { nombre, rut, fechaIncorporacion } |
| socios | object[] | Lista legacy: { nombre, rut, fechaIncorporacion } |
| representantesLegales | object[] | Representantes con forma de actuación (nuevo formato CT) |
| representantesLegales[].nombre | string | Nombre completo |
| representantesLegales[].rut | string | RUT |
| representantesLegales[].fechaIncorporacion | string | null | Fecha ISO de incorporación |
| representantesLegales[].formaActuacion | string | null | Forma de actuación (ej. "Cualquiera", "Conjunta") |
| conformacionSociedad | object[] | Socios con % de participación (nuevo formato CT) |
| conformacionSociedad[].nombre | string | Nombre o razón social del socio |
| conformacionSociedad[].rut | string | RUT |
| conformacionSociedad[].fechaIncorporacion | string | null | Fecha ISO de incorporación |
| conformacionSociedad[].participacionCapital | string | null | Porcentaje de participación en capital (ej. "34%") |
| conformacionSociedad[].participacionUtilidades | string | null | Porcentaje de participación en utilidades |
| participacionSociedades | object[] | Sociedades donde participa el contribuyente (mismo schema que conformacionSociedad) |
"propiedades": {
"cantidad": 1,
"avaluoTotalCLP": 70781209,
"bienes": [
{
"comuna": "HUECHURABA",
"rol": "04021-00015",
"direccion": "RECOLETA 6006 V WOLF",
"destino": "HABITACIONAL",
"avaluoFiscalCLP": "70.781.209",
"condicion": "Afecto",
"porcentajeDerecho": "100%",
"fojasNumeroAnoInscripcion": "59890/87243/2022",
"numeroCuotas": null,
"vencidasPorPagar": "-",
"vigentesPorPagar": "-",
"valorContribucionSemestral": "0"
}
]
},
"ponderaciones": { "antiguedad": 0.85, ... },
"sociedadYRepresentantes": {
"representantes": [
{ "nombre": "Juan Pérez", "rut": "12.345.678-9", "fechaIncorporacion": "2015-03-20" }
],
"socios": [...],
"representantesLegales": [
{ "nombre": "Juan Pérez", "rut": "12.345.678-9",
"fechaIncorporacion": "2015-03-20", "formaActuacion": "Cualquiera" }
],
"conformacionSociedad": [
{ "nombre": "Inv. Holding SpA", "rut": "76.000.001-K",
"fechaIncorporacion": "2015-03-20",
"participacionCapital": "60%", "participacionUtilidades": "60%" }
],
"participacionSociedades": [...]
}Códigos de error HTTP
| Código | Nombre | Cuándo ocurre |
|---|---|---|
| 400 | Bad Request | Parámetros inválidos (ID malformado, campos faltantes, PDF no válido) |
| 401 | Unauthorized | API key no proporcionada, inválida o desactivada |
| 402 | Payment Required | No hay créditos Datarisk disponibles para tu empresa |
| 404 | Not Found | Informe no encontrado o no pertenece a tu empresa |
| 413 | Payload Too Large | El archivo excede el límite de 15 MB |
| 422 | Unprocessable | El informe aún no fue procesado completamente |
| 429 | Too Many Requests | Rate limit excedido — espera 60 segundos |
| 500 | Server Error | Error interno del servidor |
{
"ok": false,
"error": "Descripción del error"
}Buenas prácticas
Polling
- Intervalo recomendado: 3 segundos entre consultas.
- Usa backoff exponencial para reducir carga (2s → 3s → 4.5s → ... hasta 15s).
- Timeout máximo sugerido: 120 segundos. La mayoría de PDFs se procesa en 15-40s.
- Para múltiples evaluaciones, usa batch status en vez de consultas individuales.
Archivos PDF
- El PDF debe ser una Carpeta Tributaria descargada directamente del SII.
- PDFs escaneados, protegidos con contraseña o reenviados por terceros pueden fallar.
- Tamaño máximo: 15 MB.
- Carpetas con más de 180 días de antigüedad generan una alerta pero se procesan normalmente.
Concurrencia
- Puedes enviar hasta 10 evaluaciones simultáneas sin problemas.
- Evaluaciones adicionales se encolan automáticamente (no se pierden).
- Rate limit HTTP: 100 req/min por API key (aplica a todas las llamadas).
- Cada evaluación exitosa consume 1 crédito Datarisk.
async function pollStatus(docId, apiKey) {
let delay = 2000; // 2s inicial
const maxDelay = 15000; // 15s máximo
const timeout = 120000; // 2 min timeout total
const start = Date.now();
while (Date.now() - start < timeout) {
const res = await fetch(
`${BASE}/v1/datarisk/reports/${docId}/status`,
{ headers: { Authorization: `Bearer ${apiKey}` } }
);
const { data } = await res.json();
if (data.status === "completed") return data.report;
if (data.status === "failed") throw new Error(data.error.message);
await new Promise(r => setTimeout(r, delay));
delay = Math.min(delay * 1.5, maxDelay);
}
throw new Error("Timeout: evaluación no completó en 2 min");
}Ejemplos de integración
const API_KEY = "prml_tu_api_key";
const BASE = "https://api.prismal.cl/api";
// Listar informes
const res = await fetch(
`${BASE}/v1/datarisk/reports?limit=10`,
{ headers: { "Authorization": `Bearer ${API_KEY}` } }
);
const { data, pagination } = await res.json();
console.log(`Total: ${pagination.total} informes`);
// Detalle de un informe
const detail = await fetch(
`${BASE}/v1/datarisk/reports/${data[0].documentId}`,
{ headers: { "Authorization": `Bearer ${API_KEY}` } }
);
const { data: report } = await detail.json();
console.log(report.empresa.razonSocial);
console.log(`Score: ${report.score.valor}`);
console.log(report.capacidadCredito.resultado);import requests
API_KEY = "prml_tu_api_key"
BASE = "https://api.prismal.cl/api"
headers = {"Authorization": f"Bearer {API_KEY}"}
# Listar informes
res = requests.get(
f"{BASE}/v1/datarisk/reports?limit=10",
headers=headers
)
data = res.json()
for r in data["data"]:
print(f"{r['rut']} - Score: {r['scoreValor']}")
# Detalle
doc_id = data["data"][0]["documentId"]
detail = requests.get(
f"{BASE}/v1/datarisk/reports/{doc_id}",
headers=headers
)
report = detail.json()["data"]
print(report["empresa"]["razonSocial"])
print(report["capacidadCredito"]["resultado"])Sandbox (pruebas sin cuenta)
Hay dos formas de probar la API sin cuenta real ni créditos:
Opción A — Endpoints públicos (sin autenticación)
Endpoints dedicados bajo /api/sandbox/* que no requieren ningún header de autenticación. Ideales para pruebas rápidas desde el navegador o cURL.
| Campo | Tipo | Descripción |
|---|---|---|
| POST /api/sandbox/evaluate | — | Evaluar mock sin PDF. Acepta rut y creditoSolicitado opcionales. |
| GET /api/sandbox/status/:id | — | Estado mock (siempre completed con reporte completo). |
| POST /api/sandbox/status | — | Batch status mock. Envía { ids: [...] } en el body. |
| GET /api/sandbox/reports | — | Lista mock con 1 reporte de ejemplo. |
| GET /api/sandbox/reports/:id | — | Reporte mock completo. |
Opción B — Sandbox API Key
Usa la sandbox key con los endpoints reales (/api/v1/datarisk/*). Simula el flujo completo de autenticación — ideal para validar tu integración antes de pasar a producción.
Sandbox API Key
prml_test_sandbox_0000000000000000000000000000000000000000000000Cualquier key que comience con prml_test_sandbox_ activa el modo sandbox.
Probar en Postman (paso a paso)
Método y URL
Selecciona POST y escribe la URL:
https://api.prismal.cl/api/v1/datarisk/evaluatePestaña Authorization
Haz clic en la pestaña Authorization. En "Type" selecciona Bearer Token. En el campo "Token" pega:
prml_test_sandbox_0000000000000000000000000000000000000000000000No va en Params ni en la URL. Debe ir en Authorization → Bearer Token.
Pestaña Body
Haz clic en la pestaña Body. Selecciona form-data. Agrega estas filas:
| KEY | VALUE |
|---|---|
| rut | 76.123.456-7 |
| creditoSolicitado | 50000000 |
| deterioroComercial | 0 |
En sandbox no necesitas agregar el campo file. En producción sí es obligatorio (tipo File, seleccionas el PDF).
Click Send
Recibirás un 202 Accepted con el reporte mock completo. Verifica que ves "sandbox": true en la respuesta.
Probar otros endpoints
Con la misma Authorization, prueba:
GET https://api.prismal.cl/api/v1/datarisk/reports/000000000000000000000001/status
GET https://api.prismal.cl/api/v1/datarisk/reports/000000000000000000000001
GET https://api.prismal.cl/api/v1/datarisk/reports?limit=5
¿Qué hace el modo Sandbox?
Diferencias con producción
| Campo | Tipo | Descripción |
|---|---|---|
| sandbox: true | boolean | Todas las respuestas sandbox incluyen este campo. Úsalo para detectar modo prueba. |
| file | opcional | En sandbox el PDF es opcional. En producción es obligatorio. |
| _mockReport | object | En POST /evaluate, sandbox incluye el reporte mock inline para conveniencia. |
| Datos | ficticios | Empresa "EMPRESA DEMO SANDBOX S.A." con RUT, score, F29 y F22 de ejemplo. |
prml_ (sin "test_sandbox").# Evaluar mock
curl -X POST https://api.prismal.cl/api/sandbox/evaluate
# Consultar estado (siempre completed)
curl https://api.prismal.cl/api/sandbox/status/000000000000000000000001
# Obtener reporte completo
curl https://api.prismal.cl/api/sandbox/reports/000000000000000000000001
# Listar reportes
curl https://api.prismal.cl/api/sandbox/reportscurl -X POST \
-H "Authorization: Bearer prml_test_sandbox_0000000000000000000000000000000000000000000000" \
-F "rut=76.123.456-7" \
-F "creditoSolicitado=50000000" \
https://api.prismal.cl/api/v1/datarisk/evaluate
curl -H "Authorization: Bearer prml_test_sandbox_0000000000000000000000000000000000000000000000" \
https://api.prismal.cl/api/v1/datarisk/reports/000000000000000000000001/status
curl -H "Authorization: Bearer prml_test_sandbox_0000000000000000000000000000000000000000000000" \
https://api.prismal.cl/api/v1/datarisk/reports/000000000000000000000001
curl -H "Authorization: Bearer prml_test_sandbox_0000000000000000000000000000000000000000000000" \
https://api.prismal.cl/api/v1/datarisk/reports?limit=5