Anterior
ECF API Lanzamiento DGII Engineering

Lanzamos ECF SSD API: facturación electrónica DGII como infraestructura, no como tarea

Dawlin Peña
Dawlin Peña
20 de mayo de 2026 8 min de lectura

Por qué construimos otra API de e-CF

Hay docenas de soluciones para facturación electrónica en República Dominicana. Antes de empezar nos hicimos la pregunta honesta: ¿el mundo necesita una más?

La respuesta vino de los clientes. Las empresas con las que trabajamos llegaron diciendo cosas como:

  • “Mi proveedor cobra por documento, y mi volumen lo hace inviable.”
  • “La API que usamos no nos deja firmar localmente; envían el XML sin firmar a su servidor.”
  • “No tengo visibilidad sobre qué pasó cuando un comprobante falla.”
  • “Cada vez que la DGII cambia algo, espero dos semanas a que mi proveedor actualice.”

Lo que faltaba no era una API más. Era una API diseñada para integradores, no para usuarios finales.

Hoy lanzamos públicamente ECF SSD API — la misma que ya está corriendo en producción para varios clientes en banca, retail y manufactura.

Principios de diseño

1. Tú firmas, no nosotros

La firma XAdES-BES se hace donde está tu certificado, no en nuestros servidores. Ofrecemos:

  • SDK que firma localmente con tu certificado P12.
  • Endpoint que recibe el XML ya firmado y solo se encarga del envío a DGII.

¿Por qué importa? Porque tu clave privada nunca debe salir de tu infraestructura. Si un proveedor de e-CF te pide subir tu certificado P12, cámbiate de proveedor.

2. Idempotencia real

Cada operación acepta un Idempotency-Key. Reintenta tres veces si quieres: solo vas a generar un e-CF.

POST /v1/comprobantes
Authorization: Bearer ssd_live_...
Idempotency-Key: 8f3d2c9a-7b1e-4a5f-9d2c-1e8b3f7a9c4d
Content-Type: application/xml

<ECF xmlns="...">...</ECF>

Implementado correctamente: si la primera llamada falla a mitad del camino (después del envío a DGII pero antes de devolverte la respuesta), tu reintento recupera el estado real, no duplica el envío.

3. Observabilidad de extremo a extremo

Cada e-CF tiene un tracking_id que sigue la transacción a través de:

  • Tu envío a SSD.
  • Nuestro envío a la DGII.
  • El acuse (ACECF) de respuesta.
  • Tu webhook de confirmación.
GET /v1/comprobantes/E310000000123/timeline

{
  "tracking_id": "trk_01HXY...",
  "events": [
    { "at": "2026-05-25T10:14:02Z", "type": "received", "duration_ms": 12 },
    { "at": "2026-05-25T10:14:02Z", "type": "signed_locally" },
    { "at": "2026-05-25T10:14:03Z", "type": "submitted_to_dgii", "duration_ms": 847 },
    { "at": "2026-05-25T10:14:04Z", "type": "acecf_received", "result": "ACEPTADO" },
    { "at": "2026-05-25T10:14:04Z", "type": "webhook_delivered", "endpoint": "https://..." }
  ]
}

4. Webhooks con reintentos exponenciales

Cuando llega un acuse de DGII, te notificamos. Si tu endpoint está caído, reintentamos por 24 horas con backoff exponencial. Cada webhook firmado con HMAC-SHA256 para que verifiques la autenticidad.

import { verifyWebhook } from '@ssd/ecf-sdk'

export async function POST(req: Request) {
  const signature = req.headers.get('x-ssd-signature')
  const body = await req.text()

  if (!verifyWebhook(body, signature, process.env.SSD_WEBHOOK_SECRET)) {
    return new Response('Invalid signature', { status: 401 })
  }

  const event = JSON.parse(body)
  // event.type === 'acecf.received'
  // event.data.tracking_id === 'trk_01HXY...'
}

5. Sandbox con paridad real

Nuestro ambiente sandbox apunta a TesteCF de la DGII, no a un mock interno. Cuando emites un e-CF de prueba, pasa por el mismo ciclo que producción — solo que contra el ambiente de pruebas oficial. Si funciona en sandbox, va a funcionar en producción.

Arquitectura por dentro

┌─────────────────┐    XML+P12     ┌──────────────────┐
│ Tu aplicación   │ ──────────────▶ │ SSD SDK          │
│ (ERP, POS, etc.)│                │ (firma local)    │
└─────────────────┘                └────────┬─────────┘
                                            │ XML firmado

                                  ┌──────────────────┐
                                  │ SSD Edge Worker  │
                                  │ (Cloudflare)     │
                                  └────────┬─────────┘
                                           │ HTTPS

                                  ┌──────────────────┐
                                  │ DGII Endpoint    │
                                  │ (Producción o    │
                                  │  TesteCF)        │
                                  └──────────────────┘
  • Edge runtime (Cloudflare Workers): la API vive en 300+ ciudades. Tu llamada va al nodo más cercano, no a un servidor central. Latencia promedio a DGII: <45ms.
  • D1 + R2: guardamos el rastreo y los XML firmados (los originales, no las claves). Retención configurable según tus requisitos de cumplimiento.
  • Cero estado en RAM: cada request es independiente. Si una región se cae, la siguiente toma el tráfico sin pérdida.

Lo que cubre hoy

Tipo de comprobanteSoportado
31 — Factura de Crédito Fiscal Electrónica
32 — Factura de Consumo Electrónica
33 — Nota de Débito Electrónica
34 — Nota de Crédito Electrónica
41 — Compras Electrónica
43 — Gastos Menores Electrónica
44 — Regímenes Especiales
45 — Gubernamental Electrónica
46 — Exportaciones Electrónica
47 — Pagos al Exterior Electrónica
RFCE — Resumen de Comprobantes Emitidos
ARECF — Aprobación Comercial

Precio: por uso, sin sorpresas

Cobramos por comprobante enviado con éxito a DGII. No por intento. No por consulta. No por documento de prueba. Más detalle en la página del producto.

Lo que viene

  • SDKs oficiales: ya está disponible TypeScript/Node. C#/.NET, Python y PHP cierran en el próximo trimestre.
  • Integración Odoo: módulo nativo, sin middleware adicional.
  • Reporte 606 / 607: anexos contables generados desde tu histórico de e-CF.
  • Multi-tenant: para casas de software que quieren ofrecer e-CF a sus clientes sin construir desde cero.

Si quieres credenciales de sandbox, escríbenos. Te respondemos en horas, no en semanas.

El equipo de SSD