Para desarrolladores

API InformeLegal

Integrá la gestión de expedientes a tus sistemas. REST + JSON, claves por ambiente, idempotencia y webhooks firmados.

Scoring Engine

Scoring de expedientes por API

Contactabilidad, situación legal y financiera de la persona principal, con historial inmutable, explicación de cada factor y variables propias de tu negocio. Conocé el módulo completo y después integralo con los ejemplos de esta página.

Claves por ambiente
Prefijos il_test_ y il_live_. Las claves de sandbox no generan cargos.
Idempotencia
Enviá Idempotency-Key en cada POST. Cacheamos la respuesta 7 días.
Webhooks firmados
HMAC-SHA256 en X-InformeLegal-Signature con reintentos exponenciales.
Empezá en 3 pasos
Necesitás una cuenta de empresa o estudio jurídico.
  1. 1

    Creá tu cuenta y accedé al portal.

  2. 2

    Generá una clave il_test_... desde Claves API.

  3. 3

    Probá los endpoints en el Playground incluido en el portal.

Endpoints disponibles
26 operaciones REST + JSON · base /api/public/v1 · agrupadas igual que en Swagger.
Abrir Swagger
GET LecturaPOST Creación / acciónPATCH Actualización parcialTodos los POST aceptan Idempotency-Key · los listados paginan con nextCursor · cada fila indica el scope que la API Key debe tener habilitado.

Expedientes6 endpoints

Swagger
  • POST
    /api/public/v1/cases

    Crear expediente (con partes, identificaciones y contactos)

    cases:create
  • GET
    /api/public/v1/cases

    Listar expedientes (paginado por cursor; filtro ?externalReference=CRM-2026-0001)

    cases:read
  • GET
    /api/public/v1/cases/{reference}

    Detalle completo; include=parties,filings,objects,caseTags,relatedCases,scoring,scoringRuns

    cases:read
  • PATCH
    /api/public/v1/cases/{reference}

    Actualización parcial: solo se modifican los campos enviados

    cases:update
  • GET
    /api/public/v1/cases/by-external-reference/{id}

    Detalle por referencia externa (?system=CRM)

    cases:read
  • PATCH
    /api/public/v1/cases/by-external-reference/{id}

    Actualización parcial por referencia externa

    cases:update

Comunicaciones6 endpoints

Swagger
  • POST
    /api/public/v1/cases/{reference}/communications

    Enviar comunicación (email) o documentar un envío externo con external=true

    case_communications:create Ver ejemplo
  • GET
    /api/public/v1/cases/{reference}/communications

    Listar comunicaciones del expediente

    case_communications:read
  • GET
    /api/public/v1/cases/{reference}/communications/{id}

    Detalle: destinatarios, eventos y externalLog

    case_communications:read
  • POST
    /api/public/v1/cases/{reference}/communications/{id}/cancel

    Cancelar una comunicación pendiente de envío

    case_communications:cancel
  • POST
    /api/public/v1/cases/{reference}/communications/{id}/status

    Actualizar estado y eventos (webhooks) — todos los canales

    case_communications:update Ver ejemplo
  • PATCH
    /api/public/v1/cases/{reference}/communications/{id}/status

    Alias del anterior para integraciones que prefieren PATCH

    case_communications:update Ver ejemplo

Scoring5 endpoints

Swagger
  • POST
    /api/public/v1/cases/{reference}/scoring

    Solicitar una ejecución de scoring (asincrónica, responde 202)

    scoring:execute
  • GET
    /api/public/v1/cases/{reference}/scoring

    Último scoring (?runId=... una corrida puntual · ?history=true historial)

    scoring:read
  • GET
    /api/public/v1/scoring/requests/{id}

    Estado de una solicitud de scoring (polling cada 3–5 s)

    scoring:read
  • GET
    /api/public/v1/cases/{reference}/scoring/variables

    Listar las variables externas cargadas en el expediente

    scoring:read
  • POST
    /api/public/v1/cases/{reference}/scoring/variables

    Cargar variables externas del cliente (namespace client.*)

    scoring:variables:write

Movimientos2 endpoints

Swagger
  • GET
    /api/public/v1/cases/{reference}/movements

    Listar movimientos del expediente

    case_movements:read
  • POST
    /api/public/v1/cases/{reference}/movements

    Agregar movimiento (nota, intimación, etc.)

    case_movements:create

Documentos2 endpoints

Swagger
  • GET
    /api/public/v1/cases/{reference}/documents

    Listar documentos del expediente

    documents:read
  • POST
    /api/public/v1/cases/{reference}/documents

    Subir documento (URL firmada + confirmación con sha256)

    documents:create

