Skip to main content
PATCH
http://api.gu1.ai
/
transactions
/
:id
/
changeStatus
Cambiar Estado de Transacción
curl --request PATCH \
  --url http://api.gu1.ai/transactions/:id/changeStatus \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "status": "<string>"
}
'
{
  "success": true,
  "transaction": {},
  "statusChanged": {},
  "rulesResult": {}
}

Endpoint

Cambiar Estado de Transacción

PATCH http://api.gu1.ai/transactions/:id/changeStatus
Actualiza el estado de una transacción existente con validación automática de transiciones de estado y ejecución opcional de reglas para re-evaluación de riesgo en tiempo real. Características:
  • Validación automática de transiciones de estado (previene cambios de estado inválidos)
  • Aplicación de máquina de estados (reglas de estados abiertos ↔ cerrados)
  • Ejecución automática de reglas de actualización con trigger trigger_transaction_updated
  • Protección de integridad de transacciones
  • Rastro de auditoría completo

Autenticación

Todas las solicitudes deben incluir una clave API en el encabezado Authorization:
Authorization: Bearer YOUR_API_KEY

Encabezados Requeridos

Content-Type: application/json
Authorization: Bearer YOUR_API_KEY

Parámetros de Ruta

id
string
required
El UUID de la transacción a actualizarTipo: string (uuid)

Cuerpo de la Solicitud

status
string
required
Nuevo estado de la transacción. Debe ser un valor válido del enum de estados.Estados Válidos:
  • CREATED - Transacción creada (estado abierto)
  • PROCESSING - Transacción en proceso (estado abierto)
  • SUSPENDED - Transacción temporalmente suspendida (estado abierto)
  • SENT - Transacción enviada/transmitida (estado cerrado)
  • EXPIRED - Transacción expirada (estado cerrado)
  • DECLINED - Transacción rechazada/declinada (estado cerrado)
  • REFUNDED - Transacción reembolsada/reversada (estado cerrado)
  • SUCCESSFUL - Transacción completada exitosamente (estado cerrado)
Tipo: enum - 'CREATED' | 'PROCESSING' | 'SUSPENDED' | 'SENT' | 'EXPIRED' | 'DECLINED' | 'REFUNDED' | 'SUCCESSFUL'

Reglas de Transición de Estados

El endpoint aplica reglas estrictas de transición de estados para mantener la integridad de las transacciones:

Estados Abiertos

Estados que permiten transiciones adicionales:
  • CREATED
  • PROCESSING
  • SUSPENDED
  • SENT

Estados Cerrados

Estados finales que no pueden transicionar a otros estados:
  • EXPIRED
  • DECLINED
  • REFUNDED
  • SUCCESSFUL

Matriz de Transiciones

Estado OrigenEstado Destino¿Permitido?Nota
CREATEDPROCESSING✅ SíFlujo normal
CREATEDSUSPENDED✅ SíSuspender para revisión
CREATEDSUCCESSFUL✅ SíAprobación rápida
PROCESSINGSUSPENDED✅ SíSuspender durante procesamiento
PROCESSINGSUCCESSFUL✅ SíFinalización normal
PROCESSINGDECLINED✅ SíRechazar durante procesamiento
SUSPENDEDPROCESSING✅ SíReanudar procesamiento
SUSPENDEDSUCCESSFUL✅ SíAprobar transacción suspendida
SUSPENDEDDECLINED✅ SíRechazar transacción suspendida
SUCCESSFULPROCESSING❌ NoNo se puede reabrir transacción cerrada
DECLINEDPROCESSING❌ NoNo se puede reabrir transacción cerrada
EXPIREDPROCESSING❌ NoNo se puede reabrir transacción cerrada
REFUNDEDany❌ NoNo se puede cambiar transacción reembolsada
SUCCESSFULDECLINED❌ NoNo se puede cambiar entre estados cerrados
Reglas Clave:
  1. Abierto → Abierto: Permitido (ej: CREATED → PROCESSING)
  2. Abierto → Cerrado: Permitido (ej: PROCESSING → SUCCESSFUL)
  3. Cerrado → Abierto: NO Permitido (ej: SUCCESSFUL → PROCESSING)
  4. Cerrado → Cerrado: NO Permitido (ej: DECLINED → REFUNDED)

Ejecución de Reglas de Actualización

Cuando se cambia el estado de una transacción, el endpoint automáticamente:
  1. Valida la transición - Asegura que el nuevo estado es válido y la transición está permitida
  2. Actualiza el estado - Cambia el estado de la transacción en la base de datos
  3. Ejecuta reglas de actualización - Ejecuta todas las reglas con trigger: 'updated' en su alcance
  4. Actualiza puntuación de riesgo - Re-calcula el riesgo basado en los resultados de las reglas
  5. Devuelve transacción actualizada - Devuelve la transacción completa con la nueva evaluación de riesgo

