Skip to content
Documentation sections

Query and send

List your CFDIs by month, by date range or with filters, check an invoice's payments and relations, and email it. Almost every parameter on these paths goes in HTTP headers, not in the URL.

Before you list

  • Listings have no pagination or sort order: they return everything that matches in a single response. Use short periods (a month or less) if your account stamps a lot.
  • They include cancelled CFDIs. estado_cfdi is "1" for active and "0" for cancelled.
  • Besides what you issue, they bring the received CFDIs you downloaded from the SAT. Send Documentorigin: issued for issued only or received for received only.
  • They mix CFDIs stamped in test mode and in production if your account used both.
  • Values arrive as text: amounts with six decimals ("1160.000000"), keys and flags as "1".
  • fecha is the CFDI date, not the stamping date, in central Mexico time and AAAA-MM-DD hh:mm:ss format.

By month

GET/invoice/list
GET/invoice/listextended

Headers

Typestringrequired
Voucher type: I, E, P, N or T.
Monthstringrequired
Month of the CFDI date, 1 to 12.
Yearstringrequired
Year, AAAA.
Documentoriginstringoptional
issued, received or all (the default).
curl
curl -sS "$FD_API/invoice/list" \
  -H "X-Api-Key: $FD_API_KEY" \
  -H "Type: I" -H "Month: 10" -H "Year: 2026" \
  -H "Documentorigin: issued"
200
{
  "message": "Successful Request.",
  "code": 200,
  "documents": [
    {
      "uuid": "6F0C2E1A-9B3D-4C7E-8A51-2D4F6B8C0E13",
      "folio": "1001",
      "serie": "A",
      "fecha": "2026-10-15 10:14:02",
      "tipodecomprobante": "I",
      "estado_cfdi": "1",
      "moneda": "MXN",
      "metodopago": "PUE",
      "formapago": "03",
      "monto_subtotal": "1000.000000",
      "monto_iva": "160.000000",
      "monto_total": "1160.000000",
      "emisor_rfc": "EKU9003173C9",
      "receptor_rfc": "XIA190128J61",
      "receptor_nombre": "XENON INDUSTRIAL ARTICLES",
      "estatus_cobranza": "0",
      "saldo_insoluto": "1160.000000"
    }
  ]
}

listextended takes the same headers and returns every header column of the CFDI: version, certificate, decimals, recipient address, via_generacion (1 web, 2 API, 3 issued and downloaded from the SAT, 4 received), estatus_envio_email (0 not sent, 1 sent, 2 read), pending REP, fields extra1 to extra30 and more.

estatus_cobranza is 0 with no payments, 1 partly paid and 2 paid; saldo_insoluto is what's still owed.

By date range

GET/invoice/listbydaterange

Headers

Typestringrequired
Voucher type: I, E, P, N or T.
Datefromstringrequired
From, AAAA-MM-DD, inclusive.
Datetostringrequired
To, AAAA-MM-DD, inclusive.
Documentoriginstringoptional
issued, received or all.

Returns the same columns as list.

GET/invoice/listreceived

Only the CFDIs you received from your suppliers and downloaded from the SAT, with the headers Type (empty for all types), Startdate and Enddate in AAAA-MM-DD. Here emisor_* is your supplier and receptor_* is you.

With filters

GET/invoice/listwithfilters

The Filters header carries a JSON object on a single line. Each key is a listextended column and, if you want, an operator after a space: =, !=, <, <=, >, >= or LIKE. With no operator it's equality. All conditions must hold at once (AND).

curl
curl -sS "$FD_API/invoice/listwithfilters" \
  -H "X-Api-Key: $FD_API_KEY" \
  -H 'Filters: {"receptor_rfc": "XIA190128J61", "fecha >=": "2026-10-01", "fecha <": "2026-11-01", "estado_cfdi": "1"}'
  • LIKE adds no wildcards: send the % yourself ({"receptor_nombre LIKE": "%XENON%"}). The _ is a wildcard too.
  • null with no operator finds empty values; with !=, the ones that have a value.
  • {} doesn't filter: it returns every document in your account. Avoid it in large accounts.
  • A column or an operator outside the list responds HTTP 400 with the name it doesn't recognize.

Payments on your invoices

GET/invoice/listpayments

One row per recorded payment, with its payment complement (pago_uuid, null if the payment has no REP) and the data of the invoice it pays. All headers are optional; with none it returns every payment in the account. The list comes in the list key, not in documents.

Headers (optional)

Customerrfcstring
RFC of the invoice's customer.
Cfdiuuidstring
UUID of the invoice.
Paymentuuidstring
UUID of the payment complement.
Invmonth, Invyearstring
Month and year of the invoice.
Paymonth, Payyearstring
Month and year of the payment.

Related CFDIs

GET/invoice/relations

With the Uuid header, it returns two lists. padres are the CFDIs that mention the one you query: a credit note, a replacement or a payment complement that pays it (tipo_relacion P). hijos are the ones the queried CFDI mentions in its CfdiRelacionados. This response has no message or code.

200
{
  "padres": [
    {
      "uuid": "3C9B7A12-4E5D-4F60-B8A1-9D2C6E0F7B34",
      "serie": "NC",
      "folio": "45",
      "tipodecomprobante": "E",
      "tipodecomprobante_desc": "Egreso",
      "estado_cfdi": "1",
      "monto_total": "116.000000",
      "tipo_relacion": "01",
      "tipo_relacion_desc": "01 Nota de crédito de los documentos relacionados"
    }
  ],
  "hijos": []
}

Relations are built after stamping; right after you stamp, a new relation can take a while to show up.

Send by email

POST/invoice/send

Headers

UUIDstringrequired
A CFDI registered in your account.
RECIPIENTstringrequired
One or more addresses separated by , or ;.
BCCstringoptional
Blind copy, same format.
MESSAGEstringoptional
Text that goes in the email.
curl
curl -sS -X POST "$FD_API/invoice/send" \
  -H "X-Api-Key: $FD_API_KEY" \
  -H "UUID: 6F0C2E1A-9B3D-4C7E-8A51-2D4F6B8C0E13" \
  -H "RECIPIENT: cliente@facturadigital.com.mx" \
  -H "MESSAGE: Gracias por tu compra."

It responds { "message": "Email queued", "code": 200 }: the email goes into the send queue and goes out in under a minute. If a send of the same UUID to the same address is already pending, it isn't duplicated. It uses no folio, but your account needs a balance above zero.

codeWhen
400RECIPIENT is missing or has an invalid address, or BCC has an invalid one.
601Your account has no balance.
625The UUID isn't in your account. This also happens with CFDIs stamped with stampxml and with withholdings, which don't go to your issued CFDIs.

Checked against the production API v5 on 2026-11-03.