> ## Documentation Index
> Fetch the complete documentation index at: https://docs.corgea.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Slack

> Configura notificaciones de Slack mediante webhooks de Corgea

Envía alertas de Corgea a Slack conectando un webhook de Slack Workflow Builder bajo **Integraciones → Webhooks**.

<Warning>
  La entrada independiente **Slack** de Integraciones de automatización está obsoleta. Crea las notificaciones nuevas mediante **Webhooks**. Las integraciones existentes siguen funcionando; utiliza **Ver todo** para probarlas o eliminarlas.
</Warning>

<Frame>
  <img src="https://mintcdn.com/corgea/bUShOerLaxHbdmO7/images/webhooks/webhooks_integrations.png?fit=max&auto=format&n=bUShOerLaxHbdmO7&q=85&s=e84b9d7d75569f68d644ada376ea16bf" alt="Integraciones de automatización con Slack marcado como obsoleto" style={{ borderRadius: '0.5rem' }} width="1641" height="240" data-path="images/webhooks/webhooks_integrations.png" />
</Frame>

## Requisitos previos

* Acceso de administrador en Corgea
* Permiso para crear flujos de trabajo en tu espacio de trabajo de Slack

## Configurar Slack Workflow Builder

Utiliza Slack Workflow Builder para asignar los campos de nivel superior del payload de Corgea a un mensaje del canal.

<Warning>
  Slack Workflow Builder solo admite **claves JSON de nivel superior**. Las rutas anidadas, como `data.message` o `data.summary.total_issues`, **no son compatibles** y suelen producir un error HTTP 400 `invalid_workflow_input`.

  Con `Type = Slack` y una URL de Workflow Builder (`hooks.slack.com/triggers/...`), Corgea aplana **solo** `scan.started`, `scan.completed`, `scan.failed` y `webhook.test` en un payload de nivel superior. Asigna `message`, `pull_request_id`, `scan_url` y `true_positive_count`, no los campos `data.*` anidados.

  Los demás eventos suscritos al mismo webhook de Slack, como `issue.status_changed` o `sla.violation`, siguen recibiendo el sobre anidado. Para Workflow Builder, utiliza preferentemente eventos del ciclo de vida del escaneo. Para los demás eventos, usa un destino Custom Body o que no sea de Slack.
</Warning>

<Steps>
  <Step title="Crear un flujo de trabajo">
    1. En Slack, abre el menú de tu espacio de trabajo
    2. Ve a **Herramientas → Generador de Flujos de Trabajo**
    3. Haz clic en **Crear**
    4. Elige **Webhook** como disparador
    5. Nombra el flujo de trabajo y continúa
  </Step>

  <Step title="Configurar pasos del flujo de trabajo">
    1. Copia la URL del webhook de Workflow Builder (`hooks.slack.com/triggers/...`)
    2. En el paso del desencadenador **Webhook**, **añade variables** cuyos nombres coincidan con las claves de nivel superior de Corgea (Slack no detecta automáticamente los campos del payload). Añade al menos: `message`, `pull_request_id`, `scan_url`, `true_positive_count`, `scan_id`, `event_type`, `project_name`, `status`, `branch`, `company`
    3. Añade un paso **Enviar un mensaje** (es obligatorio: Corgea no publica por sí solo en Slack)
    4. Utiliza **Insertar una variable** para insertar esas variables del webhook en el mensaje; escribir el texto `{message}` no funcionará

    Ejemplo del cuerpo plano `scan.completed` que Corgea envía a Workflow Builder (los campos anidados `project`, `summary` y `scheduled_scan_ids` **no** se incluyen):

    ```json theme={null}
    {
      "event_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "event_type": "scan.completed",
      "timestamp": "2025-01-15T15:45:00.000Z",
      "message": "Scan completed for My Project (PR #42): 5 true-positive findings. View: https://app.corgea.app/project/proj-uuid-9012/?scan_id=scan-uuid-7890",
      "scan_id": "scan-uuid-7890",
      "scan_url": "https://app.corgea.app/project/proj-uuid-9012/?scan_id=scan-uuid-7890",
      "scan_type": "full",
      "pull_request_id": "42",
      "true_positive_count": 5,
      "status": "completed",
      "branch": "feature/auth",
      "project_name": "My Project",
      "company": "comp-uuid-1234",
      "run_id": "run-abc",
      "engine": "corgea"
    }
    ```

    En `scan.failed`, el cuerpo plano también incluye `error` en el nivel superior cuando está disponible.

    Empieza por `message` para obtener un resumen listo para enviar y añade `pull_request_id`, `scan_url` y `true_positive_count` para el triaje de pull requests.

    El texto de `message` para un escaneo completado utiliza el número de **verdaderos positivos** (no el total de hallazgos):
    `Scan completed for {project} (PR #N): X true-positive finding(s) [(Y with fixes)]. View: {scan_url}`
    `Y with fixes` cuenta correcciones solo entre esos hallazgos realmente positivos.

    5. Termina y publica el flujo de trabajo
  </Step>

  <Step title="Configurar en Corgea">
    1. Ve a **Integraciones → Webhooks**
    2. Crea un webhook
    3. Establece **Tipo** en `Slack`
    4. Introduce un nombre y pega la URL del Workflow Builder
    5. Suscríbete a `scan.completed`, `scan.failed` o ambos; también puedes añadir `scan.started`
    6. En **Filtros de eventos de escaneo**, de forma opcional:
       * **Solo escaneos de pull request / merge request** — omite los escaneos que no son de PR
       * **Solo escaneos completados con hallazgos verdaderos positivos** — omite `scan.completed` cuando `true_positive_count` es 0 (`scan.failed` no se ve afectado)
    7. Haz clic en **Crear Webhook** y guarda la clave secreta de un solo uso
    8. Haz clic en **Test** para confirmar la entrega
  </Step>
