Reten Docs
Activity Generation Configs

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

CampoTipoRequeridoDescripción
activationobjectNoCampos de activación a actualizar. Omitir para no tocar activation.
engagementobjectNoCampos de engagement a actualizar. Omitir para no tocar engagement.
resurrectionobjectNoCampos 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 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 "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

EstadoDescripción
400Validació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
404Activity generation config no encontrada