API de facturación electrónica

API de facturación electrónica DIAN para tu ERP, tu POS o tu propio software

Envía un JSON y recibe la factura validada por la DIAN con CUFE, PDF y XML. Clientes, notas, documento soporte, nómina, eventos RADIAN, links de cobro y webhooks firmados, todo bajo el NIT de tu empresa, con sandbox gratis y documentación completa en español.

REST + JSON Sandbox sin consumo Webhooks firmados 1.000 documentos incluidos
Primera llamada

Una factura en una llamada

Con la llave API de tu instancia, un POST crea la factura, la firma con tu certificado y la transmite a la DIAN. Si el cliente ya existe, basta su NIT.

curl -sS -X POST https://<tu-nit>.miplata.co/api/external/invoices \
  -H "X-API-Key: TU_LLAVE" -H "Content-Type: application/json" \
  -d '{
    "customer_nit": "900123456",
    "customer_name": "Cliente Ejemplo S.A.S.",
    "customer_email": "facturas@cliente.co",
    "payment_means_code": "47",
    "items": [
      { "description": "Servicio de consultoría", "quantity": 1, "unit_price": 1000000, "tax_percent": 19 }
    ]
  }'
# → 201 { "id": "3f2b8c1e-7a4d-4b9e-9c61-2d5f0a8e4b17", "invoice_number": "FE1234", "cufe": "…", "dian_status": "SENT", "qr_code": "https://catalogo-vpfe.dian.gov.co/…", … }
#   dian_status SENT o ya ACCEPTED (QUEUED si la DIAN no responde: miPlata reintenta sola);
#   en segundos el webhook invoice.accepted (o GET /invoices/{id} con dian_status ACCEPTED)
Mapa

Qué puedes construir con la API, en una mirada

Seis familias de recursos, un mismo JSON y una misma llave. Cada fila es un caso real que ya corre en producción.

Quieres…LlamadaLo que recibesAviso (webhook)
Facturar una venta desde tu sistemaPOST /invoicesFactura validada por la DIAN: número, CUFE, PDF y XMLinvoice.accepted / invoice.rejected
Facturar a un cliente en el exteriorPOST /invoices con currency: "USD" (o EUR, GBP…)Factura de exportación (02) sin IVA, con la TRM del díainvoice.accepted
Cobrar una factura o una cotizaciónPOST /invoices/{id}/pay-linkURL de pago (Bre-B, Nequi, Daviplata o PayPal) y QRinvoice.paid
Vender desde tu web: cobrar y facturar al pagarPOST /payments/checkouts (pay_and_invoice)URL de cobro con reserva; factura automática al confirmarsecheckout.paid → checkout.invoiced
Registrar un pago en efectivo o transferenciaPOST /invoices/{id}/paymentsRecibo con referencia única; saldo actualizado—
Anular o ajustar una factura aceptadaPOST /invoices con invoice_type 91 / 92Nota crédito o débito referenciada al CUFEcredit_note.accepted / debit_note.accepted
Corregir una factura rechazadaPUT /invoices/{id} con finalize y send_to_dianMismo número, nuevo CUFE, reenvío en la misma llamadainvoice.corrected → invoice.accepted
Emitir 500 facturas de un archivoPOST /invoices/bulkLote con estado por documentoinvoice.* por cada una
Comprar a un no obligado a facturarPOST /soporteDocumento soporte (05) validadoinvoice.accepted
Pagar nóminaPOST /payrollDocumento de nómina (102) con CUNE y PDFinvoice.accepted
Acusar, aceptar o reclamar una factura recibidaPOST /eventsEvento RADIAN firmado con tu certificado—
Saber si la DIAN está caídaGET /invoices/{id} o webhookEstado QUEUED y reintento automático 48 hinvoice.pending_dian → invoice.accepted
Dar acceso a un integrador sin tu llave raízPOST /tokensToken personal con alcance y vencimiento—
Flujos

Tres flujos que resuelven el 90 % de las integraciones

ERP o contable → DIAN

Tu sistema crea el cliente por NIT (PUT /customers/by-nit), envía la factura (POST /invoices) y guarda el CUFE y el PDF que vuelven en la respuesta o por webhook. Las notas crédito referencian el id (un UUID) y avisan con credit_note.*. Un rechazo se corrige con PUT /invoices/{id}. Idempotency-Key evita duplicados ante un reintento.

Web o app → cobro → factura

Reservas la entrada, el cupo o el producto; creas un checkout pay_and_invoice con la reserva como order_reference; rediriges al comprador; al pagar, miPlata factura y te avisa con checkout.invoiced. Si cancela, DELETE y nota crédito automática si ya había factura.

Marketplace o SaaS → tus clientes

Cada cliente tuyo es una instancia con su NIT, su numeración y su certificado. Tu plataforma integra una vez contra la misma API y pide una llave por cliente. La DIAN ve a cada empresa, no a tu plataforma.

Lo que ve el comprador cuando tu sistema llama a POST /invoices/{id}/pay-link: la página de pago en pesos, la de una cotización y la de una factura en USD.
Lo que ve el comprador cuando tu sistema llama a POST /invoices/{id}/pay-link: la página de pago en pesos, la de una cotización y la de una factura en USD.Páginas reales de pago, renderizadas con datos ficticios. Abrir la demo
Qué cubre

