Docs/API y webhooks/Cumplimiento

Cumplimiento

Dos vistas de cobertura paralelas sobre los mismos datos de formación. La vista OWASP puntúa a tu plantilla frente a las cuatro familias del OWASP Top 10 (Web, API, Móvil, Cliente). La vista regulatoria puntúa la misma formación frente a estándares externos (PCI DSS, ISO/IEC 27001, SOC 2) mapeando cada control a sus CWEs subyacentes. Scope requerido: compliance:read.

Endpoints

MétodoRutaScopePropósito
GET/api/public/v1/compliance/summarycompliance:readResumen de cobertura OWASP a través de los cuatro frameworks.
GET/api/public/v1/compliance/frameworks/{'{'}frameworkId{'}'}compliance:readDesglose por módulo para un framework OWASP.
GET/api/public/v1/compliance/regulatory/summarycompliance:readResumen de cobertura para los frameworks regulatorios.
GET/api/public/v1/compliance/regulatory/{'{'}frameworkId{'}'}compliance:readDesglose por control para un framework regulatorio.

Cómo se calcula la cobertura

Un usuario elegible es cualquier miembro activo de la organización cuyo rol no sea org_admin. Un usuario cuenta como formado en un tema si tiene al menos un intento de práctica con puntuación ≥ passingScore (70) dentro de los últimos windowDays (365). Un elemento de riesgo (módulo OWASP o control regulatorio) pasa a estado covered cuando el porcentaje de usuarios elegibles formados en él supera el coverageThresholdPercent de tu organización, por defecto 80, configurable desde la UI de administración entre 50 y 100.

Identificadores de framework

TipoIdentificadorTítulo
OWASPwebOWASP Top 10 (Web)
OWASPapiOWASP API Security Top 10
OWASPmobileOWASP Mobile Top 10
OWASPclientOWASP Client-Side Top 10
Regulatoriopci-dssPCI DSS v4.0 — Requisito 6.2.4
Regulatorioiso-27001ISO/IEC 27001:2022 — Anexo A, desarrollo seguro
Regulatoriosoc-2SOC 2 — Trust Services Criteria (TSC 2017)

Resumen OWASP

Una entrada por framework OWASP. Úsalo para tarjetas de panel.

GET /api/public/v1/compliance/summary
Authorization: Bearer scs_live_…

Respuesta

{
  "frameworks": [
    {
      "frameworkId": "web",
      "title": "OWASP Top 10 (Web)",
      "totalRiskItems": 10,
      "coveredRiskItems": 7,
      "partialRiskItems": 2,
      "noActivityRiskItems": 1,
      "noContentRiskItems": 0,
      "eligibleUsers": 142,
      "trainedUsers": 118,
      "coveragePercent": 83.1,
      "avgScore": 86.4
    },
    {
      "frameworkId": "api",
      "title": "OWASP API Security Top 10",
      "totalRiskItems": 10,
      "coveredRiskItems": 5,
      "partialRiskItems": 3,
      "noActivityRiskItems": 2,
      "noContentRiskItems": 0,
      "eligibleUsers": 142,
      "trainedUsers": 91,
      "coveragePercent": 64.1,
      "avgScore": 79.2
    }
  ],
  "passingScore": 70,
  "coverageThresholdPercent": 80,
  "windowDays": 365,
  "generatedAt": "2026-05-29T13:42:11.318Z"
}
  • covered + partial + noActivity + noContent = totalRiskItems.
  • noContent significa que aún no hemos publicado formación para ese elemento de riesgo: trátalo como una brecha conocida, no como un fallo de la plantilla.
  • avgScore es la media de los intentos aprobados dentro de la ventana, expresada en una escala 0–100.

Ejemplo

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/compliance/summary

Detalle de un framework OWASP

Profundiza en un framework: devuelve los elementos de riesgo por módulo, cada uno con los temas y CWEs que lo componen. Devuelve 404 framework_not_found para cualquier identificador fuera de web | api | mobile | client.

GET /api/public/v1/compliance/frameworks/web
Authorization: Bearer scs_live_…

Respuesta

