CredonixDocs
Referencia de la APISaldo a favor

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

POSThttps://app.credonix.mx/api/v1/customers/{customerId}/credit/applications

Path 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

CampoTipoRequeridoNotas
currencystringMXN o USD. Saldo a favor que se usa y moneda de los pagos creados.
testbooleanNoPor defecto false. Con true, los complementos de pago se timbran de prueba. Ver Modo de prueba.
applicationsarrayAl menos una aplicación. Cada invoice_id puede aparecer una sola vez.
applications[].invoice_idstringOrden de cobro del cliente.
applications[].amountstringMonto en la moneda de currency. Mayor a cero, máximo 2 decimales, por ejemplo "1234.50".
applications[].exchange_ratestring | nullCondicionalTipo de cambio USD→MXN, máximo 2 decimales. Ver Tipo de cambio.
applications[].payment_datestringFecha del pago, YYYY-MM-DD.
applications[].notesstring | nullNoNotas del pago.
applications[].referencestring | nullNoReferencia 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 amount debe ser menor o igual al saldo a favor disponible en currency.
  • 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" y funding_source "credit", y un movimiento applicationToInvoice por -amount con related_invoice_id, related_payment_id y 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 en overdue, issued o created según sus fechas.
  • Con dos o más aplicaciones, los pagos comparten un payment_group_id que puedes usar en Cancelar grupo de pagos. Con una sola aplicación es null.
  • 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:

  • currency es distinta a la moneda de la orden de cobro.
  • La orden de cobro genera complemento de pago y currency es USD.

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:

SaldoOrden de cobroMonto en la moneda de la orden
USDMXNamount × exchange_rate
MXNUSDamount ÷ exchange_rate
Misma monedaMisma monedaamount

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 de currency y payment_date como fecha de pago. El pago responde con el complemento en complement.
  • 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 responde 409 con PPD_TEST_CFDI_REQUIRED y 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

CampoTipoDescripcion
payment_group_idstring | nullUUID que agrupa los pagos cuando hay dos o más aplicaciones.
paymentsarrayUn pago por aplicación.
payments[].idstringID del pago.
payments[].invoice_idstringOrden de cobro pagada.
payments[].amountstringMonto del pago con 2 decimales, en la moneda de currency.
payments[].currencystringMXN o USD.
payments[].exchange_ratestring | nullTipo de cambio guardado, solo cuando era obligatorio.
payments[].payment_datestringFecha del pago.
payments[].payment_methodstringSiempre "17".
payments[].funding_sourcestringSiempre "credit".
payments[].notesstring | nullNotas del pago.
payments[].referencestring | nullReferencia del pago.
payments[].payment_group_idstring | nullMismo valor que payment_group_id.
payments[].complementobjeto | nullComplemento 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_atstring (fecha)Momento en que se creó el pago.

Errores

StatusCódigoCausa
400VALIDATION_ERRORCuerpo 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.
400AMOUNT_EXCEEDS_BALANCEEl monto a aplicar excede el saldo pendiente de la orden de cobro.
400LEGAL_ENTITY_NOT_FOUNDLa orden de cobro no cuenta con una razón social configurada.
400LEGAL_ENTITY_NOT_CONFIGUREDLa razón social no está configurada para timbrar complementos de prueba.
400CFDI_STAMP_FAILEDEl PAC rechazó el timbrado del complemento de pago.
401API key ausente, inválida o revocada.
403INSUFFICIENT_PERMISSIONSLa API key no tiene el permiso Crear en Pagos.
404CUSTOMER_NOT_FOUNDEl cliente no existe o no pertenece a la organización.
404INVOICE_NOT_FOUNDLa orden de cobro no existe o no pertenece al cliente seleccionado.
409INSUFFICIENT_CREDITEl saldo a favor disponible es insuficiente para esta aplicación.
409INVOICE_CANCELEDLa orden de cobro se encuentra cancelada.
409INVOICE_WITHOUT_BALANCELa orden de cobro no cuenta con un saldo pendiente por cobrar.
409PPD_TEST_CFDI_REQUIREDCon "test": true, la orden de cobro tiene un CFDI PPD real timbrado pero no uno de prueba.
409PPD_CFDI_REQUIREDLa orden de cobro dejó de tener un CFDI PPD timbrado mientras se procesaba la solicitud.
409INVOICE_CANCELED_CONCURRENTUna de las órdenes de cobro fue cancelada mientras se procesaba la aplicación.
409REMAINING_CHANGED_CONCURRENTEl saldo de una orden de cobro cambió mientras se generaba el complemento.
Abrir Credonix