</Steps>

## Resultado esperado de la prueba del webhook

Cuando haces clic en **Probar Webhook** en un destino de Slack Workflow Builder, Corgea envía una muestra plana como:

```json theme={null}
{
  "event_id": "...",
  "event_type": "webhook.test",
  "timestamp": "2025-01-15T15:45:00.000Z",
  "message": "This is a test webhook from Corgea",
  "test": true,
  "webhook_name": "My Slack Hook",
  "company": "comp-uuid-1234",
  "company_id": "comp-uuid-1234",
  "scan_id": "00000000-0000-0000-0000-000000000000",
  "scan_url": "https://app.corgea.app/project/example/?scan_id=00000000-0000-0000-0000-000000000000",
  "scan_type": "full",
  "pull_request_id": "123",
  "true_positive_count": 2,
  "status": "completed",
  "branch": "main",
  "project_name": "Example Project",
  "run_id": "test-run",
  "engine": "corgea"
}
```

`company` coincide con los eventos de escaneo reales. `company_id` contiene el mismo valor para los consumidores antiguos de Test. Los destinos que no son de Slack reciben los mismos campos anidados en `data` dentro del sobre habitual.

Espera:

* HTTP 2xx de Slack (no 400 `invalid_workflow_input`)
* Un mensaje de Slack no vacío cuando asignes la variable de nivel superior `message`
* Nombres de variables que coincidan con los eventos de producción, para poder asignar durante la prueba el número de PR, el enlace al escaneo y el recuento de verdaderos positivos

## Contenido de notificaciones

Para el generador de flujos de trabajo de Slack (`Type = Slack` + `hooks.slack.com/triggers/...`), mapea estos campos **de nivel superior**:

