Saltar al contenido principal
El TED IN permite que su institución reciba transferencias originadas en otros bancos. El plugin detecta automáticamente las transferencias recibidas, valida al destinatario y acredita el valor en la cuenta correspondiente.

Cómo funciona


La recepción de un TED es un proceso automático detectado por el worker de polling cada 30 segundos.
┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│  Banco origen   │────▶│    JD SPB       │────▶│   Plugin TED    │
│  envía TED      │     │  (polling 30s)  │     │   procesa       │
└─────────────────┘     └─────────────────┘     └────────┬────────┘

                        ┌─────────────────┐              │
                        │    Webhook      │◀─────────────┤
                        │   (opcional)    │              │
                        └─────────────────┘              │

                                                ┌─────────────────┐
                                                │  Cuenta del     │
                                                │  destinatario   │
                                                │  acreditada     │
                                                └─────────────────┘

Flujo de detección

  1. Cada 30 segundos, el worker consulta el servicio RecebeMensagem de JD
  2. Al encontrar un nuevo mensaje STR0008R2 que no corresponde a una transferencia enviada por el sistema, se identifica como TED de entrada
  3. El mensaje XML bruto es inmediatamente guardado en la tabla JDIncomingMessage (garantía at-least-once con deduplicación)

Procesamiento

  1. Crea una nueva entidad Transfer con tipo TED_IN y estado RECEIVED
  2. Valida si la cuenta del destinatario existe en el CRM
  3. Si el destinatario es válido, calcula la tasa de cashin (si está habilitada)
  4. Acredita la cuenta en Midaz a través de CreateCashinTransaction
  5. Actualiza el estado a COMPLETED
  6. Envía notificación de webhook

Timeline


T+0:     Banco externo envía TED

T+30s:   Polling detecta mensaje (RecebeMensagem)
         ├─ Persistir en JDIncomingMessage
         └─ Estado: RECEIVED

T+32s:   Validar destinatario en CRM
         └─ Estado: PROCESSING

T+35s:   Acreditar cuenta (Midaz CreateCashinTransaction)
         └─ Estado: COMPLETED

T+36s:   Notificación webhook enviada
SLA: < 1 minuto detección → < 5 segundos procesamiento

Estados del TED IN


RECEIVED → PROCESSING → COMPLETED
                      → REJECTED (destinatario no encontrado)
EstadoDescripción
RECEIVEDTransferencia detectada, esperando procesamiento
PROCESSINGValidando destinatario y preparando crédito
COMPLETEDValor acreditado en la cuenta del destinatario
REJECTEDDestinatario no encontrado o cuenta inválida

Consultar transferencias recibidas


Endpoint: GET /v1/transfers

Query parameters

ParámetroTipoDescripción
typeStringFiltrar por tipo (TED_IN)
statusStringFiltrar por estado (COMPLETED, REJECTED)
fromDateISO8601Fecha inicial del período
toDateISO8601Fecha final del período
pageNumberIntegerNúmero de página (por defecto: 1)
pageSizeIntegerÍtems por página (por defecto: 50, máx.: 100)

Response

{
  "data": [
    {
      "transferId": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
      "type": "TED_IN",
      "status": "COMPLETED",
      "amount": 5000.00,
      "feeAmount": 0.00,
      "recipientHolderName": "Empresa ABC Ltda",
      "createdAt": "2026-01-21T10:15:00-03:00"
    }
  ],
  "pagination": {
    "pageNumber": 1,
    "pageSize": 50,
    "totalCount": 150,
    "totalPages": 3
  }
}

Detalles de una transferencia


Endpoint: GET /v1/transfers/

Response

