Docs

Exac para desarrolladores

Infraestructura mexicana de facturación y CFDI para desarrolladores y agentes de IA

Emite facturas, automatiza la descarga masiva de CFDI del SAT y ejecuta flujos de negocio en México mediante REST o MCP con un contrato por organización.

Producción y entorno de prueba

Las API keys de organización pertenecen a un solo entorno. Las claves de prueba usan las operaciones marcadas “Producción y prueba” en la referencia de API contra datos de prueba aislados. Las operaciones exclusivas de producción y MCP no están disponibles en prueba. Las credenciales se rechazan fuera del entorno asignado.

Inicio rápido

Haz tu primera solicitud autenticada

Comienza con una organización de prueba aislada y una API key de prueba.

  1. 1
    Abre la consola para desarrolladores

    Abre /consola desde Exac, selecciona Prueba y entra a Claves API para tu workspace actual.

  2. 2
    Crea una API key de prueba

    Crea una clave para Prueba y cópiala una sola vez. Exac prepara el entorno aislado automáticamente.

  3. 3
    Verifica la organización de prueba

    Llama GET /v1/organization con la clave de prueba contra el servidor de prueba mostrado en OpenAPI.

  4. 4
    Ejecuta un flujo Test

    Crea un contacto y un borrador CFDI; luego crea, consulta y cancela un timbrado de prueba. Los artefactos de sandbox no se envían al SAT y no tienen validez fiscal.

curl "https://grateful-squid-667.convex.site/v1/organization" \  --header "Authorization: Bearer <EXAC_API_KEY>"

Primeros flujos de integración

Flujos canónicos

Usa la misma intención de dominio mediante REST o MCP. Estos ejemplos se validan contra los contratos de ejecución; reemplaza los identificadores y credenciales de ejemplo con valores de tu organización.

01Prueba el ciclo de un CFDI en sandboxCrea, timbra, descarga y cancela un CFDI de prueba sin validez fiscal usando únicamente operaciones REST de sandbox.
  1. 1

    Verifica la organización

    Confirma que la clave de sandbox resuelva a la organización aislada esperada.

    REST · Producción y pruebaGET /v1/organization

    Guía de reintentos: Esta lectura se puede repetir de forma segura.

  2. 2

    Crea un cliente de prueba

    Crea el cliente que usará el CFDI de prueba.

    REST · Producción y pruebaPOST /v1/contacts

    Guía de reintentos: Reutiliza la misma clave solo para una solicitud idéntica.

  3. 3

    Crea un borrador CFDI

    Crea un borrador que puedas revisar antes del timbrado de prueba explícito.

    REST · Producción y pruebaPOST /v1/cfdis

    Guía de reintentos: Reutiliza la misma clave solo para la carga idéntica del borrador.

  4. 4

    Crea un timbrado de prueba

    Sandbox crea un artefacto de prueba. No se envía al SAT y no tiene validez fiscal.

    REST · Producción y pruebaPOST /v1/cfdis/cfdi:invoice-example/stamp

    Guía de reintentos: Reintenta solo con la misma clave y documentRef.

  5. 5

    Descarga el PDF de prueba

    Descarga el documento de prueba generado desde el servidor de sandbox.

    REST · Producción y pruebaGET /v1/documents/cfdi:invoice-example/files/pdf

    Guía de reintentos: Esta lectura de archivo se puede repetir de forma segura.

  6. 6

    Cancela el CFDI de prueba

    Ejercita la transición de cancelación contra datos de prueba aislados.

    REST · Producción y pruebaPOST /v1/cfdis/cfdi:invoice-example/cancel

    Guía de reintentos: Reutiliza la misma clave solo para la misma solicitud de cancelación.

