#Facturas

Los CFDIs (facturas electrónicas) de una Fiscal Entity. Casi todos los endpoints CFDI requieren fiscalEntityId (fe_…) y están tenant-gated: si tu organización no tiene una conexión activa a ese RFC, la respuesta es 404, sin revelar si el RFC existe.

#El objeto Invoice

CampoTipoDescripción
cfdi_uuidstringFolio fiscal (UUID) asignado por el SAT.
cfdi_typestringI = Ingreso, E = Egreso, N = Nómina, P = Pago, T = Traslado.
cfdi_statusstringvigente, cancelado o en_proceso_cancelacion.
cfdi_versionstringVersión del comprobante (3.3, 4.0).
issued_atstringFecha de emisión, ISO 8601.
seriesstring | nullSerie del comprobante.
foliostring | nullFolio del comprobante.
emisor_rfcstringRFC del emisor.
emisor_namestring | nullNombre o razón social del emisor.
receptor_rfcstringRFC del receptor.
receptor_namestring | nullNombre o razón social del receptor.
subtotalstringSubtotal (NUMERIC serializado como string).
totalstringTotal (NUMERIC serializado como string).
currencystringMoneda (MXN, USD, etc.).
xml_availablebooleantrue si el XML crudo está disponible para descargar vía /cfdi/invoices/{cfdi_uuid}/xml. Si es false, la descarga responde 404.
payment_methodstring | nullMetodoPago del CFDI: PUE (pago en una sola exhibición) o PPD (parcialidades/diferido). null si el CFDI no lo declara.
payment_statusstringEstado de cobro: no_aplica (PUE / no ingreso / no PPD), sin_pagar, parcial o pagada. Solo los ingresos tipo I con payment_method=PPD se reconcilian contra sus complementos de pago (REP).
outstanding_balancestring | nullSaldo insoluto (ImpSaldoInsoluto de la última parcialidad, o el total mientras siga sin pagar). null cuando payment_status es no_aplica.

#Lista de CFDIs

GET/cfdi/invoices

Tabla principal de facturas. Devuelve los CFDIs de tu organización (vía conexión activa) que cumplen los filtros, de la más reciente a la más antigua, con paginación por cursor.

#Parámetros de consulta

ParámetroTipoDescripción
fiscalEntityIdstringRequerido. Entidad (fe_…) a consultar.
fromstringRequerido. Inicio del rango, ISO 8601 (inclusive).
tostringRequerido. Fin del rango, ISO 8601 (exclusive).
typestringOpcional. I, E, N, P o T.
statusstringOpcional. vigente, cancelado o en_proceso_cancelacion.
rfcEmisorstringOpcional. Filtra por RFC exacto del emisor.
rfcReceptorstringOpcional. Filtra por RFC exacto del receptor.
rfcstringOpcional. RFC de contraparte en cualquier lado (emisor o receptor). Selectivo e indexado: abarca todo el histórico sin importar from/to.
directionstringOpcional. emitida o recibida.
uuidstringOpcional. Filtra por folio fiscal exacto. Selectivo e indexado: abarca todo el histórico sin importar from/to. UUID mal formado responde 400.
qstringOpcional. Búsqueda trigram contra emisor_name/receptor_name. Mínimo 3 caracteres (menos responde 422).
cursorstringOpcional. Cursor de la página siguiente (de next_cursor). Uno inválido responde 400.
pageSizeintegerOpcional. Tamaño de página, 1–200. Default 50.
cURL
curl "https://api.clarisfy.com/api/v1/cfdi/invoices?fiscalEntityId=fe_9a1c2b3d4e5f6071&from=2026-01-01T00:00:00Z&to=2026-07-01T00:00:00Z&status=vigente&pageSize=100" \
  -H "Authorization: Bearer clf_live_secret_9K3mZ1pQ7rTx8vB4nH6dLwYe"
