CredonixDocs
Referencia de la APIPagos

Registrar

Registra el pago de un cliente en una o varias órdenes de cobro.

Descripción general

Este endpoint registra un pago de un cliente y lo aplica a una o varias de sus órdenes de cobro. Cada elemento de allocations crea un pago en su orden de cobro. Cuando envías dos o más asignaciones, los pagos creados comparten el mismo payment_group_id. Una solicitud exitosa devuelve 201 con los pagos creados, el saldo a favor generado y los complementos de pago emitidos.

El complemento de pago se decide igual que en la aplicación. Para cada asignación cuya orden de cobro tiene un CFDI de tipo PPD emitido, la API timbra automáticamente un complemento de pago y lo devuelve en payments[].complements. No existe un campo para pedirlo o evitarlo: enviar with_complement responde 400 con VALIDATION_ERROR. Las órdenes de cobro sin CFDI PPD emitido reciben el pago sin complemento.

Al registrar el pago, la API recalcula el saldo pendiente de cada orden de cobro. Si la orden queda pagada, su estatus cambia a paid.

Modo de prueba. Con "test": true, los complementos se timbran de prueba y solo para las órdenes de cobro con un CFDI de prueba PPD emitido. Si una orden de cobro tiene un CFDI PPD real emitido pero no uno de prueba, la solicitud responde 409 con PPD_TEST_CFDI_REQUIRED y no se registra nada. Los pagos y el saldo a favor creados en modo de prueba sí son reales.

Acepta el header Idempotency-Key. Requiere el permiso Crear en Pagos.

Endpoint

POSThttps://app.credonix.mx/api/v1/payments

Pago a una orden de cobro


Envía una sola asignación. Su amount debe ser exactamente igual al amount del pago. El pago se crea sin payment_group_id. En este ejemplo la orden de cobro no tiene un CFDI PPD emitido, así que complements llega vacío.

{
  "customer_id": "cmu2193s9004kv1dqthqupd39",
  "amount": "500",
  "currency": "MXN",
  "payment_date": "2026-09-14",
  "payment_method": "03",
  "allocations": [
    { "invoice_id": "cmu219f2k008pv1dqi204523f", "amount": "500" }
  ]
}

Pago distribuido en varias órdenes de cobro


Envía dos o más asignaciones para repartir un pago entre varias órdenes de cobro del mismo cliente. Se crea un pago por orden y todos comparten payment_group_id, que puedes usar para filtrar el listado o para cancelar el grupo.

Este ejemplo usa "test": true: la primera orden de cobro tiene un CFDI de prueba PPD emitido y recibe un complemento de prueba; la segunda no tiene CFDI y queda sin complemento.

{
  "customer_id": "cmu219o5b00cyv1dqmrozb5yl",
  "amount": "1500",
  "currency": "MXN",
  "payment_date": "2026-09-14",
  "payment_method": "03",
  "reference": "TRF-78412",
  "test": true,
  "allocations": [
    { "invoice_id": "cmu219r6x00d7v1dq8paog9uj", "amount": "500" },
    { "invoice_id": "cmu219r7z00dkv1dqzeuz744z", "amount": "1000" }
  ]
}

Excedente como saldo a favor


Con "convert_overpayment_to_credit": true, lo que el pago exceda del saldo pendiente de la orden de cobro se registra como saldo a favor del cliente, en la moneda del pago. En este ejemplo la orden de cobro tenía un saldo pendiente de 1160.00: el pago de 1300 la liquida y genera 140.00 de saldo a favor.

El pago y la orden de cobro están en MXN, así que el tipo de cambio no se requiere: el exchange_rate enviado se ignora y el pago queda con exchange_rate: null.

{
  "customer_id": "cmu219o5b00cyv1dqmrozb5yl",
  "amount": "1300",
  "currency": "MXN",
  "payment_date": "2026-09-14",
  "payment_method": "03",
  "exchange_rate": "17.50",
  "convert_overpayment_to_credit": true,
  "allocations": [
    { "invoice_id": "cmu219r7z00dkv1dqzeuz744z", "amount": "1300" }
  ]
}

Pago en USD sin tipo de cambio


Un pago en USD requiere exchange_rate. Si lo omites, la API responde 400 con el error en el campo exchange_rate. Las reglas completas están en Tipo de cambio.

Tipo de cambio


exchange_rate es siempre el tipo de cambio de USD a MXN. Se envía como string o número mayor o igual a 0 con máximo 2 decimales (por ejemplo "17.50"); con más decimales la API responde 400 con VALIDATION_ERROR.

  • Una asignación: el tipo de cambio es requerido cuando currency no es MXN o es distinta de la moneda de la orden de cobro.
  • Dos o más asignaciones: el tipo de cambio es requerido cuando currency no es MXN o cuando alguna de las órdenes de cobro tiene una moneda distinta de currency.
  • Si es requerido y no lo envías, la API responde 400 con VALIDATION_ERROR en el campo exchange_rate y el mensaje "El tipo de cambio es requerido por el SAT.". Si envías 0, el mensaje es "El tipo de cambio debe ser un número mayor a 0".
  • Si no es requerido, el valor enviado se ignora y el pago queda con exchange_rate: null.

Para aplicar el pago a la orden de cobro, un pago en USD a una orden en MXN se convierte multiplicando el monto por el tipo de cambio, y un pago en MXN a una orden en USD, dividiéndolo. Con la misma moneda, el monto se aplica tal cual.

Distribución del monto