{  "steps": [    {      "id": "verify-sandbox-organization",      "rest": {        "operationId": "getOrganization",        "method": "GET",        "path": "/v1/organization",        "environments": [          "production",          "sandbox"        ]      }    },    {      "id": "create-sandbox-contact",      "rest": {        "operationId": "createContact",        "method": "POST",        "path": "/v1/contacts",        "environments": [          "production",          "sandbox"        ],        "headers": {          "Idempotency-Key": "sandbox-create-contact"        },        "body": {          "kind": "customer",          "legalName": "Estudio Jacaranda",          "email": "administracion@jacaranda.example"        }      }    },    {      "id": "create-sandbox-cfdi",      "rest": {        "operationId": "createCfdiDraft",        "method": "POST",        "path": "/v1/cfdis",        "environments": [          "production",          "sandbox"        ],        "headers": {          "Idempotency-Key": "sandbox-create-cfdi"        },        "body": {          "customerId": "customer-example",          "items": [            {              "kind": "custom",              "description": "Consultoría administrativa · julio 2026",              "quantity": 1,              "unitPrice": 10000,              "satProductCode": "84111506",              "satUnitCode": "E48",              "taxRate": 0.16,              "taxability": "standard"            }          ],          "kind": "income",          "cfdiUse": "G03",          "payment": {            "timing": "deferred_or_installments",            "formCode": "99",            "conditions": "Crédito a 30 días"          }        }      }    },    {      "id": "stamp-sandbox-cfdi",      "rest": {        "operationId": "stampCfdi",        "method": "POST",        "path": "/v1/cfdis/cfdi:invoice-example/stamp",        "environments": [          "production",          "sandbox"        ],        "headers": {          "Idempotency-Key": "sandbox-stamp-cfdi"        },        "body": {}      }    },    {      "id": "download-sandbox-pdf",      "rest": {        "operationId": "downloadDocumentFile",        "method": "GET",        "path": "/v1/documents/cfdi:invoice-example/files/pdf",        "environments": [          "production",          "sandbox"        ]      }    },    {      "id": "cancel-sandbox-cfdi",      "rest": {        "operationId": "cancelCfdi",        "method": "POST",        "path": "/v1/cfdis/cfdi:invoice-example/cancel",        "environments": [          "production",          "sandbox"        ],        "headers": {          "Idempotency-Key": "sandbox-cancel-cfdi"        },        "body": {          "reason": "02"        }      }    }  ]}
02Configurar acceso fiscalConfigura la identidad fiscal, carga el CSD y verifica la disponibilidad antes de crear CFDI.
  1. 1

    Configura la identidad fiscal

    Actualiza una sección de configuración de la organización a la vez.

    REST · Solo producciónPATCH /v1/organizationMCP · Solo producciónupdate_organization

    Guía de reintentos: Reutiliza el mismo Idempotency-Key únicamente para la misma carga de sección.

  2. 2

    Carga el par CSD

    Carga el certificado y la clave privada en base64; el material secreto nunca se devuelve.

    REST · Solo producciónPUT /v1/organization/certificates/csd

    Guía de reintentos: Reintenta con la misma clave y la carga de certificado sin cambios.

  3. 3

    Verifica la disponibilidad

    Lee la proyección de la organización y confirma la disponibilidad fiscal antes de emitir.

    REST · Producción y pruebaGET /v1/organizationMCP · Solo producciónget_organization

    Guía de reintentos: Las lecturas se pueden repetir; no agregues un idempotency key.

