Skip to main content
POST
http://api.gu1.ai
/
transactions
Crear Transacción
curl --request POST \
  --url http://api.gu1.ai/transactions \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "externalId": "<string>",
  "type": "<string>",
  "status": "<string>",
  "amount": 123,
  "currency": "<string>",
  "paymentMethod": "<string>",
  "originEntityId": "<string>",
  "originExternalId": "<string>",
  "originName": "<string>",
  "originCountry": "<string>",
  "originDetails": {},
  "destinationEntityId": "<string>",
  "destinationExternalId": "<string>",
  "destinationName": "<string>",
  "destinationCountry": "<string>",
  "destinationDetails": {},
  "description": "<string>",
  "category": "<string>",
  "metadata": {},
  "transactedAt": "<string>",
  "executeRules": true
}
'
{
  "transaction": {},
  "rulesResult": {}
}

Endpoints

Crear Transacción

POST http://api.gu1.ai/transactions
Crea una nueva transacción con conversión automática de moneda a USD y ejecución opcional de reglas para evaluación de riesgo en tiempo real. Características:
  • Conversión automática de moneda usando tasas de cambio en tiempo real
  • Caché con TTL de 1 minuto para rendimiento
  • Patrón circuit breaker para resiliencia
  • Ejecución automática de reglas opcional (por defecto: true)
  • Soporte multi-moneda (más de 150 monedas)
  • Información de pago flexible dentro de detalles de origen y destino

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

Cuerpo de la Solicitud

externalId
string
required
Tu identificador único para esta transacción en tu sistemaTipo: string (longitud mínima: 1)
type
string
required
Tipo de transacción. Opciones:
  • PAYMENT - Compra o pago a comerciante
  • TRANSFER - Transferencia entre cuentas/usuarios
  • WITHDRAWAL - Retiro de efectivo o débito de cuenta
  • DEPOSIT - Depósito o crédito de cuenta
  • REFUND - Reembolso de una transacción anterior
  • CHARGEBACK - Disputa de contracargo
  • REVERSAL - Reversión de transacción
  • FEE - Cargo de comisión o tarifa
  • ADJUSTMENT - Ajuste de saldo
  • OTHER - Otro tipo de transacción
Tipo: enum - 'PAYMENT' | 'TRANSFER' | 'WITHDRAWAL' | 'DEPOSIT' | 'REFUND' | 'CHARGEBACK' | 'REVERSAL' | 'FEE' | 'ADJUSTMENT' | 'OTHER'
status
string
default:"CREATED"
Estado de la transacción. Sigue un modelo de máquina de estados con estados abiertos y cerrados.Estados Abiertos (pueden transicionar a otros estados):
  • CREATED - Transacción creada (por defecto)
  • PROCESSING - Transacción en proceso
  • SUSPENDED - Transacción temporalmente suspendida
Estados Cerrados (finales, no pueden volver a estados abiertos):
  • SENT - Transacción enviada/transmitida
  • EXPIRED - Transacción expirada
  • DECLINED - Transacción rechazada/declinada
  • REFUNDED - Transacción reembolsada/reversada
  • SUCCESSFUL - Transacción completada exitosamente
Tipo: enum - 'CREATED' | 'PROCESSING' | 'SUSPENDED' | 'SENT' | 'EXPIRED' | 'DECLINED' | 'REFUNDED' | 'SUCCESSFUL' (por defecto: ‘CREATED’)Importante: Una vez que una transacción alcanza un estado cerrado, no puede volver a un estado abierto. Esto garantiza la integridad de la transacción y un rastro de auditoría apropiado.
amount
number
required
Monto de la transacción (debe ser positivo)Tipo: number (> 0)
currency
string
required
Código ISO 4217 de moneda (ej: “USD”, “BRL”, “EUR”)Tipo: string (longitud: 3)
paymentMethod
string
Método de pago utilizado para la transacciónTipo: string (enum, opcional)Valores Posibles:
  • CARD - Pago con tarjeta de crédito o débito
  • ACH - Automated Clearing House (transferencia bancaria US)
  • PIX - Sistema de pagos instantáneos de Brasil
  • TED - Transferencia bancaria brasileña (Transferência Eletrônica Disponível)
  • BOLETO - Boleto de pago brasileño
  • WALLET - Billetera digital (PayPal, Venmo, etc.)
  • SWIFT - Transferencia internacional SWIFT
  • IBAN - Transferencia bancaria basada en IBAN
  • CBU - Cuenta bancaria argentina (Clave Bancaria Uniforme)
  • CVU - Cuenta virtual argentina (Clave Virtual Uniforme)
  • DEBIN - Sistema de débito instantáneo argentino
  • GENERIC_BANK_ACCOUNT - Transferencia de cuenta bancaria genérica
  • MPESA - M-Pesa mobile money (Kenia)
  • UPI - Unified Payments Interface (India)
  • CHECK - Pago con cheque
  • ECHECK - Cheque electrónico
  • QR_CODE - Pago con código QR
  • ONLINE_PAYMENT - Pago online genérico
  • WITHDRAWAL_ORDER - Orden de retiro
