Inicio rápido
En esta guía emite una Factura (01) en el ambiente de pruebas del MH. Nada de lo que haga aquí tiene valor fiscal.
-
Cree su cuenta y su organización.
Entre a openfactura.co, regístrese (la contraseña debe tener al menos 10 caracteres) y cree una organización. Usted queda como propietario, con todos los permisos.
-
Registre el emisor.
En el panel, abra Emisor → Datos fiscales y complete NIT, NRC, nombre, actividad económica, dirección (departamento, municipio y distrito), teléfono y correo. La primera vez se crean el establecimiento
M001y el punto de ventaP001. -
Cargue las credenciales de pruebas del MH.
En Emisor → Credenciales del MH cargue, para el ambiente
00:- la contraseña de API que personalizó en el Sitio Emisores DTE,
- el certificado
.crtde pruebas y la contraseña de su llave privada.
Pulse Probar conexión. Open Factura verifica que la contraseña abra la llave y que el NIT del certificado sea el del emisor. Los secretos se guardan cifrados y la API nunca los devuelve.
-
Cree una clave de API de pruebas.
En Desarrolladores → Nueva clave, elija el modo pruebas y los permisos
dte:readydte:emit. Copie la claveof_test_…: se muestra una sola vez.Ventana de terminal export OPENFACTURA_API_KEY=of_test_... -
Valide y emita su primera factura.
En una Factura,
precioUniincluye IVA. Open Factura calcula el IVA, los redondeos y el total.Primero valide: no consume número de control, no firma y no transmite.
Ventana de terminal curl https://openfactura.co/api/v1/dte/validar \-H "Authorization: Bearer $OPENFACTURA_API_KEY" \-H "Content-Type: application/json" \-d '{"tipoDte": "01","datos": { "items": [{ "descripcion": "Servicio", "cantidad": 2, "precioUni": 11.3 }] }}'Si
problemasviene vacío, emita con unaIdempotency-Keypropia:Ventana de terminal curl https://openfactura.co/api/v1/dte \-H "Authorization: Bearer $OPENFACTURA_API_KEY" \-H "Content-Type: application/json" \-H "Idempotency-Key: primera-factura-001" \-d '{"tipoDte": "01","datos": { "items": [{ "descripcion": "Servicio", "cantidad": 2, "precioUni": 11.3 }] }}'Ventana de terminal npm i -g @openfactura/cliopenfactura login --url https://openfactura.co # pide la clave sin mostrarlaGuarde el cuerpo en
factura.json:{"tipoDte": "01","datos": { "items": [{ "descripcion": "Servicio", "cantidad": 2, "precioUni": 11.3 }] }}Ventana de terminal openfactura dte validar factura.jsonopenfactura dte emitir factura.jsonLa CLI genera y muestra una
Idempotency-Keyantes de enviar.Conecte Claude Code al servidor MCP remoto:
Ventana de terminal claude mcp add --transport http openfactura https://openfactura.co/mcp \--header "Authorization: Bearer of_test_..."Y pídale, por ejemplo:
Emite una factura de consumidor final por 2 servicios de $11.30 cada uno, IVA incluido.
El asistente usa
dte_validar, le muestra el resumen y llamadte_emitirsólo cuando usted lo confirma.
Respuesta
Sección titulada «Respuesta»201 Created con el Documento procesado por el MH:
{ "id": "…", "codigoGeneracion": "0862382B-0BB8-42A0-BB6B-B42DCCDF1EA4", "numeroControl": "DTE-01-M001P001-000000000000001", "tipoDte": "01", "ambiente": "00", "estado": "procesado", "fechaEmision": "2026-11-12", "horaEmision": "01:38:12", "receptorNombre": null, "receptorDocumento": null, "total": 22.6, "selloRecibido": "20265EE94C1B2C4CBB56F56121E37F5AC8CA7D27", "origen": "api", "error": null, "creado": 1794469092559, "urlConsulta": "https://admin.factura.gob.sv/…"}Si el MH no responde, recibe 202 Accepted con estado contingencia: el documento ya está firmado
y es válido; se transmite después (vea Contingencia).
Entregue el documento
Sección titulada «Entregue el documento»Al receptor se le entregan el JSON oficial y su representación gráfica (PDF):
curl -o factura.json https://openfactura.co/api/v1/dte/0862382B-0BB8-42A0-BB6B-B42DCCDF1EA4/json \ -H "Authorization: Bearer $OPENFACTURA_API_KEY"curl -o factura.pdf https://openfactura.co/api/v1/dte/0862382B-0BB8-42A0-BB6B-B42DCCDF1EA4/pdf \ -H "Authorization: Bearer $OPENFACTURA_API_KEY"openfactura dte json 0862382B-0BB8-42A0-BB6B-B42DCCDF1EA4 -o factura.jsonopenfactura dte pdf 0862382B-0BB8-42A0-BB6B-B42DCCDF1EA4 -o factura.pdfdte_obtener con el codigoGeneracion devuelve el estado, el sello y la respuesta del MH. Para los
archivos use la CLI o la API.
Siguientes pasos
Sección titulada «Siguientes pasos»- Emitir cada tipo de documento
- Idempotencia: reintentar sin emitir dos veces.
- Ambientes: pasar a producción.