{  "steps": [    {      "id": "update-fiscal-settings",      "rest": {        "operationId": "updateOrganization",        "method": "PATCH",        "path": "/v1/organization",        "environments": [          "production"        ],        "headers": {          "Idempotency-Key": "workflow-fiscal-settings"        },        "body": {          "section": "fiscal",          "legalName": "Empresa Ejemplo SA de CV",          "rfc": "XAXX010101000",          "taxSystem": "601",          "address": {            "postalCode": "82110"          }        }      },      "mcp": {        "tool": "update_organization",        "arguments": {          "idempotencyKey": "workflow-fiscal-settings",          "input": {            "section": "fiscal",            "legalName": "Empresa Ejemplo SA de CV",            "rfc": "XAXX010101000",            "taxSystem": "601",            "address": {              "postalCode": "82110"            }          }        },        "environments": [          "production"        ]      }    },    {      "id": "upload-csd",      "rest": {        "operationId": "uploadCertificate",        "method": "PUT",        "path": "/v1/organization/certificates/csd",        "environments": [          "production"        ],        "headers": {          "Idempotency-Key": "workflow-upload-csd"        },        "body": {          "certificateBase64": "BASE64_CER",          "privateKeyBase64": "BASE64_KEY",          "password": "certificate-password",          "certificateFileName": "certificate.cer",          "privateKeyFileName": "private.key"        }      }    },    {      "id": "verify-organization",      "rest": {        "operationId": "getOrganization",        "method": "GET",        "path": "/v1/organization",        "environments": [          "production",          "sandbox"        ]      },      "mcp": {        "tool": "get_organization",        "arguments": {},        "environments": [          "production"        ]      }    }  ]}
03Emitir y enviar un CFDI en producciónFlujo de producción: crea un borrador, revísalo, timbra explícitamente ante el SAT y después envía el documento.
  1. 1

    Crea el borrador

    La creación solo produce un borrador. No timbra ni envía el CFDI; revisa el borrador devuelto antes de cualquier transición explícita.

    REST · Producción y pruebaPOST /v1/cfdisMCP · Solo produccióncreate_cfdi_draft

    Guía de reintentos: Usa la misma clave para un reintento exacto; una carga modificada es una nueva solicitud.

  2. 2

    Revisa el borrador

    Usa el documentRef devuelto para revisar la proyección canónica del documento.

    REST · Producción y pruebaGET /v1/cfdis/cfdi:invoice-exampleMCP · Solo producciónget_document

    Guía de reintentos: Esta lectura se puede repetir y no lleva idempotency key.

  3. 3

    Previsualiza el PDF del borrador (opcional)

    Usa preview_pdf para revisar el documento renderizado antes de timbrar. La vista previa no tiene validez fiscal.

    REST · Producción y pruebaGET /v1/documents/cfdi:invoice-example/files/preview_pdfMCP · Solo producciónget_document_file

    Guía de reintentos: Esta lectura de archivo se puede repetir y no lleva idempotency key.

  4. 4

    Timbra ante el SAT

    El timbrado es una transición irreversible separada. Revisa primero el borrador.

    REST · Producción y pruebaPOST /v1/cfdis/cfdi:invoice-example/stampMCP · Solo producciónstamp_cfdi

    Guía de reintentos: Reintenta únicamente con la misma clave y documentRef; las fallas del proveedor pueden requerir recuperación.

  5. 5

    Envía el CFDI

    Envía por correo el CFDI timbrado y sus archivos fiscales a un destinatario explícito.

    REST · Solo producciónPOST /v1/documents/cfdi:invoice-example/sendMCP · Solo producciónsend_document

    Guía de reintentos: Reutiliza la clave para el mismo destinatario y documento; el envío sigue siendo un efecto externo.

