> ## 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.

# CRM — APIs y liberación

> Los endpoints de notas, actividades, listas y el timeline 360, que es el único que lee de tres schemas sin ser dueño de ninguno.

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 · CRM`](/releases/r1-crm)**, 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.

## Management API — SLO p95 \<1 s

| Recurso            | Endpoints                                                         | Permisos                                  | Desde      | Orden | Spec                                                             |
| ------------------ | ----------------------------------------------------------------- | ----------------------------------------- | ---------- | ----- | ---------------------------------------------------------------- |
| Notas              | CRUD `/v1/crm/notes`                                              | `crm.notes.{read,create,update}`          | `R1 · CRM` | 1     | [FS-CRM-0001](/modules/crm/features/fs-crm-0001-notes)           |
| Actividades        | CRUD `/v1/crm/activities`                                         | `crm.activities.{read,create,update}`     | `R1 · CRM` | 1     | [FS-CRM-0002](/modules/crm/features/fs-crm-0002-activities)      |
| Tipos de actividad | CRUD `/v1/crm/activity-types`                                     | `crm.activity_types.{read,create,update}` | `R1 · CRM` | 1     | [FS-CRM-0002](/modules/crm/features/fs-crm-0002-activities)      |
| Listas             | CRUD `/v1/crm/lists` · `POST·DELETE /v1/crm/lists/{id}/members`   | `crm.lists.{read,create,update}`          | `R1 · CRM` | 1     | [FS-CRM-0003](/modules/crm/features/fs-crm-0003-lists-and-views) |
| Objetos            | CRUD `/v1/crm/object-definitions` · CRUD `/v1/crm/objects/{slug}` | `crm.objects.{read,create,update}`        | `R1 · CRM` | 2     | [FS-CRM-0005](/modules/crm/features/fs-crm-0005-object-model)    |

## Timeline — SLO p95 \<1 s

| Endpoint                             | Permiso             | Desde      | Orden | Spec                                                      |
| ------------------------------------ | ------------------- | ---------- | ----- | --------------------------------------------------------- |
| `GET /v1/crm/contacts/{id}/timeline` | `crm.timeline.read` | `R1 · CRM` | 1     | [FS-CRM-0004](/modules/crm/features/fs-crm-0004-timeline) |

**Es el único endpoint de la suite que compone tres schemas** —`core`, `loyalty`, `messaging`— sin
ser dueño de ninguno. No tiene tablas propias y no debe tenerlas: si algún día necesita caché, será
una proyección con procedimiento de reconstrucción documentado.

Un permiso de timeline **no otorga los permisos de los módulos que compone**: cada fragmento se
filtra por lo que el llamante puede ver. Alguien sin `loyalty.transactions.read` ve el timeline sin
los movimientos de puntos, no un error.

## 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/crm/{{recurso}}/{{id}}`       | Soft delete: escribe `deleted_at`                       | `crm.{{recurso}}.delete` | Sí, con `POST /{{id}}/restore` |
| `DELETE /v1/crm/{{recurso}}/{{id}}/purge` | Hard delete: borra la fila, `409` si algo la referencia | `crm.{{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 `crm.{{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.
