Reten Docs
Integración Tareas

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 SUBMIT_ACTIVITY_RESULT

Headers requeridos

HeaderValor
x-api-keyYOUR_API_KEY
Content-Typeapplication/json

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
activity_idstring (UUID)NoID de la actividad en Reten. Si se omite, el resultado se registra como ejecución independiente (STANDALONE)
provider_activity_idstringNoID de la actividad en tu sistema. Solo para correlación/tracking — no identifica ni resuelve la actividad en Reten
commerce_external_idstringCondicionalID externo del comercio. Requerido solo para ejecuciones independientes (sin activity_id); con actividad vinculada se deriva de ella
occurred_atstring (ISO 8601)Fecha y hora en que se realizó la gestión
task_resultobjectDetalle 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

CampoTipoRequeridoDescripción
resultstringCódigo del tipo de resultado (obtenido de Listar Configuraciones)
commentstringNoComentario del operador sobre la gestión
operator_external_idstringNoID externo del operador que realizó la gestión
future_scheduled_atstring (ISO 8601)CondicionalFecha de reprogramación. Requerido si el tipo de resultado tiene requiresFutureScheduledAt: true
payloadobjectNoDatos 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_id solo es obligatorio en ejecuciones independientes (sin activity_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_id es opcional, si se envía y el operador no existe se crea como placeholder.
  • El código de result debe ser un tipo de resultado válido (consulta Listar Configuraciones)
  • Si el tipo de resultado tiene requiresFutureScheduledAt: true, el campo future_scheduled_at es obligatorio y debe ser una fecha futura
  • 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 accionable (READY o DISPATCHED); en caso contrario la solicitud retorna 422
  • 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. Las ejecuciones independientes (STANDALONE, sin activity_id) están exentas de esta regla

Errores

StatusDescripción
400Error de validación — campos faltantes, tipo de resultado inválido, o future_scheduled_at requerido
401Clave de API faltante o inválida
403La clave no tiene el permiso SUBMIT_ACTIVITY_RESULT
404Actividad o comercio no encontrado en el tenant
422Actividad en estado no accionable, o su fecha de ejecución ya cruzó el cierre de fin de día