{  "steps": [    {      "id": "create-cfdi-draft",      "rest": {        "operationId": "createCfdiDraft",        "method": "POST",        "path": "/v1/cfdis",        "environments": [          "production",          "sandbox"        ],        "headers": {          "Idempotency-Key": "workflow-create-cfdi"        },        "body": {          "customerId": "customer-example",          "items": [            {              "kind": "custom",              "description": "Consultoría administrativa · julio 2026",              "quantity": 1,              "unitPrice": 10000,              "satProductCode": "84111506",              "satUnitCode": "E48",              "taxRate": 0.16,              "taxability": "standard"            }          ],          "kind": "income",          "cfdiUse": "G03",          "payment": {            "timing": "deferred_or_installments",            "formCode": "99",            "conditions": "Crédito a 30 días"          }        }      },      "mcp": {        "tool": "create_cfdi_draft",        "arguments": {          "idempotencyKey": "workflow-create-cfdi",          "input": {            "customerId": "customer-example",            "items": [              {                "kind": "custom",                "description": "Consultoría administrativa · julio 2026",                "quantity": 1,                "unitPrice": 10000,                "satProductCode": "84111506",                "satUnitCode": "E48",                "taxRate": 0.16,                "taxability": "standard"              }            ],            "kind": "income",            "cfdiUse": "G03",            "payment": {              "timing": "deferred_or_installments",              "formCode": "99",              "conditions": "Crédito a 30 días"            }          }        },        "environments": [          "production"        ]      }    },    {      "id": "inspect-cfdi-draft",      "rest": {        "operationId": "getCfdi",        "method": "GET",        "path": "/v1/cfdis/cfdi:invoice-example",        "environments": [          "production",          "sandbox"        ]      },      "mcp": {        "tool": "get_document",        "arguments": {          "documentRef": "cfdi:invoice-example"        },        "environments": [          "production"        ]      }    },    {      "id": "preview-cfdi-draft-pdf",      "rest": {        "operationId": "downloadDocumentFile",        "method": "GET",        "path": "/v1/documents/cfdi:invoice-example/files/preview_pdf",        "environments": [          "production",          "sandbox"        ]      },      "mcp": {        "tool": "get_document_file",        "arguments": {          "documentRef": "cfdi:invoice-example",          "file": "preview_pdf"        },        "environments": [          "production"        ]      }    },    {      "id": "stamp-cfdi",      "rest": {        "operationId": "stampCfdi",        "method": "POST",        "path": "/v1/cfdis/cfdi:invoice-example/stamp",        "environments": [          "production",          "sandbox"        ],        "headers": {          "Idempotency-Key": "workflow-stamp-cfdi"        },        "body": {}      },      "mcp": {        "tool": "stamp_cfdi",        "arguments": {          "documentRef": "cfdi:invoice-example",          "idempotencyKey": "workflow-stamp-cfdi"        },        "environments": [          "production"        ]      }    },    {      "id": "send-cfdi",      "rest": {        "operationId": "sendDocument",        "method": "POST",        "path": "/v1/documents/cfdi:invoice-example/send",        "environments": [          "production"        ],        "headers": {          "Idempotency-Key": "workflow-send-cfdi"        },        "body": {          "recipient": "administracion@jacaranda.example"        }      },      "mcp": {        "tool": "send_document",        "arguments": {          "idempotencyKey": "workflow-send-cfdi",          "input": {            "documentRef": "cfdi:invoice-example",            "recipient": "administracion@jacaranda.example"          }        },        "environments": [          "production"        ]      }    }  ]}
04Crear un complemento de pagoRegistra uno o más pagos de una factura PPD. Exac distribuye los impuestos conocidos de la factura en cada pago parcial.
  1. 1

    Revisa el CFDI relacionado

    Usa taxes: "auto" cuando Exac tenga la factura timbrada. Para una factura externa desconocida, envía su taxObject SAT y los impuestos del pago; no se requiere importar XML.

    REST · Producción y pruebaGET /v1/cfdis/cfdi:invoice-exampleMCP · Solo producciónget_document

    Guía de reintentos: Esta lectura se puede repetir de forma segura.

  2. 2

    Crea el borrador del complemento

    En el primer pago usa installment 1 y el total de la factura como previousBalance. En pagos posteriores, incrementa installment y usa el saldo insoluto anterior. Exac resuelve los impuestos automáticos antes de crear el borrador.

    REST · Producción y pruebaPOST /v1/cfdisMCP · Solo produccióncreate_cfdi_draft

    Guía de reintentos: Reutiliza la misma clave solo para el mismo pago.

  3. 3

    Revisa antes de timbrar

    Confirma saldos, parcialidad e impuestos del pago en la proyección canónica del borrador.

    REST · Producción y pruebaGET /v1/cfdis/cfdi:payment-exampleMCP · Solo producciónget_document

    Guía de reintentos: Esta lectura se puede repetir de forma segura.

  4. 4

    Timbra el complemento

    Timbra solo después de confirmar el UUID relacionado, la parcialidad, los saldos anterior, pagado e insoluto, y los impuestos proporcionales.

    REST · Producción y pruebaPOST /v1/cfdis/cfdi:payment-example/stampMCP · Solo producciónstamp_cfdi

    Guía de reintentos: Reutiliza la misma clave solo para el mismo borrador revisado y fecha de emisión.

