Reten Docs
Atividades

Criar Atividade

Criar uma nova atividade atribuída a um comércio.

POST /api/activities

Crie uma nova atividade TASK com atribuição de comércio.

Auth: Obrigatório — permissão activity:create

Corpo da Requisição

CampoTipoObrigatórioDescrição
typestringSimTASK
reasonstringSimCódigo do motivo: apenas letras minúsculas, dígitos e _ (^[a-z0-9_]+$), máximo de 100 caracteres. Um código que não está no catálogo de motivos do tenant é adicionado a ele na hora, com um rótulo derivado do código (monthly_visit → Monthly visit)
channelstringSimSALESMAN, CALLCENTER
commerce_idUUIDCondicionalID do comércio alvo. Envie este campo ou commerce_external_id: pelo menos um é obrigatório. Se você enviar os dois, commerce_id prevalece
commerce_external_idstringCondicionalComércio alvo por ID externo (máximo de 255 caracteres). Se nenhum comércio o tiver, a API cria um comércio placeholder com esse ID externo
idempotency_keystringSimChave única por tenant (evita duplicados)
scheduled_atISO 8601SimQuando a atividade deve ser executada
intent_categorystringNãoONBOARDING, MARKETING, COLLECTION, RETENTION, NOTIFICATION, SURVEY ou VALIDATION. Padrão NOTIFICATION
suggested_execution_timeISO 8601NãoHorário sugerido para execução
user_statusstringNãoContexto de status do usuário
scoreintegerNãoPontuação de prioridade
assignment_reasonstringNãoMotivo da atribuição
activity_detailsobjectSim, para TASKDetalhes específicos do tipo — o formato depende de type (ver abaixo)

activity_details

Para type: "TASK", o objeto activity_details carrega a atribuição de rota/operador e é obrigatório. A rota e o operador são obrigatórios, cada um por ID ou por ID externo; se você enviar as duas formas, o ID prevalece. Um ID externo que nenhuma rota ou operador tem faz a API criar um placeholder com ele.

CampoTipoObrigatórioDescrição
assigned_route_idUUIDCondicionalRota atribuída. Envie este campo ou assigned_route_external_id
assigned_route_external_idstringCondicionalRota atribuída por ID externo (máximo de 255 caracteres)
assigned_operator_idUUIDCondicionalOperador atribuído. Envie este campo ou assigned_operator_external_id
assigned_operator_external_idstringCondicionalOperador atribuído por ID externo (máximo de 255 caracteres)

Exemplo

curl -X POST https://api.reten.ai/api/activities \
  -H "Authorization: Bearer <token>" \
  -H "x-tenant-id: <tenant-id>" \
  -H "x-project-id: <project-id>" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "TASK",
    "reason": "monthly_visit",
    "channel": "SALESMAN",
    "commerce_id": "880e8400-e29b-41d4-a716-446655440000",
    "idempotency_key": "task-2025-01-15-001",
    "scheduled_at": "2025-01-16T09:00:00.000Z",
    "activity_details": {
      "assigned_route_id": "dd0e8400-e29b-41d4-a716-446655440000",
      "assigned_operator_id": "cc0e8400-e29b-41d4-a716-446655440000"
    }
  }'
const response = await fetch("https://api.reten.ai/api/activities", {
  method: "POST",
  headers: {
    "Authorization": "Bearer <token>",
    "x-tenant-id": "<tenant-id>",
    "x-project-id": "<project-id>",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    type: "TASK",
    reason: "monthly_visit",
    channel: "SALESMAN",
    commerce_id: "880e8400-e29b-41d4-a716-446655440000",
    idempotency_key: "task-2025-01-15-001",
    scheduled_at: "2025-01-16T09:00:00.000Z",
    activity_details: {
      assigned_route_id: "dd0e8400-e29b-41d4-a716-446655440000",
      assigned_operator_id: "cc0e8400-e29b-41d4-a716-446655440000",
    },
  }),
});
const activity = await response.json();
import requests

response = requests.post(
    "https://api.reten.ai/api/activities",
    headers={
        "Authorization": "Bearer <token>",
        "x-tenant-id": "<tenant-id>",
        "x-project-id": "<project-id>",
    },
    json={
        "type": "TASK",
        "reason": "monthly_visit",
        "channel": "SALESMAN",
        "commerce_id": "880e8400-e29b-41d4-a716-446655440000",
        "idempotency_key": "task-2025-01-15-001",
        "scheduled_at": "2025-01-16T09:00:00.000Z",
        "activity_details": {
            "assigned_route_id": "dd0e8400-e29b-41d4-a716-446655440000",
            "assigned_operator_id": "cc0e8400-e29b-41d4-a716-446655440000",
        },
    },
)
activity = response.json()

Resposta 201 Created

Uma atividade TASK nasce em READY e fica pronta para ser despachada imediatamente: a identidade do comércio atribuído é tudo o que o despacho precisa. Veja Activity States para o catálogo completo.

Se uma atividade do projeto ativo já tiver essa idempotency_key, a API não cria nada e responde 200 OK com a atividade existente.

{
  "id": "ee0e8400-e29b-41d4-a716-446655440000",
  "projectId": "3f6c2b1a-8d4e-4f7a-9b2c-5e1d0a7f6c34",
  "type": "TASK",
  "reason": {
    "code": "monthly_visit",
    "label": "Visita Mensual"
  },
  "channel": "SALESMAN",
  "status": "READY",
  "userStatus": null,
  "idempotencyKey": "task-2025-01-15-001",
  "scheduledAt": "2025-01-16T09:00:00.000Z",
  "commerceAssignment": {
    "commerceId": "880e8400-e29b-41d4-a716-446655440000"
  }
}

Respostas de Erro

StatusDescrição
400Erro de validação: um campo ausente ou inválido, ou um campo que o endpoint não aceita
400Nem commerce_id nem commerce_external_id — Se requiere al menos uno de los campos commerce_id o commerce_external_id.
400TASK sem activity_details — TASK activities require activityDetails
400activity_details sem rota ou sem operador — assigned_route_id is required for TASK activities / assigned_operator_id is required for TASK activities
400A rota ou o operador atribuído está inativo — Assigned route is not active / Assigned operator is not active
400user_status não é um código ativo do catálogo de status de retenção do tenant — User retention status "<code>" is not configured for this tenant
404commerce_id, assigned_route_id ou assigned_operator_id não existe — Commerce not found / Route not found / Operator not found
409A idempotency_key já é usada por uma atividade de outro projeto do tenant — La clave de idempotencia ya está en uso.