Docs/API y webhooks/Catálogo de contenido

Catálogo de contenido

El catálogo es la fuente de verdad para los identificadores de categoría, módulo y tema usados en cualquier otra parte de la API pública. Consúltalos aquí antes de llamar a POST /assignments, construir elementos de cursos personalizados o interpretar respuestas de cumplimiento. Scope requerido: content:read.

Endpoints

MétodoRutaScopePropósito
GET/api/public/v1/content/categoriescontent:readTodas las categorías de nivel superior.
GET/api/public/v1/content/categories/{'{'}categoryId{'}'}/topicscontent:readTodos los temas dentro de una categoría, con información de módulo y CWE.
GET/api/public/v1/content/cwes/{'{'}cweId{'}'}/topicscontent:readResolver un id de CWE a la lista de temas que lo cubren.

Listar categorías

Devuelve todas las categorías visibles para tu organización. Las categorías reflejan las cuatro familias OWASP usadas en los endpoints de cumplimiento: web, api, mobile y client.

GET /api/public/v1/content/categories
Authorization: Bearer scs_live_…

Respuesta

{
  "count": 4,
  "categories": [
    { "categoryId": "web",    "title": "OWASP Top 10 (Web)" },
    { "categoryId": "api",    "title": "OWASP API Security Top 10" },
    { "categoryId": "mobile", "title": "OWASP Mobile Top 10" },
    { "categoryId": "client", "title": "OWASP Client-Side Top 10" }
  ]
}

Ejemplo

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

Listar temas en una categoría

Devuelve todos los temas que se agregan a la categoría dada, cada uno anotado con su módulo padre y el conjunto de CWEs usado para el mapeo de SARIF. Devuelve 404 category_not_found si el categoryId no es una de las cuatro anteriores.

GET /api/public/v1/content/categories/web/topics
Authorization: Bearer scs_live_…

Respuesta

{
  "categoryId": "web",
  "categoryTitle": "OWASP Top 10 (Web)",
  "count": 2,
  "topics": [
    {
      "topicId": "sql-injection",
      "title": "SQL Injection",
      "moduleId": "a03-injection",
      "moduleTitle": "A03: Injection",
      "cwes": ["CWE-89"]
    },
    {
      "topicId": "xss-reflected",
      "title": "Reflected Cross-Site Scripting",
      "moduleId": "a03-injection",
      "moduleTitle": "A03: Injection",
      "cwes": ["CWE-79", "CWE-80"]
    }
  ]
}
  • topicId es el valor que pasas a POST /assignments y a los elementos de cursos personalizados.
  • moduleId coincide con el moduleId usado en las respuestas de detalle de framework de cumplimiento, así que puedes unir ambos endpoints en el cliente.
  • moduleTitle puede ser null para temas que no se agrupan bajo un módulo OWASP (raro; reservado para contenido ad-hoc).

Ejemplo

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/content/categories/api/topics

Resolver un CWE a temas

Dado un identificador de CWE, devuelve todos los temas que lo cubren. Es la misma búsqueda que la ingesta de SARIF usa internamente: invócala directamente cuando quieras mapear un hallazgo a formación sin tener que ingerir un informe completo.

GET /api/public/v1/content/cwes/CWE-89/topics
Authorization: Bearer scs_live_…

Formatos de CWE aceptados

El segmento {'{'}cweId{'}'} de la ruta se normaliza en el servidor. Todos los siguientes se resuelven de forma idéntica:

  • 89
  • cwe-89
  • CWE-89
  • external/cwe/cwe-89

El campo cwe de la respuesta siempre devuelve la forma canónica normalizada (CWE-89). Los CWEs desconocidos devuelven 200 con count: 0 y un array topics vacío, no un 404, para que el cliente no tenga que tratar como caso especial los IDs no mapeados.

Respuesta

{
  "cwe": "CWE-89",
  "count": 1,
  "topics": [
    {
      "topicId": "sql-injection",
      "title": "SQL Injection",
      "moduleId": "a03-injection",
      "moduleTitle": "A03: Injection",
      "categoryId": "web",
      "categoryTitle": "OWASP Top 10 (Web)"
    }
  ]
}

Ejemplo

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/content/cwes/external/cwe/cwe-79/topics

Estabilidad de los identificadores

Los identificadores de categoría, módulo y tema son cadenas estables: no cambian una vez publicados. Pueden añadirse nuevos temas bajo módulos existentes y nuevos módulos bajo categorías existentes, pero se evitan los renombrados para mantener las integraciones resilientes. Si alguna vez se retira un tema, el identificador se conserva y el tema se oculta del catálogo en lugar de reciclarse.