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)
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.
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 }
]
}
}'
tipos de DTE: 01, 03, 04, 05, 06, 07, 11 y 14
eventos: invalidación, contingencia, retorno y operaciones especiales
código abierto: núcleo AGPL, SDK y CLI MIT
Listo para la Normativa del Ministerio de Hacienda
Tu primer DTE de prueba en 2 minutos, sin trámites.
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 }] } }) })
npx @openfactura/cli login --url https://openfactura.co
npx @openfactura/cli dte emitir factura.json
POST /api/v1/dte
De vuelta a tu sistema: el sello, el PDF y el webhook dte.procesado.
Lo que tu código necesita para emitir, enterarse y reintentar sin sorpresas.
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.
Un aviso con HMAC-SHA256 cuando un documento cambia de estado. Reintentos con espera creciente e historial de entregas.
Si la red falla, repite la petición con la misma Idempotency-Key: recibes el resultado original y nada se emite dos veces.
Servidor MCP remoto y por stdio, y skills para agentes. Cada herramienta exige el mismo permiso que su ruta REST.
Una clave of_test_ nunca toca producción. Credenciales del MH cifradas con AES-256-GCM y nunca devueltas por la API.
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.
Una API, una CLI y un agente. Cada operación existe en REST, en la CLI y como herramienta MCP, con los mismos permisos.
@openfactura/cli con licencia MITcurl 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 }
]
}
}'
{
"codigoGeneracion": "0862382B-0BB8-42A0-BB6B-B42DCCDF1EA4",
"numeroControl": "DTE-01-M001P001-000000000000001",
"estado": "procesado",
"total": 22.6,
"selloRecibido": "20265EE94C1B2C4CBB56F56121E37F5AC8CA7D27"
}
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 mcp add --transport http openfactura https://openfactura.co/mcp \
--header "Authorization: Bearer of_test_…"
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.
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.
Un POST firmado a tu sistema cuando un documento cambia de estado. Verifica la firma con WebCrypto en Node, Workers, Deno o Bun.
OpenFactura-Signatureconst 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
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.
npx @openfactura/cli mcp install --todos
Cada documento procesado tiene su representación gráfica con el formato sugerido por Hacienda, junto al JSON oficial firmado.
openfactura dte pdf) o el panel| Cant. | Descripción | Precio | Total |
|---|---|---|---|
| 2 | Servicio | $11.30 | $22.60 |
Total a pagar$22.60
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).
$0
Autoalojado: tú lo instalas, lo operas y lo mantienes.
Para desarrolladores
$9 /mes
Open Factura Cloud: sin servidores que mantener.
$25 /mes
Para agencias, software houses y contadores.
¿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.
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.