Enviar Resultado
Registra el resultado de una gestión de tipo tarea.
POST /api/integration/activity-results/tasks
Envía el resultado de una gestión de tipo tarea. El resultado se asocia a la actividad correspondiente y actualiza su estado en Reten.
La operación es un UPSERT idempotente: si la actividad aún no tiene resultado, se crea; si ya lo tiene, se sobrescriben sus detalles con el último envío (last-write-wins). Puedes re-enviar el resultado sin obtener un conflicto.
Autenticación: Requerida — permiso activity-result:submit
Headers requeridos
| Header | Valor |
|---|---|
x-api-key | YOUR_API_KEY |
Content-Type | application/json |
x-project-id es opcional: este es un endpoint project-optional.
- Con una clave de tenant o un token de usuario, enviar el header acota la solicitud a ese proyecto, así que
activity_iddebe pertenecer a él. Sin el header, el resultado toma el proyecto de su actividad. Un header enviado se valida — ver Errores de proyecto. - Un resultado sin
activity_idno tiene actividad de la que tomar el proyecto: con una clave de proyecto toma el proyecto de la clave; con una clave de tenant o un token de usuario necesita el header, y sin él la API responde400. - Una clave de proyecto siempre trabaja en su propio proyecto: un
activity_idde otro proyecto responde404.
Cuerpo de la solicitud
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
activity_id | string (UUID) | No | ID de la actividad en Reten. Si se omite, el resultado se registra como ejecución independiente (STANDALONE), que necesita un proyecto (ver Headers requeridos) |
provider_activity_id | string | No | ID de la actividad en tu sistema. Solo para correlación/tracking — no identifica ni resuelve la actividad en Reten |
commerce_external_id | string | Condicional | ID externo del comercio. Requerido solo para ejecuciones independientes (sin activity_id); con actividad vinculada se deriva de ella |
occurred_at | string (ISO 8601) | Sí | Fecha y hora en que se realizó la gestión |
task_result | object | Sí | Detalle del resultado de la tarea (ver tabla abajo) |
La actividad se resuelve únicamente por activity_id. Si se envía, el
resultado se vincula a esa actividad; si se omite, se registra como ejecución
independiente (STANDALONE). provider_activity_id es solo para
correlación/tracking con tu sistema y no resuelve la actividad.
commerce_external_id es opcional cuando la gestión está vinculada a una
actividad (activity_id): el comercio se deriva de la actividad. Solo es
obligatorio en ejecuciones independientes (STANDALONE) — cuando no se envía
activity_id — y en ese caso, si el comercio no existe, se crea como
placeholder.
Campos de task_result
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
result | string | Sí | Código del tipo de resultado (obtenido de Listar Configuraciones) |
comment | string | No | Comentario del operador sobre la gestión |
operator_external_id | string | No | ID externo del operador que realizó la gestión |
future_scheduled_at | string (ISO 8601) | Condicional | Fecha de reprogramación. Requerido si el tipo de resultado tiene requiresFutureScheduledAt: true |
payload | object | No | Datos adicionales del resultado |
Ejemplo
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": "Cliente aceptó oferta de renovación",
"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: "Cliente aceptó oferta de renovación",
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": "Cliente aceptó oferta de renovación",
"operator_external_id": "OP-042",
},
},
)
data = response.json()Respuesta 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": "Cliente aceptó oferta de renovación",
"operatorExternalId": "OP-042",
"futureScheduledAt": null
}Reglas de validación
- El
commerce_external_idsolo es obligatorio en ejecuciones independientes (sinactivity_id); en ese caso, si el comercio no existe se crea como placeholder. Con una actividad vinculada el comercio se deriva de ella y este campo es opcional. - El
operator_external_ides opcional, si se envía y el operador no existe se crea como placeholder. - El código de
resultdebe ser un tipo de resultado activo (consulta Listar Configuraciones); en caso contrario la solicitud retorna422—El tipo de resultado seleccionado no está activo. - Si el tipo de resultado tiene
requiresFutureScheduledAt: true, el campofuture_scheduled_ates obligatorio (si falta,422—Este tipo de resultado requiere una fecha comprometida.) y debe caer hoy o después en la zona horaria del tenant (si no,422—La fecha programada no puede ser en el pasado.) - Si la actividad ya tiene un resultado, el envío lo sobrescribe (UPSERT idempotente); no se retorna conflicto
- La actividad vinculada debe estar en un estado que admita resultado (
READY,DISPATCHED,RETRYINGoCOMPLETED— enCOMPLETED, el envío sobrescribe el resultado existente); en caso contrario la solicitud retorna422—La actividad no está en un estado válido para registrar resultado. - No se acepta registrar un resultado para una actividad cuya fecha de ejecución ya cruzó el cierre de fin de día, en ese caso la solicitud retorna
422—La actividad corresponde a un día ya cerrado y no admite registrar resultado.Las ejecuciones independientes (STANDALONE, sinactivity_id) están exentas de esta regla
Errores
| Status | Descripción |
|---|---|
400 | Error de validación en el cuerpo — campos faltantes o inválidos |
400 | Un resultado sin activity_id no tiene proyecto: una clave de tenant o un token de usuario que no envía x-project-id — Falta el header obligatorio x-project-id: un resultado sin activity_id necesita proyecto. |
401 | Clave de API inválida, revocada o expirada, o su dueño está inactivo (ver Errores) |
403 | La clave no tiene el permiso activity-result:submit |
404 | El activity_id no existe en el tenant o, cuando la solicitud tiene un proyecto (una clave de proyecto o x-project-id), en ese proyecto — Actividad no encontrada. |
422 | La actividad no admite resultado en su estado actual, su día ya se cerró en el cierre de fin de día, el tipo de resultado no está activo, o future_scheduled_at falta o está en el pasado (ver Reglas de validación) |