Una asignación

  • allocations[0].amount debe ser igual a amount; si no, la API responde 400 con VALIDATION_ERROR en allocations.0.amount.
  • La orden de cobro no puede estar cancelada y debe tener un saldo pendiente.
  • Si el pago supera el saldo pendiente de la orden de cobro más la tolerancia, la API responde 409 con OVERPAYMENT_NOT_ALLOWED, salvo que envíes convert_overpayment_to_credit: true; en ese caso el excedente se registra como saldo a favor.

Dos o más asignaciones

  • Cada orden de cobro debe estar en estatus issued u overdue.
  • Sin convert_overpayment_to_credit, la suma de las asignaciones debe ser igual a amount, con una diferencia máxima de 0.01. Con convert_overpayment_to_credit: true, la suma puede ser menor que amount y la diferencia se registra como saldo a favor.
  • Cada asignación, convertida a la moneda de su orden de cobro, no puede superar el saldo pendiente de esa orden más la tolerancia (ALLOCATION_EXCEEDS_BALANCE). Si la supera dentro de la tolerancia, el excedente se registra como saldo a favor.
  • El saldo a favor del pago se registra en un solo movimiento, en la moneda del pago.

La tolerancia es el 1% del total de la orden de cobro, con un máximo de 500 para órdenes en MXN y de 25 para órdenes en USD.

Reglas de los campos

CampoTipoRequeridoNotas
customer_idstringCliente dueño de las órdenes de cobro.
amountstring | numberMayor a 0, máximo 2 decimales. Sin comas.
currencyMXN | USDMoneda del pago.
exchange_ratestring | number | nullSegún la monedaTipo de cambio USD→MXN, máximo 2 decimales. Ver Tipo de cambio.
payment_datestring (YYYY-MM-DD)Fecha del pago.
payment_methodstringClave del catálogo de formas de pago (tabla abajo).
referencestring | nullNoReferencia del pago.
notesstring | nullNoNotas del pago.
convert_overpayment_to_creditbooleanNoPor defecto false. Registra el excedente como saldo a favor.
testbooleanNoPor defecto false. Timbra los complementos de pago en modo de prueba.
allocationsarrayAl menos 1 elemento. No puede repetir invoice_id.

Cualquier otro campo, incluido with_complement, responde 400 con VALIDATION_ERROR (unrecognized_keys).

allocations[]

CampoTipoRequeridoNotas
invoice_idstringOrden de cobro del cliente.
amountstring | numberMonto aplicado a la orden, en la moneda del pago. Mayor a 0, máximo 2 decimales.

Formas de pago

ClaveForma de pago
01Efectivo
02Cheque
03Transferencia electrónica
04Tarjeta de crédito
05Monedero electrónico
06Dinero electrónico
08Vales de despensa
12Dación en pago
13Pago por subrogación
14Pago por consignación
15Condonación
17Compensación
23Novación
24Confusión
25Remisión de deuda
26Prescripción o caducidad
27A satisfacción del acreedor
28Tarjeta de débito
29Tarjeta de servicios
30Aplicación de anticipos
31Intermediario pagos
99Por definir
CX01Deposito en ventanilla (clave SAT 01)
CX02Moneypool (clave SAT 01)

Forma de las respuestas

201 — pago registrado

CampoTipoDescripcion
payment_group_idstring | nullnull con una asignación; UUID compartido por los pagos con dos o más.
credit_generatedobjeto | nullSaldo a favor generado por el pago: { "amount", "currency" }.
paymentsarrayUn pago por asignación, con la forma de Consultar pago más complements.
payments[].complementsarrayComplementos de pago timbrados para ese pago. Ver Listar complementos de pago.

Errores

StatusCódigoCausa
400VALIDATION_ERRORCampo faltante o inválido, campo desconocido, tipo de cambio requerido o menor o igual a 0, asignaciones que no suman el monto del pago u órdenes de cobro repetidas.
400INVOICES_NOT_FOUNDDos o más asignaciones: alguna orden de cobro no existe o no pertenece al cliente.
400INVOICE_TOTAL_INVALIDLa orden de cobro no tiene un monto total válido.
400ALLOCATION_EXCEEDS_BALANCEDos o más asignaciones: una asignación supera el saldo pendiente de su orden de cobro.
400LEGAL_ENTITY_NOT_CONFIGUREDLa razón social no tiene la configuración necesaria para timbrar el complemento de pago.
400CFDI_STAMP_FAILEDEl PAC rechazó el complemento de pago. message trae el motivo y errors puede listar datos faltantes.
401MISSING_API_KEY | INVALID_API_KEY | API_KEY_REVOKEDAPI key ausente, inválida o revocada.
403INSUFFICIENT_PERMISSIONSLa API key no tiene el permiso Crear en Pagos.
404INVOICE_NOT_FOUNDUna asignación: la orden de cobro no existe o no pertenece al cliente.
409PPD_TEST_CFDI_REQUIREDModo de prueba: la orden de cobro tiene un CFDI PPD real emitido pero no un CFDI de prueba PPD.
409INVOICE_CANCELEDLa orden de cobro está cancelada.
409INVOICE_NOT_PAYABLEDos o más asignaciones: la orden de cobro no está en estatus issued u overdue.
409INVOICE_WITHOUT_BALANCELa orden de cobro no tiene saldo pendiente.
409OVERPAYMENT_NOT_ALLOWEDUna asignación: el pago supera el saldo pendiente y no enviaste convert_overpayment_to_credit: true.
409PPD_CFDI_REQUIREDLa orden de cobro no cuenta con un CFDI PPD emitido al procesar el pago.
409CONCURRENT_OVERPAYMENT | INVOICE_CANCELED_CONCURRENT | REMAINING_CHANGED_CONCURRENTLa orden de cobro cambió mientras se procesaba el pago. Actualiza la información y reintenta.
Abrir Credonix