Cómo debitar al usuario origen

Débito al usuario origen

El endpoint de débito se invoca al inicio del procesamiento de una transferencia, con el objetivo de debitar la cuenta del usuario origen. Este endpoint debe garantizar que la cuenta esté activa y sea válida, y debe reservar los fondos necesarios para que la operación pueda ejecutarse.

En ACH En Línea, una operación de débito se representa como una acción de tipo COMMIT DEBIT. Si esta acción se marca como COMPLETED exitosamente, pero más adelante ocurre un error en el procesamiento, ACH En Línea ejecutará una operación opuesta (de tipo credito) para revertir el movimiento de saldo y restablecer el estado original de la cuenta.

Proceso de débito paso a paso

A continuación, se describe detalladamente el flujo de procesamiento para una transferencia tipo regulada, enfocándonos en la etapa de débito al usuario origen. Este flujo se ejecuta en múltiples etapas, combinando interacciones entre ACH En Línea y el banco originador, tanto en fases síncronas como asincrónicas.

El objetivo principal de este proceso es asegurar que los fondos del usuario origen estén disponibles y sean reservados o debitados correctamente antes de avanzar con el resto de la operación. El flujo también contempla los mecanismos necesarios para revertir movimientos en caso de errores, así como el cumplimiento de los tiempos regulatorios.

A continuación, se detallan las acciones involucradas, junto con ejemplos prácticos y consideraciones técnicas relevantes.

sequenceDiagram
    autonumber
    participant sb as Entidad Origen
    participant ach as ACH En Línea
    
    sb ->> +ach: Creación de la tx
    Note over ach,sb: /v1/money-movements/transfers
    
    ach ->> +sb: Llama al prepare debit
    Note over sb,ach: /v1/debits
    
    sb ->> +ach: 200 OK
    sb ->> +sb: Reserva de fondos
    
    alt Validaciones no se cumplen
        sb ->> +ach: Envía rechazo
        Note over sb,ach: validación
    end
    
    ach ->> +sb: Confirmación preparación
    Note over ach,sb: /v1/money-movements/transfers/{id}/status
    
    ach ->> +sb: 200 OK
    ach ->> +sb: Llama al commit debit
    Note over ach,sb: /v1/debits/{idDebit}/commit
    
    sb ->> +sb: Realiza débito de fondos
    sb ->> +ach: 200 OK

1. ACH En Línea llama al banco origen para procesar la operación de preparación del débito

ACH En Línea inicia el proceso mediante una solicitud POST al endpoint v1/debits del banco origen, con la información completa de la transferencia.

Campos de entrada preparación del débito

