Atualizar Lifecycle Configs
Atualização in-place de um ou mais pilares de ciclo de vida em uma AGC.
PUT /api/activity-generation-configs/:id/lifecycle
Atualiza um ou mais pilares de ciclo de vida de uma AGC in-place, em uma única transação atômica.
Auth: Obrigatório — permissão activity-generation-config:update
Parâmetros de Rota
| Parâmetro | Tipo | Descrição |
|---|---|---|
id | UUID | ID da activity generation config |
Corpo da Requisição
Envie apenas os pilares que deseja atualizar. Cada pilar enviado edita o pilar correspondente da AGC da rota — uma AGC tem exatamente um de cada tipo, então o corpo não o identifica. Dentro de um pilar, envie apenas os campos que deseja alterar (os mesmos de criar); os campos omitidos mantêm o valor atual. Os corpos de requisição são snake_case.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
activation | object | Não | Campos de ativação a atualizar. Omitir para deixar activation intocado. |
engagement | object | Não | Campos de engajamento a atualizar. Omitir para deixar engagement intocado. |
resurrection | object | Não | Campos de ressurreição a atualizar. Omitir para deixar resurrection intocado. |
Editar um pilar mantém seu id — o mesmo que você lê em GET /:id.
Reconciliação de filhos (por id)
Cada item filho (um moment / level / threshold) carrega um id opcional. Quando um pilar inclui seu array de filhos (moments / levels / thresholds), os filhos são reconciliados contra as linhas existentes; quando o array é omitido, os filhos ficam intocados:
| Filho na requisição | Efeito |
|---|---|
COM id correspondente a um filho existente | Atualizado in-place (id preservado) |
SEM id | Inserido como um novo filho |
| Filho existente ausente do array | Excluído |
A operação inteira roda em uma única transação — ou todas as alterações são aplicadas, ou nenhuma é.
Exemplo — atualizar apenas engagement
Editar um nível (mantido por seu id), adicionar um nível novo (sem id) e remover um nível omitindo-o.
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', // tem id -> atualizado 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,
},
{
// sem id -> inserido como um novo nível
status_code: 'power',
user_retention_status_config_id: '1122aabb-3344-4ccd-9eef-556677889900',
label: 'Power',
min_threshold: 10,
order: 2,
},
// o nível anterior "core" foi omitido -> excluído
],
},
// activation e resurrection são omitidos -> ficam intocados
};
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>' } },
);Neste exemplo: o nível casual é atualizado in-place (seu id é preservado), um novo nível power é inserido, e o nível core anterior — ausente do array — é excluído. activation e resurrection são omitidos, então ficam intocados.
Resposta 200 OK
Corpo vazio. Busque GET /:id depois para ler os pilares atualizados e os configHashes recalculados.
Respostas de Erro
| Status | Descrição |
|---|---|
400 | Validação falhou — inclusive um pilar que traz id (o pilar é sempre o da AGC da rota) ou um id de filho que não pertence a esse pilar |
404 | Activity generation config não encontrada |