Todo el ciclo del documento, no solo la emisión

Documentos

Factura de venta (01), exportación (02), notas crédito y débito (91/92), documento soporte (05) y su nota de ajuste (95), cotizaciones, emisión masiva por lotes y contingencia tipo 04.

Nómina electrónica

Crear, firmar y transmitir documentos de nómina (102) y ajustes (103), consultar estado y PDF.

Clientes y catálogos

Clientes por NIT con validación del dígito de verificación, departamentos y municipios DANE, tipos de documento, medios de pago.

Cobros

Link de pago por factura con Bre-B, Nequi, Daviplata o PayPal; registro de pagos recibidos fuera de la pasarela; checkouts para tiendas con factura automática al pagar.

Recepción y RADIAN

Eventos de acuse, recibo, aceptación y reclamo sobre facturas de compra identificadas por CUFE.

Webhooks y tokens

Eventos invoice.accepted, invoice.rejected, invoice.paid, credit_note.accepted, checkout.paid, checkout.invoiced y más, firmados con HMAC-SHA256 (X-MiPlata-Signature); tokens personales por integración sin compartir la llave raíz.

Configuración → Claves API («Crear clave API»): llaves con IP permitidas, límite por minuto, uso diario y vencimiento.
Configuración → Claves API («Crear clave API»): llaves con IP permitidas, límite por minuto, uso diario y vencimiento.Así se ve en una cuenta real. Esta sección no aparece en la demo pública porque maneja credenciales y datos privados de la empresa.
Configuración → Webhooks: URL, eventos suscritos y el último estado de entrega.
Configuración → Webhooks: URL, eventos suscritos y el último estado de entrega.Así se ve en una cuenta real. Esta sección no aparece en la demo pública porque maneja credenciales y datos privados de la empresa.
Modelo

API bajo tu propio NIT, no bajo el de un proveedor

Con un proveedor tecnológico, la API transmite a la DIAN bajo el Software ID del proveedor. Con miPlata, tu instancia transmite con tu Software ID y tu certificado: en la DIAN el facturador y el software son tu empresa.

Sandbox y producción

Un solo interruptor en Configuración → Entorno cambia toda la instancia: la DIAN de habilitación y los cobros de prueba. Misma llave, mismas rutas. El sandbox no consume cupo.

Cupo y precio

El plan incluye 1.000 documentos incluidos (12 meses) o 250 documentos incluidos (3 meses). 1 envío a la DIAN en producción = 1 documento; un reintento por caída de la DIAN no cuenta. Recargas de 2.000, 12.500 o 27.000 documentos.

Documentación

Referencia completa en /api-docs, también en texto plano (/api-docs.md), JSON y colección Postman. Ejemplos en curl para cada caso: nacional, extranjero, consumidor final, exportación.

Sin código

Si vendes en una tienda online, no necesitas la API

Tiendanube y WooCommerce ya tienen conector (Mercado Libre, próximamente): cada pedido pagado se factura solo y cada devolución genera su nota crédito.

Preguntas frecuentes

Lo que nos preguntan

¿Necesito ser proveedor tecnológico para usar la API?

No. Tu empresa se habilita ante la DIAN con software propio a nombre de su NIT; la API es la de tu propia instancia. No hay un tercero intermedio ni un registro adicional ante la DIAN.

¿La API tiene costo?

Está incluida en el plan con un cupo de documentos: 1.000 documentos incluidos en el Plan 12 Meses y 250 documentos incluidos en el Plan 3 Meses. Sin cargo por llamada. Cuando se agota, compras una recarga (2.000, 12.500 o 27.000 documentos).

¿Hay sandbox?

Sí, gratis e ilimitado. En modo Sandbox la instancia transmite a la DIAN de habilitación (sin validez fiscal) y los cobros usan pasarelas de prueba. Misma llave y mismas rutas que producción.

¿En qué lenguaje están los ejemplos?

curl y JSON en la documentación, utilizable desde cualquier lenguaje. Hay colección Postman y una versión en texto plano pensada para asistentes de código.

¿Cómo me entero de que la DIAN aceptó o rechazó?

Por webhook firmado (invoice.accepted, invoice.rejected, invoice.pending_dian, invoice.contingency_04; las notas crédito con credit_note.*) o consultando GET /invoices/{id}. Los rechazos vienen con el código de regla de la DIAN y su explicación; se corrigen con PUT /invoices/{id} (mismo número, nuevo CUFE).

¿Puedo cobrar la factura desde la API?

Sí. POST /invoices/{id}/pay-link genera un link de pago (Bre-B, Nequi, Daviplata o PayPal); cuando el cliente paga, miPlata deja la factura pagada sola y el webhook invoice.paid te avisa (checkout.paid es solo para los checkouts de POST /payments/checkouts).

Conecta tu sistema a la DIAN en una tarde

Sandbox gratis, documentación en español y soporte por correo. Si prefieres que lo hagamos nosotros, hay paquetes de integración con precio fijo.

Ver la documentación