Actualizar Lifecycle Configs
Actualización in-place de uno o más pilares de ciclo de vida de una AGC.
PUT /api/activity-generation-configs/:id/lifecycle
Actualiza 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 enviado edita el pilar correspondiente de la AGC de la ruta — una AGC tiene exactamente uno de cada tipo, así que el cuerpo no lo identifica. Dentro de un pilar, envía solo los campos que quieras cambiar (los mismos que en crear); los campos omitidos conservan su valor actual. Los cuerpos de solicitud son snake_case.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
activation | object | No | Campos de activación a actualizar. Omitir para no tocar activation. |
engagement | object | No | Campos de engagement a actualizar. Omitir para no tocar engagement. |
resurrection | object | No | Campos de resurrección a actualizar. Omitir para no tocar resurrection. |
Editar un pilar conserva su id — el mismo que lees en GET /:id.
Reconciliación de hijos (por id)
Cada elemento hijo (un moment / level / threshold) lleva un id opcional. Cuando un pilar incluye su arreglo de hijos (moments / levels / thresholds), los hijos se reconcilian contra las filas existentes; cuando el arreglo se omite, los hijos quedan intactos:
| 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 "x-project-id: <project-id>" \
-H "Content-Type: application/json" \
-d '{
"engagement": {
"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: {
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>', 'x-project-id': '<project-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 — incluido un pilar que trae id (el pilar es siempre el de la AGC de la ruta) o un id de hijo que no pertenece a ese pilar |
404 | Activity generation config no encontrada |