Campo Tipo Validación Longitud Obligatoriedad
meta objeto N/A N/A SI
id cadena Identificador único de la transacción Min 1 Max 36 SI
status cadena Estado de la transacción. Ver tabla "VALORES PARA LAS ACCIONES Y ESTADOS (status)" Min 1 Max 8 SI
data objeto N/A N/A SI
debitId cadena Identificador del debit prepare, el banco debe guardar este valor Min 1 Max 36 SI
movementType lista Identificador del schema del flujo transaccional. Ver tabla "VALORES PARA LOS MOVEMENT TYPE" lista SI
amountInformation objeto N/A N/A SI
amount decimal Valor de la transacción. 13 enteros, 2 decimales, siempre mayor que cero. El monto máximo por transacción corresponde a 250 MM. Ver tabla "REGLAS PARA LOS VALORES DE TIPO DECIMAL" (13,2) SI
currency lista Símbolo de la moneda de la transacción. Ver tabla "VALORES PARA TIPOS DE MONEDA (CURRENCY)" lista SI
creationDateTime fecha Momento en el que se solicita la preparación del débito. Ver tabla "REGLAS PARA LOS VALORES DE TIPO FECHA" Ver tabla SI
source objeto N/A N/A SI
personType lista Tipo de persona que hace la transacción. Ver tabla "VALORES PARA TIPOS DE PERSONA (PERSONTYPE)" lista SI
document objeto N/A N/A SI
number cadena Número de identificación del ordenante del pago entero SI
type lista Tipo de identificación del ordenante del pago. Ver tabla "VALORES PARA EL TIPO DE DOCUMENTO" lista SI
fullName cadena Nombre comercial, se usa para persona jurídica Min 1 Max 160 COND Obligatorio si personType es LEGAL
firstName cadena Primer nombre Min 1 Max 40 COND Obligatorio si personType es NATURAL
secondName cadena Segundo nombre Min 1 Max 40 NO
firstLastName cadena Primer apellido Min 1 Max 40 COND Obligatorio si personType es NATURAL
secondLastName cadena segundo apellido Min 1 Max 40 NO
spbviCode lista Nombre del SPBVI origen lista SI
accountInformation objeto N/A N/A SI
accountId cadena Número de cuenta del origen de la transacción Min 1 Max 34 SI
accountType lista Tipo de cuenta del origen de la transacción. Ver tabla "VALORES PARA EL TIPO DE CUENTA" lista SI
financialInstitutionId entero Identificador de la entidad destino. Número NIT sin dígito de verificación Min 1 Max 9 SI
target objeto N/A N/A SI
personType lista Tipo de persona que hace la transacción lista SI
document objeto N/A N/A SI
number cadena Número de identificación del beneficiario del pago entero SI
type lista Tipo de identificación del beneficiario del pago. Ver tabla "VALORES PARA EL TIPO DE DOCUMENTO" lista SI
fullName cadena Nombre comercial, se usa para persona jurídica Min 1 Max 160 COND Obligatorio si personType es LEGAL
firstName cadena Primer nombre Min 1 Max 40 COND Obligatorio si personType es NATURAL
secondName cadena Segundo nombre Min 1 Max 40 NO
firstLastName cadena Primer apellido Min 1 Max 40 COND Obligatorio si personType es NATURAL
secondLastName cadena segundo apellido Min 1 Max 40 NO
targetSpbviCode lista Nombre del SPBVI destino lista SI
alias objeto N/A N/A NO
aliasType lista Tipo de alias. Ver tabla "VALORES PARA TIPOS DE ALIAS" lista NO
aliasValue cadena Valor de la llave Min 1 Max 92 NO
accountInformation objeto N/A N/A NO
accountId cadena Número de cuenta del beneficiario Min 1 Max 34 NO
accountType lista Tipo de cuenta del beneficiario. Ver tabla "VALORES PARA EL TIPO DE CUENTA" lista NO
financialInstitutionId entero Identificador de la entidad destino Min 1 Max 9 NO
qr objeto N/A N/A NO
qrId cadena Identificador del QR Min 35 Max 35 NO

Request preparación del débito

curl --location 'https://url_entidad/v1/debits' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJkZW1vLXVzdWFyaW8iLCJyb2xlIjoiYXBwLXRlc3QiLCJpYXQiOjE3MDAwMDAwMDAsImV4cCI6MTcwMDA4NjQwMH0.abc123xyz987fakeSignatureOnlyForDemoPurposes' \
--data '{...}'

Data:

{
  "meta": {
    "id": "string",
    "status": "string"
  },
  "data": {
    "debitId": "string",
    "movementType": ["lista"],
    "amountInformation": {
      "amount": "decimal",
      "currency": ["lista"]
    },
    "source": {
      "personType": ["lista"],
      "document": {
        "number": "string",
        "type": ["lista"],
        "fullName": "string",
        "firstName": "string",
        "secondName": "string",
        "firstLastName": "string",
        "secondLastName": "string"
      },
      "spbviCode": ["lista"],
      "accountInformation": {
        "accountId": "string",
        "accountType": ["lista"],
        "financialInstitutionId": "entero"
      }
    },
    "target": {
      "personType": ["lista"],
      "document": {
        "number": "string",
        "type": ["lista"],
        "fullName": "string",
        "firstName": "string",
        "secondName": "string",
        "firstLastName": "string",
        "secondLastName": "string"
      },
      "targetSpbviCode": ["lista"],
      "alias": {
        "aliasType": ["lista"],
        "aliasValue": "string"
      },
      "accountInformation": {
        "accountId": "string",
        "accountType": ["lista"],
        "financialInstitutionId": "entero"
      },
      "qr": {
        "qrId": "string"
      }
    }
  }
}'