{
  "transferId": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
  "type": "TED_IN",
  "status": "COMPLETED",
  "sender": {
    "ispb": "60746948",
    "branch": "1234",
    "account": "567890",
    "holderName": "Carlos Oliveira",
    "holderDocument": "98765432100"
  },
  "recipient": {
    "accountId": "550e8400-e29b-41d4-a716-446655440000",
    "holderName": "Empresa ABC Ltda",
    "holderDocument": "12345678000199"
  },
  "amount": 5000.00,
  "feeAmount": 0.00,
  "totalAmount": 5000.00,
  "controlNumber": "JD20260121000042",
  "createdAt": "2026-01-21T10:15:00-03:00",
  "completedAt": "2026-01-21T10:15:05-03:00",
  "statusHistory": [
    {"status": "RECEIVED", "timestamp": "2026-01-21T10:15:00-03:00"},
    {"status": "PROCESSING", "timestamp": "2026-01-21T10:15:02-03:00"},
    {"status": "COMPLETED", "timestamp": "2026-01-21T10:15:05-03:00"}
  ]
}

Tarifa de recepción (cashin)


El plugin puede cobrar tarifa sobre transferencias recibidas. La configuración se hace por organización. Cuando está habilitada, la tarifa es calculada via plugin-fees y deducida del valor acreditado:
totalAmount = amount - feeAmount

Ejemplo con tarifa

{
  "amount": 1000.00,
  "feeAmount": 2.50,
  "totalAmount": 997.50
}

Validación del destinatario


El plugin valida al destinatario usando el documento (CPF/CNPJ) informado en el mensaje STR0008R2:
  1. Consulta el CRM por el documento
  2. Si es encontrado, identifica la cuenta correspondiente
  3. Si no es encontrado, inicia devolución (chargeback)

Transferencia rechazada

Cuando el destinatario no es encontrado, una devolución es automáticamente enviada al banco de origen:
{
  "transferId": "d4e5f6a7-b8c9-0123-defg-456789012345",
  "type": "TED_IN",
  "status": "REJECTED",
  "amount": 3000.00,
  "sender": {
    "ispb": "60701190",
    "branch": "0001",
    "account": "123456",
    "holderName": "Ana Costa"
  },
  "rejectionReason": "Recipient not found: document 11122233344 not registered",
  "createdAt": "2026-01-21T11:00:00-03:00",
  "rejectedAt": "2026-01-21T11:00:03-03:00"
}

Tratamiento de errores


Errores críticos y sus acciones:
  • Destinatario no encontrado: Enviar chargeback a JD (STR0010R2), estado=REJECTED
  • Midaz no disponible: Retry 3x → DLQ (intervención manual)
  • Duplicado: Constraint unique sequenceNumber previene créditos duplicados

Webhook de recepción


Configure un webhook para ser notificado en tiempo real sobre transferencias recibidas.

Evento: transfer.incoming

{
  "event": "transfer.incoming",
  "timestamp": "2026-01-21T10:15:05-03:00",
  "data": {
    "transferId": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
    "type": "TED_IN",
    "status": "COMPLETED",
    "amount": 5000.00,
    "feeAmount": 0.00,
    "totalAmount": 5000.00,
    "sender": {
      "ispb": "60746948",
      "holderName": "Carlos Oliveira"
    },
    "recipient": {
      "accountId": "550e8400-e29b-41d4-a716-446655440000",
      "holderName": "Empresa ABC Ltda"
    }
  }
}
Vea más detalles en Webhooks.

Reconciliación


Para reconciliación contable, utilice los siguientes campos:
CampoUso
controlNumberNúmero de control de JD SPB (único por transferencia)
transferIdIdentificador interno de Lerian
createdAtTimestamp de detección
completedAtTimestamp de crédito
El historial de transferencias se mantiene por 5 años, conforme a los requisitos regulatorios del BACEN.

Garantías de procesamiento


El plugin implementa garantías para evitar duplicados y pérdidas:
GarantíaImplementación
At-least-onceMensajes persistidos ANTES del procesamiento
IdempotenciaEl mismo sequenceNumber no es procesado dos veces
RetryFallas transitorias reintentadas con backoff exponencial
DLQFallas permanentes van a dead-letter queue
CRÍTICO: El mensaje es persistido en la tabla JDIncomingMessage ANTES del procesamiento, garantizando que ninguna transferencia sea perdida en caso de falla.