{  "steps": [    {      "id": "inspect-related-cfdi",      "rest": {        "operationId": "getCfdi",        "method": "GET",        "path": "/v1/cfdis/cfdi:invoice-example",        "environments": [          "production",          "sandbox"        ]      },      "mcp": {        "tool": "get_document",        "arguments": {          "documentRef": "cfdi:invoice-example"        },        "environments": [          "production"        ]      }    },    {      "id": "create-payment-complement-draft",      "rest": {        "operationId": "createCfdiDraft",        "method": "POST",        "path": "/v1/cfdis",        "environments": [          "production",          "sandbox"        ],        "headers": {          "Idempotency-Key": "workflow-create-payment-complement"        },        "body": {          "kind": "payment_complement",          "customerId": "customer-example",          "payment": {            "formCode": "03",            "paidLocalDateTime": "2026-07-15T12:00:00",            "documents": [              {                "uuid": "00000000-0000-4000-8000-000000000001",                "amount": 11600,                "installment": 1,                "previousBalance": 11600,                "taxes": "auto"              }            ]          }        }      },      "mcp": {        "tool": "create_cfdi_draft",        "arguments": {          "idempotencyKey": "workflow-create-payment-complement",          "input": {            "kind": "payment_complement",            "customerId": "customer-example",            "payment": {              "formCode": "03",              "paidLocalDateTime": "2026-07-15T12:00:00",              "documents": [                {                  "uuid": "00000000-0000-4000-8000-000000000001",                  "amount": 11600,                  "installment": 1,                  "previousBalance": 11600,                  "taxes": "auto"                }              ]            }          }        },        "environments": [          "production"        ]      }    },    {      "id": "inspect-payment-complement-draft",      "rest": {        "operationId": "getCfdi",        "method": "GET",        "path": "/v1/cfdis/cfdi:payment-example",        "environments": [          "production",          "sandbox"        ]      },      "mcp": {        "tool": "get_document",        "arguments": {          "documentRef": "cfdi:payment-example"        },        "environments": [          "production"        ]      }    },    {      "id": "stamp-payment-complement",      "rest": {        "operationId": "stampCfdi",        "method": "POST",        "path": "/v1/cfdis/cfdi:payment-example/stamp",        "environments": [          "production",          "sandbox"        ],        "headers": {          "Idempotency-Key": "workflow-stamp-payment-complement"        },        "body": {}      },      "mcp": {        "tool": "stamp_cfdi",        "arguments": {          "documentRef": "cfdi:payment-example",          "idempotencyKey": "workflow-stamp-payment-complement"        },        "environments": [          "production"        ]      }    }  ]}
05Convertir recibos en CFDICrea un borrador de CFDI a partir de ventas seleccionadas de recibos. El timbrado permanece como una operación explícita separada.
  1. 1

    Crea un recibo facturable

    Usa invoiceRequested: true para conservar la identidad SAT y el tratamiento fiscal del producto al vender. Es opcional para recibos que nunca se facturarán.

    REST · Producción y pruebaPOST /v1/sales-receiptsMCP · Solo produccióncreate_sales_receipt

    Guía de reintentos: Reutiliza la misma clave solo para la venta idéntica.

  2. 2

    Convierte los recibos

    La operación valida la propiedad y conciliación de los recibos y devuelve un borrador de CFDI. No timbra ni envía el CFDI.

    REST · Producción y pruebaPOST /v1/cfdis/from-sales-receiptsMCP · Solo produccióncreate_cfdi_draft_from_sales_receipts

    Guía de reintentos: Reintenta el mismo conjunto de recibos con la misma clave; nunca cambies el conjunto usando una clave existente.

  3. 3

    Lee el CFDI resultante

    Usa el documentRef de CFDI devuelto por la conversión para obtener el detalle canónico.

    REST · Producción y pruebaGET /v1/cfdis/cfdi:invoice-exampleMCP · Solo producciónget_document

    Guía de reintentos: Las lecturas se pueden repetir y no necesitan idempotency key.

