#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-gated — 404 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)
/cfdi/payment-analyticsPayload ú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) | Tipo | Descripción |
|---|---|---|
fiscalEntityId | string | Requerido. Identificador de la Fiscal Entity (fe_…). |
repOverdueThresholdDays | integer | Umbral de antigüedad (días) para rep_overdue (1–3650, por defecto 40). |
curl "https://api.clarisfy.com/api/v1/cfdi/payment-analytics?fiscalEntityId=fe_9a1c2b3d4e5f6071" \
-H "Authorization: Bearer clf_live_secret_9K3mZ1pQ7rTx8vB4nH6dLwYe"{
"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 HTTP | Causa |
|---|---|
400 | fiscalEntityId con formato inválido. |
404 | Tu organización no tiene una conexión activa a ese RFC. |
#CFDIs recibidas PPD con REP probablemente faltante
/cfdi/ppd-rep-overdueLista 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) | Tipo | Descripción |
|---|---|---|
fiscalEntityId | string | Requerido. Identificador de la Fiscal Entity (fe_…). |
thresholdDays | integer | Umbral de antigüedad en días (1–3650, por defecto 40). |
curl "https://api.clarisfy.com/api/v1/cfdi/ppd-rep-overdue?fiscalEntityId=fe_9a1c2b3d4e5f6071&thresholdDays=40" \
-H "Authorization: Bearer clf_live_secret_9K3mZ1pQ7rTx8vB4nH6dLwYe"[
{
"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"
}
]| Campo | Tipo | Descripción |
|---|---|---|
cfdi_uuid | string | UUID del CFDI (folio fiscal). |
emisor_rfc | string | RFC del emisor (proveedor). |
emisor_name | string | null | Razón social del emisor. |
folio | string | null | Folio interno del CFDI. |
issued_at | string | Fecha de emisión (ISO 8601). |
days_overdue | integer | Días transcurridos desde issued_at, según el now() del servidor. |
total | string | Monto total del CFDI (NUMERIC como string). |
outstanding_balance | string | Saldo 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 HTTP | Causa |
|---|---|
400 | fiscalEntityId con formato inválido. |
404 | Tu organización no tiene una conexión activa a ese RFC. |
#Reporte de financiamiento (préstamos)
/cfdi/financingEstima 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) | Tipo | Descripción |
|---|---|---|
fiscalEntityId | string | Requerido. Identificador de la Fiscal Entity (fe_…). |
from | datetime | Requerido. Inicio (inclusivo) del rango sobre issued_at. |
to | datetime | Requerido. Fin (exclusivo) del rango sobre issued_at. Rango máximo: 24 meses. |
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"{
"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
}
]
}| Campo | Tipo | Descripción |
|---|---|---|
summary.total_amount | string | Total estimado en el rango (NUMERIC como string). |
summary.concept_count | integer | Líneas ("conceptos") estimadas. |
summary.lender_count | integer | Prestamistas (emisores) distintos. |
by_category[].category | string | intereses, arrendamiento, infonavit, comisiones, capital o credito. |
by_category[].total_amount | string | Total de la categoría (NUMERIC como string). |
by_category[].concept_count | integer | Conceptos en la categoría. |
by_category[].lender_count | integer | Prestamistas distintos en la categoría. |
by_month[].period_year | integer | Año del periodo. |
by_month[].period_month | integer | Mes (1–12). |
by_month[].total_amount | string | Total del mes (NUMERIC como string). |
by_month[].concept_count | integer | Conceptos del mes. |
by_lender[].emisor_rfc | string | RFC del prestamista. |
by_lender[].emisor_name | string | Nombre del prestamista en el CFDI. |
by_lender[].category | string | Categoría del monto agregado para este prestamista. |
by_lender[].total_amount | string | Total con este prestamista en esta categoría (NUMERIC como string). |
by_lender[].concept_count | integer | Conceptos 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 HTTP | Causa |
|---|---|
400 | fiscalEntityId con formato inválido, o rango from/to mayor a 24 meses. |
404 | Tu organización no tiene una conexión activa a ese RFC. |