Soltryx · DGII Norma 06-18

Documentación e-CF

Emite comprobantes fiscales electrónicos en República Dominicana con una sola llamada HTTP. Soportamos los 10 tipos eCF, firma XMLDSIG, envío automático a DGII y reconciliación asíncrona — todo desde tu sistema.

10
Tipos eCF
99.97%
Tasa éxito DGII
<200ms
Latencia firma
XMLDSIG
Firma fiscal

Introducción

Soltryx e-CF API emite comprobantes fiscales electrónicos (e-CF) en República Dominicana según la Norma DGII 06-18. En una sola llamada HTTP, tu sistema persiste la factura, la firma con XMLDSIG usando el certificado de tu empresa, y la envía a DGII.

Firma fiscal incluida

XMLDSIG con tu certificado PFX por empresa, en cada request.

Asíncrono robusto

Outbox persistente. Si DGII se cae, reintentamos hasta que pase.

Multi-empresa

Una API key por empresa. Scoping fuerte, no se cruzan.

Los 10 tipos eCF

E31, E32, E33, E34, E41, E43, E44, E45, E46, E47 — todos validados en testecf.

Quick Start

Envía tu primera factura en tres pasos:

  1. Obtén una API key de tu empresa con el formato eck_live_…
  2. POST a /api/v1/invoices/ingest con el JSON de la factura
  3. Recibí el trackId de DGII y consulta el estado cuando quieras
curl -X POST https://api.soltryx.com/api/v1/invoices/ingest \
  -H "Authorization: Bearer eck_live_<tu-api-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "ecf": "E310000000001",
    "ecfType": "31",
    "sellerRnc": "000000000",
    "sequenceExpDate": "2028-12-31",
    "issueDate": "2026-05-14T12:00:00",
    "buyerRnc": "000000001",
    "buyerBusinessName": "Empresa Cliente SRL",
    "InvoiceTotalAmount": 1180,
    "TotalTaxedAmount": 180,
    "items": [{
      "lineNumber": 1,
      "itemDescription": "Servicio profesional",
      "serviceInd": "1",
      "itemQuantity": 1,
      "unitPrice": 1000,
      "itemAmount": 1000,
      "TaxTypes": 1
    }],
    "payments": [{ "type": 1, "amount": 1180 }]
  }'

Respuesta esperada

{
  "invoiceId": "a24d02dd-34d5-4909-81e3-ad673752b058",
  "ecfDocument": "E310000000001",
  "status": "SIGNED",
  "outboxId": "4a754eb2-1575-4566-ae10-6c35b5469f7d",
  "message": "Factura ingresada, firmada y encolada para entrega a DGII."
}

El outboxId referencia la cola fiscal. Cuando DGII responda definitivo, podés consultar el estado con GET /api/v1/invoices/:id.

Autenticación

Cada empresa tiene una API key con prefijo eck_live_. Soltryx te la entrega cuando registras tu empresa.

El API acepta dos esquemas equivalentes:

Recomendado — Bearer Token (estándar HTTP):

Authorization: Bearer eck_live_xxxxxxxxxxxxxxxxxxxxxxxxxxx

Alternativa — Header dedicado:

X-API-Key: eck_live_xxxxxxxxxxxxxxxxxxxxxxxxxxx

⚠️ Scoping por empresa

Una API key autoriza UNA empresa específica. El campo sellerRnc del payload debe coincidir con la empresa de la API key. Si no coincide: 403 Forbidden.

Los 10 tipos eCF

Cubrimos los 10 tipos de comprobantes fiscales electrónicos definidos por la Norma DGII 06-18. El builder elige automáticamente el formato XML y el endpoint DGII según ecfType.

📄
E31Crédito Fiscal

B2B con RNC del comprador (factura clásica con ITBIS).

GENERALrequiere sequenceExpDate
🛒
E32Consumo

B2C — consumidor final sin RNC obligatorio.

FC
➕
E33Nota de Débito

Aumenta el monto adeudado de un eCF previo.

GENERALrequiere sequenceExpDate
➖
E34Nota de Crédito

Reduce / anula un eCF previo.

GENERAL
🧾
E41Compras

Registro de compras con retención ITBIS/ISR.

GENERALrequiere sequenceExpDate
💵
E43Gastos Menores

Caja chica, peajes, compras sin RNC del proveedor.

GENERALrequiere sequenceExpDate
🎓
E44Régimen Especial

Operaciones exentas de ITBIS (servicios médicos, educación).

GENERALrequiere sequenceExpDate
🏛️
E45Gubernamental

Venta a organismos del Estado (DGII, ministerios).

GENERALrequiere sequenceExpDate
🚢
E46Exportaciones

Comprador extranjero, ITBIS 0%, FOB/CIF.

GENERALrequiere sequenceExpDate
🌍
E47Pagos al Exterior

Servicios contratados a proveedor extranjero (retención ISR).

GENERALrequiere sequenceExpDate

Flujo de envío

