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

# Notificaciones

> Canales, tipos de evento y qué se degrada sin configurar.

## Los tres canales

Cada notificación puede salir por hasta tres canales:

* **Inbox in-app**: la lista que ve el usuario en la app (`GET /api/notifications`). Siempre funciona, sin configuración adicional.
* **Web Push** (`WEB_PUSH`): notificación push del navegador, vía suscripción VAPID.
* **Email** (`EMAIL`): correo enviado a través de Resend.

## Registro público

`POST /api/register` y `POST /api/register/camello` (los dos endpoints de alta, sin sesión) notifican a **todos los usuarios `ADMIN`** por los tres canales: inbox, Web Push y email.

## Eventos de Jobs

Los eventos `JOB_*` se disparan al crear un Job, al asignarlo (`POST /api/admin/jobs/:id/assign`) y en cada cambio de estado (aceptar, rechazar, completar, cancelar).

## Preferencias por canal

`GET /api/me/notification-preferences` devuelve `{ items: [{ channel, enabled }] }` para los canales `WEB_PUSH` y `EMAIL` (el inbox in-app no es configurable, siempre está activo). Se cambian con `PATCH /api/me/notification-preferences`.

<Warning>
  Si el usuario no tiene fila de preferencia para un canal, ese canal cuenta como **habilitado**. La ausencia de preferencia no es "deshabilitado por defecto" — es "habilitado hasta que se diga lo contrario". Es fácil asumir lo opuesto y la consecuencia es real: sin fila, ese usuario sigue recibiendo ese canal.
</Warning>

## `GET /api/admin/notifications`

Este endpoint (solo `ADMIN`) lista **deliveries** — es decir, qué se envió por cada canal — no notificaciones. La distinción importa: una misma notificación lógica puede generar varias filas de delivery (una por canal), y esta lista es sobre esos envíos individuales, con su propio `channel` y `status`. Acepta `limit`, `cursor`, y filtros por `channel`, `status`, `type` y `q`.

## Degradación sin configurar

Web Push y email dependen de variables de entorno; si faltan, ese canal se marca `SKIPPED` en el delivery correspondiente en lugar de fallar:

* Sin las variables `VAPID_*`, el canal push queda `SKIPPED`.
* Sin las variables `RESEND_*`, el canal email queda `SKIPPED`.
* El inbox in-app **no depende de ninguna de las dos** y sigue funcionando en ambos casos.

El detalle de qué hace cada variable y qué se degrada exactamente sin ella está en [Variables de entorno](/docs/handbook/empezar/variables-de-entorno).
