#Cobranza y pagos

Estos endpoints resumen el estado de cobro y pago de los CFDIs de una Fiscal Entity: quién debe, quién te debe, y qué tan vencido está. Todos cuelgan de https://api.clarisfy.com/api/v1/cfdi/ y son tenant-gated404 si tu organización no tiene una conexión activa al RFC.

Dos formas de pago existen en el SAT y son la base de todo lo que sigue:

  • PUE (Pago en Una sola Exhibición) — se paga completo al momento de facturar. No requiere complemento de pago.
  • PPD (Pago en Parcialidades o Diferido) — el pago llega después, por partes. Cada pago recibido debe registrarse con un REP (Recibo Electrónico de Pago / complemento de pago). Mientras no llegue ningún REP, el CFDI queda sin_pagar.

#Análisis PUE/PPD (cobrar/pagar, distribución y KPIs)

GET/cfdi/payment-analytics

Payload único que agrega todos los periodos del RFC: reparto PUE vs PPD, cuentas por cobrar y por pagar (con antigüedad y top contrapartes), distribución por estado de cobro, KPIs tipo inversionista y el resumen de REP vencidos.

Parámetro (query)TipoDescripción
fiscalEntityIdstringRequerido. Identificador de la Fiscal Entity (fe_…).
repOverdueThresholdDaysintegerUmbral de antigüedad (días) para rep_overdue (1–3650, por defecto 40).
cURL
curl "https://api.clarisfy.com/api/v1/cfdi/payment-analytics?fiscalEntityId=fe_9a1c2b3d4e5f6071" \
  -H "Authorization: Bearer clf_live_secret_9K3mZ1pQ7rTx8vB4nH6dLwYe"
JSON
{
  "summary": {
    "emitida": {
      "pue": { "count": 40, "total": "600000.00" },
      "ppd": { "count": 15, "total": "220000.00" },
      "pue_cancelled": { "count": 2, "total": "15000.00" },
      "ppd_cancelled": { "count": 1, "total": "8000.00" }
    },
    "recibida": {
      "pue": { "count": 22, "total": "180000.00" },
      "ppd": { "count": 9, "total": "95000.00" },
      "pue_cancelled": { "count": 0, "total": "0.00" },
      "ppd_cancelled": { "count": 0, "total": "0.00" }
    }
  },
  "receivable": {
    "total_outstanding": "75000.00",
    "by_status": {
      "sin_pagar": { "count": 3, "amount": "45000.00" },
      "parcial": { "count": 2, "amount": "30000.00" }
    },
    "aging": [
      { "bucket": "0-30", "count": 2, "amount": "12000.00" },
      { "bucket": "31-60", "count": 1, "amount": "20000.00" },
      { "bucket": "61-90", "count": 1, "amount": "18000.00" },
      { "bucket": "90+", "count": 1, "amount": "25000.00" }
    ],
    "top_counterparties": [
      { "rfc": "ACME920101AA1", "name": "ACME Corporativo SA", "outstanding": "30000.00" }
    ]
  },
  "payable": {
    "total_outstanding": "32000.00",
    "by_status": {
      "sin_pagar": { "count": 2, "amount": "20000.00" },
      "parcial": { "count": 1, "amount": "12000.00" }
    },
    "aging": [
      { "bucket": "0-30", "count": 1, "amount": "8000.00" },
      { "bucket": "31-60", "count": 1, "amount": "12000.00" },
      { "bucket": "61-90", "count": 1, "amount": "12000.00" },
      { "bucket": "90+", "count": 0, "amount": "0.00" }
    ],
    "top_counterparties": [
      { "rfc": "PRVA850505CC3", "name": "Proveedor A SA", "outstanding": "12000.00" }
    ]
  },
  "distribution": {
    "by_payment_status": [
      { "status": "no_aplica", "count": 5, "amount": "40000.00" },
      { "status": "sin_pagar", "count": 8, "amount": "65000.00" },
      { "status": "parcial", "count": 3, "amount": "42000.00" },
      { "status": "pagada", "count": 60, "amount": "780000.00" }
    ],
    "monthly_trend": [
      { "period": "2026-06", "pue_total": "30000.00", "ppd_total": "20000.00" }
    ]
  },
  "investor_kpis": {
    "revenue_ttm": "820000.00",
    "revenue_prior_ttm": "700000.00",
    "revenue_growth_yoy": 0.1714,
    "cogs_ttm": "410000.00",
    "gross_margin_proxy": 0.5,
    "dso_days": 33.4,
    "dpo_days": 28.5,
    "customer_concentration_top1": 0.22,
    "customer_concentration_top5": 0.61,
    "cancellation_rate": 0.03,
    "collection_rate": 0.87,
    "working_capital": "43000.00",
    "active_months": 12
  },
  "rep_overdue": {
    "threshold_days": 40,
    "count": 3,
    "total_outstanding": "3200.00"
  }
}

rep_overdue es la misma heurística de riesgo que expone /cfdi/ppd-rep-overdue — úsalo para ver el conteo/monto agregado, y el otro endpoint para el listado completo.

#Errores

Código HTTPCausa
400fiscalEntityId con formato inválido.
404Tu organización no tiene una conexión activa a ese RFC.

#CFDIs recibidas PPD con REP probablemente faltante

GET/cfdi/ppd-rep-overdue

