# Discourse (/es/docs/integrations/discourse)

Conecta una comunidad de Discourse a Sift para ingestar temas, respuestas y mensajes privados en una sola bandeja y responder desde ahí - sin que tu equipo tenga que vivir en Discourse.

## De un vistazo [#de-un-vistazo]

| | |
| --- | --- |
| Entrante: Nuevos temas (todas las categorías monitoreadas) | ✅ |
| Entrante: Respuestas + ediciones de temas | ✅ |
| Entrante: Mensajes privados al usuario agente | ✅ |
| Entrante: Cambios de estado (cerrar / archivar / trash) | ✅ |
| Entrante: Whispers / posts solo-staff | ⚠️ visibles solo si el usuario agente los puede ver |
| Saliente: Publicar respuesta en hilo | ✅ |
| Saliente: Cerrar / reabrir un tema | ✅ |
| Saliente: Marcar (flag) un post para moderación | ✅ requiere alcance `post_actions` |
| Saliente: Editar / eliminar posts existentes | ❌ nunca |
| Enriquecimiento de autor (email, trust level, flag de admin) | ✅ requiere `check_emails` |
| Múltiples instancias de Discourse por workspace | ✅ |
| Bots de respuesta automática | ✅ |
| Webhook-driven (sin polling) | ✅ |

## Configurarlo [#configurarlo]

{/* setup-screenshot */}
<figure>
  <img src="/assets/screenshots/discourse/setup.png" alt="La página de configuración de Discourse en Sift, mostrando cuentas conectadas (nombres de cuenta redactados para los docs)." />
  <figcaption>Configuración de Discourse en Sift - gestiona las cuentas conectadas aquí.</figcaption>
</figure>

Ve a [Configuración → Integraciones → Discourse](https://app.getsift.ai/app/settings/integrations/) y:

1. **Crea un usuario "Sift agent" dedicado** en Discourse - trust level admin o moderador. Sift vincula la API key a este único usuario, no a "All Users".
2. **Genera una API key** vinculada a ese usuario, con los alcances granulares en [Configuración de la API key](#configuración-de-la-api-key) abajo.
3. **Agrega un webhook** en Discourse (Admin → API → Webhooks) apuntando a `https://api.getsift.ai/integrations/discourse` con los eventos en [Webhook](#webhook) abajo.
4. **Pega la API key + URL de la comunidad en Sift** y listo - los nuevos temas comienzan a fluir inmediatamente.

Los detalles profundos "para qué es cada alcance" + "cada endpoint que tocamos" están abajo para tu revisión de seguridad.

## Lo que puedes hacer [#lo-que-puedes-hacer]

**Responde** en cualquier tema desde la bandeja - Sift publica de vuelta a Discourse como el usuario agente dedicado. **Cierra o reabre** un tema desde la bandeja. **Marca un post para moderación** (spam / fuera de tema / inapropiado / notificar-usuario / notificar-moderadores) si tu API key tiene el alcance `post_actions`.

**Activa workflows** según señales del tema (categoría, autor, trust level, keyword, sentimiento). Enruta al equipo correcto automáticamente. **Aplica bots de respuesta automática** para patrones de FAQ.

El enriquecimiento de autor (email, trust level, flag de admin) se superpone a cada post entrante para que los workflows puedan enrutar diferente para staff vs. cuentas nuevas vs. usuarios de trust level 3.

## Configuración de la API key [#configuración-de-la-api-key]

- **Vincúlala a un único usuario dedicado.** Crea un usuario "Sift agent" en Discourse y vincula la API key a ese usuario únicamente - **no** a "All Users". Auditoría limpia, revocación de una sola cuenta.
- **Trust level.** El usuario agente debe ser **administrador o moderador**. Requerido para `/admin/users/*`, cambios de estado de temas y creación de usuarios, sin importar los alcances granulares de la key.
- **Atribución.** Las respuestas salientes usan el header `Api-Username` para atribuir publicaciones al usuario agente (o `system` como fallback).

## Alcances granulares [#alcances-granulares]

El conjunto mínimo que Sift necesita:

```
categories:     list, show
topics:         read, read_lists, write, status
users:          list, show, check_emails, create
post_actions:   (gobierna POST /post_actions.json - ver nota sobre Flagging abajo)
```

**`categories`**: `list` para el árbol completo de categorías al configurar + `show` para paginar temas dentro de una categoría.

**`topics`**: `read` (cada tema ingestado + cada webhook), `read_lists` (vistas paginadas de categoría), `write` (publicar respuestas del agente), `status` (cerrar/reabrir). `update`/`delete`/`recover`/`change_owner` no se usan - no otorgar.

**`users`**: `list` (verificación de conexión + buscar por email), `show` (enriquecer cada autor con email, trust level, flag de admin), `check_emails` (Discourse oculta los emails detrás de este alcance incluso para keys admin), `create` (una sola vez: provisiona el usuario agente de Sift durante el onboarding). Nada más - sin update, sin log_out, sin suspend, sin delete, sin sync_sso.

**`posts`**: ninguno. Las respuestas están cubiertas por `topics:write`. Sift nunca edita, elimina ni recupera posts.

### Flagging - `post_actions` [#flagging---post_actions]

Sift llama `POST /post_actions.json` para marcar posts para moderación (spam / fuera de tema / inapropiado / notificar-usuario / notificar-moderadores) desde la bandeja. Si `post_actions` no es seleccionable como alcance propio en tu UI de keys, otorga el grupo de alcance que cubra `/post_actions.json` en tu versión de Discourse, o publica sin flagging - no es ruta crítica.

## Lo que Sift nunca toca [#lo-que-sift-nunca-toca]

Ningún endpoint de AI, automation, badges, data explorer, email-in, groups, invites, logs, revisions, search, solved, tags, uploads, user_status, ni WordPress. Contáctanos si tu revisión de seguridad necesita la lista completa enumerada.

## Webhook [#webhook]

En **Admin → API → Webhooks**, apunta a:

```
https://api.getsift.ai/integrations/discourse
```

Suscríbete a: `topic_created`, `topic_edited`, `topic_archived`, `topic_closed`, `topic_recovered`, `topic_trashed`, `post_created`. Recomendado usar webhook secret. Sift deduplica sus propios posts salientes (TTL de 5 min) para que los echoes de respuestas del agente no se re-ingesten.

## Referencia de endpoints [#referencia-de-endpoints]

Para auditoría:

| Endpoint | Usado para | Alcance |
| --- | --- | --- |
| `GET /site.json` | Onboarding | público |
| `GET /categories.json` | Enumerar categorías | `categories:list` |
| `GET /c/{slug}/{id}.json` | Listar temas | `categories:show` + `topics:read_lists` |
| `GET /t/{topicId}.json` | Tema + posts completos | `topics:read` |
| `GET /admin/users/list/{filter}.json` | Verificación de conexión, buscar por email | `users:list` (+ `check_emails`) |
| `GET /admin/users/{id}.json` | Enriquecimiento de usuario | `users:show` + `check_emails` |
| `GET /u/{username}.json` | Búsqueda pública de usuario | `users:show` |
| `POST /users.json` | Provisionar usuario agente de Sift | `users:create` |
| `POST /posts.json` | Publicar respuesta del agente | `topics:write` |
| `PUT /t/{topicId}/status.json` | Cerrar / reabrir tema | `topics:status` |
| `POST /post_actions.json` | Marcar post | `post_actions:*` |