JSON
{
  "items": [
    {
      "cfdi_uuid": "12345678-1234-1234-1234-123456789abc",
      "cfdi_type": "I",
      "cfdi_status": "vigente",
      "cfdi_version": "4.0",
      "issued_at": "2026-04-15T10:30:00+00:00",
      "series": "A",
      "folio": "00001",
      "emisor_rfc": "ACME920101AA1",
      "emisor_name": "ACME Corporativo SA",
      "receptor_rfc": "VECJ880326XYZ",
      "receptor_name": "Mi Empresa SA",
      "subtotal": "1000.00",
      "total": "1160.00",
      "currency": "MXN",
      "xml_available": true,
      "payment_method": "PPD",
      "payment_status": "sin_pagar",
      "outstanding_balance": "160.00"
    }
  ],
  "next_cursor": "eyJpc3N1ZWRfYXQiOiIyMDI2LTA0LTE1VDEwOjMwOjAwKzAwOjAwIiwiaWQiOjEyM30.abc123"
}

#Errores

Código HTTPCausa
400fiscalEntityId inválido, uuid mal formado, cursor falsificado/inválido, o rango from/to mayor a 24 meses sin filtro selectivo.
422q con menos de 3 caracteres.

#Detalle de un CFDI

GET/cfdi/invoices/{cfdi_uuid}

Devuelve un CFDI específico por su folio fiscal, con relations (las relaciones del CFDI en ambos sentidos) y concepts (las líneas del comprobante, ordenadas por line_number), además de todos los campos del objeto Invoice.

#Parámetros

ParámetroTipoDescripción
cfdi_uuidstringRuta. Folio fiscal (UUID) del CFDI.
fiscalEntityIdstringQuery. Requerido. Entidad (fe_…) dueña del CFDI.

relations[]:

CampoTipoDescripción
relation_typestringTipoRelacion del SAT (p. ej. 04 = sustitución de CFDIs previos).
related_uuidstringFolio fiscal del CFDI relacionado.
directionstringoutgoing: este CFDI declara la relación hacia related_uuid (ej. una sustituta apunta al CFDI viejo). incoming: otro CFDI de la entidad declara la relación hacia este (related_uuid es ese otro CFDI, ej. la sustituta).

concepts[]:

CampoTipoDescripción
line_numberintegerNúmero de línea dentro del CFDI.
descriptionstringDescripción del concepto.
product_service_codestring | nullClaveProdServ (clave de producto/servicio SAT).
unit_codestring | nullClave de unidad (ClaveUnidad, p. ej. H87).
quantitystringCantidad (NUMERIC como string).
unit_pricestringValor unitario (NUMERIC como string).
amountstringImporte de la línea (NUMERIC como string).
discountstringDescuento de la línea (NUMERIC como string).
cURL
curl "https://api.clarisfy.com/api/v1/cfdi/invoices/12345678-1234-1234-1234-123456789abc?fiscalEntityId=fe_9a1c2b3d4e5f6071" \
  -H "Authorization: Bearer clf_live_secret_9K3mZ1pQ7rTx8vB4nH6dLwYe"
JSON
{
  "cfdi_uuid": "12345678-1234-1234-1234-123456789abc",
  "cfdi_type": "I",
  "cfdi_status": "vigente",
  "cfdi_version": "4.0",
  "issued_at": "2026-04-15T10:30:00+00:00",
  "series": "A",
  "folio": "00001",
  "emisor_rfc": "ACME920101AA1",
  "emisor_name": "ACME Corporativo SA",
  "receptor_rfc": "VECJ880326XYZ",
  "receptor_name": "Mi Empresa SA",
  "subtotal": "1000.00",
  "total": "1160.00",
  "currency": "MXN",
  "xml_available": true,
  "payment_method": "PPD",
  "payment_status": "sin_pagar",
  "outstanding_balance": "160.00",
  "relations": [
    {
      "relation_type": "04",
      "related_uuid": "87654321-4321-4321-4321-cba987654321",
      "direction": "outgoing"
    }
  ],
  "concepts": [
    {
      "line_number": 1,
      "description": "Servicio profesional",
      "product_service_code": "01010101",
      "unit_code": "H87",
      "quantity": "1.00000000",
      "unit_price": "1000.00000000",
      "amount": "1000.00000000",
      "discount": "0.00000000"
    }
  ]
}