2. La Entidad Participante origen envía respuesta al llamado de preparación del débito

La Entidad Participante confirma la recepción de la instrucción para preparación del débito.

Response preparación del débito

HTTP/1.1 200 OK 
Content-Length: 0

3. Reserva de fondos

La Entidad Participante asegura la reserva de fondos al usuario origen.

4. Procesar rechazo de la transferencia

En caso de que la Entidad Origen no logre procesar la preparación del débito. La transferencia debe rechazarse, por ende, la Entidad debe enviar el respectivo rechazo via POST al endpoint v1/money-movements/transfers/{id}/status.

 

Campos de entrada rechazo

 

Campos de entrada confirmación de la preparación del débito (header)

Campo Tipo Validación Descripción Obligatoriedad
x-hash String Min 64 – Máx 64 Cadena de comprobación de integridad de la trama. Serializar el objeto data y aplicar SHA256. SI

Campos de entrada confirmación del débito (body)

Campo Tipo Validación Longitud Obligatoriedad
data objeto N/A N/A SI
status cadena Estado en el que quedará la transacción. Ver tabla "VALORES PARA LAS ACCIONES Y ESTADOS (status)" Lista SI
creationDateTime fecha Momento en el que se rechaza la preparación del débito Ver tabla "REGLAS PARA LOS VALORES DE TIPO FECHA" SI
coreId cadena Identificador interno del banco para el rechazo Min 1 Max 255 SI
operation cadena Operación que se está reportando. Ver tabla "VALORES PARA LAS OPERACIONES" Lista SI

Request rechazo

curl --location 'https://url_ach/v1/money-movements/transfers/{id}/status' \
--header 'x-hash: 695ffdf84f0dad0c19e3b8b09a4565246c156d747ffb26149e4c2dc5d3b66ca1' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJkZW1vLXVzdWFyaW8iLCJyb2xlIjoiYXBwLXRlc3QiLCJpYXQiOjE3MDAwMDAwMDAsImV4cCI6MTcwMDA4NjQwMH0.abc123xyz987fakeSignatureOnlyForDemoPurposes' \
--data '{...}'
{
  "data": {
    "status": "string",
    "creationDateTime": "fecha",
    "coreId": "string",
    "operation": "string"
  }
}

Campos de salida rechazo

Campo Tipo Validación Longitud Mapeo de datos
data objeto N/A N/A N/A
id cadena Identificador único de la transacción Min 1 Max 36 data.handle
status cadena Estado actual de la transacción. Ver tabla "VALORES PARA LAS ACCIONES Y ESTADOS (status)" lista meta.status
creationDateTime fecha Momento del mensaje de respuesta Ver tabla "REGLAS PARA LOS VALORES DE TIPO FECHA" N/A
movementType lista Identificador del schema del flujo transaccional. Ver tabla "VALORES PARA LAS LOS MOVEMENT TYPE" lista data.schema

Response rechazo

{
  "data": {
    "id": "string",
    "status": "string",
    "creationDateTime": "fecha",
    "movementType": ["lista"]
  }
}

5. Confirma preparación del débito

La Entidad Participante envía la confirmación de la preparación del débito a ACH En Línea. Solicitud POST al endpoint v1/money-movements/transfers/{id}/status.

 

Campos de entrada confirmación preparación débito

Campos de entrada confirmación de preparación del débito (header)

Campo Tipo Validación Descripción Obligatoriedad
x-hash String Min 64 – Máx 64 Cadena de comprobación de integridad de la trama. Serializar el objeto data y aplicar SHA256. SI

Campos de entrada confirmación del débito (Body)

Campo Tipo Validación Longitud Obligatoriedad
data objeto N/A N/A SI
status cadena Estado en el que quedará la transacción. Ver tabla "VALORES PARA LAS ACCIONES Y ESTADOS (status)" Lista SI
creationDateTime fecha Momento en el que se confirma la preparación del débito Ver tabla "REGLAS PARA LOS VALORES DE TIPO FECHA" SI
coreId cadena Identificador interno del banco para la preparación del débito Min 1 Max 255 SI
operation cadena Operación que se está reportando. Ver tabla "VALORES PARA LAS OPERACIONES" Lista SI

