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

# Messaging — APIs y liberación

> Los endpoints de canales, plantillas, envíos, supresiones y campañas. Los demás módulos no llaman a estos: emiten eventos que este módulo consume.

Cada endpoint declara **exactamente un permiso** (R16) y pertenece a **una sola clase de SLO**
(DEC-D7). Hasta que su entrega esté lista el endpoint no existe, ni siquiera devolviendo 501.

## Cómo se lee la columna *Desde*

Todo lo de esta página pertenece a **[`R1 · Messaging`](/releases/r1-messaging)**, una de las cinco entregas de
[Release 1](/releases/overview) (`2026.11`). Las fases F1a/F1b/F2 son **orden de construcción**
dentro del release, no versiones ([ADR-025](/adr/adr-025-release-model)). La columna *Orden* dice
cuándo se construye: `1` lo que bloquea al resto, `2` lo que completa la propuesta.

## Runtime API — SLO p95 \<300 ms

| Endpoint                                 | Permiso                  | Idempotencia                      | Desde            | Orden | Spec                                                                    |
| ---------------------------------------- | ------------------------ | --------------------------------- | ---------------- | ----- | ----------------------------------------------------------------------- |
| `POST /v1/messaging/sends`               | `messaging.sends.create` | `Idempotency-Key` **obligatoria** | `R1 · Messaging` | 1     | [FS-MSG-0003](/modules/messaging/features/fs-msg-0003-sends-and-status) |
| `POST /v1/messaging/webhooks/{provider}` | firma HMAC del proveedor | por `provider_message_id`         | `R1 · Messaging` | 1     | [FS-MSG-0003](/modules/messaging/features/fs-msg-0003-sends-and-status) |

## Member API — centro de preferencias

| Endpoint                                         | Autorización             | Desde            | Orden | Spec                                                                            |
| ------------------------------------------------ | ------------------------ | ---------------- | ----- | ------------------------------------------------------------------------------- |
| `GET·PATCH /v1/messaging/members/me/preferences` | token de member          | `R1 · Messaging` | 1     | [FS-MSG-0004](/modules/messaging/features/fs-msg-0004-suppressions-preferences) |
| `GET /v1/messaging/members/me/notifications`     | token de member          | `R1 · Messaging` | 1     | [FS-MSG-0006](/modules/messaging/features/fs-msg-0006-channel-adapters)         |
| `POST /v1/messaging/unsubscribe`                 | token firmado del enlace | `R1 · Messaging` | 1     | [FS-MSG-0004](/modules/messaging/features/fs-msg-0004-suppressions-preferences) |

## Management API — SLO p95 \<1 s

| Recurso        | Endpoints                                                                             | Permisos                                       | Desde            | Orden | Spec                                                                            |
| -------------- | ------------------------------------------------------------------------------------- | ---------------------------------------------- | ---------------- | ----- | ------------------------------------------------------------------------------- |
| Canales        | `GET·PUT /v1/messaging/channel-settings`                                              | `messaging.channels.{read,update}`             | `R1 · Messaging` | 1     | [FS-MSG-0001](/modules/messaging/features/fs-msg-0001-channel-cascade)          |
| Ruteo          | CRUD `/v1/messaging/event-routing`                                                    | `messaging.routing.{read,update}`              | `R1 · Messaging` | 1     | [FS-MSG-0001](/modules/messaging/features/fs-msg-0001-channel-cascade)          |
| Plantillas     | CRUD `/v1/messaging/templates` · `POST /v1/messaging/templates/{id}/preview`          | `messaging.templates.{read,create,update}`     | `R1 · Messaging` | 1     | [FS-MSG-0002](/modules/messaging/features/fs-msg-0002-templates)                |
| Envíos         | `GET /v1/messaging/sends` · `GET /v1/messaging/sends/{id}/history`                    | `messaging.sends.read`                         | `R1 · Messaging` | 1     | [FS-MSG-0003](/modules/messaging/features/fs-msg-0003-sends-and-status)         |
| Supresiones    | `GET·POST·DELETE /v1/messaging/suppressions`                                          | `messaging.suppressions.{read,create,delete}`  | `R1 · Messaging` | 1     | [FS-MSG-0004](/modules/messaging/features/fs-msg-0004-suppressions-preferences) |
| Webhooks       | CRUD `/v1/messaging/webhook-endpoints`                                                | `messaging.webhooks.{read,create,update}`      | `R1 · Messaging` | 1     | [FS-MSG-0006](/modules/messaging/features/fs-msg-0006-channel-adapters)         |
| Campañas       | CRUD `/v1/messaging/campaigns` · `POST /v1/messaging/campaigns/{id}/run`              | `messaging.campaigns.{read,create,update,run}` | `R1 · Messaging` | 2     | [FS-MSG-0007](/modules/messaging/features/fs-msg-0007-campaigns-and-triggers)   |
| Dominios       | CRUD `/v1/messaging/sender-domains` · `POST /v1/messaging/sender-domains/{id}/verify` | `messaging.domains.{read,create,verify}`       | `R1 · Messaging` | 2     | [FS-MSG-0008](/modules/messaging/features/fs-msg-0008-sender-domains)           |
| Deliverability | `GET /v1/messaging/deliverability`                                                    | `messaging.deliverability.read`                | `R1 · Messaging` | 2     | [FS-MSG-0008](/modules/messaging/features/fs-msg-0008-sender-domains)           |

## La supresión no se puede saltar

Ningún endpoint, ningún permiso y ninguna configuración permite enviar a una dirección suprimida.
Es la última compuerta antes de despachar y no admite override — un `DELETE` sobre una supresión la
levanta, y eso queda auditado con quién lo hizo.

## Eliminar y purgar

Todo recurso de forma A expone las dos, con **permisos distintos**
([`standards/data.md`](/standards/data) §1b):

| Endpoint                                        | Qué hace                                                | Permiso                        | Reversible                     |
| ----------------------------------------------- | ------------------------------------------------------- | ------------------------------ | ------------------------------ |
| `DELETE /v1/messaging/{{recurso}}/{{id}}`       | Soft delete: escribe `deleted_at`                       | `messaging.{{recurso}}.delete` | Sí, con `POST /{{id}}/restore` |
| `DELETE /v1/messaging/{{recurso}}/{{id}}/purge` | Hard delete: borra la fila, `409` si algo la referencia | `messaging.{{recurso}}.purge`  | **No**                         |

Purgar exige haber eliminado antes. Las tablas append-only no exponen ninguna de las dos.

## Reglas que aplican a todos

* **Un permiso por endpoint** (R16), con la forma `messaging.{{recurso}}.{{acción}}`.
* **Nuestras propias superficies consumen solo esta API** (R17).
* **Errores como RFC 9457** `problem+json` con un `code` estable, que es parte del contrato.
* **Los presupuestos de latencia son criterio de Definition of Done** (R18), verificados con prueba
  de carga en certificación.