#Errores

Código HTTPCausa
400fiscalEntityId o cfdi_uuid con formato inválido.
404Tu organización no tiene conexión activa al RFC, o el CFDI no existe para esa entidad.

#Descargar el XML crudo

GET/cfdi/invoices/{cfdi_uuid}/xml

Entrega el XML crudo del CFDI tal como fue almacenado (bronze). Esta respuesta no es JSON: es el archivo XML como adjunto.

  • Content-Type: application/xml
  • Content-Disposition: attachment; filename="{cfdi_uuid}.xml"

#Parámetros

ParámetroTipoDescripción
cfdi_uuidstringRuta. Folio fiscal (UUID) del CFDI.
fiscalEntityIdstringQuery. Requerido. Entidad (fe_…) dueña del CFDI.
cURL
curl "https://api.clarisfy.com/api/v1/cfdi/invoices/12345678-1234-1234-1234-123456789abc/xml?fiscalEntityId=fe_9a1c2b3d4e5f6071" \
  -H "Authorization: Bearer clf_live_secret_9K3mZ1pQ7rTx8vB4nH6dLwYe" \
  -o factura.xml

#Errores

Código HTTPCausa
400fiscalEntityId o cfdi_uuid con formato inválido.
404Tu organización no tiene conexión activa al RFC; el CFDI no existe para esa entidad; o no hay XML disponible (filas sintéticas/legacy sin documento real — revisa xml_available en el objeto Invoice).

#Pagos (REP) que liquidan un CFDI

GET/cfdi/invoices/{cfdi_uuid}/payments

Devuelve las asignaciones de pago (complementos tipo P / REP) que liquidan el CFDI PPD identificado por cfdi_uuid. Ordenadas por número de parcialidad y fecha de pago. Un CFDI sin pagos (o inexistente para la entidad) devuelve [].

#Parámetros

ParámetroTipoDescripción
cfdi_uuidstringRuta. Folio fiscal (UUID) del CFDI PPD liquidado.
fiscalEntityIdstringQuery. Requerido. Entidad (fe_…) dueña del CFDI.

InvoicePaymentResponse (cada elemento del arreglo):

CampoTipoDescripción
paying_cfdi_uuidstringFolio fiscal del CFDI tipo P (REP) que realizó el pago.
payment_datestringFecha del pago, ISO 8601.
partiality_numberinteger | nullNúmero de parcialidad.
amountstringMonto del pago (NUMERIC como string).
paid_amountstring | nullMonto abonado en esta parcialidad.
previous_balancestring | nullSaldo insoluto previo al pago.
pending_balancestring | nullSaldo insoluto resultante.
currencystring | nullMoneda del pago.
is_manualbooleantrue cuando el vínculo fue creado manualmente (ver abajo), no por un complemento REP timbrado en el SAT.
cURL
curl "https://api.clarisfy.com/api/v1/cfdi/invoices/12345678-1234-1234-1234-123456789abc/payments?fiscalEntityId=fe_9a1c2b3d4e5f6071" \
  -H "Authorization: Bearer clf_live_secret_9K3mZ1pQ7rTx8vB4nH6dLwYe"
JSON
[
  {
    "paying_cfdi_uuid": "abcdef12-3456-7890-abcd-ef1234567890",
    "payment_date": "2026-04-20T10:00:00+00:00",
    "partiality_number": 1,
    "amount": "1160.00",
    "paid_amount": "1000.00",
    "previous_balance": "1160.00",
    "pending_balance": "160.00",
    "currency": "MXN",
    "is_manual": false
  }
]

#Errores

Código HTTPCausa
400fiscalEntityId o cfdi_uuid con formato inválido.
404Tu organización no tiene conexión activa al RFC.

#Vincular manualmente un pago (REP) a un CFDI PPD

POST/cfdi/invoices/{invoice_uuid}/manual-payments