Ejemplo: "PIX" o "CARD"
originEntityId
string
UUID de la entidad origen (remitente) en el sistema gu1Tipo: string (uuid, opcional)
originExternalId
string
Su ID externo para la entidad origenTipo: string (opcional)
originName
string
Nombre de la entidad origen (remitente)Tipo: string (longitud máxima: 500, opcional)
originCountry
string
Código de país ISO 3166-1 alpha-2 de la entidad origenTipo: string (longitud: 2, opcional)
originDetails
object
Información contextual sobre el origen de la transacción (dispositivo, geolocalización y detalles de pago).Tipo: object (opcional, estructura validada)Diferencia Clave:
  • originCountry (campo directo) = País de la entidad
  • originDetails.country = País del dispositivo/IP al momento de la transacción (puede diferir si está viajando)
Campos Soportados:Dispositivo/Técnico:
  • deviceId (string) - Identificador del dispositivo
  • deviceFingerprint (string) - Hash de huella digital del dispositivo
  • deviceType (enum) - mobile | desktop | tablet | pos | atm
  • userAgent (string) - User agent del navegador
  • ipAddress (string) - Dirección IP (formato validado)
Geolocalización:
  • country (string) - Código ISO de 2 letras
  • city (string) - Nombre de la ciudad
  • region (string) - Estado/provincia
  • latitude (number) - Latitud (-90 a 90)
  • longitude (number) - Longitud (-180 a 180)
  • timezone (string) - Identificador de zona horaria
Detalles de Pago (objeto anidado):
  • paymentDetails (object) - Información específica de pago para el origen. Puede enviar cualquier campo relacionado con el pago:
    • Detalles Bancarios/Cuenta:
      • accountNumber (string) - Número de cuenta
      • accountType (enum) - checking | savings | business | personal
      • bankCode (string) - Código del banco
      • bankName (string) - Nombre del banco
      • routingNumber (string) - Routing number (US)
      • swiftCode (string) - Código SWIFT/BIC
      • iban (string) - IBAN (International Bank Account Number)
    • Detalles PIX (Brasil):
      • pixKey (string) - Clave PIX
      • pixType (enum) - Tipo de clave PIX: email | phone | cpf | cnpj | random
    • Detalles de Tarjeta:
      • cardLast4 (string) - Últimos 4 dígitos de la tarjeta
      • cardBrand (string) - Marca de tarjeta (Visa, Mastercard, Amex, etc.)
      • cardholderName (string) - Nombre en la tarjeta
      • cardBin (string) - Primeros 6 dígitos de la tarjeta (BIN)
      • cardType (enum) - credit | debit | prepaid
      • cardCountry (string) - País emisor de la tarjeta (ISO 2 letras)
      • cardExpiry (string) - Fecha de vencimiento (MM/YY)
      • cardFingerprint (string) - Huella digital única de la tarjeta para seguimiento
    • Detalles Crypto:
      • walletAddress (string) - Dirección de wallet de criptomoneda
      • walletType (string) - Tipo de wallet (ej: “metamask”, “coinbase”)
      • blockchain (string) - Red blockchain (ej: “ethereum”, “bitcoin”)
      • tokenSymbol (string) - Símbolo del token (ej: “ETH”, “BTC”, “USDT”)
    • Wallet/Pago Digital:
      • walletId (string) - Identificador de wallet digital
      • walletProvider (string) - Proveedor de wallet (ej: “paypal”, “venmo”, “cashapp”)
      • walletEmail (string) - Email asociado con el wallet
    • Y cualquier otro campo relacionado con el pago que necesite
Banderas de Seguridad:
  • isVpn (boolean) - VPN detectado
  • isTor (boolean) - Red Tor detectada
  • isProxy (boolean) - Proxy detectado
  • governmentAccount (boolean) - Bandera de cuenta gubernamental
