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.
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:
- Obtén una API key de tu empresa con el formato
eck_live_… - POST a
/api/v1/invoices/ingestcon el JSON de la factura - Recibí el
trackIdde 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_xxxxxxxxxxxxxxxxxxxxxxxxxxxAlternativa — 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.
B2B con RNC del comprador (factura clásica con ITBIS).
B2C — consumidor final sin RNC obligatorio.
Aumenta el monto adeudado de un eCF previo.
Reduce / anula un eCF previo.
Registro de compras con retención ITBIS/ISR.
Caja chica, peajes, compras sin RNC del proveedor.
Operaciones exentas de ITBIS (servicios médicos, educación).
Venta a organismos del Estado (DGII, ministerios).
Comprador extranjero, ITBIS 0%, FOB/CIF.
Servicios contratados a proveedor extranjero (retención ISR).
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.
Cliente
POST /invoices/ingest con API key + JSON
API NestJS
Persiste + firma XMLDSIG + encola
Worker
Drena outbox a 4 req/s por empresa
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ódigo | Estado | Significado |
|---|---|---|
| 0 | Aceptado | e-CF válido fiscalmente. Sin observaciones. |
| 2 | Rechazado | DGII no acepta el e-CF. Revisa el detalle en mensajes[]. |
| 3 | En proceso | Asíncrono. El reconciler consulta cada 30s hasta que DGII resuelva. |
| 4 | Aceptado Condicional | Válido pero con observaciones menores. Se trata como ACCEPTED. |
| 75 | NCF E32 ya usado | Para E32, la combinación eNCF + códigoSeguridad ya fue procesada. |
| 145 | Fecha vencimiento inválida | El NCF está fuera del rango autorizado o sequenceExpDate incorrecto. |
| 614 | NCF modificado no existe | Para E33/E34, el modifiedNcf referenciado no está en DGII. |
| 1209 | NCF ya utilizado | Secuencia consumida previamente en DGII. |
| 1934 | Sumatoria MontoGravadoI1 | Observació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.
