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 crédito) 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 las validaciones no se cumplen
        sb ->> -ach: Envía rechazo
    end
    sb ->> +ach: Confirma preparación debit
    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 Mapeo de datos
meta objeto N/A N/A N/A
id cadena Identificador único de la transacción Min 1 Max 36 transfers.data.id
status cadena Estado de la transacción. Ver tabla "VALORES PARA LAS ACCIONES Y ESTADOS (status)" Min 1 Max 8 transfers.meta.status
data objeto N/A N/A N/A
debitId cadena Identificador del debit prepare, el banco debe guardar este valor Min 1 Max 36 handle
movementType lista Identificador del schema del flujo transaccional. Ver tabla "VALORES PARA LAS LOS MOVEMENT TYPE" lista N/A
amountInformation objeto N/A N/A N/A
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) (transfers.data.amount / 100)
currency lista Símbolo de la moneda de la transacción. Ver tabla "VALORES PARA TIPOS DE MONEDA (CURRENCY)" lista N/A
creationDateTime fecha Momento en el que se solicita la preparación del débito Ver tabla "REGLAS PARA LOS VALORES DE TIPO FECHA" No aplica
source objeto N/A N/A N/A
personType lista Tipo de persona que hace la transacción lista N/A
document objeto N/A N/A N/A
number cadena Número de identificación del ordenante del pago entero N/A
type lista Tipo de identificación del ordenante del pago lista N/A
fullName cadena Nombre comercial, se usa para persona jurídica Min 1 Max 160 N/A
firstName cadena Primer nombre Min 1 Max 40 N/A
secondName cadena Segundo nombre Min 1 Max 40 N/A
firstLastName cadena Primer apellido Min 1 Max 40 N/A
secondLastName cadena Segundo apellido Min 1 Max 40 N/A
spbviCode lista Nombre del SPBVI origen lista N/A
accountInformation objeto N/A N/A N/A
accountId cadena Número de cuenta del origen de la transacción Min 1 Max 34 N/A
accountType lista Tipo de cuenta del origen de la transacción. Ver tabla "VALORES PARA EL TIPO DE CUENTA" lista N/A
financialInstitutionId entero Identificador de la entidad destino. Número NIT sin digito de verificación Min 1 Max 9 N/A
target objeto N/A N/A N/A
personType lista Tipo de persona que hace la transacción lista N/A
document objeto N/A N/A N/A
number cadena Número de identificación del ordenante del pago entero N/A
type lista Tipo de identificación del ordenante del pago lista N/A
fullName cadena Nombre comercial, se usa para persona jurídica Min 1 Max 160 N/A
firstName cadena Primer nombre Min 1 Max 40 N/A
secondName cadena Segundo nombre Min 1 Max 40 N/A
firstLastName cadena Primer apellido Min 1 Max 40 N/A
secondLastName cadena Segundo apellido Min 1 Max 40 N/A
targetSpbviCode lista Nombre del SPBVI origen lista N/A
alias objeto N/A N/A N/A
aliasType lista Tipo de cuenta del origen de la transacción. Ver tabla "VALORES PARA EL TIPO DE CUENTA" lista N/A
aliasValue cadena Llave Min 1 Max 92 N/A
accountInformation objeto N/A N/A N/A
accountId cadena Número de cuenta del origen de la transacción Min 1 Max 34 N/A
accountType lista Tipo de cuenta del origen de la transacción lista N/A
financialInstitutionId entero Identificador de la entidad destino Min 1 Max 9 N/A
qr objeto N/A N/A N/A
qrId cadena Identificador del QR Min 35 Max 35 N/A

Request preparación del débito

curl --location 'https://url_participante/v1/debits' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJkZW1vLXVzdW
FyaW8iLCJyb2xlIjoiYXBwLXRlc3QiLCJpYXQ iOjE3MDAwMDAwMDAsImV4cCI6MTcwMDA4NjQwMH0.abc123xyz987fakeSignatureOnlyForDemoPurposes' \
--data '{...}'

Data:

{
    "meta": {
        "id": "string",
        "status": "string"
    },
    "data": {
        "debitId": "string",
        "movementType": ["lista"],
        "amountInformation": {
            "amount": "decimal",
            "currency": ["lista"],
            "creationDateTime": "2026-05-15T14:30:00Z"
        },
        "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 vía POST al endpoint v1/money-movements/transfers/{id}/status

Campos de entrada rechazo

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 rechazo (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.eyJ1c2VyS
WQiOiJkZW1vLXVzdWFyaW8iLCJyb2xlIjoiYXBwLXRlc3QiLCJpYXQ iOjE3MDAwMDAwMDAsImV4cCI6MTcwMDA4NjQwMH0.abc123xyz987fakeSignatureOnlyForDemoPurposes' \
--data '{...}'
{
    "data": {
        "status": "REJECTED",
        "creationDateTime": "2026-05-15T14:30:00Z",
        "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": "REJECTED",
        "creationDateTime": "2026-05-15T14:30:00Z",
        "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 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 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 la 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.eyJ1c2VySWQiOiJkZW1vLXVzdWFyaW8iLCJyb2xlIjoiYXBwLXRlc3QiLCJpYXQ iOjE3MDAwMDAwMDAsImV4cCI6MTcwMDA4NjQwMH0.abc123xyz987fakeSignatureOnlyForDemoPurposes' \
--data '{...}'
{
    "data": {
        "status": "string",
        "creationDateTime": "2026-05-15T14:30:00Z",
        "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 ACH En Línea reciba la confirmación de la preparación del débito por parte de la Entidad Origen, ACH En Línea utiliza el servicio POST: https://url_participante/v1/debits/{idDebit}/commit expuesto por la Entidad Origen para que se deje en firme el débito al usuario origen. El idDebit corresponde al enviado por ACH En Línea en el request de preparación del débito.

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

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 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 del débito

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.eyJ1c2VySWQiOiJkZW1vL
XVzdWFyaW8iLCJyb2xlIjoiYXBwLXRlc3QiLCJpYXQ iOjE3MDAwMDAwMDAsImV4cCI6MTcwMDA4NjQwMH0.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 a Bre-b Anterior