| Campo                 | Descripción                                                                           |
| --------------------- | ------------------------------------------------------------------------------------- |
| `message`             | Resumen listo para enviar (PR #, conteo de TP, URL de escaneo cuando esté disponible) |
| `event_type`          | por ejemplo, `scan.completed`, `scan.failed`, `webhook.test`                          |
| `event_id`            | UUID de evento de entrega                                                             |
| `timestamp`           | Marca temporal ISO 8601                                                               |
| `scan_id`             | UUID del escaneo                                                                      |
| `scan_url`            | Enlace profundo al escaneo en Corgea                                                  |
| `scan_type`           | Cadena con el tipo de escaneo                                                         |
| `pull_request_id`     | Número PR/MR cuando esto es un escaneo pull request (vacío cuando no es PR)           |
| `true_positive_count` | Hallazgos de seguridad no eliminados excluyendo falsos positivos y calidad del código |
| `status`              | `started`, `completed`, o `failed`                                                    |
| `branch`              | Rama Git                                                                              |
| `project_name`        | Nombre del proyecto                                                                   |
| `company`             | ID de empresa (misma clave que las cargas útiles de escaneo en vivo)                  |
| `company_id`          | Mismo valor que `company` (solo en `webhook.test`, no en eventos `scan.*` reales)     |
| `run_id`              | ID de la ejecución de escaneo                                                         |
| `engine`              | Motor del escáner                                                                     |
| `error`               | Motivo de fallo (`scan.failed` solo cuando está presente)                             |
| `test`                | `true` en `webhook.test` solo                                                         |
| `webhook_name`        | Nombre de usuario de Webhook (`webhook.test` solo)                                    |

`true_positive_count` coincide con el recuento de seguridad de la interfaz de escaneo: excluye `status=false_positive`, `hold_reason=false_positive` y `detected_by=code-quality`. Los campos anidados como `summary`, `project`, `scheduled_scan_ids`, `scan_errors`, `created_at` y `processed_at` permanecen disponibles en `data` para Zapier/Other (y en el historial de entregas), pero no se aplanan para Slack Workflow Builder.

## Notas de compatibilidad

* **Zapier / Otros:** siguen recibiendo el sobre anidado (`event_id`, `event_type`, `timestamp`, `data`), incluyendo `data.message`, `data.summary`, y los nuevos campos de triaje bajo `data`.
* **Configuraciones existentes de Slack Workflow Builder** que asignaban campos `data.*` anidados dejarán de funcionar; vuelve a asignarlos a claves de nivel superior (`message`, no `data.message`).
* **Historial de entregas** en Corgea almacena el sobre anidado incluso cuando Slack recibe un cuerpo HTTP plano.
* **Los eventos que no son de escaneo** de un webhook de Slack Workflow Builder no se aplanan; mantenlos en Zapier/Other o utiliza un Custom Body si necesitas variables de Slack.

## Incoming Webhooks frente a Workflow Builder

* **Recomendado:** URL de Workflow Builder (`hooks.slack.com/triggers/...`) con un paso **Enviar un mensaje**. Corgea aplana `scan.*` y `webhook.test` cuando `Type = Slack`.
* **Incoming Webhooks** (`hooks.slack.com/services/...`): no se pueden guardar a menos que añadas un [Custom Body](/es/webhooks) cuyo JSON renderizado contenga una cadena `text` no vacía en el nivel superior (texto alternativo de Slack; también se permite `blocks`). `{"text": "{{message}}"}` solo funciona si el webhook se limita a `scan.started` / `scan.completed` / `scan.failed` / `scheduled_scan.daily_report` (`{{message}}` está vacío en los demás eventos). Sin un cuerpo válido, las entregas fallan y el webhook puede pausarse automáticamente.

## Gestión de integraciones existentes de Slack

Si aún tienes integraciones en la fila obsoleta de Slack, abre **Ver todo** para probarlas o eliminarlas:

<Frame>
  <img src="https://mintcdn.com/corgea/bUShOerLaxHbdmO7/images/webhooks/slack_view_all_modal.png?fit=max&auto=format&n=bUShOerLaxHbdmO7&q=85&s=82712d185c56db9be7b35b1e8eff1931" alt="Ver todas las modales de integraciones de Slack para gestionar integraciones existentes" style={{ borderRadius: '0.5rem' }} width="839" height="350" data-path="images/webhooks/slack_view_all_modal.png" />
</Frame>

## Opciones de personalización

Con Workflow Builder, puedes:

* Enruta mensajes a diferentes canales por gravedad o proyecto
* Añadir recordatorios o pasos de seguimiento
* Construye lógica condicional alrededor de los resultados del escaneo (por ejemplo, solo notifica cuando `true_positive_count` es mayor que 0)
* Reutilizar las mismas variables del payload en varias acciones

Utiliza los **filtros de eventos de escaneo** de Corgea (solo PR y escaneos completados con hallazgos) para evitar el ruido de escaneos programados o completos sin recurrir a un servicio externo de aplanamiento como Zapier.

## Recursos adicionales

* [Guía para crear flujos de trabajo de Slack](https://slack.com/help/articles/360035692513-Guide-to-Workflow-Builder)
* [Aplanar JSON para Workflow Builder](https://slack.dev/flatten-json-for-workflow-builder/)
* [Webhooks de Corgea](/es/webhooks)