Identificaciones1 endpoint

Swagger
  • POST
    /api/public/v1/identifiers/validate

    Validar y clasificar una identificación por país (CUIT/CUIL, DNI, etc.)

    identifiers:validate

Autologin4 endpoints

Swagger
  • POST
    /api/public/v1/users/{user_id}/autologin

    Crear token de un solo uso (USER_ID acepta UUID o email)

    autologin:create Ver ejemplo
  • GET
    /api/public/v1/users/{user_id}/autologin/{token_id}

    Consultar el estado de un token emitido

    autologin:read Ver ejemplo
  • POST
    /api/public/v1/users/{user_id}/autologin/{token_id}/revoke

    Revocar un token puntual

    autologin:revoke Ver ejemplo
  • POST
    /api/public/v1/users/{user_id}/autologin/revoke-all

    Revocar todos los tokens activos del usuario

    autologin:revoke Ver ejemplo
Comunicaciones externas (external: true)
Documentá en el expediente envíos que salieron por otros sistemas, sin que InformeLegal intervenga.
  • InformeLegal no envía ninguna comunicación.
  • No se valida remitente, canal ni contenido: se acepta cualquier canal (email, sms, whatsapp, postal, phone, other).
  • La comunicación se guarda directamente en estado sent junto con su log de trazabilidad.
  • El objeto externalLog queda disponible en el detalle y el listado de comunicaciones (API y portal).
curl -X POST https://informelegal.org/api/public/v1/cases/AR-2026-00001234/communications \
  -H "Authorization: Bearer $ILK_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "external": true,
    "channel": "whatsapp",
    "subject": "Intimación de pago",
    "contentText": "Notificación enviada desde el CRM propio.",
    "recipients": [{ "destination": "+5491122334455", "recipientType": "to", "role": "TITULAR" }],
    "externalReference": "CRM-2026-0007",
    "externalLog": {
      "system": "CRM Propio",
      "providerName": "Twilio",
      "providerMessageId": "SM1234567890",
      "status": "delivered",
      "sentAt": "2026-08-18T14:05:00Z",
      "deliveredAt": "2026-08-18T14:05:12Z",
      "operator": "mlopez",
      "cost": 0.04,
      "currency": "USD",
      "evidenceUrl": "https://crm.example.com/evidencias/SM1234567890.pdf"
    }
  }'
Actualizar estado y webhooks de una comunicación
POST (o PATCH) /api/public/v1/cases/{reference}/communications/{id}/status · scope case_communications:update · aplica a todos los canales.
  • Identificá cada destinatario por recipientId, destination o externalId.
  • Los eventos quedan auditados en el historial del destinatario y en el log técnico de intentos de entrega.
  • Si no enviás status, InformeLegal lo deriva (sent, partial o failed) y recalcula los contadores.
  • Se emite el webhook saliente correspondiente: communication.sent, communication.failed o communication.cancelled.

Estados de comunicación

draft · scheduled · queued · sending · sent · partial · delivered · failed · cancelled

Estados de destinatario

pending · queued · sending · sent · delivered · read · failed · bounced · rejected · blocked · opted_out · cancelled

Eventos (webhooks)

queued · sending · sent · accepted · delivered · opened · clicked · read · deferred · failed · bounced · rejected · complained · unsubscribed · blocked · cancelled

Normalización: acceptedsent; opened/clickedread; bounced/rejectedfailed; complained/unsubscribedopted_out; deferredsending.

curl -X POST https://informelegal.org/api/public/v1/cases/AR-2026-00001234/communications/{communicationId}/status \
  -H "Authorization: Bearer $ILK_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "externalLog": { "providerName": "Twilio", "system": "CRM Propio" },
    "events": [
      { "destination": "+5491122334455", "event": "delivered", "occurredAt": "2026-08-21T13:05:00Z", "providerMessageId": "SM1234567890" },
      { "destination": "deudor@example.com", "event": "bounced", "errorCode": "550", "errorMessage": "mailbox not found" }
    ]
  }'