Lista completa de CFDIs recibidas PPD vigentes que siguen sin_pagar (sin ningún REP recibido) y fueron emitidas hace más de thresholdDays días, ordenadas por issued_at ascendente (la más antigua/vencida primero).

Parámetro (query)TipoDescripción
fiscalEntityIdstringRequerido. Identificador de la Fiscal Entity (fe_…).
thresholdDaysintegerUmbral de antigüedad en días (1–3650, por defecto 40).
cURL
curl "https://api.clarisfy.com/api/v1/cfdi/ppd-rep-overdue?fiscalEntityId=fe_9a1c2b3d4e5f6071&thresholdDays=40" \
  -H "Authorization: Bearer clf_live_secret_9K3mZ1pQ7rTx8vB4nH6dLwYe"
JSON
[
  {
    "cfdi_uuid": "12345678-1234-1234-1234-123456789abc",
    "emisor_rfc": "PRVA850505CC3",
    "emisor_name": "Proveedor A SA",
    "folio": "00042",
    "issued_at": "2026-05-01T10:30:00+00:00",
    "days_overdue": 55,
    "total": "800.00",
    "outstanding_balance": "800.00"
  }
]
CampoTipoDescripción
cfdi_uuidstringUUID del CFDI (folio fiscal).
emisor_rfcstringRFC del emisor (proveedor).
emisor_namestring | nullRazón social del emisor.
foliostring | nullFolio interno del CFDI.
issued_atstringFecha de emisión (ISO 8601).
days_overdueintegerDías transcurridos desde issued_at, según el now() del servidor.
totalstringMonto total del CFDI (NUMERIC como string).
outstanding_balancestringSaldo insoluto — para sin_pagar equivale a total (NUMERIC como string).

La lista se limita a 1000 filas. Para el conteo real completo usa rep_overdue.count de /cfdi/payment-analytics. Si no hay coincidencias, la respuesta es [].

#Errores

Código HTTPCausa
400fiscalEntityId con formato inválido.
404Tu organización no tiene una conexión activa a ese RFC.

#Reporte de financiamiento (préstamos)

GET/cfdi/financing

Estima el gasto en financiamiento (préstamos) del RFC en el rango from/to, a partir de los CFDIs recibidos y vigentes.

Alcance "financiamiento amplio": intereses y capital bancario, arrendamiento financiero (leasing), INFONAVIT y prestamistas privados. Cada concepto se clasifica en intereses, arrendamiento, infonavit, comisiones, capital (capital bancario, separado de los intereses) o credito.

Parámetro (query)TipoDescripción
fiscalEntityIdstringRequerido. Identificador de la Fiscal Entity (fe_…).
fromdatetimeRequerido. Inicio (inclusivo) del rango sobre issued_at.
todatetimeRequerido. Fin (exclusivo) del rango sobre issued_at. Rango máximo: 24 meses.
cURL
curl "https://api.clarisfy.com/api/v1/cfdi/financing?fiscalEntityId=fe_9a1c2b3d4e5f6071&from=2025-08-01T00:00:00Z&to=2026-07-25T00:00:00Z" \
  -H "Authorization: Bearer clf_live_secret_9K3mZ1pQ7rTx8vB4nH6dLwYe"
JSON
{
  "summary": {
    "total_amount": "23957870.43000000",
    "concept_count": 61,
    "lender_count": 23
  },
  "by_category": [
    {
      "category": "intereses",
      "total_amount": "23957870.43000000",
      "concept_count": 25,
      "lender_count": 18
    }
  ],
  "by_month": [
    {
      "period_year": 2026,
      "period_month": 3,
      "total_amount": "1250000.00000000",
      "concept_count": 7
    }
  ],
  "by_lender": [
    {
      "emisor_rfc": "BBA940707IE1",
      "emisor_name": "BBVA MEXICO",
      "category": "intereses",
      "total_amount": "500000.00000000",
      "concept_count": 12
    }
  ]
}
CampoTipoDescripción
summary.total_amountstringTotal estimado en el rango (NUMERIC como string).
summary.concept_countintegerLíneas ("conceptos") estimadas.
summary.lender_countintegerPrestamistas (emisores) distintos.
by_category[].categorystringintereses, arrendamiento, infonavit, comisiones, capital o credito.
by_category[].total_amountstringTotal de la categoría (NUMERIC como string).
by_category[].concept_countintegerConceptos en la categoría.
by_category[].lender_countintegerPrestamistas distintos en la categoría.
by_month[].period_yearintegerAño del periodo.
by_month[].period_monthintegerMes (1–12).
by_month[].total_amountstringTotal del mes (NUMERIC como string).
by_month[].concept_countintegerConceptos del mes.
by_lender[].emisor_rfcstringRFC del prestamista.
by_lender[].emisor_namestringNombre del prestamista en el CFDI.
by_lender[].categorystringCategoría del monto agregado para este prestamista.
by_lender[].total_amountstringTotal con este prestamista en esta categoría (NUMERIC como string).
by_lender[].concept_countintegerConceptos con este prestamista en esta categoría.

by_month viene en orden cronológico (para graficar tendencia); by_lender viene ordenado por monto descendente.

#Errores

Código HTTPCausa
400fiscalEntityId con formato inválido, o rango from/to mayor a 24 meses.
404Tu organización no tiene una conexión activa a ese RFC.