Request confirmación de preparación del débito

curl --location 'https://url_ach/v1/money-movements/transfers/{id}/status' \
--header 'x-hash: 695ffdf84f0dad0c19e3b8b09a4565246c156d747ffb26149e4c2dc5d3b66ca1' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJkZW1vLXVzdWFyaW8iLCJyb2xlIjoiYXBwLXRlc3QiLCJpYXQiOjE3MDAwMDAwMDAsImV4cCI6MTcwMDA4NjQwMH0.abc123xyz987fakeSignatureOnlyForDemoPurposes' \
--data '{...}'
{
  "data": {
    "status": "string",
    "creationDateTime": "fecha",
    "coreId": "string",
    "operation": "string"
  }
}

6. ACH En Línea envía respuesta al llamado de confirmación de preparación del débito

Una vez la Entidad Participante envía la confirmación de preparación del débito. ACH En Línea envía la respuesta a dicho llamado.

Campos de salida enviados por ACH al recibir confirmación de preparación del débito

Campo Tipo Validación Longitud Mapeo de datos
meta objeto N/A N/A N/A
requestId cadena UUID que identifica el mensaje Min 36 - Max 36 N/A
version cadena Versión del protocolo de mensajería. valor fijo "1.0.0" Min 1 Max 15 N/A
id cadena Identificador único de la transacción Min 1 Max 36 data.handle
status cadena Estado actual de la transacción. Ver tabla "VALORES PARA LAS ACCIONES Y ESTADOS (status)" lista meta.status
creationDateTime fecha Momento del mensaje de respuesta Ver tabla "REGLAS PARA LOS VALORES DE TIPO FECHA" N/A
movementType lista Identificador del schema del flujo transaccional. Ver tabla "VALORES PARA LAS LOS MOVEMENT TYPE" lista data.schema

Response enviados por ACH al recibir confirmación de preparación del débito

{
  "data": {
    "id": "string",
    "status": "string",
    "creationDateTime": "2026-05-15T14:30:00Z",
    "movementType": ["lista"]
  }
}

7. ACH En Línea llama al banco origen para procesar la operación commit del débito

ACH En Línea ejecuta la solicitud POST al endpoint v1/debits{idDebit}/commit del banco origen para dejar en firme el débito al usuario.

Campos de entrada commit debit