Ejemplo:
{
  "deviceType": "mobile",
  "ipAddress": "189.123.45.67",
  "country": "BR",
  "city": "São Paulo",
  "isVpn": false,
  "paymentDetails": {
    "accountNumber": "12345",
    "accountType": "personal",
    "bankName": "Banco do Brasil",
    "pixKey": "user@email.com",
    "pixType": "email"
  }
}
Se permiten campos personalizados - el sistema validará los campos conocidos y preservará los personalizados.
destinationEntityId
string
UUID de la entidad destino (receptor) en el sistema gu1Tipo: string (uuid, opcional)
destinationExternalId
string
Su ID externo para la entidad destinoTipo: string (opcional)
destinationName
string
Nombre de la entidad destino (receptor)Tipo: string (longitud máxima: 500, opcional)
destinationCountry
string
Código de país ISO 3166-1 alpha-2 de la entidad destinoTipo: string (longitud: 2, opcional)
destinationDetails
object
Información contextual sobre el destino de la transacción (información de comerciante, dispositivo y detalles de pago).Tipo: object (opcional, estructura validada)Campos Soportados:Información de Comerciante:
  • mcc (string) - Merchant Category Code (4 dígitos, ISO 18245)
  • mccDescription (string) - Descripción del MCC (ej: “Restaurants”)
  • merchantId (string) - Identificador del comerciante
  • merchantName (string) - Nombre del comerciante
  • merchantType (string) - Tipo/categoría del comerciante
Dispositivo/Técnico:
  • deviceId (string) - Identificador del dispositivo
  • deviceType (enum) - pos | online | mobile | atm
  • ipAddress (string) - Dirección IP (formato validado)
Geolocalización:
  • country (string) - Código ISO de 2 letras
  • city (string) - Nombre de la ciudad
  • region (string) - Estado/provincia
Detalles de Pago (objeto anidado):
  • paymentDetails (object) - Información específica de pago para el destino. Puede enviar cualquier campo relacionado con el pago:
    • Detalles Bancarios/Cuenta:
      • accountNumber (string) - Número de cuenta destino
      • accountType (enum) - checking | savings | business | merchant
      • bankCode (string) - Código del banco
      • bankName (string) - Nombre del banco
      • routingNumber (string) - Routing number (US)
      • swiftCode (string) - Código SWIFT/BIC
      • iban (string) - IBAN (International Bank Account Number)
    • Detalles PIX (Brasil):
      • pixKey (string) - Clave PIX
      • pixType (enum) - Tipo de clave PIX: email | phone | cpf | cnpj | random
    • Detalles de Tarjeta:
      • cardLast4 (string) - Últimos 4 dígitos de la tarjeta
      • cardBrand (string) - Marca de tarjeta (Visa, Mastercard, Amex, etc.)
      • cardholderName (string) - Nombre en la tarjeta
      • cardBin (string) - Primeros 6 dígitos de la tarjeta (BIN)
      • cardType (enum) - credit | debit | prepaid
      • cardCountry (string) - País emisor de la tarjeta (ISO 2 letras)
      • cardExpiry (string) - Fecha de vencimiento (MM/YY)
      • cardFingerprint (string) - Huella digital única de la tarjeta para seguimiento
    • Detalles Crypto:
      • walletAddress (string) - Dirección de wallet de criptomoneda
      • walletType (string) - Tipo de wallet (ej: “metamask”, “coinbase”)
      • blockchain (string) - Red blockchain (ej: “ethereum”, “bitcoin”)
      • tokenSymbol (string) - Símbolo del token (ej: “ETH”, “BTC”, “USDT”)
    • Wallet/Pago Digital:
      • walletId (string) - Identificador de wallet digital
      • walletProvider (string) - Proveedor de wallet (ej: “paypal”, “venmo”, “cashapp”)
      • walletEmail (string) - Email asociado con el wallet
    • Y cualquier otro campo relacionado con el pago que necesite
Banderas de Riesgo:
  • cryptoExchange (boolean) - Es exchange de criptomonedas
  • highRisk (boolean) - Bandera de comerciante de alto riesgo
  • privateSector (boolean) - Bandera de sector privado
