Skip to main content
Build, stamp, cancel, validate, and bulk-download CFDI 4.0 invoices with a developer-first, agent-first API. Friendly JSON in — a SAT-stamped UUID out.

Quickstart

Stamp your first invoice in three requests — zero credentials, simulated PAC.

API Reference

Every endpoint, request, and response — generated from the OpenAPI 3.1 spec.

Connect (multi-tenant)

One platform key, many tenants — Stripe Connect–style. Built for accounting apps.

Going live

Live API keys, a real CSD, the carta manifiesto, and the production checklist.

What it does

Fiscal profiles

Register an emitter RFC + CSD (and FIEL). Keys are AES-256-GCM encrypted and never returned.

Invoices

JSON → CFDI 4.0 XML → local CSD sello → PAC stamp. Drafts, PDF, credit notes, complemento de pago.

Cancellation

Motivos 01–04 with the SAT acuse and receptor-acceptance polling.

Validation

Validate any CFDI XML — structure, arithmetic, sello, and SAT status.

Massive download

SAT descarga masiva jobs by date range, issued/received, CFDI or metadata.

Webhooks

HMAC-signed events with retries — including Connect webhooks across all your tenants.

SDKs

Two first-party SDKs wrap the API — both fully typed, dependency-free, and covering every endpoint (invoices, fiscal profiles, downloads, webhooks, events, usage, versions):

Node.js

@invoice-api/node — ESM, fully typed, with a webhook-signature verifier.

Python

invoice_api — stdlib-only, Python 3.9+, with the same webhook verifier.
Neither package is on a public registry yet — npm install @invoice-api/node and pip install invoice-api 404 today. Install from the repository (npm pack the sdk/ folder, or pip install ./sdk-python); the exact commands live in the repo README’s SDKs section.

Built for agents

RFC 9457 problem+json errors carry a stable code and human- and LLM-readable remediation. The API ships llms.txt, an OpenAPI 3.1 spec, and a simulated PAC so anything — human or agent — can integrate with zero credentials. Dated versioning (Invoice-Version) keeps old integrations stable — see the changelog.
Test mode (sk_test_) targets the sandbox or the built-in simulated PAC; live mode (sk_live_) targets production. Data is fully isolated per mode.