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_cfdiis"1"for active and"0"for cancelled. - Besides what you issue, they bring the received CFDIs you downloaded from the SAT. Send
Documentorigin: issuedfor issued only orreceivedfor 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". fechais the CFDI date, not the stamping date, in central Mexico time andAAAA-MM-DD hh:mm:ssformat.
By month
/invoice/list/invoice/listextendedHeaders
Type- Voucher type:
I,E,P,NorT. Month- Month of the CFDI date,
1to12. Year- Year,
AAAA. Documentoriginissued,receivedorall(the default).
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"{
"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
/invoice/listbydaterangeHeaders
Type- Voucher type:
I,E,P,NorT. Datefrom- From,
AAAA-MM-DD, inclusive. Dateto- To,
AAAA-MM-DD, inclusive. Documentoriginissued,receivedorall.
Returns the same columns as list.
/invoice/listreceivedOnly 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
/invoice/listwithfiltersThe 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 -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"}'LIKEadds no wildcards: send the%yourself ({"receptor_nombre LIKE": "%XENON%"}). The_is a wildcard too.nullwith 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
/invoice/listpaymentsOne 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)
Customerrfc- RFC of the invoice's customer.
Cfdiuuid- UUID of the invoice.
Paymentuuid- UUID of the payment complement.
Invmonth, Invyear- Month and year of the invoice.
Paymonth, Payyear- Month and year of the payment.
Related CFDIs
/invoice/relationsWith 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.
{
"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
/invoice/sendHeaders
UUID- A CFDI registered in your account.
RECIPIENT- One or more addresses separated by
,or;. BCC- Blind copy, same format.
MESSAGE- Text that goes in the email.
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.
| code | When |
|---|---|
| 400 | RECIPIENT is missing or has an invalid address, or BCC has an invalid one. |
| 601 | Your account has no balance. |
| 625 | The 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.