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
https://app.credonix.mx/api/v1/paymentsPago 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
currencyno esMXNo es distinta de la moneda de la orden de cobro. - Dos o más asignaciones: el tipo de cambio es requerido cuando
currencyno esMXNo cuando alguna de las órdenes de cobro tiene una moneda distinta decurrency. - Si es requerido y no lo envías, la API responde
400conVALIDATION_ERRORen el campoexchange_ratey el mensaje"El tipo de cambio es requerido por el SAT.". Si envías0, 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].amountdebe ser igual aamount; si no, la API responde400conVALIDATION_ERRORenallocations.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
409conOVERPAYMENT_NOT_ALLOWED, salvo que envíesconvert_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
issueduoverdue. - Sin
convert_overpayment_to_credit, la suma de las asignaciones debe ser igual aamount, con una diferencia máxima de0.01. Conconvert_overpayment_to_credit: true, la suma puede ser menor queamounty 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
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
customer_id | string | Sí | Cliente dueño de las órdenes de cobro. |
amount | string | number | Sí | Mayor a 0, máximo 2 decimales. Sin comas. |
currency | MXN | USD | Sí | Moneda del pago. |
exchange_rate | string | number | null | Según la moneda | Tipo de cambio USD→MXN, máximo 2 decimales. Ver Tipo de cambio. |
payment_date | string (YYYY-MM-DD) | Sí | Fecha del pago. |
payment_method | string | Sí | Clave del catálogo de formas de pago (tabla abajo). |
reference | string | null | No | Referencia del pago. |
notes | string | null | No | Notas del pago. |
convert_overpayment_to_credit | boolean | No | Por defecto false. Registra el excedente como saldo a favor. |
test | boolean | No | Por defecto false. Timbra los complementos de pago en modo de prueba. |
allocations | array | Sí | Al menos 1 elemento. No puede repetir invoice_id. |
Cualquier otro campo, incluido with_complement, responde 400 con VALIDATION_ERROR (unrecognized_keys).
allocations[]
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
invoice_id | string | Sí | Orden de cobro del cliente. |
amount | string | number | Sí | Monto aplicado a la orden, en la moneda del pago. Mayor a 0, máximo 2 decimales. |
Formas de pago
| Clave | Forma de pago |
|---|---|
01 | Efectivo |
02 | Cheque |
03 | Transferencia electrónica |
04 | Tarjeta de crédito |
05 | Monedero electrónico |
06 | Dinero electrónico |
08 | Vales de despensa |
12 | Dación en pago |
13 | Pago por subrogación |
14 | Pago por consignación |
15 | Condonación |
17 | Compensación |
23 | Novación |
24 | Confusión |
25 | Remisión de deuda |
26 | Prescripción o caducidad |
27 | A satisfacción del acreedor |
28 | Tarjeta de débito |
29 | Tarjeta de servicios |
30 | Aplicación de anticipos |
31 | Intermediario pagos |
99 | Por definir |
CX01 | Deposito en ventanilla (clave SAT 01) |
CX02 | Moneypool (clave SAT 01) |
Forma de las respuestas
201 — pago registrado
| Campo | Tipo | Descripcion |
|---|---|---|
payment_group_id | string | null | null con una asignación; UUID compartido por los pagos con dos o más. |
credit_generated | objeto | null | Saldo a favor generado por el pago: { "amount", "currency" }. |
payments | array | Un pago por asignación, con la forma de Consultar pago más complements. |
payments[].complements | array | Complementos de pago timbrados para ese pago. Ver Listar complementos de pago. |
Errores
| Status | Código | Causa |
|---|---|---|
400 | VALIDATION_ERROR | Campo 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. |
400 | INVOICES_NOT_FOUND | Dos o más asignaciones: alguna orden de cobro no existe o no pertenece al cliente. |
400 | INVOICE_TOTAL_INVALID | La orden de cobro no tiene un monto total válido. |
400 | ALLOCATION_EXCEEDS_BALANCE | Dos o más asignaciones: una asignación supera el saldo pendiente de su orden de cobro. |
400 | LEGAL_ENTITY_NOT_CONFIGURED | La razón social no tiene la configuración necesaria para timbrar el complemento de pago. |
400 | CFDI_STAMP_FAILED | El PAC rechazó el complemento de pago. message trae el motivo y errors puede listar datos faltantes. |
401 | MISSING_API_KEY | INVALID_API_KEY | API_KEY_REVOKED | API key ausente, inválida o revocada. |
403 | INSUFFICIENT_PERMISSIONS | La API key no tiene el permiso Crear en Pagos. |
404 | INVOICE_NOT_FOUND | Una asignación: la orden de cobro no existe o no pertenece al cliente. |
409 | PPD_TEST_CFDI_REQUIRED | Modo de prueba: la orden de cobro tiene un CFDI PPD real emitido pero no un CFDI de prueba PPD. |
409 | INVOICE_CANCELED | La orden de cobro está cancelada. |
409 | INVOICE_NOT_PAYABLE | Dos o más asignaciones: la orden de cobro no está en estatus issued u overdue. |
409 | INVOICE_WITHOUT_BALANCE | La orden de cobro no tiene saldo pendiente. |
409 | OVERPAYMENT_NOT_ALLOWED | Una asignación: el pago supera el saldo pendiente y no enviaste convert_overpayment_to_credit: true. |
409 | PPD_CFDI_REQUIRED | La orden de cobro no cuenta con un CFDI PPD emitido al procesar el pago. |
409 | CONCURRENT_OVERPAYMENT | INVOICE_CANCELED_CONCURRENT | REMAINING_CHANGED_CONCURRENT | La orden de cobro cambió mientras se procesaba el pago. Actualiza la información y reintenta. |