Campo Tipo Validación Longitud Mapeo de datos
meta objeto N/A N/A transfers.meta
id cadena Identificador único de la transacción Min 1 Max 36 transfers.meta.id
status cadena Estado actual de la transacción N/A meta.status
data objeto N/A N/A transfers.data
debitId cadena Identificador único del débito N/A N/A
movementType lista Identificador del schema del flujo transaccional. Ver tabla "VALORES PARA LAS LOS MOVEMENT TYPE" lista transfers.data.movementType
amountInformation objeto N/A N/A transfers.data.amountInformation
amount decimal Valor de la transacción en base 100 (13,2) transfers.data.amountInformation.amount
currency lista Símbolo de la moneda de la transacción lista transfers.data.amountInformation.currency
source objeto N/A N/A transfers.data.source
personType lista Tipo de persona que hace la transacción lista transfers.data.source.personType
document objeto N/A N/A transfers.data.source.document
number cadena Número de identificación del ordenante del pago entero transfers.data.source.document.number
type lista Tipo de identificación del ordenante del pago lista transfers.data.source.document.type
fullName cadena Nombre comercial, se usa para persona jurídica Min 1 Max 160 transfers.data.source.document.fullName
firstName cadena Primer nombre Min 1 Max 40 transfers.data.source.document.firstName
secondName cadena Segundo nombre Min 1 Max 40 transfers.data.source.document.secondName
firstLastName cadena Primer apellido Min 1 Max 40 transfers.data.source.document.firstLastName
secondLastName cadena Segundo apellido Min 1 Max 40 transfers.data.source.document.secondLastName
spbviCode lista Nombre del SPBVI origen lista transfers.data.source.spbviCode
accountInformation objeto N/A N/A transfers.data.source.accountInformation
accountId cadena Número de cuenta del origen de la transacción Min 1 Max 34 transfers.data.source.accountInformation.accountId
accountType lista Tipo de cuenta del origen de la transacción lista transfers.data.source.accountInformation.accountType
financialInstitutionId entero Identificador de la entidad destino Min 1 Max 9 transfers.data.source.accountInformation.financialInstitutionId
target objeto N/A N/A transfers.data.target
personType lista Tipo de persona que hace la transacción lista transfers.data.target.personType
document objeto N/A N/A transfers.data.target.document
number cadena Número de identificación del ordenante del pago entero transfers.data.target.document.number
type lista Tipo de identificación del ordenante del pago lista transfers.data.target.document.type
fullName cadena Nombre comercial, se usa para persona jurídica Min 1 Max 160 transfers.data.target.document.fullName
firstName cadena Primer nombre Min 1 Max 40 transfers.data.target.document.firstName
secondName cadena Segundo nombre Min 1 Max 40 transfers.data.target.document.secondName
firstLastName cadena Primer apellido Min 1 Max 40 transfers.data.target.document.firstLastName
secondLastName cadena Segundo apellido Min 1 Max 40 transfers.data.target.document.secondLastName
targetSpbviCode lista Nombre del SPBVI destino lista transfers.data.target.targetSpbviCode
alias objeto N/A N/A transfers.data.target.alias
aliasType lista Identificador del tipo de llave lista transfers.data.target.alias.aliasType
aliasValue cadena Llave Min 1 Max 92 transfers.data.target.alias.aliasValue
accountInformation objeto N/A N/A transfers.data.target.accountInformation
accountId cadena Número de cuenta del destino de la transacción Min 1 Max 34 transfers.data.target.accountInformation.accountId
accountType lista Tipo de cuenta del destino de la transacción lista transfers.data.target.accountInformation.accountType
financialInstitutionId entero Identificador de la entidad destino Min 1 Max 9 transfers.data.target.accountInformation.financialInstitutionId
qr objeto N/A N/A transfers.data.target.qr
qrId cadena Identificador del QR Min 35 Max 35 transfers.data.target.qr.qrId

Request commit debit

curl --location 'https://url_participante/v1/debits/{idDebit}/commit' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJkZW1vLXVzdWFyaW8iLCJyb2xlIjoiYXBwLXRlc3QiLCJpYXQiOjE3MDAwMDAwMDAsImV4cCI6MTcwMDA4NjQwMH0.abc123xyz987fakeSignatureOnlyForDemoPurposes' \
--data '{...}'
{
  "meta": {
    "id": "string",
    "status": "string"
  },
  "data": {
    "debitId": "string",
    "movementType": ["lista"],
    "amountInformation": {
      "amount": "decimal",
      "currency": ["lista"]
    },
    "source": {
      "personType": ["lista"],
      "document": {
        "number": "string",
        "type": ["lista"],
        "fullName": "string",
        "firstName": "string",
        "secondName": "string",
        "firstLastName": "string",
        "secondLastName": "string"
      },
      "spbviCode": ["lista"],
      "accountInformation": {
        "accountId": "string",
        "accountType": ["lista"],
        "financialInstitutionId": "entero"
      }
    },
    "target": {
      "personType": ["lista"],
      "document": {
        "number": "string",
        "type": ["lista"],
        "fullName": "string",
        "firstName": "string",
        "secondName": "string",
        "firstLastName": "string",
        "secondLastName": "string"
      },
      "targetSpbviCode": ["lista"],
      "alias": {
        "aliasType": ["lista"],
        "aliasValue": "string"
      },
      "accountInformation": {
        "accountId": "string",
        "accountType": ["lista"],
        "financialInstitutionId": "entero"
      },
      "qr": {
        "qrId": "string"
      }
    }
  }
}

8.Entidad Participante Origen deja en firme el débito.

La Entidad Participante deja en firme el débito o en su defecto, procesa el débito al usuario origen.

9.La Entidad Participante origen envía respuesta al llamado de commit del débito

Una vez la Entidad Participante origen efectúa el proceso del débito al usuario origen, envía la respuesta al llamado del commit del débito.

Response commit del débito

HTTP/1.1 200 OK
Content-Length: 0
Orderarticle 2
Cómo enviar cuenta a cuenta Anterior