Ejemplo:
{
  "mcc": "5812",
  "mccDescription": "Restaurants",
  "merchantName": "Restaurant ABC",
  "country": "US",
  "highRisk": false,
  "paymentDetails": {
    "accountNumber": "98765",
    "accountType": "merchant",
    "bankName": "Bradesco"
  }
}
Se permiten campos personalizados - el sistema validará los campos conocidos y preservará los personalizados.
description
string
Descripción de la transacciónTipo: string (longitud máxima: 1000, opcional)
category
string
Categoría de transacción para agrupaciónTipo: string (longitud máxima: 100, opcional)
metadata
object
Metadatos personalizados para almacenar información adicional de la transacción.Tipo: object (opcional, estructura validada)Campos Estándar Soportados:

tags (object) - Sistema de Categorización Clave-Valor

El campo tags le permite agregar pares clave-valor personalizados para categorización flexible, filtrado y gestión de flujos de trabajo. Esto es particularmente útil para:
  • Filtrado personalizado en dashboards y reportes
  • Activar lógica de negocio específica
  • Seguimiento del estado de revisión
  • Categorización por nivel de riesgo o fuente
  • Estados de flujo de trabajo personalizados
Formato: { "clave1": "valor1", "clave2": "valor2" }Patrones Comunes de Tags:
  • risk_level (string) - “low”, “medium”, “high”, “critical”
  • source (string) - “api”, “web”, “mobile”, “batch”, “import”
  • channel (string) - “online”, “branch”, “atm”, “call_center”, “partner”
  • reviewed (boolean) - false (pendiente de revisión), true (revisado)
  • category (string) - “payroll”, “supplier”, “refund”, “investment”, “loan”, “bill_payment”
  • priority (string) - “low”, “normal”, “high”, “urgent”
  • team (string) - “compliance”, “fraud”, “support”, “operations”
  • campaign (string) - Identificador de campaña de marketing o negocio
  • approved_by (string) - Usuario o sistema que aprobó
  • requires_approval (boolean) - Requiere aprobación manual
  • customer_segment (string) - “vip”, “regular”, “new”, “dormant”
  • product_type (string) - “savings”, “investment”, “loan”, “transfer”
  • region (string) - “north”, “south”, “latam”, “emea”, “apac”
  • business_unit (string) - “retail”, “corporate”, “wealth”, “sme”
Ejemplos de Casos de Uso:Ejemplo 1: Flujo de trabajo basado en riesgo
{
  "tags": {
    "risk_level": "high",
    "reviewed": false,
    "requires_approval": true,
    "assigned_to": "fraud_team"
  }
}
Ejemplo 2: Categorización de negocio
{
  "tags": {
    "category": "payroll",
    "batch_id": "PAY_2025_01",
    "department": "engineering",
    "cost_center": "R&D"
  }
}
Ejemplo 3: Seguimiento multi-canal
{
  "tags": {
    "source": "mobile_app",
    "channel": "online",
    "campaign": "winter_2025",
    "referral_code": "FRIEND123",
    "first_transaction": true,
    "customer_segment": "new"
  }
}
Ejemplo 4: Operaciones bancarias
{
  "tags": {
    "channel": "branch",
    "business_unit": "retail",
    "product_type": "loan",
    "region": "latam",
    "requires_approval": true,
    "approved_by": "manager_john"
  }
}
Filtrar transacciones por tags: Posteriormente puede filtrar transacciones usando estos tags en endpoints de listado o dashboards.

Otros Campos de Metadata:

  • purpose (string) - Propósito de la transacción (ej: “salary”, “invoice_payment”)
  • frequency (string) - Frecuencia de la transacción (ej: “monthly”, “one-time”)
  • contract_number (string) - Número de contrato (para pagos empresariales)
  • enhanced_due_diligence (boolean) - Bandera de EDD
  • block_reason (string) - Razón de bloqueo
  • compliance_alert (boolean) - Bandera de alerta de cumplimiento
Ejemplo Completo:
{
  "tags": {
    "risk_level": "medium",
    "source": "api",
    "reviewed": false,
    "category": "invoice_payment"
  },
  "purpose": "supplier_payment",
  "frequency": "monthly",
  "contract_number": "CNT-2025-001",
  "enhanced_due_diligence": false
}
Se permiten campos personalizados más allá de los estándar y serán preservados.
transactedAt
string
Cuándo ocurrió la transacción (timestamp ISO 8601). Por defecto es la hora actual si no se proporciona.Tipo: string (datetime ISO 8601, opcional)
executeRules
boolean
default:"true"
Si ejecutar reglas de riesgo automáticamente después de crear la transacciónTipo: boolean (por defecto: true)