{
  "frameworkId": "web",
  "title": "OWASP Top 10 (Web)",
  "summary": {
    "frameworkId": "web",
    "title": "OWASP Top 10 (Web)",
    "totalRiskItems": 10,
    "coveredRiskItems": 7,
    "partialRiskItems": 2,
    "noActivityRiskItems": 1,
    "noContentRiskItems": 0,
    "eligibleUsers": 142,
    "trainedUsers": 118,
    "coveragePercent": 83.1,
    "avgScore": 86.4
  },
  "riskItems": [
    {
      "moduleId": "a01-broken-access-control",
      "title": "A01: Broken Access Control",
      "status": "covered",
      "topicsCount": 4,
      "eligibleUsers": 142,
      "trainedUsers": 124,
      "coveragePercent": 87.3,
      "avgScore": 88.1,
      "topics": [
        {
          "topicId": "idor",
          "title": "Insecure Direct Object References",
          "trainedUsers": 121,
          "totalAttempts": 318,
          "avgScore": 87.6,
          "cwes": ["CWE-639", "CWE-285"]
        }
      ]
    }
  ],
  "passingScore": 70,
  "coverageThresholdPercent": 80,
  "windowDays": 365,
  "generatedAt": "2026-05-29T13:42:11.318Z"
}
  • status es uno de covered, partial, no-activity, no-content.
  • totalAttempts incluye intentos fallidos dentro de la ventana; trainedUsers cuenta solo a los usuarios con al menos un intento aprobado.

Ejemplo

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/compliance/frameworks/api

Resumen regulatorio

Misma forma que el resumen OWASP, pero para frameworks regulatorios. Cada entrada lleva version y subtitle para que puedas renderizar directamente la cláusula identificativa del estándar.

GET /api/public/v1/compliance/regulatory/summary
Authorization: Bearer scs_live_…

Respuesta

{
  "frameworks": [
    {
      "frameworkId": "pci-dss",
      "title": "PCI DSS",
      "version": "v4.0",
      "subtitle": "Payment Card Industry Data Security Standard — Requirement 6 (Secure Systems and Software)",
      "totalControls": 6,
      "coveredControls": 4,
      "partialControls": 1,
      "noActivityControls": 1,
      "noContentControls": 0,
      "eligibleUsers": 142,
      "trainedUsers": 105,
      "coveragePercent": 73.9,
      "avgScore": 84.7
    },
    {
      "frameworkId": "iso-27001",
      "title": "ISO/IEC 27001",
      "version": "2022",
      "subtitle": "Annex A controls — secure development and application security",
      "totalControls": 6,
      "coveredControls": 5,
      "partialControls": 1,
      "noActivityControls": 0,
      "noContentControls": 0,
      "eligibleUsers": 142,
      "trainedUsers": 117,
      "coveragePercent": 82.4,
      "avgScore": 86.0
    }
  ],
  "passingScore": 70,
  "coverageThresholdPercent": 80,
  "windowDays": 365,
  "generatedAt": "2026-05-29T13:42:11.318Z"
}

Ejemplo

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/compliance/regulatory/summary

Detalle de un framework regulatorio

Desglose por control. Cada control incluye la descripción original tal y como la publica el estándar y el conjunto de CWEs que usamos para mapear formación al control. Devuelve 404 regulatory_framework_not_found para identificadores desconocidos.

GET /api/public/v1/compliance/regulatory/pci-dss
Authorization: Bearer scs_live_…

Respuesta

{
  "frameworkId": "pci-dss",
  "title": "PCI DSS",
  "version": "v4.0",
  "subtitle": "Payment Card Industry Data Security Standard — Requirement 6 (Secure Systems and Software)",
  "summary": {
    "frameworkId": "pci-dss",
    "title": "PCI DSS",
    "version": "v4.0",
    "subtitle": "Payment Card Industry Data Security Standard — Requirement 6 (Secure Systems and Software)",
    "totalControls": 6,
    "coveredControls": 4,
    "partialControls": 1,
    "noActivityControls": 1,
    "noContentControls": 0,
    "eligibleUsers": 142,
    "trainedUsers": 105,
    "coveragePercent": 73.9,
    "avgScore": 84.7
  },
  "controls": [
    {
      "controlId": "6.2.4.a",
      "title": "Injection Attacks",
      "description": "Address attacks that inject untrusted data into commands or queries (Req 6.2.4.a).",
      "cwes": ["CWE-89", "CWE-78", "CWE-79", "CWE-94", "CWE-611", "CWE-917", "CWE-918"],
      "status": "covered",
      "topicsCount": 7,
      "eligibleUsers": 142,
      "trainedUsers": 128,
      "coveragePercent": 90.1,
      "avgScore": 88.6,
      "topics": [
        {
          "topicId": "sql-injection",
          "title": "SQL Injection",
          "trainedUsers": 131,
          "totalAttempts": 402,
          "avgScore": 89.4,
          "cwes": ["CWE-89"]
        }
      ]
    }
  ],
  "passingScore": 70,
  "coverageThresholdPercent": 80,
  "windowDays": 365,
  "generatedAt": "2026-05-29T13:42:11.318Z"
}

Ejemplo

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/compliance/regulatory/iso-27001