Crea un vínculo manual entre un CFDI tipo P (REP) y un CFDI de ingreso PPD, para los casos en que el complemento de pago del SAT aún no reconcilia la factura (o nunca lo hará). El vínculo queda marcado is_manual = true (sobrevive a la re-ingesta del REP) y recalcula payment_status / outstanding_balance del PPD desde todas sus asignaciones, igual que un REP timbrado.

El saldo previo es el outstanding_balance actual del PPD (o su total si aún no tenía pagos); el saldo insoluto resultante es max(0, previo - amount).

#Parámetros

ParámetroTipoDescripción
invoice_uuidstringRuta. Folio fiscal (UUID) del CFDI de ingreso PPD a liquidar.
fiscalEntityIdstringQuery. Requerido. Entidad (fe_…) dueña de ambos CFDIs.

#Cuerpo de la petición

CampoTipoDescripción
payment_uuidstringRequerido. Folio fiscal (UUID) del CFDI tipo P (REP) que realizó el pago.
amountstringRequerido. Monto a aplicar al CFDI PPD (NUMERIC como string, mayor a 0).
cURL
curl -X POST "https://api.clarisfy.com/api/v1/cfdi/invoices/12345678-1234-1234-1234-123456789abc/manual-payments?fiscalEntityId=fe_9a1c2b3d4e5f6071" \
  -H "Authorization: Bearer clf_live_secret_9K3mZ1pQ7rTx8vB4nH6dLwYe" \
  -H "Content-Type: application/json" \
  -d '{"payment_uuid": "abcdef12-3456-7890-abcd-ef1234567890", "amount": "1160.00"}'

Respuesta 201 Created (InvoicePaymentResponse, con is_manual: true):

JSON
{
  "paying_cfdi_uuid": "abcdef12-3456-7890-abcd-ef1234567890",
  "payment_date": "2026-04-20T10:00:00+00:00",
  "partiality_number": 1,
  "amount": "1160.00",
  "paid_amount": "1160.00",
  "previous_balance": "1160.00",
  "pending_balance": "0.00",
  "currency": "MXN",
  "is_manual": true
}

#Errores

Código HTTPCausa
400fiscalEntityId, invoice_uuid o payment_uuid con formato inválido.
404Tu organización no tiene conexión activa al RFC, o payment_uuid no existe en la entidad.
422invoice_uuid no es un ingreso PPD (I/PPD); payment_uuid no es un CFDI tipo P; o amount no es numérico o no es mayor a 0.
409Ese par (PPD, REP) ya está vinculado.

#Eliminar un vínculo manual de pago

DELETE/cfdi/invoices/{invoice_uuid}/manual-payments/{payment_uuid}

Elimina un vínculo de pago manual (is_manual = true) entre un REP (payment_uuid) y un CFDI PPD (invoice_uuid), y recalcula payment_status/outstanding_balance del PPD desde las asignaciones restantes. Nunca borra un pago proveniente de un complemento REP timbrado en el SAT.

#Parámetros

ParámetroTipoDescripción
invoice_uuidstringRuta. Folio fiscal (UUID) del CFDI PPD.
payment_uuidstringRuta. Folio fiscal (UUID) del CFDI tipo P (REP) vinculado.
fiscalEntityIdstringQuery. Requerido. Entidad (fe_…) dueña de ambos CFDIs.
cURL
curl -X DELETE "https://api.clarisfy.com/api/v1/cfdi/invoices/12345678-1234-1234-1234-123456789abc/manual-payments/abcdef12-3456-7890-abcd-ef1234567890?fiscalEntityId=fe_9a1c2b3d4e5f6071" \
  -H "Authorization: Bearer clf_live_secret_9K3mZ1pQ7rTx8vB4nH6dLwYe"

Respuesta 204 No Content (sin cuerpo).

#Errores

Código HTTPCausa
400fiscalEntityId, invoice_uuid o payment_uuid con formato inválido.
404Tu organización no tiene conexión activa al RFC, o no existe un vínculo manual para ese par (PPD, REP).