Métodos de Pago

  • CARD - Pago con tarjeta de crédito/débito
  • ACH - Transferencia ACH (EE.UU.)
  • PIX - Pago instantáneo brasileño
  • TED - Transferencia bancaria brasileña (TED)
  • BOLETO - Pago con boleto brasileño
  • WALLET - Pago con billetera digital
  • SWIFT - Transferencia internacional SWIFT
  • IBAN - Transferencia basada en IBAN
  • CBU - Cuenta bancaria argentina (CBU)
  • CVU - Billetera virtual argentina (CVU)
  • DEBIN - Débito directo argentino
  • GENERIC_BANK_ACCOUNT - Transferencia bancaria genérica
  • MPESA - Dinero móvil M-Pesa
  • UPI - Pago UPI de India
  • CHECK - Cheque físico
  • ECHECK - Cheque electrónico
  • QR_CODE - Pago con código QR
  • ONLINE_PAYMENT - Pago en línea genérico
  • WITHDRAWAL_ORDER - Orden de retiro

Account Types

  • PERSONAL - Personal account
  • BUSINESS - Business account
  • MERCHANT - Merchant account
  • SAVINGS - Savings account
  • CHECKING - Checking account
  • INVESTMENT - Investment account
  • ESCROW - Escrow account
  • PREPAID - Prepaid account
  • OTHER - Other account type

MCC Codes

Merchant Category Codes (MCC) classify business types:
{
  "mccCode": "5411"  // Grocery Stores
}
Common examples:
  • 5411 - Grocery Stores
  • 5812 - Restaurants
  • 5999 - Miscellaneous Retail
  • 6011 - ATM/Cash Withdrawal
  • 7995 - Gambling

Tags and Metadata

{
  "tags": ["high_value", "first_transaction", "promotional"],
  "metadata": {
    "campaignId": "summer_2024",
    "referralCode": "FRIEND10",
    "customField": "any_value"
  }
}

Multi-Currency Support

gu1 proporciona conversión automática de moneda para todas las transacciones. Cada organización tiene una moneda base configurada (por defecto: USD), y todas las transacciones se convierten automáticamente a esta moneda base para una evaluación de reglas y reportes consistentes.

Cómo Funciona

  1. Detección Automática: Cuando la currency de una transacción difiere de la moneda base de tu organización, se activa la conversión automática
  2. Tasas en Tiempo Real: Las tasas de cambio se obtienen de nuestro servicio de monedas en tiempo real
  3. Almacenamiento Dual de Montos: Se almacenan tanto los montos originales como los convertidos
  4. Evaluación de Reglas: Las reglas pueden usar amount (original) o amountBaseCurrency (convertido)

Monedas Soportadas

Más de 150 monedas soportadas incluyendo:
  • Principales: USD, EUR, GBP, JPY, CHF, CAD, AUD
  • América Latina: BRL, ARS, MXN, COP, CLP, PEN, UYU
  • Asia: CNY, INR, KRW, SGD, HKD, THB, MYR
  • Crypto: BTC, ETH, USDT, USDC
  • Y muchas más (estándar ISO 4217)

Fuentes de Tasa de Cambio

FuenteDescripciónCuándo se Usa
ms-providerTasas en tiempo real del microservicio de monedasFuente primaria
cache-fallbackTasas en caché cuando el servicio no está disponibleFallback (< 1h de antigüedad)
no-conversionNo se necesita conversión (misma moneda)Igual a la base
client-providedTasa personalizada proporcionada por el clienteOverride opcional

Campos de Respuesta

Cuando ocurre conversión de moneda, la respuesta incluye:
{
  "currencyConversion": {
    "originalAmount": 500.00,
    "originalCurrency": "BRL",
    "convertedAmount": 100.00,
    "baseCurrency": "USD",
    "exchangeRate": 0.20,
    "rateSource": "ms-provider",
    "convertedAt": "2024-10-28T14:30:00Z"
  }
}

Uso de Montos Convertidos en Reglas

Las reglas pueden referenciar ambos montos:
{
  "conditions": [
    {
      "field": "amount",
      "operator": "GREATER_THAN",
      "value": 1000
    }
  ]
}
O usar el monto convertido para umbrales consistentes:
{
  "conditions": [
    {
      "field": "amountBaseCurrency",
      "operator": "GREATER_THAN",
      "value": 10000
    }
  ]
}
Mejor Práctica: Usar amountBaseCurrency en reglas para asegurar umbrales consistentes independientemente de la moneda de la transacción.

Manejo de Errores