{  "steps": [    {      "id": "create-invoiceable-receipt",      "rest": {        "operationId": "createSalesReceipt",        "method": "POST",        "path": "/v1/sales-receipts",        "environments": [          "production",          "sandbox"        ],        "headers": {          "Idempotency-Key": "workflow-create-invoiceable-receipt"        },        "body": {          "saleType": "paid",          "customer": {            "kind": "stored",            "customerId": "customer-example"          },          "items": [            {              "productId": "product-example",              "description": "Servicio",              "quantity": 1,              "unitPrice": 1250            }          ],          "paymentForm": "03",          "invoiceRequested": true        }      },      "mcp": {        "tool": "create_sales_receipt",        "arguments": {          "idempotencyKey": "workflow-create-invoiceable-receipt",          "input": {            "saleType": "paid",            "customer": {              "kind": "stored",              "customerId": "customer-example"            },            "items": [              {                "productId": "product-example",                "description": "Servicio",                "quantity": 1,                "unitPrice": 1250              }            ],            "paymentForm": "03",            "invoiceRequested": true          }        },        "environments": [          "production"        ]      }    },    {      "id": "create-cfdi-from-receipts",      "rest": {        "operationId": "createCfdiDraftFromSalesReceipts",        "method": "POST",        "path": "/v1/cfdis/from-sales-receipts",        "environments": [          "production",          "sandbox"        ],        "headers": {          "Idempotency-Key": "workflow-receipts-to-cfdi"        },        "body": {          "salesReceiptRefs": [            "sales_receipt:receipt-example"          ],          "customer": {            "kind": "existing",            "customerId": "customer-example"          },          "cfdiUse": "S01"        }      },      "mcp": {        "tool": "create_cfdi_draft_from_sales_receipts",        "arguments": {          "idempotencyKey": "workflow-receipts-to-cfdi",          "input": {            "salesReceiptRefs": [              "sales_receipt:receipt-example"            ],            "customer": {              "kind": "existing",              "customerId": "customer-example"            },            "cfdiUse": "S01"          }        },        "environments": [          "production"        ]      }    },    {      "id": "read-converted-cfdi",      "rest": {        "operationId": "getCfdi",        "method": "GET",        "path": "/v1/cfdis/cfdi:invoice-example",        "environments": [          "production",          "sandbox"        ]      },      "mcp": {        "tool": "get_document",        "arguments": {          "documentRef": "cfdi:invoice-example"        },        "environments": [          "production"        ]      }    }  ]}
06Buscar y descargar un CFDIBusca en la colección de CFDI con filtros fiscales, recupera un documento y descarga su PDF o XML.
  1. 1

    Busca CFDI

    Usa kind y paymentTiming en lugar de un filtro genérico de tipo de documento.

    REST · Producción y pruebaGET /v1/cfdisMCP · Solo producciónsearch_documents

    Guía de reintentos: Esta lectura se puede repetir y usa paginación por cursor para las páginas siguientes.

  2. 2

    Recupera el CFDI

    Usa la referencia opaca de CFDI devuelta por la colección.

    REST · Producción y pruebaGET /v1/cfdis/cfdi:invoice-exampleMCP · Solo producciónget_document

    Guía de reintentos: Las lecturas se pueden repetir y no necesitan idempotency key.

  3. 3

    Descarga el PDF

    La ruta REST devuelve un adjunto; la herramienta MCP devuelve un recurso binario.

    REST · Producción y pruebaGET /v1/documents/cfdi:invoice-example/files/pdfMCP · Solo producciónget_document_file

    Guía de reintentos: Las lecturas de archivos se pueden repetir y no necesitan idempotency key.

  4. 4

    Descarga el XML

    Usa el mismo documentRef para recuperar el XML fiscal cuando esté disponible.

    REST · Producción y pruebaGET /v1/documents/cfdi:invoice-example/files/xmlMCP · Solo producciónget_document_file

    Guía de reintentos: Las lecturas de archivos se pueden repetir y no necesitan idempotency key.