El endpoint /invoices/ingest es síncrono para vos pero asíncrono hacia DGII. Apenas firmamos, recibís 200 OK. El worker drena la cola hacia DGII en background con rate-limit y reintentos.

1

Cliente

POST /invoices/ingest con API key + JSON

2

API NestJS

Persiste + firma XMLDSIG + encola

3

Worker

Drena outbox a 4 req/s por empresa

4

DGII

Recibe XML, asigna trackId, valida

Si DGII está lento o caído, las facturas quedan en la outbox y se reintentan automáticamente con backoff exponencial. Cuando DGII responda definitivo, el reconciler actualiza el estado de la factura a ACCEPTED o REJECTED.

Códigos DGII

Cuando DGII responde, el campo codigo indica el resultado. Para errores, el array mensajes[] da el detalle:

CódigoEstadoSignificado
0Aceptadoe-CF válido fiscalmente. Sin observaciones.
2RechazadoDGII no acepta el e-CF. Revisa el detalle en mensajes[].
3En procesoAsíncrono. El reconciler consulta cada 30s hasta que DGII resuelva.
4Aceptado CondicionalVálido pero con observaciones menores. Se trata como ACCEPTED.
75NCF E32 ya usadoPara E32, la combinación eNCF + códigoSeguridad ya fue procesada.
145Fecha vencimiento inválidaEl NCF está fuera del rango autorizado o sequenceExpDate incorrecto.
614NCF modificado no existePara E33/E34, el modifiedNcf referenciado no está en DGII.
1209NCF ya utilizadoSecuencia consumida previamente en DGII.
1934Sumatoria MontoGravadoI1Observación: el monto gravado en encabezado no coincide al céntimo con la suma de items.

Ejemplos por tipo

JSON minimal para los tipos más comunes con bloques especiales:

E33 — Nota de Débito

{
  "ecf": "E330000000001",
  "ecfType": "33",
  "sellerRnc": "000000000",
  "sequenceExpDate": "2028-12-31",
  "issueDate": "2026-05-14T12:00:00",
  "buyerRnc": "000000001",
  "modifiedNcf": "E310000001234",
  "modifDateNcf": "2026-04-15",
  "modifReasonId": 3,
  "modifReasonDesc": "Recargo por intereses de mora",
  "InvoiceTotalAmount": 118,
  "TotalTaxedAmount": 18,
  "items": [{
    "lineNumber": 1,
    "itemDescription": "Intereses de mora",
    "serviceInd": "1",
    "itemQuantity": 1,
    "unitPrice": 100,
    "itemAmount": 100,
    "TaxTypes": 1
  }],
  "payments": [{ "type": 1, "amount": 118 }]
}

E34 — Nota de Crédito

{
  "ecf": "E340000000001",
  "ecfType": "34",
  "sellerRnc": "000000000",
  "creditNoteInd": 0,
  "issueDate": "2026-05-14T12:00:00",
  "buyerRnc": "000000001",
  "modifiedNcf": "E310000001234",
  "modifDateNcf": "2026-04-15",
  "modifReasonId": 1,
  "modifReasonDesc": "Anulación por devolución",
  "InvoiceTotalAmount": 1180,
  "TotalTaxedAmount": 180,
  "items": [{
    "lineNumber": 1,
    "itemDescription": "Devolución servicio E310000001234",
    "serviceInd": "1",
    "itemQuantity": 1,
    "unitPrice": 1000,
    "itemAmount": 1000,
    "TaxTypes": 1
  }],
  "payments": [{ "type": 1, "amount": 1180 }]
}

E46 — Exportaciones

{
  "ecf": "E460000000001",
  "ecfType": "46",
  "sellerRnc": "000000000",
  "sequenceExpDate": "2028-12-31",
  "issueDate": "2026-05-14T12:00:00",
  "foreignBuyer": {
    "identifier": "P-12345678",
    "legalName": "ACME GLOBAL CORP",
    "countryCode": "USA"
  },
  "exportInfo": {
    "conditions": "FOB",
    "fobTotal": 5000,
    "insurance": 100,
    "freight": 250,
    "cifTotal": 5350,
    "destinationCountry": "USA"
  },
  "InvoiceTotalAmount": 5350,
  "TotalTaxedAmount": 0,
  "items": [{
    "lineNumber": 1,
    "itemDescription": "Producto exportado",
    "serviceInd": "2",
    "itemQuantity": 1,
    "unitPrice": 5000,
    "itemAmount": 5000,
    "TaxTypes": 3
  }],
  "payments": [{ "type": 1, "amount": 5350 }]
}

Los tipos restantes (E31, E32, E41, E43, E44, E45, E47) siguen la misma estructura de POST /invoices/ingest: cambia el ecfType y los bloques propios de cada uno.

Obtener API key

¿Listo para emitir?

Iniciá sesión con tu cuenta Soltryx y generá API keys desde el panel de tu empresa. Si todavía no tenés cuenta, contactá soporte y te ayudamos con el onboarding.