Si la conversión de moneda falla:
  • El procesamiento de la transacción continúa con el monto original
  • El campo currencyConversion será omitido de la respuesta
  • Las reglas que usan amountBaseCurrency usarán el amount original como fallback
  • El error se registra pero no bloquea la transacción

Ejemplo: Transacción Multi-Moneda

{
  "transaction": {
    "externalId": "txn_euro_001",
    "type": "PAYMENT",
    "amount": 850.00,
    "currency": "EUR",
    "timestamp": "2024-10-28T15:00:00Z",
    "originEntityId": "customer_france_001",
    "destinationEntityId": "merchant_usa_001"
  }
}
La respuesta incluye conversión:
{
  "success": true,
  "transaction": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "state": "APPROVE"
  },
  "currencyConversion": {
    "originalAmount": 850.00,
    "originalCurrency": "EUR",
    "convertedAmount": 935.00,
    "baseCurrency": "USD",
    "exchangeRate": 1.10,
    "rateSource": "ms-provider",
    "convertedAt": "2024-10-28T15:00:01Z"
  }
}

Complete Request Examples

PIX Transfer (Brazil)

curl -X POST http://api.gu1.ai/transactions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "externalId": "txn_pix_12345",
    "type": "TRANSFER",
    "status": "CREATED",
    "amount": 500.00,
    "currency": "BRL",
    "originEntityId": "customer_maria_001",
    "originName": "Maria Silva",
    "originCountry": "BR",
    "originDetails": {
      "deviceId": "device_123",
      "ipAddress": "189.123.45.67",
      "country": "BR",
      "city": "São Paulo",
      "paymentDetails": {
        "pixKey": "maria.silva@example.com",
        "pixType": "email",
        "bankName": "Banco do Brasil"
      }
    },
    "destinationEntityId": "merchant_loja_002",
    "destinationName": "Loja Online",
    "destinationCountry": "BR",
    "destinationDetails": {
      "merchantId": "MER_002",
      "mcc": "5411",
      "paymentDetails": {
        "accountNumber": "98765",
        "accountType": "merchant",
        "bankName": "Bradesco"
      }
    },
    "description": "Purchase at Online Store",
    "category": "retail",
    "metadata": {
      "storeId": "store_002",
      "orderId": "order_789"
    },
    "transactedAt": "2024-12-23T14:30:00Z",
    "executeRules": true
  }'

Card Payment

curl -X POST http://api.gu1.ai/transactions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "externalId": "txn_card_67890",
    "type": "PAYMENT",
    "amount": 1250.00,
    "currency": "USD",
    "originEntityId": "customer_john_003",
    "originName": "John Smith",
    "originCountry": "US",
    "originDetails": {
      "deviceId": "device_456",
      "deviceType": "desktop",
      "ipAddress": "198.51.100.42",
      "country": "US",
      "paymentDetails": {
        "cardLast4": "8765",
        "cardBrand": "Visa",
        "expiryMonth": "12",
        "expiryYear": "2027"
      }
    },
    "destinationEntityId": "merchant_electronics_001",
    "destinationName": "Electronics Store",
    "destinationCountry": "US",
    "destinationDetails": {
      "mcc": "5732",
      "merchantId": "MER_ELEC_001",
      "paymentDetails": {
        "accountNumber": "ACC123456",
        "accountType": "merchant"
      }
    },
    "description": "Laptop purchase",
    "category": "electronics",
    "metadata": {
      "sessionId": "sess_abc123",
      "isFirstTransaction": true
    },
    "executeRules": true
  }'

Multi-Currency Transfer

curl -X POST http://api.gu1.ai/transactions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "externalId": "txn_euro_001",
    "type": "TRANSFER",
    "amount": 750.50,
    "currency": "EUR",
    "originEntityId": "user_alice_001",
    "originName": "Alice Martinez",
    "originCountry": "ES",
    "originDetails": {
      "deviceId": "device_789",
      "ipAddress": "88.22.15.10",
      "country": "ES",
      "city": "Madrid",
      "paymentDetails": {
        "accountNumber": "ES1234567890123456789012",
        "bankName": "Banco Santander",
        "accountType": "personal"
      }
    },
    "destinationEntityId": "user_bob_002",
    "destinationName": "Bob Johnson",
    "destinationCountry": "DE",
    "destinationDetails": {
      "country": "DE",
      "paymentDetails": {
        "accountNumber": "DE89370400440532013000",
        "bankName": "Deutsche Bank",
        "accountType": "personal"
      }
    },
    "description": "International transfer",
    "category": "p2p",
    "executeRules": true
  }'