{  "steps": [    {      "id": "search-cfdis",      "rest": {        "operationId": "listCfdis",        "method": "GET",        "path": "/v1/cfdis",        "environments": [          "production",          "sandbox"        ],        "query": {          "kind": "income",          "status": "valid",          "dateFrom": "2026-01-01",          "dateTo": "2026-01-31",          "limit": 20        }      },      "mcp": {        "tool": "search_documents",        "arguments": {          "input": {            "category": "cfdi",            "kind": "income",            "status": "valid",            "dateFrom": "2026-01-01",            "dateTo": "2026-01-31",            "limit": 20          }        },        "environments": [          "production"        ]      }    },    {      "id": "get-cfdi",      "rest": {        "operationId": "getCfdi",        "method": "GET",        "path": "/v1/cfdis/cfdi:invoice-example",        "environments": [          "production",          "sandbox"        ]      },      "mcp": {        "tool": "get_document",        "arguments": {          "documentRef": "cfdi:invoice-example"        },        "environments": [          "production"        ]      }    },    {      "id": "download-pdf",      "rest": {        "operationId": "downloadDocumentFile",        "method": "GET",        "path": "/v1/documents/cfdi:invoice-example/files/pdf",        "environments": [          "production",          "sandbox"        ]      },      "mcp": {        "tool": "get_document_file",        "arguments": {          "documentRef": "cfdi:invoice-example",          "file": "pdf"        },        "environments": [          "production"        ]      }    },    {      "id": "download-xml",      "rest": {        "operationId": "downloadDocumentFile",        "method": "GET",        "path": "/v1/documents/cfdi:invoice-example/files/xml",        "environments": [          "production",          "sandbox"        ]      },      "mcp": {        "tool": "get_document_file",        "arguments": {          "documentRef": "cfdi:invoice-example",          "file": "xml"        },        "environments": [          "production"        ]      }    }  ]}
07Conciliar el estado CFDI con el SATConsulta al SAT el estado actual de un CFDI timbrado después de un resultado asíncrono o incierto del proveedor.
  1. 1

    Actualiza el estado ante el SAT

    La actualización requiere datos de verificación capturados del XML fiscal y concilia el estado local.

    REST · Solo producciónPOST /v1/cfdis/cfdi:invoice-example/status/refreshMCP · Solo producciónrefresh_cfdi_status

    Guía de reintentos: Reutiliza la misma clave para la misma observación del documento; es una lectura externa que cambia estado.

  2. 2

    Lee el documento conciliado

    Obtén el documento de nuevo para consumir el estado local canónico y la proyección de cancelación.

    REST · Producción y pruebaGET /v1/cfdis/cfdi:invoice-exampleMCP · Solo producciónget_document

    Guía de reintentos: Las lecturas se pueden repetir y no necesitan idempotency key.

{  "steps": [    {      "id": "refresh-cfdi-status",      "rest": {        "operationId": "refreshCfdiStatus",        "method": "POST",        "path": "/v1/cfdis/cfdi:invoice-example/status/refresh",        "environments": [          "production"        ],        "headers": {          "Idempotency-Key": "workflow-refresh-cfdi-status"        },        "body": {}      },      "mcp": {        "tool": "refresh_cfdi_status",        "arguments": {          "documentRef": "cfdi:invoice-example",          "idempotencyKey": "workflow-refresh-cfdi-status"        },        "environments": [          "production"        ]      }    },    {      "id": "read-reconciled-cfdi",      "rest": {        "operationId": "getCfdi",        "method": "GET",        "path": "/v1/cfdis/cfdi:invoice-example",        "environments": [          "production",          "sandbox"        ]      },      "mcp": {        "tool": "get_document",        "arguments": {          "documentRef": "cfdi:invoice-example"        },        "environments": [          "production"        ]      }    }  ]}
08Sincronizar y reportar datos fiscalesPrograma la descarga masiva de CFDI del SAT mediante la sincronización de documentos y después consulta por separado los agregados CFDI y los totales declarados autorizados.
  1. 1

    Verifica la FIEL

    Lee la organización y continúa solo cuando readiness.fiel sea true. Carga la FIEL en la configuración de Exac cuando sea false.

    REST · Producción y pruebaGET /v1/organizationMCP · Solo producciónget_organization

    Guía de reintentos: Esta lectura se puede repetir de forma segura.

  2. 2

    Programa una sincronización de documentos

    Elige una fuente del SAT y un rango inclusivo de fechas; la respuesta solo confirma la programación.

    REST · Solo producciónPOST /v1/tax/syncMCP · Solo producciónsync_sat_data

    Guía de reintentos: Reutiliza la misma clave para la misma fuente y rango; consulta los resultados cuando termine el trabajo.

  3. 3

    Consulta los agregados CFDI

    Los totales CFDI excluyen ventas de recibos/POS y son distintos de los totales fiscales declarados.

    REST · Producción y pruebaGET /v1/reports/cfdiMCP · Solo producciónget_cfdi_summary

    Guía de reintentos: Este reporte es de solo lectura y se puede repetir.

  4. 4

    Consulta los totales declarados

    Los totales fiscales provienen únicamente de declaraciones analizadas; si no están disponibles permanecen como null y no se estiman.

    REST · Solo producciónGET /v1/reports/taxesMCP · Solo producciónget_tax_summary

    Guía de reintentos: Este reporte es de solo lectura y se puede repetir.

