Skip to Content
GuíasEmitir CFDI Ingreso

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:

  1. API Key activa — ver Autenticacion
  2. CSD subido y activo — ver Subir Certificado
  3. Cliente registrado (opcional) — si ya tienes clientes dados de alta puedes referenciarlos por id en lugar de enviar los datos del receptor cada vez

Base URL: https://api.factulink.com.mx/api/v1

El 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:

SeccionDescripcionRequerido
tipoTipo de comprobante (I, E, P, N, T)Si
emisorSe toma automaticamente de tu tenant (RFC, nombre, regimen fiscal)Automatico
receptorDatos fiscales del clienteSi
conceptosLista de productos o servicios facturadosSi
impuestosTraslados y/o retenciones por conceptoDepende 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:

CampoDescripcion
descripcionTexto libre describiendo el producto o servicio
clave_prod_servClave del catalogo del SAT (8 digitos)
clave_unidadClave de unidad de medida del SAT
cantidadCantidad del producto o servicio
valor_unitarioPrecio unitario antes de impuestos
objeto_imp01 No objeto, 02 Si objeto, 03 Si objeto y no obligado
impuestosObjeto con traslados y/o retenciones (requerido si objeto_imp es 02)

Tipos de comprobante

TipoNombreUso
IIngresoFactura de venta de productos o servicios
EEgresoNota de credito o devolucion
PPagoComplemento de recepcion de pago
NNominaRecibo de nomina
TTrasladoCarta 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

POST/api/v1/cfdis201
Response
{
"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
          }
        ]
      }
    }
  ]
}'
POST/api/v1/cfdis/validate200
Response
{
"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.

POST/api/v1/cfdis202
Response
{
"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_01HQ3KD5R8N2YPTM4VBWG7E9CK

Cuando 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
GET/api/v1/cfdis/:uuid/xml200
Response
Content-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>

PDF

GET/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
GET/api/v1/cfdis/:uuid/pdf200
Response
Content-Type: application/pdf
Content-Disposition: attachment; filename="6128396f-c09c-4e3a-b4d7-8a5f2e1c9b3d.pdf"

(contenido binario del PDF)

Siguientes pasos

Last updated on