Aplicar saldo
Aplica el saldo a favor de un cliente a una o más órdenes de cobro.
Descripción general
Este endpoint aplica el saldo a favor de un cliente a una o varias de sus órdenes de cobro. Por cada aplicación crea un pago con forma de pago 17 (Compensación) y funding_source: "credit", y un movimiento applicationToInvoice que descuenta el monto del saldo a favor. Una solicitud exitosa devuelve 201 con los pagos creados.
currency indica de qué saldo se toma el monto (MXN o USD) y es la moneda de los pagos creados. La suma de los amount no puede superar el saldo disponible en esa moneda.
Igual que en la aplicación, la forma de pago siempre es 17: el cuerpo no acepta payment_method. Cuando la orden de cobro tiene un CFDI PPD timbrado, la API timbra el complemento de pago en la misma solicitud.
Requiere el permiso Crear en Pagos.
Endpoint
https://app.credonix.mx/api/v1/customers/{customerId}/credit/applicationsPath param: customerId — ID del cliente dueño del saldo a favor y de las órdenes de cobro.
Aplica saldo a una orden de cobro
Aplica 300.00 del saldo a favor en MXN a una orden de cobro en MXN con un CFDI PPD de prueba timbrado. Como la solicitud lleva "test": true, el complemento de pago se timbra de prueba ("test": true). El pago y el movimiento de saldo sí son reales: el saldo pendiente de la orden de cobro baja de 1160.00 a 860.00.
{
"currency": "MXN",
"test": true,
"applications": [
{
"invoice_id": "cmu21aagp00hnv1dq2aztwkyr",
"amount": "300",
"payment_date": "2026-09-14",
"reference": "APL-2026-0914"
}
]
}Saldo en una moneda distinta a la orden de cobro
Al aplicar saldo en USD a una orden de cobro en MXN, cada aplicación debe llevar exchange_rate. Esta solicitud no lo envía, así que la API responde 400 con un error por cada aplicación afectada, en el campo applications.{i}.exchange_rate, y no registra nada. Ver Tipo de cambio.
{
"currency": "USD",
"applications": [
{
"invoice_id": "cmu21aagp00hnv1dq2aztwkyr",
"amount": "10",
"payment_date": "2026-09-14"
}
]
}Reglas de los campos
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
currency | string | Sí | MXN o USD. Saldo a favor que se usa y moneda de los pagos creados. |
test | boolean | No | Por defecto false. Con true, los complementos de pago se timbran de prueba. Ver Modo de prueba. |
applications | array | Sí | Al menos una aplicación. Cada invoice_id puede aparecer una sola vez. |
applications[].invoice_id | string | Sí | Orden de cobro del cliente. |
applications[].amount | string | Sí | Monto en la moneda de currency. Mayor a cero, máximo 2 decimales, por ejemplo "1234.50". |
applications[].exchange_rate | string | null | Condicional | Tipo de cambio USD→MXN, máximo 2 decimales. Ver Tipo de cambio. |
applications[].payment_date | string | Sí | Fecha del pago, YYYY-MM-DD. |
applications[].notes | string | null | No | Notas del pago. |
applications[].reference | string | null | No | Referencia del pago. |
El cuerpo no acepta campos adicionales: payment_method o cualquier otro campo desconocido responde 400 con VALIDATION_ERROR.
Comportamiento
- La suma de los
amountdebe ser menor o igual al saldo a favor disponible encurrency. - Cada orden de cobro debe pertenecer al cliente, no estar cancelada y tener saldo pendiente.
- El monto, convertido a la moneda de la orden de cobro, no puede superar su saldo pendiente más una tolerancia: el menor entre el 1 % del total de la orden y 500 en MXN o 25 en USD.
- Por cada aplicación se crea un pago con
payment_method"17"yfunding_source"credit", y un movimientoapplicationToInvoicepor-amountconrelated_invoice_id,related_payment_idy la nota"Saldo a favor aplicado a la orden de cobro.". - Se recalcula el saldo pendiente de cada orden de cobro. Si queda liquidada, su estatus cambia a
paid; si no, queda enoverdue,issuedocreatedsegún sus fechas. - Con dos o más aplicaciones, los pagos comparten un
payment_group_idque puedes usar en Cancelar grupo de pagos. Con una sola aplicación esnull. - Para deshacer una aplicación, cancela el pago relacionado.
Tipo de cambio
El tipo de cambio siempre es USD→MXN. exchange_rate es obligatorio en una aplicación cuando se cumple cualquiera de estas condiciones:
currencyes distinta a la moneda de la orden de cobro.- La orden de cobro genera complemento de pago y
currencyesUSD.
Si falta, es null o es menor o igual a cero, la API responde 400 con VALIDATION_ERROR y el mensaje "El tipo de cambio es requerido por el SAT." en applications.{i}.exchange_rate. Cuando no es obligatorio, la API no lo guarda y el pago responde con exchange_rate: null.
Para comparar el monto con el saldo pendiente de la orden de cobro:
| Saldo | Orden de cobro | Monto en la moneda de la orden |
|---|---|---|
USD | MXN | amount × exchange_rate |
MXN | USD | amount ÷ exchange_rate |
| Misma moneda | Misma moneda | amount |
Complemento de pago
- Si la orden de cobro tiene un CFDI PPD timbrado, la API timbra el complemento de pago con forma de pago
17, la moneda decurrencyypayment_datecomo fecha de pago. El pago responde con el complemento encomplement. - Si la orden de cobro no tiene CFDI PPD timbrado, el pago se crea sin complemento (
complement: null). - Con
"test": true, el complemento se timbra de prueba sobre el CFDI PPD de prueba de la orden de cobro. Si la orden tiene un CFDI PPD real timbrado pero no uno de prueba, la API responde409conPPD_TEST_CFDI_REQUIREDy no registra nada. - Si la solicitud falla después de timbrar, la API cancela los complementos que ya había timbrado.
Campos de la respuesta
| Campo | Tipo | Descripcion |
|---|---|---|
payment_group_id | string | null | UUID que agrupa los pagos cuando hay dos o más aplicaciones. |
payments | array | Un pago por aplicación. |
payments[].id | string | ID del pago. |
payments[].invoice_id | string | Orden de cobro pagada. |
payments[].amount | string | Monto del pago con 2 decimales, en la moneda de currency. |
payments[].currency | string | MXN o USD. |
payments[].exchange_rate | string | null | Tipo de cambio guardado, solo cuando era obligatorio. |
payments[].payment_date | string | Fecha del pago. |
payments[].payment_method | string | Siempre "17". |
payments[].funding_source | string | Siempre "credit". |
payments[].notes | string | null | Notas del pago. |
payments[].reference | string | null | Referencia del pago. |
payments[].payment_group_id | string | null | Mismo valor que payment_group_id. |
payments[].complement | objeto | null | Complemento de pago timbrado: id, test, uuid, status (pending, emitted, canceled, not_required o rejected), payment_form, issue_date, currency, verification_url y created_at. |
payments[].created_at | string (fecha) | Momento en que se creó el pago. |
Errores
| Status | Código | Causa |
|---|---|---|
400 | VALIDATION_ERROR | Cuerpo inválido: campo obligatorio faltante, amount en cero o con más de 2 decimales, invoice_id repetido, campo desconocido o exchange_rate faltante cuando es obligatorio. |
400 | AMOUNT_EXCEEDS_BALANCE | El monto a aplicar excede el saldo pendiente de la orden de cobro. |
400 | LEGAL_ENTITY_NOT_FOUND | La orden de cobro no cuenta con una razón social configurada. |
400 | LEGAL_ENTITY_NOT_CONFIGURED | La razón social no está configurada para timbrar complementos de prueba. |
400 | CFDI_STAMP_FAILED | El PAC rechazó el timbrado del complemento de pago. |
401 | — | API key ausente, inválida o revocada. |
403 | INSUFFICIENT_PERMISSIONS | La API key no tiene el permiso Crear en Pagos. |
404 | CUSTOMER_NOT_FOUND | El cliente no existe o no pertenece a la organización. |
404 | INVOICE_NOT_FOUND | La orden de cobro no existe o no pertenece al cliente seleccionado. |
409 | INSUFFICIENT_CREDIT | El saldo a favor disponible es insuficiente para esta aplicación. |
409 | INVOICE_CANCELED | La orden de cobro se encuentra cancelada. |
409 | INVOICE_WITHOUT_BALANCE | La orden de cobro no cuenta con un saldo pendiente por cobrar. |
409 | PPD_TEST_CFDI_REQUIRED | Con "test": true, la orden de cobro tiene un CFDI PPD real timbrado pero no uno de prueba. |
409 | PPD_CFDI_REQUIRED | La orden de cobro dejó de tener un CFDI PPD timbrado mientras se procesaba la solicitud. |
409 | INVOICE_CANCELED_CONCURRENT | Una de las órdenes de cobro fue cancelada mientras se procesaba la aplicación. |
409 | REMAINING_CHANGED_CONCURRENT | El saldo de una orden de cobro cambió mientras se generaba el complemento. |