Response

Success Response (201 Created)

{
  "transaction": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "externalId": "txn_pix_12345",
    "organizationId": "org_uuid",
    "type": "TRANSFER",
    "status": "CREATED",
    "amount": "500.00",
    "currency": "BRL",
    "amountInUsd": "100.00",
    "exchangeRate": "0.2000000000",
    "rateSource": "ms-provider",
    "rateTimestamp": "2024-12-23T14:30:00.000Z",
    "convertedAt": "2024-12-23T14:30:01.000Z",
    "originEntityId": "customer_maria_001",
    "originExternalId": null,
    "originName": "Maria Silva",
    "originCountry": "BR",
    "originDetails": {
      "deviceId": "device_123",
      "ipAddress": "189.123.45.67",
      "country": "BR",
      "city": "São Paulo",
      "paymentDetails": {
        "pixKey": "maria.silva@example.com",
        "pixType": "email",
        "bankName": "Banco do Brasil"
      }
    },
    "destinationEntityId": "merchant_loja_002",
    "destinationExternalId": null,
    "destinationName": "Loja Online",
    "destinationCountry": "BR",
    "destinationDetails": {
      "merchantId": "MER_002",
      "mcc": "5411",
      "paymentDetails": {
        "accountNumber": "98765",
        "accountType": "merchant",
        "bankName": "Bradesco"
      }
    },
    "riskScore": "25.50",
    "riskFactors": [
      {
        "factor": "velocity_check",
        "score": 15,
        "description": "3 transactions in the last hour"
      }
    ],
    "flagged": false,
    "description": "Purchase at Online Store",
    "category": "retail",
    "metadata": {
      "storeId": "store_002",
      "orderId": "order_789"
    },
    "transactedAt": "2024-12-23T14:30:00.000Z",
    "createdAt": "2024-12-23T14:30:01.000Z",
    "updatedAt": "2024-12-23T14:30:01.000Z"
  },
  "rulesResult": {
    "success": true,
    "rulesTriggered": 3,
    "alerts": [
      {
        "id": "alert_001",
        "severity": "low",
        "type": "velocity_check",
        "message": "User has 3 transactions in the last hour"
      }
    ],
    "riskScore": 25.50,
    "decision": "APPROVE"
  }
}

Response Fields

transaction
object
La transacción creada con todos sus datos incluyendo:
  • id (string) - UUID interno de gu1
  • externalId (string) - Su ID externo
  • type (enum) - Tipo de transacción
  • status (enum) - Estado de la transacción
  • amount (string) - Monto original (string numérico)
  • currency (string) - Código de moneda original (ISO 4217)
  • amountInUsd (string | null) - Monto convertido en USD
  • exchangeRate (string | null) - Tasa de cambio utilizada (precisión: 10 decimales)
  • rateSource (string | null) - Fuente de la tasa de cambio
  • riskScore (string | null) - Puntuación de riesgo 0-100 (precisión: 2 decimales) si se ejecutaron reglas
  • riskFactors (array) - Array de factores de riesgo identificados
  • flagged (boolean) - Si la transacción fue marcada para revisión
rulesResult
object
Resultado de la ejecución de reglas (solo presente si executeRules fue true), incluyendo:
  • success (boolean) - Si las reglas se ejecutaron exitosamente
  • rulesTriggered (number) - Número de reglas que se activaron
  • alerts (array) - Alertas generadas por las reglas
  • riskScore (number) - Puntuación de riesgo final calculada
  • decision (string) - Decisión final (APPROVE, REJECT, HOLD, REVIEW_REQUIRED)

Transaction Status Values

El estado de la transacción sigue un modelo de máquina de estados con estados abiertos y cerrados:

Estados Abiertos (Pueden Transicionar)

EstadoDescripciónPuede Transicionar A
CREATEDTransacción creada (estado inicial)PROCESSING, SUSPENDED, SENT, EXPIRED, DECLINED, SUCCESSFUL
PROCESSINGTransacción siendo procesadaSUSPENDED, SENT, EXPIRED, DECLINED, REFUNDED, SUCCESSFUL
SUSPENDEDTransacción temporalmente suspendidaPROCESSING, SENT, EXPIRED, DECLINED, REFUNDED, SUCCESSFUL

Estados Cerrados (Finales)