Trigger de Reglas

El endpoint usa el modo trigger_transaction_updated, que ejecuta todas las reglas configuradas con el trigger updated. Ejemplo de configuración de alcance de regla:
{
  "scope": {
    "triggers": ["updated"],
    "targetEntityTypes": ["transaction"]
  }
}

Ejemplos Completos de Solicitud

Aprobar una Transacción Suspendida

curl -X PATCH http://api.gu1.ai/transactions/550e8400-e29b-41d4-a716-446655440000/changeStatus \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "SUCCESSFUL"
  }'

Rechazar una Transacción en Revisión

curl -X PATCH http://api.gu1.ai/transactions/550e8400-e29b-41d4-a716-446655440000/changeStatus \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "DECLINED"
  }'

Suspender una Transacción para Revisión Manual

curl -X PATCH http://api.gu1.ai/transactions/550e8400-e29b-41d4-a716-446655440000/changeStatus \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "SUSPENDED"
  }'

Respuesta

Respuesta Exitosa (200 OK)

{
  "success": true,
  "transaction": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "externalId": "txn_12345",
    "type": "PAYMENT",
    "status": "SUCCESSFUL",
    "amount": 1500.00,
    "currency": "USD",
    "amountInUsd": 1500.00,
    "origin": {
      "entityId": "customer_001",
      "externalId": "EXT-001",
      "name": "Juan Pérez",
      "country": "US",
      "details": {},
      "type": "person",
      "riskScore": 15.50
    },
    "destination": {
      "entityId": "merchant_002",
      "externalId": "MER-002",
      "name": "Tienda de Electrónicos",
      "country": "US",
      "details": {},
      "type": "company",
      "riskScore": 8.20
    },
    "riskScore": 22.50,
    "riskFactors": [
      {
        "factor": "status_change",
        "score": 5,
        "description": "Estado de transacción cambió a SUCCESSFUL"
      }
    ],
    "flagged": false,
    "description": "Compra de laptop",
    "category": "electronics",
    "metadata": {},
    "transactedAt": "2024-12-23T14:30:00.000Z",
    "createdAt": "2024-12-23T14:30:00.000Z",
    "updatedAt": "2024-12-23T15:45:00.000Z"
  },
  "statusChanged": {
    "from": "SUSPENDED",
    "to": "SUCCESSFUL"
  },
  "rulesResult": {
    "success": true,
    "executed": true,
    "rulesTriggered": 3,
    "executionTimeMs": 245,
    "result": {
      "entityId": "550e8400-e29b-41d4-a716-446655440000",
      "entityType": "transaction",
      "rulesExecuted": [
        {
          "ruleId": "rule_001",
          "ruleName": "Verificación de Transacciones de Alto Valor",
          "passed": true,
          "score": 5
        }
      ],
      "totalRules": 3,
      "successfulRules": 3,
      "failedRules": 0,
      "overallConfidence": 0.95,
      "riskScore": 22.50,
      "flags": []
    },
    "auditId": "audit_12345",
    "isNewAudit": false
  }
}

Campos de Respuesta

success
boolean
Si el cambio de estado fue exitoso
transaction
object
La transacción actualizada con todos sus datos, incluyendo:
  • id (string) - UUID de la transacción
  • status (string) - Nuevo estado de la transacción
  • origin (object) - Información de la parte origen (estructura anidada)
    • entityId (string) - UUID de la entidad origen
    • name (string) - Nombre de la parte origen
    • country (string) - País de origen
    • details (object) - Detalles adicionales de origen
    • type (string) - Tipo de entidad origen
    • riskScore (number) - Puntuación de riesgo de la entidad origen
  • destination (object) - Información de la parte destino (estructura anidada)
    • entityId (string) - UUID de la entidad destino
    • name (string) - Nombre de la parte destino
    • country (string) - País de destino
    • details (object) - Detalles adicionales de destino
    • type (string) - Tipo de entidad destino
    • riskScore (number) - Puntuación de riesgo de la entidad destino
  • riskScore (number) - Puntuación de riesgo actualizada después de la re-evaluación
  • riskFactors (array) - Factores de riesgo actualizados
  • flagged (boolean) - Estado de marcado actualizado
  • updatedAt (string) - Timestamp de la actualización
statusChanged
object
Información sobre la transición de estado:
  • from (string) - Estado anterior
  • to (string) - Nuevo estado
