Reten Docs
Activity Generation Configs

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ámetroTipoDescripción
idUUIDID 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.

CampoTipoRequeridoDescripción
activationobjectNoPilar de activación completo + su id. Omitir para no tocar activation.
engagementobjectNoPilar de engagement completo + su id. Omitir para no tocar engagement.
resurrectionobjectNoPilar 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 solicitudEfecto
CON id que coincide con un hijo existenteActualizado in-place (id preservado)
SIN idInsertado como nuevo hijo
Hijo existente ausente del arregloEliminado

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

EstadoDescripción
400Validación fallida, o un pilar presente no incluye su id
404Activity generation config (o un id de pilar/hijo referenciado) no encontrada