Saltar al contenido

Factura para desarrolladores

Emite DTE del Ministerio de Hacienda desde tu POS, e-commerce, SaaS o ERP con una API pública, ambiente de pruebas, webhooks firmados, CLI y MCP. Código abierto: sin amarres.

  • API pública y OpenAPI 3.1
  • Ambiente de pruebas desde el primer día
  • Código abierto: puedes autoalojarlo

POST /api/v1/dte · ambiente de pruebas

curl https://openfactura.co/api/v1/dte \
  -H "Authorization: Bearer $OPENFACTURA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-1042" \
  -d '{
    "tipoDte": "01",
    "datos": {
      "items": [
        { "descripcion": "Servicio", "cantidad": 2, "precioUni": 11.3 }
      ]
    }
  }'

Lo que cubre hoy

  • 8

    tipos de DTE: 01, 03, 04, 05, 06, 07, 11 y 14

  • 4

    eventos: invalidación, contingencia, retorno y operaciones especiales

  • 100%

    código abierto: núcleo AGPL, SDK y CLI MIT

  • 2.0

    Listo para la Normativa del Ministerio de Hacienda

Una llamada API y te integras con Hacienda

Tu primer DTE de prueba en 2 minutos, sin trámites.

API · 3 líneas
const r = await fetch('https://openfactura.co/api/v1/dte', { method: 'POST',
  headers: { Authorization: `Bearer ${process.env.OPENFACTURA_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({ tipoDte: '01', datos: { items: [{ descripcion: 'Café', cantidad: 2, precioUni: 3.5 }] } }) })
o con la CLI · 2 líneas
npx @openfactura/cli login --url https://openfactura.co
npx @openfactura/cli dte emitir factura.json

De vuelta a tu sistema: el sello, el PDF y el webhook dte.procesado.

Todo lo que necesitas para integrar

Lo que tu código necesita para emitir, enterarse y reintentar sin sorpresas.

  • Emisión de todos los DTE

    Factura, Crédito Fiscal, remisión, notas de crédito y débito, retención, exportación y sujeto excluido. Validación contra el esquema del MH, firma JWS, transmisión y sello.

  • Webhooks firmados

    Un aviso con HMAC-SHA256 cuando un documento cambia de estado. Reintentos con espera creciente e historial de entregas.

  • Idempotencia

    Si la red falla, repite la petición con la misma Idempotency-Key: recibes el resultado original y nada se emite dos veces.

  • MCP y agentes

    Servidor MCP remoto y por stdio, y skills para agentes. Cada herramienta exige el mismo permiso que su ruta REST.

  • Pruebas y producción

    Una clave of_test_ nunca toca producción. Credenciales del MH cifradas con AES-256-GCM y nunca devueltas por la API.

  • En español

    Documentación, mensajes y el vocabulario de Hacienda en español. Códigos de error estables, OpenAPI 3.1 y límites con cabeceras RateLimit.

Elige cómo integrar

Una API, una CLI y un agente. Cada operación existe en REST, en la CLI y como herramienta MCP, con los mismos permisos.

  • REST con OpenAPI 3.1 público
  • CLI @openfactura/cli con licencia MIT
  • MCP remoto o por stdio, y skills para agentes

Inicio rápido

POST /api/v1/dte
curl https://openfactura.co/api/v1/dte \
  -H "Authorization: Bearer $OPENFACTURA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-1042" \
  -d '{
    "tipoDte": "01",
    "datos": {
      "items": [
        { "descripcion": "Servicio", "cantidad": 2, "precioUni": 11.3 }
      ]
    }
  }'
201 Created
{
  "codigoGeneracion": "0862382B-0BB8-42A0-BB6B-B42DCCDF1EA4",
  "numeroControl": "DTE-01-M001P001-000000000000001",
  "estado": "procesado",
  "total": 22.6,
  "selloRecibido": "20265EE94C1B2C4CBB56F56121E37F5AC8CA7D27"
}
terminal
npm i -g @openfactura/cli
openfactura login --url https://openfactura.co   # pide la clave sin mostrarla

openfactura dte validar factura.json   # sin número de control, sin firmar
openfactura dte emitir factura.json
openfactura dte pdf 0862382B-0BB8-42A0-BB6B-B42DCCDF1EA4 -o factura.pdf
Claude Code · servidor remoto
claude mcp add --transport http openfactura https://openfactura.co/mcp \
  --header "Authorization: Bearer of_test_…"
o por stdio, con la CLI
claude mcp add openfactura \
  --env OPENFACTURA_API_KEY=of_test_… \
  --env OPENFACTURA_URL=https://openfactura.co \
  -- npx -y @openfactura/cli mcp

Pídele «Emite una factura de consumidor final por 2 servicios de $11.30, IVA incluido». El asistente valida, te muestra el resumen y emite cuando confirmas.

terminal
npx skills add xaviigna/openfactura

Cuatro skills para Claude Code, Cursor y otros agentes: openfactura-conectar, openfactura-facturar, openfactura-errores y openfactura-webhooks. Ver en skills.sh.

Entérate de cada sello sin consultar

Un POST firmado a tu sistema cuando un documento cambia de estado. Verifica la firma con WebCrypto en Node, Workers, Deno o Bun.

  • Firma HMAC-SHA256 en OpenFactura-Signature
  • Reintentos con espera creciente
  • Historial de entregas
  • dte.procesado
  • dte.rechazado
  • dte.contingencia
  • dte.invalidado
  • retorno.procesado
  • operaciones_especiales.procesado

Guía de webhooks

webhook.ts
const enc = new TextEncoder()

export async function POST(req: Request) {
  const cuerpo = await req.text() // crudo, antes de JSON.parse
  const cabecera = req.headers.get('OpenFactura-Signature') ?? ''
  const { t, v1 = '' } = Object.fromEntries(
    cabecera.split(',').map((p) => p.split('=')),
  )
  if (!(Math.abs(Date.now() / 1000 - Number(t)) <= 300))
    return new Response('expirado', { status: 400 })

  const llave = await crypto.subtle.importKey(
    'raw', enc.encode(process.env.OPENFACTURA_WEBHOOK_SECRET),
    { name: 'HMAC', hash: 'SHA-256' }, false, ['verify'],
  )
  const firma = Uint8Array.from(v1.match(/../g) ?? [],
    (h) => Number.parseInt(h, 16))
  const ok = await crypto.subtle.verify(
    'HMAC', llave, firma, enc.encode(`${t}.${cuerpo}`),
  )
  if (!ok) return new Response('firma inválida', { status: 400 })

  const aviso = JSON.parse(cuerpo) // { id, evento, ambiente, datos }
  return new Response(null, { status: 204 })
}

Para agentes

Tu agente lo hace por ti

Pídelo en español. Tu agente busca al cliente, valida contra el esquema del MH y emite el DTE por MCP, con los permisos de la clave que le des.

Conecta tus agentes
npx @openfactura/cli mcp install --todos
Funciona con
  • +4

Conecta tu agente Herramientas MCP skills.sh

El PDF oficial, listo para tu cliente

Cada documento procesado tiene su representación gráfica con el formato sugerido por Hacienda, junto al JSON oficial firmado.

  • Código QR de consulta en el portal del MH
  • Código de generación, número de control y sello
  • Por la API, la CLI (openfactura dte pdf) o el panel

Leer la documentación

factura.pdf
Tu empresa, S.A. de C.V.
Documento tributario electrónicoFACTURA
Código de generación
0862382B-0BB8-42A0-BB6B-B42DCCDF1EA4
Número de control
DTE-01-M001P001-000000000000001
Sello de recepción
20265EE94C1B2C4CBB56F56121E37F5AC8CA7D27
Cant.DescripciónPrecioTotal
2Servicio$11.30$22.60

Total a pagar$22.60

Código abierto o en la nube

Pro y Max traen la API, los webhooks, la CLI y el MCP, sin cotizaciones. En la nube operamos el núcleo con actualizaciones y respaldos automáticos (recuperación de 30 días).

Free

$0

Autoalojado: tú lo instalas, lo operas y lo mantienes.

  • El código abierto (AGPL)
  • Tu propio servidor, base de datos y respaldos
  • Tú configuras credenciales, correo y actualizaciones
  • Soporte de la comunidad (GitHub)

Para desarrolladores

Pro

$9 /mes

Open Factura Cloud: sin servidores que mantener.

  • 10,000 DTE/mes incluidos, luego $0.001 por DTE
  • API, OpenAPI, MCP, CLI, webhooks y ambiente de pruebas
  • Usuarios y sucursales ilimitados
  • Envío del DTE por correo y PDF con tu logo
  • 1 empresa
  • Soporte por correo

Max

$25 /mes

Para agencias, software houses y contadores.

  • Todo lo de Pro
  • 100,000 DTE/mes incluidos, luego $0.001 por DTE
  • Hasta 10 empresas
  • WhatsApp incluido
  • Reportes fiscales (F-07, libros de IVA) y alertas
  • Soporte prioritario

¿Más volumen o un SLA? Hablemos

Alta ante Hacienda acompañada: $49 pago único (opcional).

Precios en dólares, IVA no incluido. Facturar en Hacienda no tiene costo: pagas por la plataforma, no por cada factura.

Integra tu sistema

Crea tu cuenta, genera una clave of_test_ y emite tu primer DTE de prueba hoy. Si tienes dudas, la documentación y el repositorio están abiertos.