rulesResult
object
Resultado completo de la ejecución de reglas de actualización (RulesExecutionResult):
  • success (boolean) - Si las reglas se ejecutaron exitosamente
  • executed (boolean) - Si se ejecutó alguna regla
  • result (object | undefined) - Resultado del análisis de entidad con detalles de ejecución de reglas
  • rulesTriggered (number | undefined) - Número de reglas que fueron ejecutadas
  • executionTimeMs (number | undefined) - Tiempo de ejecución en milisegundos
  • error (string | undefined) - Mensaje de error si la ejecución falló
  • auditId (string | undefined) - ID del registro de auditoría
  • isNewAudit (boolean | undefined) - Si se creó una nueva auditoría
  • warnings (array | undefined) - Array de mensajes de advertencia
  • metadata (object | undefined) - Metadata adicional incluyendo resumen de cobertura, campos faltantes y recomendaciones

Respuestas de Error

400 Bad Request - Estado Inválido

{
  "error": "Invalid status",
  "validStatuses": [
    "CREATED",
    "PROCESSING",
    "SUSPENDED",
    "SENT",
    "EXPIRED",
    "DECLINED",
    "REFUNDED",
    "SUCCESSFUL"
  ]
}

400 Bad Request - Transición Inválida

{
  "error": "Cannot transition from closed status to open status",
  "currentStatus": "SUCCESSFUL",
  "requestedStatus": "PROCESSING",
  "message": "Transaction is in a closed state (SUCCESSFUL) and cannot be reopened"
}

404 Not Found

{
  "error": "Transaction not found"
}

401 Unauthorized

{
  "error": "Unauthorized",
  "message": "Invalid or missing API key"
}

500 Internal Server Error

{
  "error": "Failed to change transaction status",
  "details": "Internal server error message"
}

Casos de Uso

1. Flujo de Revisión Manual

// Paso 1: Suspender transacción sospechosa
await changeStatus(transactionId, 'SUSPENDED');

// Paso 2: Analista revisa la transacción
// ... proceso de revisión manual ...

// Paso 3: Aprobar o rechazar según la revisión
if (approved) {
  await changeStatus(transactionId, 'SUCCESSFUL');
} else {
  await changeStatus(transactionId, 'DECLINED');
}

2. Verificación Automática de Cumplimiento

// Transacción creada con estado CREATED
const transaction = await createTransaction({...});

// Ejecutar verificaciones de cumplimiento adicionales
const complianceResult = await runComplianceChecks(transaction.id);

if (complianceResult.passed) {
  // Mover a procesamiento
  await changeStatus(transaction.id, 'PROCESSING');

  // Completar transacción
  await changeStatus(transaction.id, 'SUCCESSFUL');
} else {
  // Rechazar por problemas de cumplimiento
  await changeStatus(transaction.id, 'DECLINED');
}

3. Respuesta a Detección de Fraude

// Monitorear actualizaciones de transacciones
if (fraudDetected) {
  // Suspender transacción inmediatamente
  await changeStatus(transactionId, 'SUSPENDED');

  // Crear alerta para investigación
  await createAlert({
    transactionId,
    type: 'fraud_suspected',
    severity: 'high'
  });

  // Después de la investigación, tomar acción
  if (confirmed) {
    await changeStatus(transactionId, 'DECLINED');
  } else {
    await changeStatus(transactionId, 'SUCCESSFUL');
  }
}

4. Actualizaciones Masivas de Estado

// Actualizar múltiples transacciones en paralelo
const suspendedTransactions = await getTransactionsByStatus('SUSPENDED');

const results = await Promise.allSettled(
  suspendedTransactions.map(async (txn) => {
    if (shouldApprove(txn)) {
      return await changeStatus(txn.id, 'SUCCESSFUL');
    } else if (shouldDecline(txn)) {
      return await changeStatus(txn.id, 'DECLINED');
    }
  })
);

console.log(`Actualizadas ${results.filter(r => r.status === 'fulfilled').length} transacciones`);

Mejores Prácticas

  1. Validar antes de cambiar - Siempre verificar el estado actual antes de intentar un cambio de estado para evitar llamadas API innecesarias
  2. Manejar errores de transición - Implementar manejo de errores apropiado para transiciones inválidas, ya que las transacciones cerradas no pueden ser reabiertas
  3. Usar estados apropiados - Elegir el estado correcto que refleje el estado de negocio real de la transacción
  4. Monitorear ejecución de reglas - Prestar atención al objeto rulesResult para asegurar que las reglas de actualización se ejecuten como se espera y verificar detalles de ejecución, advertencias y metadata
  5. Implementar registro de auditoría - Rastrear todos los cambios de estado en su sistema para cumplimiento y depuración
  6. Actualizaciones masivas - Al actualizar múltiples transacciones, usar Promise.allSettled() para continuar procesando incluso si algunas actualizaciones fallan
  7. Integración de webhooks - Considerar configurar webhooks para recibir notificaciones cuando los cambios de estado ejecuten reglas importantes
  8. Probar transiciones de estado - Probar todas las posibles transiciones de estado en su entorno de desarrollo antes de desplegar a producción

Endpoints Relacionados