Reten Docs
Activity Generation Configs

Publicar Activity Generation Config

Passar uma activity generation config de draft ou paused para active.

PATCH /api/activity-generation-configs/:id/publish

Publica uma AGC do projeto ativo: ela passa de draft ou paused para active (veja Status). Apenas as configurações active estão pensadas para rodar. Uma AGC pausada é retomada com este mesmo endpoint e conserva seu id.

Auth: Obrigatório — permissão activity-generation-config:update

Parâmetros de Rota

ParâmetroTipoDescrição
idUUIDID da activity generation config

Corpo da Requisição

O corpo é opcional.

CampoTipoObrigatórioDescrição
confirmDefaultRootbooleanNãoConfirma a publicação enquanto a audiência raiz do projeto continua sendo a padrão (veja abaixo). Apenas true confirma; ausente, false ou null não

Transições

Status atualResultado
draftactive
pausedactive
activeSem alteração: responde 200 com a AGC como está, sem verificar a audiência raiz

Confirmação da audiência raiz padrão

Todo projeto é criado com sua audiência raiz Toda la empresa: os comércios ativos (veja Projetos → Audiência raiz). Enquanto a audiência raiz mantiver essa definição padrão, publicar faz a configuração rodar sobre a empresa inteira, por isso a API pede uma confirmação explícita.

  • A audiência raiz é padrão enquanto sua definição continuar sendo exatamente a original: um único bloco de consulta equivalente a SELECT DISTINCT user_id FROM user_properties WHERE is_active = true, sem joins, janela de tempo, agrupamento, HAVING nem composições. Qualquer outra mudança de estrutura a torna editada; renomeá-la não. Uma audiência raiz editada e depois devolvida a essa definição volta a ser padrão.
  • A verificação é sempre sobre a audiência raiz do projeto, mesmo quando a AGC tem seu próprio audienceId.
  • Sem confirmDefaultRoot: true, publicar uma AGC em draft ou paused nessa situação responde 409 com este corpo, e a AGC mantém seu status:
{
  "statusCode": 409,
  "error": "Conflict",
  "code": "DEFAULT_ROOT_CONFIRMATION_REQUIRED",
  "message": "La raíz del proyecto sigue siendo la raíz por defecto («Toda la empresa»): publicar hará correr esta configuración sobre toda la empresa. Para confirmarlo, reenvía la solicitud con `confirmDefaultRoot: true`."
}

Ramifique por code, nunca pelo texto de message, que pode mudar (veja Respostas de Erro). Para confirmar, envie a mesma requisição com { "confirmDefaultRoot": true }; enviá-lo com a audiência raiz já editada é inócuo, e a AGC é publicada normalmente. Para publicar sem a confirmação, edite antes a audiência raiz do projeto.

Exemplo

curl -X PATCH https://api.reten.ai/api/activity-generation-configs/f47ac10b-58cc-4372-a567-0e02b2c3d479/publish \
  -H "Authorization: Bearer <token>" \
  -H "x-tenant-id: <tenant-id>" \
  -H "x-project-id: <project-id>" \
  -H "Content-Type: application/json" \
  -d '{ "confirmDefaultRoot": true }'
import axios from 'axios';

const id = 'f47ac10b-58cc-4372-a567-0e02b2c3d479';
const url = `https://api.reten.ai/api/activity-generation-configs/${id}/publish`;
const headers = { Authorization: 'Bearer <token>', 'x-tenant-id': '<tenant-id>', 'x-project-id': '<project-id>' };

let published;
try {
  published = (await axios.patch(url, {}, { headers })).data;
} catch (error) {
  // A audiência raiz do projeto continua sendo a padrão
  if (axios.isAxiosError(error) && error.response?.data?.code === 'DEFAULT_ROOT_CONFIRMATION_REQUIRED') {
    // Confirme com o usuário antes de publicar sobre a empresa inteira
    published = (await axios.patch(url, { confirmDefaultRoot: true }, { headers })).data;
  } else {
    throw error;
  }
}

Resposta 200 OK

Retorna a AGC com seu novo status e seus três pilares aninhados, no mesmo formato camelCase que GET /:id, mas sem effectiveAudienceId nem configHashes.

