Emitir CFDI
Esta guia cubre el flujo completo para construir y timbrar un CFDI a traves de la API de FactuLink: desde los prerrequisitos hasta la descarga del XML y PDF timbrados.
Prerrequisitos
Antes de emitir un CFDI necesitas:
- API Key activa — ver Autenticacion
- CSD subido y activo — ver Subir Certificado
- Cliente registrado (opcional) — si ya tienes clientes dados de alta puedes
referenciarlos por
iden lugar de enviar los datos del receptor cada vez
Base URL:
https://api.factulink.com.mx/api/v1El prefijo de tu API Key determina el ambiente:
sk_test_= sandbox,sk_live_= producción.
Estructura de un CFDI
Un CFDI se compone de las siguientes secciones principales:
| Seccion | Descripcion | Requerido |
|---|---|---|
| tipo | Tipo de comprobante (I, E, P, N, T) | Si |
| emisor | Se toma automaticamente de tu tenant (RFC, nombre, regimen fiscal) | Automatico |
| receptor | Datos fiscales del cliente | Si |
| conceptos | Lista de productos o servicios facturados | Si |
| impuestos | Traslados y/o retenciones por concepto | Depende de objeto_imp |
Emisor
No necesitas enviar los datos del emisor. El sistema los toma del tenant asociado a tu API Key: RFC, razon social y regimen fiscal.
Receptor
{
"rfc": "XAXX010101000",
"nombre": "PUBLICO EN GENERAL",
"regimen_fiscal": "616",
"domicilio_fiscal": "06600",
"uso_cfdi": "S01"
}Si ya tienes un cliente registrado, puedes usar su ID en lugar del objeto completo:
{
"receptor_id": "cli_01HQ3KBXZ9N4WRCM8VDPG5T7EY"
}Conceptos
Cada concepto representa un producto o servicio facturado. Los campos principales son:
| Campo | Descripcion |
|---|---|
descripcion | Texto libre describiendo el producto o servicio |
clave_prod_serv | Clave del catalogo del SAT (8 digitos) |
clave_unidad | Clave de unidad de medida del SAT |
cantidad | Cantidad del producto o servicio |
valor_unitario | Precio unitario antes de impuestos |
objeto_imp | 01 No objeto, 02 Si objeto, 03 Si objeto y no obligado |
impuestos | Objeto con traslados y/o retenciones (requerido si objeto_imp es 02) |
Tipos de comprobante
| Tipo | Nombre | Uso |
|---|---|---|
| I | Ingreso | Factura de venta de productos o servicios |
| E | Egreso | Nota de credito o devolucion |
| P | Pago | Complemento de recepcion de pago |
| N | Nomina | Recibo de nomina |
| T | Traslado | Carta porte o traslado de mercancias |
El tipo mas comun es I (Ingreso). Los ejemplos de esta guia usan ese tipo.
Ejemplo completo: CFDI Ingreso con 2 conceptos e IVA 16%
Request
POST/api/v1/cfdis
curl -X POST https://api.factulink.com.mx/api/v1/cfdis \
-H "Authorization: Bearer sk_test_4b7e2f1a8d9c3e6b5f0a1d2c4e7f8a9b" \
-H "Content-Type: application/json" \
-d '{
"tipo": "I",
"receptor": {
"rfc": "CACX7605101P8",
"nombre": "CARLOS CASTRO XOCHIHUA",
"regimen_fiscal": "612",
"domicilio_fiscal": "06600",
"uso_cfdi": "G03"
},
"conceptos": [
{
"descripcion": "Servicio de consultoria tecnologica",
"clave_prod_serv": "80101500",
"clave_unidad": "E48",
"cantidad": 1,
"valor_unitario": 5000,
"objeto_imp": "02",
"impuestos": {
"traslados": [
{
"impuesto": "002",
"tipo_factor": "Tasa",
"tasa_o_cuota": "0.160000",
"base": 5000,
"importe": 800
}
]
}
},
{
"descripcion": "Licencia de software mensual",
"clave_prod_serv": "43232301",
"clave_unidad": "E48",
"cantidad": 3,
"valor_unitario": 1500,
"objeto_imp": "02",
"impuestos": {
"traslados": [
{
"impuesto": "002",
"tipo_factor": "Tasa",
"tasa_o_cuota": "0.160000",
"base": 4500,
"importe": 720
}
]
}
}
]
}'Respuesta exitosa
/api/v1/cfdis201{
"id": "cfdi_01HQ3KD5R8N2YPTM4VBWG7E9CK",
"uuid": "6128396f-c09c-4e3a-b4d7-8a5f2e1c9b3d",
"tipo": "I",
"status": "vigente",
"emisor": {
"rfc": "EKU9003173C9",
"nombre": "EMPRESA DE PRUEBAS SA DE CV",
"regimen_fiscal": "601"
},
"receptor": {
"rfc": "CACX7605101P8",
"nombre": "CARLOS CASTRO XOCHIHUA"
},
"conceptos": [
{
"descripcion": "Servicio de consultoria tecnologica",
"cantidad": 1,
"valor_unitario": 5000.00,
"importe": 5000.00
},
{
"descripcion": "Licencia de software mensual",
"cantidad": 3,
"valor_unitario": 1500.00,
"importe": 4500.00
}
],
"subtotal": 9500.00,
"total": 11020.00,
"fecha_timbrado": "2026-04-05T14:22:08Z",
"sello_sat": "dGhpcyBpcyBhIGZha2Ugc2VsbG8gZGVsIFNBVA==...",
"certificado_sat": "30001000000500003416",
"cadena_original_sat": "||1.1|6128396f-c09c-4e3a-b4d7-8a5f2e1c9b3d|2026-04-05T14:22:08|...",
"created_at": "2026-04-05T14:22:08Z"
}El campo uuid es el identificador fiscal unico del CFDI. Lo necesitas para
consultar, cancelar o descargar el comprobante.
Pre-validacion (sin timbrar)
Antes de timbrar puedes validar la estructura del CFDI sin consumir un folio. El endpoint de validacion aplica las mismas reglas que el timbrado pero no envia el comprobante al PAC.
POST/api/v1/cfdis/validate
curl -X POST https://api.factulink.com.mx/api/v1/cfdis/validate \
-H "Authorization: Bearer sk_test_4b7e2f1a8d9c3e6b5f0a1d2c4e7f8a9b" \
-H "Content-Type: application/json" \
-d '{
"tipo": "I",
"receptor": {
"rfc": "CACX7605101P8",
"nombre": "CARLOS CASTRO XOCHIHUA",
"regimen_fiscal": "612",
"domicilio_fiscal": "06600",
"uso_cfdi": "G03"
},
"conceptos": [
{
"descripcion": "Servicio de consultoria",
"clave_prod_serv": "80101500",
"clave_unidad": "E48",
"cantidad": 1,
"valor_unitario": 1000,
"objeto_imp": "02",
"impuestos": {
"traslados": [
{
"impuesto": "002",
"tipo_factor": "Tasa",
"tasa_o_cuota": "0.160000",
"base": 1000,
"importe": 160
}
]
}
}
]
}'/api/v1/cfdis/validate200{
"valid": true,
"errors": [],
"warnings": [
"El uso_cfdi G03 no es comun para regimen 612. Verifica que sea correcto."
]
}Si hay errores, el campo errors contiene la lista de problemas que debes corregir
antes de timbrar.
Timbrado asincrono
Cuando el PAC no esta disponible o hay alta demanda, el sistema puede encolar
el CFDI para timbrado asincrono. En ese caso la respuesta tiene status en_cola
en lugar de vigente.
/api/v1/cfdis202{
"id": "cfdi_01HQ3KD5R8N2YPTM4VBWG7E9CK",
"uuid": null,
"tipo": "I",
"status": "en_cola",
"mensaje": "El CFDI se timbrará en breve. Consulta el estado con GET /cfdis/:id",
"created_at": "2026-04-05T14:25:00Z"
}Consulta el estado del CFDI con:
GET /api/v1/cfdis/cfdi_01HQ3KD5R8N2YPTM4VBWG7E9CKCuando el timbrado se complete, el campo status cambiara a vigente y el uuid
estara disponible. Si configuraste webhooks, recibiras un evento
cfdi.timbrado automaticamente.
Descargar XML y PDF
Una vez timbrado el CFDI puedes descargar el XML fiscal y la representacion impresa en PDF.
XML
GET/api/v1/cfdis/:uuid/xml
curl -X GET https://api.factulink.com.mx/api/v1/cfdis/6128396f-c09c-4e3a-b4d7-8a5f2e1c9b3d/xml \
-H "Authorization: Bearer sk_test_4b7e2f1a8d9c3e6b5f0a1d2c4e7f8a9b" \
--output factura.xml/api/v1/cfdis/:uuid/xml200Content-Type: application/xml
Content-Disposition: attachment; filename="6128396f-c09c-4e3a-b4d7-8a5f2e1c9b3d.xml"
<?xml version="1.0" encoding="UTF-8"?>
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/4" Version="4.0" ...>
...
</cfdi:Comprobante>/api/v1/cfdis/:uuid/pdf
curl -X GET https://api.factulink.com.mx/api/v1/cfdis/6128396f-c09c-4e3a-b4d7-8a5f2e1c9b3d/pdf \
-H "Authorization: Bearer sk_test_4b7e2f1a8d9c3e6b5f0a1d2c4e7f8a9b" \
--output factura.pdf/api/v1/cfdis/:uuid/pdf200Content-Type: application/pdf
Content-Disposition: attachment; filename="6128396f-c09c-4e3a-b4d7-8a5f2e1c9b3d.pdf"
(contenido binario del PDF)Siguientes pasos
- Cancelar CFDI — Como cancelar un comprobante ante el SAT
- Subir Certificado — Gestionar tus CSDs
- Referencia API — Documentacion completa del endpoint
/cfdis