{  "steps": [    {      "id": "verify-fiel-readiness",      "rest": {        "operationId": "getOrganization",        "method": "GET",        "path": "/v1/organization",        "environments": [          "production",          "sandbox"        ]      },      "mcp": {        "tool": "get_organization",        "arguments": {},        "environments": [          "production"        ]      }    },    {      "id": "sync-documents",      "rest": {        "operationId": "syncTaxData",        "method": "POST",        "path": "/v1/tax/sync",        "environments": [          "production"        ],        "headers": {          "Idempotency-Key": "workflow-sync-documents"        },        "body": {          "source": "documents",          "dateFrom": "2026-01-01",          "dateTo": "2026-01-31",          "kind": "all"        }      },      "mcp": {        "tool": "sync_sat_data",        "arguments": {          "idempotencyKey": "workflow-sync-documents",          "input": {            "source": "documents",            "dateFrom": "2026-01-01",            "dateTo": "2026-01-31",            "kind": "all"          }        },        "environments": [          "production"        ]      }    },    {      "id": "read-cfdi-summary",      "rest": {        "operationId": "getCfdiReport",        "method": "GET",        "path": "/v1/reports/cfdi",        "environments": [          "production",          "sandbox"        ],        "query": {          "monthFrom": "2026-01",          "monthTo": "2026-01"        }      },      "mcp": {        "tool": "get_cfdi_summary",        "arguments": {          "monthFrom": "2026-01",          "monthTo": "2026-01"        },        "environments": [          "production"        ]      }    },    {      "id": "read-tax-summary",      "rest": {        "operationId": "getTaxReport",        "method": "GET",        "path": "/v1/reports/taxes",        "environments": [          "production"        ],        "query": {          "fiscalYear": 2026        }      },      "mcp": {        "tool": "get_tax_summary",        "arguments": {          "fiscalYear": 2026        },        "environments": [          "production"        ]      }    }  ]}
09Registrar un pago por cobrarRegistra un pago de cliente y asígnalo a saldos abiertos de recibos mediante una operación idempotente y auditable.
  1. 1

    Registra y asigna el pago

    La asignación debe referenciar recibos pertenecientes al cliente y a la organización.

    REST · Producción y pruebaPOST /v1/accounts/receivables/customer-example/paymentsMCP · Solo producciónrecord_payment

    Guía de reintentos: Reintenta únicamente el pago exacto con la misma clave para evitar un movimiento de dinero duplicado.

  2. 2

    Verifica el saldo de la cuenta

    Lee la proyección de la cuenta después de la mutación para mostrar los nuevos saldos operativos y fiscales.

    REST · Producción y pruebaGET /v1/accounts/receivables/customer-exampleMCP · Solo producciónget_accounts

    Guía de reintentos: Las lecturas se pueden repetir y no necesitan idempotency key.

{  "steps": [    {      "id": "record-payment",      "rest": {        "operationId": "createReceivablePayment",        "method": "POST",        "path": "/v1/accounts/receivables/customer-example/payments",        "environments": [          "production",          "sandbox"        ],        "headers": {          "Idempotency-Key": "workflow-receivable-payment"        },        "body": {          "allocations": [            {              "documentRef": "sales_receipt:receipt-example",              "amount": 500            }          ],          "paymentForm": "03",          "notes": "Bank transfer"        }      },      "mcp": {        "tool": "record_payment",        "arguments": {          "idempotencyKey": "workflow-receivable-payment",          "input": {            "direction": "received",            "customerId": "customer-example",            "allocations": [              {                "documentRef": "sales_receipt:receipt-example",                "amount": 500              }            ],            "paymentForm": "03",            "notes": "Bank transfer"          }        },        "environments": [          "production"        ]      }    },    {      "id": "read-receivable-account",      "rest": {        "operationId": "getReceivableAccount",        "method": "GET",        "path": "/v1/accounts/receivables/customer-example",        "environments": [          "production",          "sandbox"        ]      },      "mcp": {        "tool": "get_accounts",        "arguments": {          "input": {            "operation": "get",            "kind": "receivable",            "customerId": "customer-example"          }        },        "environments": [          "production"        ]      }    }  ]}

El contrato está listo para construir

El artefacto OpenAPI 3.1 se genera desde el mismo registro de operaciones que el runtime REST y se verifica contra clientes generados de TypeScript y Python.