Ejemplos con cURL
Copiá y reemplazá tu clave y referencias.
curl -X POST https://informelegal.org/api/public/v1/cases   -H "Authorization: Bearer il_test_XXXXXXXXXXXX"   -H "Content-Type: application/json"   -H "Idempotency-Key: 8a1b2c3d-..."   -d '{
  "externalReference": { "system": "CRM", "id": "2026-0001" },
  "country": "AR",
  "caseType": "COBRANZA",
  "category": "Deuda comercial",
  "subcategory": "Factura impaga",
  "campaign": "Recupero Q3 2026",
  "openedAt": "2026-07-20T10:00:00.000Z",
  "status": "INICIADO",
  "currency": "ARS",
  "originalAmount": 125000,
  "currentBalance": 148750,
  "feesAmount": 12500,
  "expensesAmount": 3500,
  "interestAmount": 18750,
  "taxAmount": 0,
  "product": "Cuenta corriente",
  "branch": "Casa central",
  "origin": "Sistema externo",
  "sourceChannel": "API",
  "subject": "Cobranza extrajudicial de factura impaga",
  "description": "Factura 0001-00001234 vencida, enviada desde el CRM.",
  "priority": "normal",
  "riskLevel": "medio",
  "confidentiality": "normal",
  "dueDate": "2026-07-27T10:00:00.000Z",
  "prescriptionDate": "2027-07-20T10:00:00.000Z",
  "publicReportEnabled": true,
  "notifyCaseCreated": true,
  "customFields": { "asignacion": "Equipo Recupero A" },
  "internalNotes": "Caso creado por integración API en ambiente sandbox.",
  "parties": [
    {
      "role": "TITULAR",
      "isPrimary": true,
      "person": {
        "personType": "INDIVIDUAL",
        "country": "AR",
        "firstName": "Juan",
        "lastName": "Pérez",
        "fullName": "Juan Pérez",
        "identifications": [
          { "type": "CUIT", "number": "20-31763804-4", "isPrimary": true }
        ],
        "contacts": [
          { "type": "EMAIL", "value": "juan.perez@example.com" },
          { "type": "PHONE", "value": "+5491155550101" }
        ]
      }
    },
    {
      "role": "GARANTE",
      "person": {
        "personType": "INDIVIDUAL",
        "country": "AR",
        "fullName": "María García",
        "identifications": [
          { "type": "CUIT", "value": "27-30123456-8" }
        ],
        "emails": ["maria.garcia@example.com"],
        "phones": ["+5491155550102"]
      }
    }
  ],
  "tags": ["sandbox", "api", "cobranza"]
}'

La respuesta incluye publicCaseUrl: una URL pública de solo lectura del expediente, válida por 60 minutos, lista para compartir o embeber en un iframe.

{
  "success": true,
  "data": {
    "caseId": "57464021-88d1-4a88-89aa-f25dcd8a1b2c",
    "caseNumber": "EXP-2026-000123",
    "caseReference": "csr_XXXXXXXXXXXX",
    "internalNumber": null,
    "externalNumber": null,
    "status": "INICIADO",
    "createdAt": "2026-07-20T10:00:01.123Z",
    "campaign": "Recupero Q3 2026",
    "campaignPublicUrl": "https://informelegal.org/campana/a3261a57-...",
    "publicCaseUrl": "https://informelegal.org/expediente-publico/AbC123...",
    "publicCaseToken": "AbC123...",
    "publicCaseExpiresAt": "2026-07-20T11:00:01.123Z",
    "parties": [ { "partyId": "...", "role": "TITULAR", "personId": "...", "resolution": "NEW_PERSON" } ]
  }
}
Autologin de usuarios
Credencial sensible
Generá una URL temporal de un solo uso para que un usuario de tu organización ingrese al portal sin tipear su contraseña. Requiere el scope autologin:create, que se otorga por separado del resto de los permisos de la API Key.
  • En la URL, USER_ID acepta tanto el UUID del usuario como su email (por ejemplo usuario@empresa.com).
  • Solo se resuelven usuarios que pertenecen a la organización de la API Key; en caso contrario se devuelve 403 AUTOLOGIN_USER_NOT_ALLOWED o 404 AUTOLOGIN_USER_NOT_FOUND.
  • El token es una credencial: tratalo como un secreto, no lo registres en logs ni lo envíes por canales inseguros.
  • El valor completo se devuelve solo al crearlo; la base conserva únicamente su hash.
  • Es de un solo uso y se invalida en el momento del canje.
  • Vigencia mínima 60s, por defecto 600s y máximo 3600s (1 hora).
  • Portales permitidos: user_portal, company_portal, legal_firm_portal. El portal administrador no está habilitado.
  • redirect_path debe ser una ruta interna relativa dentro de la allowlist de la API Key (sin dominios externos ni ..).
  • Con invalidate_previous: true (default) los tokens activos previos del mismo usuario y portal quedan como replaced.
  • La sesión creada usa exclusivamente los roles y permisos actuales del usuario: nunca hereda permisos de la API Key.
  • Se aplica idempotencia por Idempotency-Key y límites de emisión por API Key (respuesta 429).
  • Endpoints complementarios: consulta de estado, revocación de un token y revoke-all.