EstadoDescripciónNota
SENTTransacción enviada/transmitidaEstado final - no más transiciones
EXPIREDTransacción expiradaEstado final - no más transiciones
DECLINEDTransacción rechazada/declinadaEstado final - no más transiciones
REFUNDEDTransacción reembolsada/reversadaEstado final - no más transiciones
SUCCESSFULTransacción completada exitosamenteEstado final - no más transiciones
Importante: Una vez que una transacción alcanza un estado cerrado, no puede volver a un estado abierto. Esto asegura la integridad de la transacción y rastros de auditoría apropiados.

Risk Score Ranges

Puntuación de riesgo de 0 a 100 (almacenada con precisión de 2 decimales):
  • 0-30: Riesgo bajo (verde)
  • 31-60: Riesgo medio (amarillo)
  • 61-80: Riesgo alto (naranja)
  • 81-100: Riesgo crítico (rojo)

Currency Conversion Rate Sources

El campo rateSource indica cómo se obtuvo la tasa de cambio:
  • ms-provider: Tasa en tiempo real del microservicio de monedas (fuente primaria)
  • cache-fallback: Tasa en caché (< 1h de antigüedad) cuando el servicio no está disponible
  • no-conversion: No se necesita conversión (la moneda ya es USD)
  • null: La conversión falló o no aplica

Error Responses

400 Bad Request - Validation Error

Ejemplo 1: Missing required fields
{
  "error": "Validation failed",
  "details": [
    {
      "path": "externalId",
      "message": "Required",
      "code": "invalid_type"
    },
    {
      "path": "amount",
      "message": "Number must be greater than 0",
      "code": "too_small"
    }
  ]
}
Ejemplo 2: Invalid paymentDetails for card (nested in originDetails)
{
  "error": "Validation failed",
  "details": [
    {
      "path": "originDetails.paymentDetails.cardLast4",
      "message": "Card last 4 digits must be exactly 4 characters",
      "code": "invalid_length"
    },
    {
      "path": "originDetails.paymentDetails.cardBrand",
      "message": "Invalid card brand",
      "code": "invalid_string"
    }
  ]
}
Ejemplo 3: Invalid PIX details (nested in originDetails)
{
  "error": "Validation failed",
  "details": [
    {
      "path": "originDetails.paymentDetails.pixKey",
      "message": "Required",
      "code": "invalid_type"
    },
    {
      "path": "originDetails.paymentDetails.pixType",
      "message": "Invalid PIX type",
      "code": "invalid_enum_value"
    },
    {
      "path": "originDetails.paymentDetails.bankName",
      "message": "String must contain at least 1 character(s)",
      "code": "too_small"
    }
  ]
}
Ejemplo 4: Invalid IP address in originDetails
{
  "error": "Validation failed",
  "details": [
    {
      "path": "originDetails.ipAddress",
      "message": "Invalid IP address format",
      "code": "invalid_string"
    },
    {
      "path": "originDetails.country",
      "message": "Country must be ISO 2 letter code",
      "code": "invalid_length"
    }
  ]
}

400 Bad Request - Missing Organization

{
  "error": "Organization ID and User ID are required"
}

401 Unauthorized

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

500 Internal Server Error

{
  "error": "Failed to create transaction",
  "details": "Database connection error"
}

Best Practices

  1. Use consistent external IDs - Su externalId debe ser único en todo su sistema para evitar duplicados y permitir un seguimiento adecuado
  2. Include entity references - Vincule transacciones a entidades (originEntityId, destinationEntityId) para una mejor evaluación de riesgo y análisis de relaciones
  3. Provide comprehensive metadata - Incluya contexto empresarial relevante en el campo metadata para reglas personalizadas y análisis futuro
  4. Set transactedAt accurately - Siempre proporcione el timestamp real de la transacción, no dependa del valor por defecto (hora actual)
  5. Handle currency conversion gracefully - Tenga en cuenta que la conversión de moneda puede fallar; verifique amountInUsd y exchangeRate en la respuesta
  6. Execute rules strategically - Use executeRules: false para importaciones masivas o cuando desee diferir la evaluación de riesgo
  7. Monitor risk scores - Configure alertas para transacciones con puntuaciones de riesgo altas o estado flagged
  8. Implement error handling - Maneje errores de validación y reintente fallos transitorios con exponential backoff
  9. Use payment details - Proporcione información de pago detallada dentro de originDetails.paymentDetails y destinationDetails.paymentDetails para mejor detección de fraude y contexto de transacción

Next Steps