Enviar Resultado
Registre o resultado de uma atividade do tipo tarefa.
POST /api/integration/activity-results/tasks
Envia o resultado de uma atividade do tipo tarefa. O resultado é associado à atividade correspondente e atualiza seu status na Reten.
A operação é um UPSERT idempotente: se a atividade ainda não tiver resultado, ele é criado; se já tiver, seus detalhes são sobrescritos com o último envio (last-write-wins). Você pode reenviar o resultado sem obter um conflito.
Autenticação: Exigida — permissão activity-result:submit
Headers exigidos
| Header | Valor |
|---|---|
x-api-key | YOUR_API_KEY |
Content-Type | application/json |
x-project-id é opcional: este é um endpoint project-optional.
- Com uma chave de tenant ou um token de usuário, enviar o header restringe a requisição a esse projeto, então o
activity_iddeve pertencer a ele. Sem o header, o resultado assume o projeto da sua atividade. Um header enviado é validado — veja Erros de projeto. - Um resultado sem
activity_idnão tem atividade da qual assumir o projeto: com uma chave de projeto, assume o projeto da chave; com uma chave de tenant ou um token de usuário, precisa do header, e sem ele a API responde400. - Uma chave de projeto sempre trabalha no seu próprio projeto: um
activity_idde outro projeto responde404.
Corpo da requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
activity_id | string (UUID) | Não | ID da atividade na Reten. Se omitido, o resultado é registrado como execução independente (STANDALONE), que precisa de um projeto (veja Headers exigidos) |
provider_activity_id | string | Não | ID da atividade no seu sistema. Apenas para correlação/rastreamento — não identifica nem resolve a atividade na Reten |
commerce_external_id | string | Condicional | ID externo do comércio. Exigido apenas para execuções independentes (sem activity_id); com uma atividade vinculada, é derivado dela |
occurred_at | string (ISO 8601) | Sim | Data e hora em que a atividade foi tratada |
task_result | object | Sim | Detalhe do resultado da tarefa (ver tabela abaixo) |
A atividade é resolvida apenas pelo activity_id. Se enviado, o resultado é vinculado a essa atividade; se omitido, é registrado como execução independente (STANDALONE). provider_activity_id serve apenas para correlação/rastreamento com o seu sistema e não resolve a atividade.
commerce_external_id é opcional quando a atividade está vinculada a uma atividade (activity_id): o comércio é derivado dela. É exigido apenas para execuções independentes (STANDALONE) — quando activity_id não é enviado — e, nesse caso, se o comércio não existir, ele é criado como placeholder.
Campos de task_result
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
result | string | Sim | Código do tipo de resultado (obtido em Listar Configurações) |
comment | string | Não | Comentário do operador sobre a atividade |
operator_external_id | string | Não | ID externo do operador que tratou a atividade |
future_scheduled_at | string (ISO 8601) | Condicional | Data de reagendamento. Exigido se o tipo de resultado tiver requiresFutureScheduledAt: true |
payload | object | Não | Dados adicionais do resultado |
Exemplo
curl -X POST BASE_URL/api/integration/activity-results/tasks \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"activity_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"commerce_external_id": "COM-001",
"occurred_at": "2026-04-11T10:30:00.000Z",
"task_result": {
"result": "SALE_COMPLETED",
"comment": "Customer accepted renewal offer",
"operator_external_id": "OP-042"
}
}'const response = await fetch(
`${BASE_URL}/api/integration/activity-results/tasks`,
{
method: "POST",
headers: {
"x-api-key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
activity_id: "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
commerce_external_id: "COM-001",
occurred_at: "2026-04-11T10:30:00.000Z",
task_result: {
result: "SALE_COMPLETED",
comment: "Customer accepted renewal offer",
operator_external_id: "OP-042",
},
}),
}
);
const data = await response.json();import requests
response = requests.post(
f"{BASE_URL}/api/integration/activity-results/tasks",
headers={
"x-api-key": "YOUR_API_KEY",
},
json={
"activity_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"commerce_external_id": "COM-001",
"occurred_at": "2026-04-11T10:30:00.000Z",
"task_result": {
"result": "SALE_COMPLETED",
"comment": "Customer accepted renewal offer",
"operator_external_id": "OP-042",
},
},
)
data = response.json()Resposta 201 Created
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"source": "RETEN_ACTIVITY",
"origin": "EXTERNAL",
"activityId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"providerActivityId": null,
"commerceExternalId": "COM-001",
"resultStatus": "COMPLETED",
"occurredAt": "2026-04-11T10:30:00.000Z",
"createdAt": "2026-04-11T10:30:05.000Z",
"updatedAt": "2026-04-11T10:30:05.000Z",
"result": {
"code": "SALE_COMPLETED",
"label": "Venta completada"
},
"comment": "Customer accepted renewal offer",
"operatorExternalId": "OP-042",
"futureScheduledAt": null
}Regras de validação
commerce_external_idsó é exigido para execuções independentes (semactivity_id); nesse caso, se o comércio não existir, ele é criado como placeholder. Com uma atividade vinculada, o comércio é derivado dela e esse campo é opcional.operator_external_idé opcional; se enviado e o operador não existir, ele é criado como placeholder.- O código de
resultdeve ser um tipo de resultado ativo (consulte Listar Configurações); caso contrário, a requisição retorna422—El tipo de resultado seleccionado no está activo. - Se o tipo de resultado tiver
requiresFutureScheduledAt: true, o campofuture_scheduled_até obrigatório (se faltar,422—Este tipo de resultado requiere una fecha comprometida.) e deve cair hoje ou depois no fuso horário do tenant (senão,422—La fecha programada no puede ser en el pasado.) - Se a atividade já tiver um resultado, o envio o sobrescreve (UPSERT idempotente); nenhum conflito é retornado
- A atividade vinculada deve estar em um estado que aceite resultado (
READY,DISPATCHED,RETRYINGouCOMPLETED— emCOMPLETED, o envio sobrescreve o resultado existente); caso contrário, a requisição retorna422—La actividad no está en un estado válido para registrar resultado. - Não é permitido registrar um resultado para uma atividade cuja data de execução já ultrapassou o corte de fim de dia; nesse caso, a requisição retorna
422—La actividad corresponde a un día ya cerrado y no admite registrar resultado.Execuções independentes (STANDALONE, semactivity_id) estão isentas dessa regra
Erros
| Status | Descrição |
|---|---|
400 | Erro de validação no corpo — campos ausentes ou inválidos |
400 | Um resultado sem activity_id não tem projeto: uma chave de tenant ou um token de usuário que não envia x-project-id — Falta el header obligatorio x-project-id: un resultado sin activity_id necesita proyecto. |
401 | Chave de API inválida, revogada ou expirada, ou seu dono está inativo (veja Erros) |
403 | A chave não tem a permissão activity-result:submit |
404 | O activity_id não existe no tenant ou, quando a requisição tem um projeto (uma chave de projeto ou x-project-id), nesse projeto — Actividad no encontrada. |
422 | A atividade não aceita resultado no estado atual, seu dia já foi fechado pelo corte de fim de dia, o tipo de resultado não está ativo, ou future_scheduled_at está ausente ou no passado (veja Regras de validação) |