curl --request POST \
  --url https://www.informelegal.org/api/public/v1/users/USER_ID/autologin \
  --header 'Authorization: Bearer API_KEY' \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: autologin-user-123-001' \
  --data '{
    "portal": "user_portal",
    "expires_in_seconds": 600,
    "redirect_path": "/expedientes",
    "invalidate_previous": true,
    "external_reference": "CRM-LOGIN-001"
  }'
Variables personalizadas (customFields)
Campos propios de cada empresa o estudio para agregar información adicional a los expedientes y a sus entidades relacionadas.
  • Se configuran en el portal, en Variables personalizadas, indicando entidad, código, etiqueta y tipo (texto, texto largo, número, fecha, sí/no o lista de opciones).
  • Se envían y se devuelven en el objeto opcional customFields, donde cada clave es el código de la variable.
  • Disponibles en expedientes (POST/GET /v1/cases), partes, movimientos y comunicaciones.
  • Todas son opcionales. Un código inexistente devuelve 422 UNKNOWN_CUSTOM_FIELD y un valor con tipo inválido 422 INVALID_CUSTOM_FIELD.
"customFields": { "asignacion": "Equipo Recupero A", "importancia": "Alta" }
Funcionalidades extra (embebido y parámetros de URL)
Opciones pensadas para integrar pantallas de InformeLegal dentro de tu propia aplicación.

Parámetros de URL del portal

Se pueden agregar como query string a cualquier página del portal (empresas, estudios o usuarios).

ParámetroValoresComportamiento
hideMenutrue / falseColapsa el menú lateral a solo íconos (true) o lo abre (false). El usuario puede volver a expandirlo desde el botón del header. Si no se envía, se respeta la última preferencia guardada.
deleteMenutrue / falseCon true elimina por completo la barra lateral y sus botones: no puede reabrirse y se ignora hideMenu. Con false o ausente, manda hideMenu.
readonlytrue / falseAplica a la ficha de expediente (/panel/expedientes/{id} y /expedientes/{id}). Con true la ficha se muestra en modo solo lectura: se ocultan los botones de edición, alta y borrado (movimientos, documentos, partes, campos personalizados, datos financieros). Combinado con deleteMenu=true también se oculta el enlace de volver, ideal para embeber la ficha.

Ejemplo: https://www.informelegal.org/panel/expedientes?deleteMenu=true

Autorización de dominios para iframes

Por defecto las páginas solo pueden embeberse en el propio dominio (frame-ancestors 'self'). Para embeberlas en tu sitio, tu webmaster debe solicitarnos el alta del dominio de origen. Datos a enviar:

  • Dominio exacto desde el que se va a embeber (por ejemplo https://app.tuempresa.com). Se admiten comodines de subdominio: *.tuempresa.com.
  • Rutas a habilitar: puntuales (/expediente-publico/*, /informe-legal/*, /panel/*) o todo el sitio (/*).
  • Organización asociada (opcional) y ambiente (sandbox o producción).

Una vez autorizado, el servidor deja de enviar X-Frame-Options en esas rutas y publica Content-Security-Policy: frame-ancestors 'self' https://tu-dominio. Los cambios se propagan en menos de 60 segundos.

Nunca se habilitan para embebido las rutas de API (/api/*), autenticación (/auth) ni el portal administrador (/admin).

Ejemplos de integración

<!-- Portal embebido sin menú lateral -->
<iframe
  src="https://www.informelegal.org/panel/expedientes?deleteMenu=true"
  width="100%"
  height="800"
  style="border:0"
  referrerpolicy="strict-origin-when-cross-origin"
  allow="clipboard-write"
  title="InformeLegal"
></iframe>
<!-- Expediente público (token temporal de 60 minutos) -->
<iframe
  src="https://www.informelegal.org/expediente-publico/AbC123..."
  width="100%"
  height="900"
  style="border:0"
  title="Expediente público"
></iframe>

Para que el usuario quede logueado dentro del iframe sin tipear su contraseña, combiná el endpoint de autologin con redirect_path y agregale ?deleteMenu=true.

Recomendaciones para el webmaster

  • Servir tu página siempre por HTTPS: el navegador bloquea contenido mixto.
  • No usar sandbox sin allow-scripts allow-same-origin allow-forms allow-popups.
  • Evitar bloqueos de cookies de terceros si embebés páginas con sesión (usá autologin en cada carga).
  • Altura mínima sugerida: 800 px, o ajustar dinámicamente según tu layout.
Playground interactivo
Desde el portal, cada organización tiene un tester en vivo con presets, generación de cURL y logs.