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.
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). Si la cancelación trae motivo, el cuerpo de JOB_STATUS_CHANGED lo incluye. El recordatorio de cita (APPOINTMENT_REMINDER) no sale en esos momentos: lo dispara POST /api/cron/appointment-reminders cuando la cita está a menos de 24 horas. Al aceptar un trabajo se emite JOB_DOCUMENT_READY con la orden de servicio imprimible (/trabajos/:id/comprobante). La bandeja permite marcar todas como leídas (POST /api/notifications/read-all), borrar una (DELETE /api/notifications/:id) y vaciar (POST /api/notifications/clear).
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.
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.
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.
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.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"CamellApp","colors":{"primary":"#c88d2f","light":"#e0b46a","dark":"#122c51"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"camellapp","hasAudioNarration":false,"actualSubdomain":"camellapp","customDomains":["docs.camellapp.com"],"gitSource":{"type":"github","owner":"mangomorado","repo":"camellapp","deployBranch":"master","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6aec9a1f8c2847cc731fd8b8","clientVersion":"0.0.4076","searchFilterCounts":[{"language":"default","tag":"API","count":65},{"language":"default","tag":"Dominio","count":9},{"language":"default","tag":"Notifications","count":8},{"language":"default","tag":"Jobs","count":7},{"language":"default","tag":"Admin Users","count":6},{"language":"default","tag":"Agenda","count":6},{"language":"default","tag":"Me","count":6},{"language":"default","tag":"Arquitectura","count":5},{"language":"default","tag":"Admin Camellos","count":5},{"language":"default","tag":"Auth","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"docs/handbook/dominio/notificaciones","slug":"/docs/handbook/dominio/notificaciones","pageMetadata":{"title":"Notificaciones","description":"Canales, tipos de evento y qué se degrada sin configurar.","href":"/docs/handbook/dominio/notificaciones"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Canales, tipos de evento y qué se degrada sin configurar.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`los-tres-canales`,children:`Los tres canales`}),`\n`,_jsx(_components.p,{children:`Cada notificación puede salir por hasta tres canales:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Inbox in-app`}),`: la lista que ve el usuario en la app (`,_jsx(_components.code,{children:`GET /api/notifications`}),`). Siempre funciona, sin configuración adicional.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Web Push`}),` (`,_jsx(_components.code,{children:`WEB_PUSH`}),`): notificación push del navegador, vía suscripción VAPID.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Email`}),` (`,_jsx(_components.code,{children:`EMAIL`}),`): correo enviado a través de Resend.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`registro-público`,children:`Registro público`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`POST /api/register`}),` y `,_jsx(_components.code,{children:`POST /api/register/camello`}),` (los dos endpoints de alta, sin sesión) notifican a `,_jsxs(_components.strong,{children:[`todos los usuarios `,_jsx(_components.code,{children:`ADMIN`})]}),` por los tres canales: inbox, Web Push y email.`]}),`\n`,_jsx(Heading,{level:`2`,id:`eventos-de-jobs`,children:`Eventos de Jobs`}),`\n`,_jsxs(_components.p,{children:[`Los eventos `,_jsx(_components.code,{children:`JOB_*`}),` se disparan al crear un Job, al asignarlo (`,_jsx(_components.code,{children:`POST /api/admin/jobs/:id/assign`}),`) y en cada cambio de estado (aceptar, rechazar, completar, cancelar). Si la cancelación trae motivo, el cuerpo de `,_jsx(_components.code,{children:`JOB_STATUS_CHANGED`}),` lo incluye. El recordatorio de cita (`,_jsx(_components.code,{children:`APPOINTMENT_REMINDER`}),`) no sale en esos momentos: lo dispara `,_jsx(_components.code,{children:`POST /api/cron/appointment-reminders`}),` cuando la cita está a menos de 24 horas. Al aceptar un trabajo se emite `,_jsx(_components.code,{children:`JOB_DOCUMENT_READY`}),` con la orden de servicio imprimible (`,_jsx(_components.code,{children:`/trabajos/:id/comprobante`}),`). La bandeja permite marcar todas como leídas (`,_jsx(_components.code,{children:`POST /api/notifications/read-all`}),`), borrar una (`,_jsx(_components.code,{children:`DELETE /api/notifications/:id`}),`) y vaciar (`,_jsx(_components.code,{children:`POST /api/notifications/clear`}),`).`]}),`\n`,_jsx(Heading,{level:`2`,id:`preferencias-por-canal`,children:`Preferencias por canal`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`GET /api/me/notification-preferences`}),` devuelve `,_jsx(_components.code,{children:`{ items: [{ channel, enabled }] }`}),` para los canales `,_jsx(_components.code,{children:`WEB_PUSH`}),` y `,_jsx(_components.code,{children:`EMAIL`}),` (el inbox in-app no es configurable, siempre está activo). Se cambian con `,_jsx(_components.code,{children:`PATCH /api/me/notification-preferences`}),`.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Si el usuario no tiene fila de preferencia para un canal, ese canal cuenta como `,_jsx(_components.strong,{children:`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.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`get-/api/admin/notifications`,children:_jsx(_components.code,{children:`GET /api/admin/notifications`})}),`\n`,_jsxs(_components.p,{children:[`Este endpoint (solo `,_jsx(_components.code,{children:`ADMIN`}),`) lista `,_jsx(_components.strong,{children:`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 `,_jsx(_components.code,{children:`channel`}),` y `,_jsx(_components.code,{children:`status`}),`. Acepta `,_jsx(_components.code,{children:`limit`}),`, `,_jsx(_components.code,{children:`cursor`}),`, y filtros por `,_jsx(_components.code,{children:`channel`}),`, `,_jsx(_components.code,{children:`status`}),`, `,_jsx(_components.code,{children:`type`}),` y `,_jsx(_components.code,{children:`q`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`degradación-sin-configurar`,children:`Degradación sin configurar`}),`\n`,_jsxs(_components.p,{children:[`Web Push y email dependen de variables de entorno; si faltan, ese canal se marca `,_jsx(_components.code,{children:`SKIPPED`}),` en el delivery correspondiente en lugar de fallar:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Sin las variables `,_jsx(_components.code,{children:`VAPID_*`}),`, el canal push queda `,_jsx(_components.code,{children:`SKIPPED`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Sin las variables `,_jsx(_components.code,{children:`RESEND_*`}),`, el canal email queda `,_jsx(_components.code,{children:`SKIPPED`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`El inbox in-app `,_jsx(_components.strong,{children:`no depende de ninguna de las dos`}),` y sigue funcionando en ambos casos.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`El detalle de qué hace cada variable y qué se degrada exactamente sin ella está en `,_jsx(_components.a,{href:`/docs/handbook/empezar/variables-de-entorno`,children:`Variables de entorno`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Notificaciones","description":"Canales, tipos de evento y qué se degrada sin configurar.","href":"/docs/handbook/dominio/notificaciones"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Los tres canales","slug":"los-tres-canales","depth":2,"children":[]},{"title":"Registro público","slug":"registro-público","depth":2,"children":[]},{"title":"Eventos de Jobs","slug":"eventos-de-jobs","depth":2,"children":[]},{"title":"Preferencias por canal","slug":"preferencias-por-canal","depth":2,"children":[]},{"title":"GET /api/admin/notifications","slug":"get-/api/admin/notifications","depth":2,"children":[]},{"title":"Degradación sin configurar","slug":"degradación-sin-configurar","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"camellapp","siteName":"CamellApp","title":"Notificaciones - CamellApp","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-22T15:49:49.185Z","originalFileLocation":"docs/handbook/dominio/notificaciones.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Canales, tipos de evento y qué se degrada sin configurar.\">\u003cmeta data-mint-head name=\"application-name\" content=\"CamellApp\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/camellapp/_generated/favicon/apple-touch-icon.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/camellapp/_generated/favicon/favicon-32x32.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/camellapp/_generated/favicon/favicon-16x16.png?v=3\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/camellapp/_generated/favicon/favicon.ico?v=3\">\u003cmeta data-mint-head property=\"og:title\" content=\"Notificaciones - CamellApp\">\u003cmeta data-mint-head property=\"og:description\" content=\"Canales, tipos de evento y qué se degrada sin configurar.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"CamellApp\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.camellapp.com/docs/handbook/dominio/notificaciones\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://camellapp.mintlify.site/_mintlify/api/og/v2?division=Dominio\u0026amp;title=Notificaciones\u0026amp;description=Canales%2C+tipos+de+evento+y+qu%C3%A9+se+degrada+sin+configurar.\u0026amp;theme=e6c2b81cb548feb29b388616\u0026amp;signature=1ddeede32982f38bd87092996751a270b5888a2a3af461b4467e21531f74bf00\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Notificaciones - CamellApp\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Canales, tipos de evento y qué se degrada sin configurar.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://camellapp.mintlify.site/_mintlify/api/og/v2?division=Dominio\u0026amp;title=Notificaciones\u0026amp;description=Canales%2C+tipos+de+evento+y+qu%C3%A9+se+degrada+sin+configurar.\u0026amp;theme=e6c2b81cb548feb29b388616\u0026amp;signature=1ddeede32982f38bd87092996751a270b5888a2a3af461b4467e21531f74bf00\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/camellapp/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"CamellApp\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#c88d2f\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.camellapp.com/docs/handbook/dominio/notificaciones\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/handbook/dominio/notificaciones.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.camellapp.com/#organization\",\"name\":\"CamellApp\",\"url\":\"https://docs.camellapp.com\"},{\"@type\":\"WebSite\",\"@id\":\"https://docs.camellapp.com#website\",\"name\":\"CamellApp\",\"url\":\"https://docs.camellapp.com\",\"publisher\":{\"@id\":\"https://docs.camellapp.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.camellapp.com/docs/handbook/dominio/notificaciones#webpage\",\"url\":\"https://docs.camellapp.com/docs/handbook/dominio/notificaciones\",\"name\":\"Notificaciones\",\"description\":\"Canales, tipos de evento y qué se degrada sin configurar.\",\"dateModified\":\"2026-10-22T15:49:49.185Z\",\"isPartOf\":{\"@id\":\"https://docs.camellapp.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.camellapp.com/docs/handbook/dominio/notificaciones#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.camellapp.com/docs/handbook/dominio/notificaciones#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Dominio\",\"item\":\"https://docs.camellapp.com/docs/handbook/dominio/jobs\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Notificaciones\",\"item\":\"https://docs.camellapp.com/docs/handbook/dominio/notificaciones\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.camellapp.com/docs/handbook/dominio/notificaciones#article\",\"headline\":\"Notificaciones\",\"name\":\"Notificaciones\",\"description\":\"Canales, tipos de evento y qué se degrada sin configurar.\",\"url\":\"https://docs.camellapp.com/docs/handbook/dominio/notificaciones\",\"mainEntityOfPage\":{\"@id\":\"https://docs.camellapp.com/docs/handbook/dominio/notificaciones#webpage\"},\"dateModified\":\"2026-10-22T15:49:49.185Z\",\"publisher\":{\"@id\":\"https://docs.camellapp.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.camellapp.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"CamellApp\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"CamellApp","nav":{"global":null,"groups":[{"group":"Inicio","pages":[{"title":"CamellApp","href":"/index"}]},{"group":"Novedades","pages":[{"title":"Novedades","href":"/docs/handbook/novedades"}]},{"group":"Empezar","pages":[{"title":"Instalación","href":"/docs/handbook/empezar/instalacion"},{"title":"Variables de entorno","href":"/docs/handbook/empezar/variables-de-entorno"}]},{"group":"Arquitectura","pages":[{"title":"Visión general","href":"/docs/handbook/arquitectura/vision-general"},{"title":"Datos y Prisma","href":"/docs/handbook/arquitectura/datos-y-prisma"},{"title":"Estructura del código","href":"/docs/handbook/arquitectura/estructura-del-codigo"},{"title":"Route handlers","href":"/docs/handbook/arquitectura/route-handlers"},{"title":"Autenticación y roles","href":"/docs/handbook/arquitectura/auth-y-roles"}]},{"group":"Dominio","pages":[{"title":"Trabajos (Jobs)","href":"/docs/handbook/dominio/jobs"},{"title":"Agenda","href":"/docs/handbook/dominio/agenda"},{"title":"Matching por score","href":"/docs/handbook/dominio/matching"},{"title":"Búsqueda conversacional","href":"/docs/handbook/dominio/busqueda"},{"title":"Precio referencial","description":"Monto orientativo del camello, sin cobro en la plataforma.","href":"/docs/handbook/dominio/precio-referencial"},{"title":"Notificaciones","href":"/docs/handbook/dominio/notificaciones"},{"title":"Auditoría de acceso","description":"Registro de inicios de sesión correctos, visible solo para administradores.","href":"/docs/handbook/dominio/auditoria"},{"title":"Textos legales","href":"/docs/handbook/dominio/legales"},{"title":"Centro de ayuda","href":"/docs/handbook/dominio/ayuda"}]},{"group":"Guías","pages":[{"title":"Testing","href":"/docs/handbook/guias/testing"},{"title":"Añadir un endpoint","href":"/docs/handbook/guias/anadir-un-endpoint"},{"title":"Despliegue","href":"/docs/handbook/guias/despliegue"}]},{"group":"Contribuir","pages":[{"title":"Flujo de trabajo y regla de docs","href":"/docs/handbook/contribuir/flujo-y-regla-de-docs"}]},{"group":"API","pages":[{"group":"Auth","pages":[{"title":"Registrar usuario con email y password","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/register","href":"/api-reference/auth/registrar-usuario-con-email-y-password"},{"title":"Registrar prestador (usuario CAMELLOS + perfil Camello)","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/register/camello","href":"/api-reference/auth/registrar-prestador-usuario-camellos-+-perfil-camello"},{"title":"Pantalla/flujo de inicio de sesion NextAuth","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/auth/signin","href":"/api-reference/auth/pantallaflujo-de-inicio-de-sesion-nextauth"},{"title":"Obtener sesion actual","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/auth/session","href":"/api-reference/auth/obtener-sesion-actual"},{"title":"Cerrar sesion","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/auth/signout","href":"/api-reference/auth/cerrar-sesion"}]},{"group":"Me","pages":[{"title":"Obtener perfil del usuario autenticado","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/me","href":"/api-reference/me/obtener-perfil-del-usuario-autenticado"},{"title":"Eliminar (anonimizar) la cuenta del usuario autenticado","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml delete /api/me","href":"/api-reference/me/eliminar-anonimizar-la-cuenta-del-usuario-autenticado"},{"title":"Actualizar nombre, telefono, ciudad y/o barrio","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml patch /api/me","href":"/api-reference/me/actualizar-nombre-telefono-ciudad-yo-barrio"},{"title":"Subir avatar (JPEG/PNG/WebP, max 2 MB)","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/me/avatar","href":"/api-reference/me/subir-avatar-jpegpngwebp-max-2-mb"},{"title":"Cambiar contraseña","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml patch /api/me/password","href":"/api-reference/me/cambiar-contraseña"},{"title":"Actualizar el precio referencial del camello autenticado","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml patch /api/me/price","href":"/api-reference/me/actualizar-el-precio-referencial-del-camello-autenticado"}]},{"group":"Agenda","pages":[{"title":"Franjas semanales del camello autenticado","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/me/availability","href":"/api-reference/agenda/franjas-semanales-del-camello-autenticado"},{"title":"Reemplaza todas las franjas del camello","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml put /api/me/availability","href":"/api-reference/agenda/reemplaza-todas-las-franjas-del-camello"},{"title":"Huecos libres de 60 minutos de un camello activo","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/camellos/{id}/slots","href":"/api-reference/agenda/huecos-libres-de-60-minutos-de-un-camello-activo"},{"title":"Citas del rango, con la visibilidad de los trabajos","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/agenda","href":"/api-reference/agenda/citas-del-rango-con-la-visibilidad-de-los-trabajos"},{"title":"Recordatorio de citas en las proximas 24 horas","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/cron/appointment-reminders","href":"/api-reference/agenda/recordatorio-de-citas-en-las-proximas-24-horas"},{"title":"Fija o mueve la cita de un trabajo propio","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/jobs/{id}/schedule","href":"/api-reference/agenda/fija-o-mueve-la-cita-de-un-trabajo-propio"}]},{"group":"Camellos","pages":[{"title":"Listar camellos activos (publico)","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/camellos","href":"/api-reference/camellos/listar-camellos-activos-publico"},{"title":"Metadatos publicos (conteo, oficios, ciudades)","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/camellos/meta","href":"/api-reference/camellos/metadatos-publicos-conteo-oficios-ciudades"},{"title":"Crear reseña de un camello (solo CLIENTES)","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/camellos/{id}/reviews","href":"/api-reference/camellos/crear-reseña-de-un-camello-solo-clientes"}]},{"group":"Categories","pages":[{"title":"Listar categorias (publico)","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/categories","href":"/api-reference/categories/listar-categorias-publico"}]},{"group":"Health","pages":[{"title":"Probe publico de liveness (DB)","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/health","href":"/api-reference/health/probe-publico-de-liveness-db"},{"title":"Snapshot de salud del sistema","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/admin/health","href":"/api-reference/health/snapshot-de-salud-del-sistema"}]},{"group":"Search","pages":[{"title":"Interpretar una busqueda en lenguaje natural (publico)","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/search/interpret","href":"/api-reference/search/interpretar-una-busqueda-en-lenguaje-natural-publico"},{"title":"Interpretar una foto del problema (publico)","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/search/interpret-image","href":"/api-reference/search/interpretar-una-foto-del-problema-publico"}]},{"group":"Admin Users","pages":[{"title":"Listar usuarios (paginado)","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/admin/users","href":"/api-reference/admin-users/listar-usuarios-paginado"},{"title":"Crear usuario","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/admin/users","href":"/api-reference/admin-users/crear-usuario"},{"title":"Obtener usuario por ID","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/admin/users/{id}","href":"/api-reference/admin-users/obtener-usuario-por-id"},{"title":"Eliminar usuario","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml delete /api/admin/users/{id}","href":"/api-reference/admin-users/eliminar-usuario"},{"title":"Actualizar usuario","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml patch /api/admin/users/{id}","href":"/api-reference/admin-users/actualizar-usuario"},{"title":"Actualizar solo el rol de usuario","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml patch /api/admin/users/{id}/role","href":"/api-reference/admin-users/actualizar-solo-el-rol-de-usuario"}]},{"group":"Admin Services","pages":[{"title":"Listar servicios","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/admin/services","href":"/api-reference/admin-services/listar-servicios"},{"title":"Crear servicio","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/admin/services","href":"/api-reference/admin-services/crear-servicio"},{"title":"Eliminar servicio","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml delete /api/admin/services/{id}","href":"/api-reference/admin-services/eliminar-servicio"},{"title":"Actualizar servicio","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml patch /api/admin/services/{id}","href":"/api-reference/admin-services/actualizar-servicio"}]},{"group":"Admin Categories","pages":[{"title":"Listar categorias (con conteo de servicios)","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/admin/categories","href":"/api-reference/admin-categories/listar-categorias-con-conteo-de-servicios"},{"title":"Crear categoria","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/admin/categories","href":"/api-reference/admin-categories/crear-categoria"},{"title":"Eliminar categoria","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml delete /api/admin/categories/{id}","href":"/api-reference/admin-categories/eliminar-categoria"},{"title":"Actualizar categoria","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml patch /api/admin/categories/{id}","href":"/api-reference/admin-categories/actualizar-categoria"}]},{"group":"Admin Camellos","pages":[{"title":"Listar camellos (admin)","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/admin/camellos","href":"/api-reference/admin-camellos/listar-camellos-admin"},{"title":"Crear camello (JSON o multipart con foto)","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/admin/camellos","href":"/api-reference/admin-camellos/crear-camello-json-o-multipart-con-foto"},{"title":"Obtener camello por ID","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/admin/camellos/{id}","href":"/api-reference/admin-camellos/obtener-camello-por-id"},{"title":"Eliminar camello (hard delete)","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml delete /api/admin/camellos/{id}","href":"/api-reference/admin-camellos/eliminar-camello-hard-delete"},{"title":"Actualizar camello (JSON o multipart)","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml patch /api/admin/camellos/{id}","href":"/api-reference/admin-camellos/actualizar-camello-json-o-multipart"}]},{"group":"Jobs","pages":[{"title":"Listar trabajos del usuario autenticado","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/jobs","href":"/api-reference/jobs/listar-trabajos-del-usuario-autenticado"},{"title":"Crear solicitud de trabajo","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/jobs","href":"/api-reference/jobs/crear-solicitud-de-trabajo"},{"title":"Detalle de un trabajo visible para el usuario","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/jobs/{id}","href":"/api-reference/jobs/detalle-de-un-trabajo-visible-para-el-usuario"},{"title":"Camello acepta un trabajo pendiente","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/jobs/{id}/accept","href":"/api-reference/jobs/camello-acepta-un-trabajo-pendiente"},{"title":"Camello rechaza un trabajo pendiente","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/jobs/{id}/reject","href":"/api-reference/jobs/camello-rechaza-un-trabajo-pendiente"},{"title":"Marcar trabajo en progreso como completado","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/jobs/{id}/complete","href":"/api-reference/jobs/marcar-trabajo-en-progreso-como-completado"},{"title":"Cancelar un trabajo pendiente o en progreso","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/jobs/{id}/cancel","href":"/api-reference/jobs/cancelar-un-trabajo-pendiente-o-en-progreso"}]},{"group":"Admin Jobs","pages":[{"title":"Asignar un camello a un trabajo pendiente libre","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/admin/jobs/{id}/assign","href":"/api-reference/admin-jobs/asignar-un-camello-a-un-trabajo-pendiente-libre"},{"title":"Ranking de camellos candidatos para un trabajo","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/admin/jobs/{id}/candidates","href":"/api-reference/admin-jobs/ranking-de-camellos-candidatos-para-un-trabajo"}]},{"group":"Notifications","pages":[{"title":"Listar inbox del usuario","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/notifications","href":"/api-reference/notifications/listar-inbox-del-usuario"},{"title":"Marcar notificacion como leida","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml patch /api/notifications/{id}/read","href":"/api-reference/notifications/marcar-notificacion-como-leida"},{"title":"Marcar todas como leidas","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/notifications/read-all","href":"/api-reference/notifications/marcar-todas-como-leidas"},{"title":"Clave publica VAPID","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/notifications/push/vapid","href":"/api-reference/notifications/clave-publica-vapid"},{"title":"Guardar suscripcion Web Push","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml post /api/notifications/push/subscribe","href":"/api-reference/notifications/guardar-suscripcion-web-push"},{"title":"Eliminar suscripcion Web Push","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml delete /api/notifications/push/subscribe","href":"/api-reference/notifications/eliminar-suscripcion-web-push"},{"title":"Preferencias de canal","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/me/notification-preferences","href":"/api-reference/notifications/preferencias-de-canal"},{"title":"Actualizar preferencia de canal","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml patch /api/me/notification-preferences","href":"/api-reference/notifications/actualizar-preferencia-de-canal"}]},{"group":"Admin Notifications","pages":[{"title":"Listar envios (deliveries)","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/admin/notifications","href":"/api-reference/admin-notifications/listar-envios-deliveries"}]},{"group":"Admin Legal","pages":[{"title":"Listar textos legales editables","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/admin/legal-documents","href":"/api-reference/admin-legal/listar-textos-legales-editables"},{"title":"Publicar una version de un texto legal","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml put /api/admin/legal-documents/{slug}","href":"/api-reference/admin-legal/publicar-una-version-de-un-texto-legal"}]},{"group":"Admin Meta","pages":[{"title":"Obtener especificación OpenAPI (YAML)","deprecated":null,"version":null,"openapi":"/docs/openapi-auth.yaml get /api/admin/openapi","href":"/api-reference/admin-meta/obtener-especificación-openapi-yaml"}]}]}]},"basePath":"","title":"Notificaciones - CamellApp","buildId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","deploymentId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","dynamics":[],"chunks":[]}