{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "projectId": "3f6c2b1a-8d4e-4f7a-9b2c-5e1d0a7f6c34",
  "name": "Default lifecycle",
  "description": "Activation, engagement and resurrection for the main funnel",
  "audienceId": "1f0d2c3b-4a59-4687-9c12-abcdef012345",
  "status": "active",
  "updatedBy": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
  "createdAt": "2026-06-10T14:00:00.000Z",
  "updatedAt": "2026-06-20T10:00:00.000Z",
  "activationConfig": {
    "id": "2a8f0c11-6b22-4d33-8e44-aa55bb66cc77",
    "name": "Activation",
    "description": "First-week activation moments",
    "sourceTable": "events",
    "sourceColumns": ["user_id", "event_id"],
    "dateColumn": "occurred_at",
    "activityGenerationConfigId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "aggregationMethod": "nunique",
    "isActive": true,
    "updatedBy": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
    "createdAt": "2026-06-10T14:00:00.000Z",
    "updatedAt": "2026-06-10T14:00:00.000Z",
    "activationMoments": [
      {
        "id": "3b9a1d22-7c33-4e44-9f55-bb66cc77dd88",
        "activationConfigId": "2a8f0c11-6b22-4d33-8e44-aa55bb66cc77",
        "statusCode": "aha",
        "userRetentionStatusConfigId": "aa11bb22-cc33-4d44-9e55-ff66aa77bb88",
        "minActions": 3,
        "windowDays": 7,
        "timeWindow": 30,
        "priority": 1,
        "isActive": true,
        "createdAt": "2026-06-10T14:00:00.000Z",
        "updatedAt": "2026-06-10T14:00:00.000Z"
      }
    ]
  },
  "engagementConfig": {
    "id": "5d1c3f44-9e55-4066-b177-dd88ee99ffaa",
    "name": "Engagement",
    "description": "Active-user engagement levels",
    "sourceTable": "events",
    "sourceColumns": ["user_id", "event_id"],
    "dateColumn": "occurred_at",
    "activityGenerationConfigId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "engagementWindowDays": 28,
    "minLifetimeActionsForEngaged": 1,
    "countingMethod": "active_days",
    "isActive": true,
    "updatedBy": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
    "createdAt": "2026-06-10T14:00:00.000Z",
    "updatedAt": "2026-06-10T14:00:00.000Z",
    "engagementLevels": [
      {
        "id": "6e2d4055-af66-4177-c288-ee99ffaa00bb",
        "engagementConfigId": "5d1c3f44-9e55-4066-b177-dd88ee99ffaa",
        "statusCode": "casual",
        "userRetentionStatusConfigId": "cc33dd44-ee55-4f66-a077-bb99ccaaddbb",
        "label": "Casual",
        "minThreshold": 1,
        "maxThreshold": 7,
        "order": 1,
        "isActive": true,
        "createdAt": "2026-06-10T14:00:00.000Z",
        "updatedAt": "2026-06-10T14:00:00.000Z"
      }
    ]
  },
  "resurrectionConfig": {
    "id": "8a4f6277-c188-4399-e400-aa00bb11ccdd",
    "name": "Resurrection",
    "description": "Recovery vs. churn classification",
    "sourceTable": "events",
    "sourceColumns": ["user_id"],
    "dateColumn": "occurred_at",
    "activityGenerationConfigId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "isActive": true,
    "updatedBy": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
    "createdAt": "2026-06-10T14:00:00.000Z",
    "updatedAt": "2026-06-10T14:00:00.000Z",
    "resurrectionThresholds": [
      {
        "id": "9b5a7388-d299-44aa-f511-bb11ccdd22ee",
        "resurrectionConfigId": "8a4f6277-c188-4399-e400-aa00bb11ccdd",
        "statusCode": "dormant",
        "userRetentionStatusConfigId": "ee55ff66-aa77-4188-c299-ddbbeeccffdd",
        "label": "Dormant",
        "thresholdDays": 30,
        "order": 1,
        "isActive": true,
        "createdAt": "2026-06-10T14:00:00.000Z",
        "updatedAt": "2026-06-10T14:00:00.000Z"
      }
    ]
  }
}

Respostas de Erro

StatusDescrição
400id não é um UUID válido
400confirmDefaultRoot não é um boolean
400Campo desconhecido no corpo
404Não existe uma activity generation config com esse id no projeto ativo — Activity generation config <id> not found
409A audiência raiz do projeto continua sendo a padrão e a requisição não traz confirmDefaultRoot: true — code: DEFAULT_ROOT_CONFIRMATION_REQUIRED