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

# Módulos de producto

> Qué tiene encendido cada institución, y por qué un endpoint puede responder 403 aunque el token esté bien.

No todas las instituciones compran lo mismo. Cada tenant tiene una lista de módulos habilitados (`enabledProductModules`), configurable en **Institución → Capacidades**, y esa lista decide tres cosas: qué se ve en la navegación, qué se ve en el portal, y qué endpoints responden.

<Warning>
  Si un endpoint del Client API devuelve `403 MODULE_DISABLED`, el token está bien: lo que falta es el módulo en la institución. Revisa `platform_integrations` y el módulo funcional del recurso que estás tocando.
</Warning>

## El registro canónico

Los ids son estables y viven en `packages/shared/src/product-modules/registry.ts`. La API solo acepta subconjuntos de esta lista.

* **Capa `application`**: funcionalidad que usa la gente.
* **Capa `platform`**: capacidades transversales de las que cuelgan otras.
* **Por defecto**: si una institución nueva lo recibe encendido (estrategia opt-out) o no (opt-in).
* **Configurable**: si un administrador puede apagarlo desde la interfaz.

### Staff — el dashboard administrativo

| Módulo                 | Nombre           | Por defecto | Configurable |
| ---------------------- | ---------------- | ----------- | ------------ |
| `staff_students`       | Estudiantes      | sí          | sí           |
| `staff_courses`        | Cursos           | sí          | sí           |
| `staff_programs`       | Programas        | sí          | sí           |
| `staff_grades`         | Calificaciones   | sí          | sí           |
| `staff_attendance`     | Asistencia       | sí          | sí           |
| `staff_enrollments`    | Matrículas       | sí          | sí           |
| `staff_admissions`     | Admisiones       | sí          | sí           |
| `staff_communications` | Comunicaciones   | sí          | sí           |
| `staff_scheduling`     | Agenda y citas   | sí          | sí           |
| `staff_vault`          | Vault documental | sí          | sí           |
| `staff_payments`       | Pagos            | sí          | sí           |
| `staff_forms`          | Formularios      | sí          | sí           |
| `staff_reports`        | Reportes         | sí          | sí           |
| `staff_pqrs`           | PQRS             | **no**      | sí           |
| `staff_public_pages`   | EdFlyer          | **no**      | sí           |
| `staff_academy`        | Academy          | sí          | **no**       |
| `staff_support`        | Soporte          | sí          | **no**       |

PQRS y EdFlyer son módulos especializados: se encienden en la institución que los pide. Academy y Soporte no se apagan — son parte de la plataforma.

### Portal — familias y estudiantes

Todos cuelgan de `portal_base`. Apagar la base apaga el portal entero.

| Módulo              | Nombre                    | Requiere      | Por defecto |
| ------------------- | ------------------------- | ------------- | ----------- |
| `portal_base`       | Portal estudiantil (base) | —             | sí          |
| `portal_grades`     | Calificaciones            | `portal_base` | sí          |
| `portal_fees`       | Cuotas                    | `portal_base` | sí          |
| `portal_program`    | Programa                  | `portal_base` | sí          |
| `portal_attendance` | Asistencia                | `portal_base` | sí          |
| `portal_messages`   | Mensajes                  | `portal_base` | sí          |
| `portal_calendar`   | Calendario                | `portal_base` | sí          |
| `portal_pqrs`       | PQRS                      | `portal_base` | sí          |

### Plataforma

| Módulo                  | Nombre           | Por defecto | Para qué                                                            |
| ----------------------- | ---------------- | ----------- | ------------------------------------------------------------------- |
| `platform_integrations` | Integraciones    | **no**      | **Requisito del Client API.** Sin esto no hay API keys ni webhooks. |
| `platform_workflows`    | Automatizaciones | sí          | Notificaciones, bots de conversación, tareas disparadas por evento. |

## Cómo lo ve tu integración

`GET /api/client/v1/me` devuelve `enabledModules` con la lista efectiva de la institución. Consúltalo al arrancar en vez de asumir: es la diferencia entre un error claro en tu despliegue y un `403` intermitente en producción.

```json theme={null}
{
  "data": {
    "tenant": { "id": "...", "slug": "colegio-abc", "name": "Colegio ABC" },
    "apiKey": {
      "id": "...",
      "name": "SIS producción",
      "scopes": ["students:read", "students:write"],
      "masterDomains": ["students"],
      "rateLimit": { "requestsPerMinute": 120 }
    },
    "productAccess": {
      "enabledModules": ["platform_integrations", "staff_students", "..."],
      "sorByDomain": { "students": "external_master", "grades": "edtools_master" }
    }
  }
}
```

<Info>
  La navegación del dashboard, la barra del portal y la paleta de comandos (`⌘K`) filtran contra esta misma lista. Un módulo apagado no es un enlace escondido: es una capacidad que no existe para esa institución.
</Info>
