Actualizar Lifecycle Configs
Reemplazo in-place de uno o más pilares de ciclo de vida de una AGC.
PUT /api/activity-generation-configs/:id/lifecycle
Reemplaza uno o más pilares de ciclo de vida de una AGC in-place, en una única transacción atómica.
Auth: Requerida — permiso activity-generation-config:update
Parámetros de Ruta
| Parámetro | Tipo | Descripción |
|---|---|---|
id | UUID | ID de la activity generation config |
Cuerpo de la Solicitud
Envía solo los pilares que quieras actualizar. Cada pilar presente es el objeto de pilar completo (la misma forma que en crear) más un id obligatorio — el id de la fila del pilar existente, usado para ubicar la fila a reemplazar. Los cuerpos de solicitud son snake_case.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
activation | object | No | Pilar de activación completo + su id. Omitir para no tocar activation. |
engagement | object | No | Pilar de engagement completo + su id. Omitir para no tocar engagement. |
resurrection | object | No | Pilar de resurrección completo + su id. Omitir para no tocar resurrection. |
El id de la fila del pilar es estable a través de las ediciones — es el mismo id que lees en GET /:id y no cambia tras una actualización de ciclo de vida.
Reconciliación de hijos (por id)
Cada elemento hijo (un moment / level / threshold) lleva un id opcional. Dentro de un pilar presente, los hijos se reconcilian contra las filas existentes:
| Hijo en la solicitud | Efecto |
|---|---|
CON id que coincide con un hijo existente | Actualizado in-place (id preservado) |
SIN id | Insertado como nuevo hijo |
| Hijo existente ausente del arreglo | Eliminado |
Toda la operación corre en una transacción — o se aplican todos los cambios, o ninguno.
Ejemplo — actualizar solo engagement
Editar un nivel (conservado por su id), agregar un nivel nuevo (sin id) y eliminar un nivel omitiéndolo.
curl -X PUT https://api.reten.ai/api/activity-generation-configs/f47ac10b-58cc-4372-a567-0e02b2c3d479/lifecycle \
-H "Authorization: Bearer <token>" \
-H "x-tenant-id: <tenant-id>" \
-H "Content-Type: application/json" \
-d '{
"engagement": {
"id": "5d1c3f44-9e55-4066-b177-dd88ee99ffaa",
"name": "Engagement",
"source_table": "events",
"source_columns": ["user_id", "event_id"],
"date_column": "occurred_at",
"engagement_window_days": 28,
"min_lifetime_actions_for_engaged": 1,
"counting_method": "active_days",
"levels": [
{
"id": "6e2d4055-af66-4177-c288-ee99ffaa00bb",
"status_code": "casual",
"user_retention_status_config_id": "cc33dd44-ee55-4f66-a077-bb99ccaaddbb",
"label": "Casual",
"min_threshold": 1,
"max_threshold": 9,
"order": 1
},
{
"status_code": "power",
"user_retention_status_config_id": "1122aabb-3344-4ccd-9eef-556677889900",
"label": "Power",
"min_threshold": 10,
"order": 2
}
]
}
}'import axios from 'axios';
const id = 'f47ac10b-58cc-4372-a567-0e02b2c3d479';
const body = {
engagement: {
id: '5d1c3f44-9e55-4066-b177-dd88ee99ffaa', // existing pillar row id (required)
name: 'Engagement',
source_table: 'events',
source_columns: ['user_id', 'event_id'],
date_column: 'occurred_at',
engagement_window_days: 28,
min_lifetime_actions_for_engaged: 1,
counting_method: 'active_days',
levels: [
{
id: '6e2d4055-af66-4177-c288-ee99ffaa00bb', // has id -> updated in place
status_code: 'casual',
user_retention_status_config_id: 'cc33dd44-ee55-4f66-a077-bb99ccaaddbb',
label: 'Casual',
min_threshold: 1,
max_threshold: 9,
order: 1,
},
{
// no id -> inserted as a new level
status_code: 'power',
user_retention_status_config_id: '1122aabb-3344-4ccd-9eef-556677889900',
label: 'Power',
min_threshold: 10,
order: 2,
},
// the previous "core" level is omitted -> deleted
],
},
// activation and resurrection are omitted -> left untouched
};
await axios.put(
`https://api.reten.ai/api/activity-generation-configs/${id}/lifecycle`,
body,
{ headers: { Authorization: 'Bearer <token>', 'x-tenant-id': '<tenant-id>' } },
);En este ejemplo: el nivel casual se actualiza in-place (su id se preserva), se inserta un nuevo nivel power, y el nivel core anterior — ausente del arreglo — se elimina. activation y resurrection se omiten, por lo que quedan intactos.
Respuesta 200 OK
Cuerpo vacío. Luego obtén GET /:id para leer los pilares actualizados y los configHashes recalculados.
Respuestas de Error
| Estado | Descripción |
|---|---|
400 | Validación fallida, o un pilar presente no incluye su id |
404 | Activity generation config (o un id de pilar/hijo referenciado) no encontrada |