Skip to content
Last updated

Un complemento de pago es un CFDI de tipo Pago (P) que documenta la recepción de un pago asociado a una factura que fue emitida con método de pago PPD (Pago en parcialidades o diferido).

Este comprobante es obligatorio cuando el pago no se realiza en el momento de la emisión de la factura original.


Endpoint

POST /v1/qrs/invoices/payment-complements

Host (DEV):

https://api-dev.qrwey.com

Host (PROD):

https://api.qrwey.com

Headers requeridos

Authorization: Bearer {{access_token}}
Content-Type: application/json

Diferencias con la factura de ingreso

CampoValor para complemento de pago
type_of_receiptDebe ser P (Pago)
amountDebe ser 0
subtotalDebe ser 0
currencyDebe ser XXX (sin moneda)
itemsNo se incluye o se deja vacío
sat_payment_formNo se incluye
sat_payment_methodNo se incluye
exchange_rateNo se incluye
complement.paymentRequerido. Contiene los datos del pago recibido

⚠️ El objeto complement.payment es obligatorio. Sin el, la operación fallará.


Request body

A continuación se muestra la estructura mínima para timbrar un complemento de pago.

Campos del comprobante (requeridos)

CampoDescripción
dateFecha de emisión ISO 8601
expedition_zip_codeCódigo postal del lugar de expedición
amount0
subtotal0
currencyXXX (sin moneda)
type_of_receiptP (Pago)
export_codeCódigo de exportación, ej. 01
issuer.rfcRFC del emisor
recipientDatos del receptor: rfc, business_name, zip_code, tax_regime_code, cfdi_use_code (normalmente CP01)
complement.paymentDatos del pago recibido

Datos del pago (complement.payment) - requeridos

CampoDescripción
payment_dateFecha en que se recibió el pago, ISO 8601
payment_formForma de pago SAT, ej. 03 Transferencia
currencyMoneda del pago, ej. MXN
amountMonto total del pago recibido
related_documentsDocumentos (facturas PPD) que cubre el pago

Cada documento relacionado vincula el pago con una factura PPD emitida previamente:

CampoDescripción
uuidUUID fiscal del CFDI PPD original
currencyMoneda del CFDI original
installment_numberNúmero de parcialidad
previous_balanceSaldo anterior
amount_paidMonto pagado en esta parcialidad
remaining_balanceSaldo restante después del pago
tax_object_codeClave del objeto de impuesto, ej. 02
taxesImpuestos del documento relacionado (requerido cuando tax_object_code es 02)

Impuestos del documento relacionado (taxes)

CampoDescripción
typeTipo: Traslado (traslado) o Retencion (retención)
baseBase imponible proporcional al pago
taxClave del impuesto SAT, ej. 002 IVA
factorTipo de factor: Tasa, Cuota o Exento
rateTasa o cuota del impuesto, ej. 0.160000 (requerido cuando factor es Tasa o Cuota)
amountMonto del impuesto proporcional al pago

⚠️ Los impuestos de cada documento se acumulan automáticamente para generar los nodos ImpuestosDR, ImpuestosP (a nivel de pago) y Totales (a nivel de complemento) en el XML timbrado.


Ejemplo de request (DEV)

curl -X POST "https://api-dev.qrwey.com/v1/qrs/invoices/payment-complements" \
  -H "Authorization: Bearer {{access_token}}" \
  -H "Content-Type: application/json" \
  -d '{
    "date": "2026-03-19T16:00:00",
    "expedition_zip_code": "06600",
    "amount": 0,
    "subtotal": 0,
    "currency": "XXX",
    "type_of_receipt": "P",
    "export_code": "01",
    "issuer": {
      "rfc": "FUNK671228PH6"
    },
    "recipient": {
      "rfc": "EKU9003173C9",
      "business_name": "ESCUELA KEMPER URGATE",
      "zip_code": "42501",
      "tax_regime_code": "601",
      "cfdi_use_code": "CP01"
    },
    "complement": {
      "payment": {
        "payment_date": "2026-03-18T12:00:00",
        "payment_form": "03",
        "currency": "MXN",
        "amount": 5800.00,
        "related_documents": [
          {
            "uuid": "A1B2C3D4-E5F6-7890-ABCD-EF1234567890",
            "currency": "MXN",
            "installment_number": 1,
            "previous_balance": 11600.00,
            "amount_paid": 5800.00,
            "remaining_balance": 5800.00,
            "tax_object_code": "02",
            "taxes": [
              {
                "type": "Traslado",
                "base": 5000.00,
                "tax": "002",
                "factor": "Tasa",
                "rate": "0.160000",
                "amount": 800.00
              }
            ]
          }
        ]
      }
    }
  }'

Campos opcionales

No son necesarios para timbrar, pero puedes incluirlos:

CampoDescripción
sale_idIdentificador propio de la operación
complement.payment.exchange_rateTasa de cambio del pago
complement.payment.operation_numberNúmero de operación o referencia bancaria
complement.payment.source_bank_rfcRFC del banco emisor del pago
complement.payment.source_accountCuenta bancaria del pagador
complement.payment.target_bank_rfcRFC del banco receptor del pago
complement.payment.target_accountCuenta bancaria del receptor
related_documents[].seriesSerie del CFDI original
related_documents[].folioFolio del CFDI original
related_documents[].exchange_rateTasa de cambio del documento

Respuesta

{
  "invoiceStatus": "GENERATED",
  "folioUuid": "R1S2T3U4-V5W6-7890-XYZA-BC1234567890",
  "sourceTaxId": "FUNK671228PH6",
  "sourceLegalName": "KARLA FUENTE NOLASCO",
  "targetTaxId": "EKU9003173C9",
  "targetLegalName": "ESCUELA KEMPER URGATE",
  "subtotal": 0,
  "iva": 0,
  "total": 0,
  "invoiceDate": "2026-03-19T16:00:00Z",
  "invoiceError": null,
  "base64Xml": "PD94bWwgdmVyc2lvbj0iMS4wIiBlb..."
}

⚠️ En el complemento de pago, los campos subtotal, iva y total siempre son 0. El monto real del pago esta documentado en el nodo complement.payment.

La estructura de la respuesta es la misma que para Timbrar CFDI 4.0. Consulta esa guia para el detalle de todos los campos.


Errores comunes

CódigoMotivo
400type_of_receipt no es P, complement.payment ausente, o related_documents vacío
401Token inválido o expirado
404Emisor no encontrado o sin llaves CSD
422UUID del documento relacionado inválido, montos inconsistentes, o reglas del SAT no cumplidas

Consulta: Manejo de errores


Buenas prácticas

  • Emite el complemento de pago dentro de los plazos establecidos por el SAT (generalmente el día 17 del mes siguiente)
  • Verifica que el UUID del documento relacionado corresponda a un CFDI con método de pago PPD
  • El installment_number debe ser secuencial: primer pago = 1, segundo = 2, etc.
  • Valida que previous_balance - amount_paid = remaining_balance
  • El cfdi_use_code del receptor para complementos de pago normalmente es CP01
  • Usa payment_form 03 (Transferencia electrónica) cuando el pago sea por transferencia bancaria
  • Conserva el folioUuid para vincular el complemento con la factura original en tu contabilidad

¿Qué sigue?