ECF Connector API
Integra tu sistema con la facturación electrónica dominicana (e‑CF) a través de una API REST simple y segura. Firma, envía y consulta comprobantes fiscales electrónicos ante la DGII.
Solicitar tu API KeyDescripción general
El ECF Connector es un módulo desarrollado por RutiversoTech que expone una API REST para crear, firmar y enviar Comprobantes Fiscales Electrónicos (e-CF) a la DGII, directamente desde cualquier sistema externo.
Todos los endpoints tienen el prefijo base:
{URL_proporcionada}/api/ecf
Autenticación
Todos los endpoints requieren un API Key enviada en el encabezado Authorization. La clave se genera automáticamente al crear un conector en el sistema.
Authorization: ECF-{id}-{32_caracteres_aleatorios}
inactive o pending_paid son rechazados en todos los endpoints operativos.Formato de respuesta
Todas las respuestas son JSON con la siguiente estructura estándar:
{
"message": "Descripción del resultado",
"code": 200,
"data": { /* datos específicos del endpoint */ }
}
| Campo | Tipo | Descripción |
|---|---|---|
message | string | Mensaje descriptivo del resultado |
code | integer | Código HTTP de la respuesta (200, 400, 500) |
data | object | array | Payload con los datos de la respuesta |
Códigos de error comunes
| Código | Significado |
|---|---|
200 | Operación exitosa |
400 | Solicitud inválida (parámetros faltantes o incorrectos) |
401 | API Key no válida o conector inactivo |
500 | Error interno del servidor |
Estados ECF
Los comprobantes pasan por los siguientes estados ante la DGII:
El campo ecf_status reporta sent mientras el comprobante está firmado y en cola o ya enviado. El estado interno exacto viene en ecf_status_detail (init = en cola, aún no recibido por la DGII). Consulta /invoice/{id}/status hasta obtener success, conditional o failure.
Tipos de NCF soportados
El prefijo del campo ncf determina automáticamente el tipo de documento y el movimiento contable que se crea.
Endpoints
Verifica que la API Key sea válida y devuelve la información del conector. Úsalo para confirmar la autenticación antes de realizar operaciones.
Encabezados
| Header | Tipo | Descripción | |
|---|---|---|---|
Authorization | string | REQ | API Key del conector |
Respuesta exitosa
{
"message": "Autenticación exitosa",
"code": 200,
"data": {
"client_id": 42,
"client_name": "Mi Empresa S.R.L.",
"state": "active"
}
}
Devuelve todos los impuestos configurados en el sistema. Los IDs obtenidos se usan en el campo tax_ids al crear facturas.
Respuesta exitosa
{
"code": 200,
"data": [
{ "id": 1, "name": "ITBIS 18%", "amount": 18.0, "type_tax_use": "sale" },
{ "id": 2, "name": "ITBIS 16%", "amount": 16.0, "type_tax_use": "sale" },
{ "id": 5, "name": "Exento (0%)", "amount": 0.0, "type_tax_use": "sale" }
]
}
Retorna todos los tipos de documentos fiscales disponibles en el sistema.
Respuesta exitosa
{
"code": 200,
"data": [
{ "id": 10, "name": "Factura de Crédito Fiscal Electrónica", "prefix": "E31" },
{ "id": 11, "name": "Factura de Consumo Electrónica", "prefix": "E32" }
]
}
Busca un tipo de documento específico por su prefijo (ej. E31, E34).
Parámetros de ruta
| Parámetro | Tipo | Descripción | |
|---|---|---|---|
prefix | string | REQ | Prefijo del tipo de NCF (ej. E31) |
GET /api/ecf/type/document/E31
Crea un nuevo cliente en el sistema. Devuelve el id para usarlo como partner_id en futuras facturas.
Body (JSON)
| Campo | Tipo | Descripción | |
|---|---|---|---|
name | string | REQ | Nombre o razón social del cliente |
type_client | string | REQ | Tipo de cliente (ver tipos) |
rnc | string | OPT* | RNC o cédula. Obligatorio para todos salvo non_payer |
Ejemplo de solicitud
{
"name": "Comercial Los Girasoles S.R.L.",
"type_client": "tax_payer",
"rnc": "101234567"
}
Respuesta exitosa
{
"code": 200,
"data": {
"id": 89,
"name": "Comercial Los Girasoles S.R.L.",
"type": "tax_payer",
"rnc": "101234567"
}
}
Endpoint principal. Crea la factura en el sistema, la firma digitalmente con el certificado P12 y responde de inmediato con el QR, la fecha de firma y el código de seguridad. El envío a la DGII se hace en segundo plano (en unos 2 minutos) o en el momento en que consultas /invoice/{id}/status. Para esperar la respuesta de la DGII en la misma llamada envía "wait_dgii": true.
ncf e invoice_date_due (vencimiento de la secuencia e-NCF autorizada por la DGII, no del pago). Para identificar al cliente usa partner_id (ID existente) o la combinación client_name + client_vat.ncf (o el mismo external_ref) recibes la misma factura con "message": "Documento existente", sin duplicarla. Útil para reintentar tras un timeout.Campos comunes
| Campo | Tipo | Descripción | |
|---|---|---|---|
ncf | string | REQ | Número de comprobante fiscal (ej. E310000000001) |
invoice_date_due | string | REQ | Vencimiento de la secuencia e-NCF (YYYY-MM-DD). No es la fecha límite de pago: para ventas a crédito usa payment_due_date |
partner_id | integer | OPT* | ID de cliente existente en el sistema |
client_name | string | OPT* | Nombre del cliente (alternativa a partner_id) |
client_vat | string | OPT | RNC/cédula al usar client_name |
invoice_date | string | OPT | Fecha de emisión (YYYY-MM-DD). Por defecto: hoy |
ref / external_ref | string | OPT | Referencia interna / número de orden. Si se repite, se devuelve la factura existente (no se duplica) |
description | string | OPT | Descripción general del comprobante |
items | array | OPT | Líneas de producto (ver tabla de ítems) |
payment_type | string | OPT | Tipo de pago: "1" contado, "2" crédito, "3" gratuito (ver tabla). Si no se envía: "1" (contado) |
payment_due_date | string | OPT* | Fecha límite de pago (YYYY-MM-DD). Obligatoria si payment_type es "2"; no puede ser anterior a invoice_date. Genera FechaLimitePago en el e-CF |
payment_term | string | OPT | Término de pago, máx. 15 caracteres (ej. "30 dias"). Requiere payment_type. Genera TerminoPago (no aplica a E34 ni E43) |
wait_dgii | boolean | OPT | true envía a la DGII dentro de la misma llamada y espera su respuesta. Por defecto: false (envío en segundo plano) |
Ítems de línea (items[])
| Campo | Tipo | Descripción | |
|---|---|---|---|
name | string | REQ | Descripción del producto o servicio |
quantity | float | REQ | Cantidad |
price_unit | float | REQ | Precio unitario (sin impuestos) |
product_id | integer | OPT | ID del producto en el sistema |
tax_ids | integer[] | OPT | IDs de impuestos a aplicar |
discount | float | OPT | Porcentaje de descuento (0–100) |
E33 — Nota de Débito
| Campo | Tipo | Descripción | |
|---|---|---|---|
ncf_modificate | string | REQ | NCF del documento que se modifica |
modification_code | string | REQ | Código de modificación (ver tabla) |
income_type | string | REQ | Tipo de ingreso (ver tabla) |
base_amount | float | REQ | Monto base a debitar |
tax_ids | integer[] | OPT | Impuestos sobre el monto base |
E34 — Nota de Crédito
| Campo | Tipo | Descripción | |
|---|---|---|---|
ncf_modificate | string | REQ | NCF de la factura original que se anula/modifica |
modification_code | string | REQ | Código de modificación |
base_amount | float | REQ | Monto base a acreditar |
tax_ids | integer[] | OPT | Impuestos a devolver |
E43 — Régimen Especial (compra)
| Campo | Tipo | Descripción | |
|---|---|---|---|
expense_type | string | OPT | Tipo de gasto. Por defecto: "01". Ver tabla |
E31 / E32 / E45 / E46 / E47 — Ventas
| Campo | Tipo | Descripción | |
|---|---|---|---|
income_type | string | OPT | Tipo de ingreso (ver tabla) |
Ejemplo — Factura de venta (E32)
POST /api/ecf/send
Authorization: ECF-5-abc123...
{
"ncf": "E320000000001",
"invoice_date_due": "2026-07-30",
"partner_id": 89,
"income_type": "01",
"items": [
{
"name": "Servicio de consultoría",
"quantity": 1,
"price_unit": 5000.00,
"tax_ids": [1],
"discount": 0
}
]
}
Ejemplo — Factura de crédito fiscal a crédito (E31)
Venta a 30 días: payment_type "2" + payment_due_date. El e-CF sale con TipoPago=2, FechaLimitePago y TerminoPago.
POST /api/ecf/send
Authorization: ECF-5-abc123...
{
"ncf": "E310000000001",
"invoice_date_due": "2028-12-31",
"invoice_date": "2026-09-27",
"partner_id": 89,
"income_type": "01",
"payment_type": "2",
"payment_due_date": "2026-10-27",
"payment_term": "30 dias",
"items": [
{
"name": "Servicio de consultoría",
"quantity": 1,
"price_unit": 5000.00,
"tax_ids": [1]
}
]
}
Ejemplo — Nota de crédito (E34)
POST /api/ecf/send
Authorization: ECF-5-abc123...
{
"ncf": "E340000000001",
"invoice_date_due": "2026-07-30",
"partner_id": 89,
"ncf_modificate": "E320000000001",
"modification_code": "1",
"base_amount": 5000.00,
"tax_ids": [1]
}
Respuesta exitosa
{
"message": "Documento creado correctamente",
"code": 200,
"data": {
"invoice_id": 145,
"invoice_name": "INV/2026/00145",
"partner_id": 89,
"partner_name": "Comercial Los Girasoles S.R.L.",
"ncf": "E310000000001",
"origin_ncf": null,
"ecf_status": "sent",
"ecf_status_detail": "init",
"status_url": "/api/ecf/invoice/145/status",
"fecha_firma": "27-09-2026 10:15:30",
"codigo_seguridad": "Wr3u19",
"qr_link": "https://ecf.dgii.gov.do/...",
"payment_type": "2",
"payment_due_date": "2026-10-27",
"payment_term": "30 dias",
"move_type": "out_invoice",
"amount_untaxed": 5000.00,
"amount_tax": 900.00,
"amount_total": 5900.00
}
}
payment_due_date solo viene en ventas a crédito (null en contado/gratuito). El QR se entrega antes de la aprobación de la DGII: consulta status_url hasta ver success antes de dar la factura por aceptada.
Consulta el estado actual de una factura. Si el comprobante todavía está en cola (ecf_status_detail = init), lo envía a la DGII en ese momento y devuelve el resultado. Devuelve los mismos campos que /send (QR, fecha de firma, tipo de pago, etc.).
Parámetros de ruta
| Parámetro | Tipo | Descripción |
|---|---|---|
id | integer | ID interno de la factura |
{
"code": 200,
"data": {
"invoice_id": 145,
"ncf": "E320000000001",
"ecf_status": "success",
"ecf_status_detail": "success",
"amount_total": 5900.00,
"message_dgii": "Aceptado"
}
}
Lista las facturas creadas por el conector con paginación y filtro opcional por estado.
Query params
| Parámetro | Tipo | Descripción | |
|---|---|---|---|
ecf_status | string | OPT | Filtrar: sent (incluye los que están en cola), success, conditional, failure |
limit | integer | OPT | Registros por página (20–100, por defecto: 20) |
GET /api/ecf/invoices?ecf_status=sent&limit=50
Fuerza una consulta en tiempo real a la DGII para actualizar el estado de la factura. Si todavía está en cola, primero la envía.
Descarga el XML sin firma del comprobante. La respuesta tiene Content-Type: application/xml.
GET /api/ecf/get/145/xml
# Response Content-Type: application/xml
# Body: <?xml version="1.0" ...><ECF>...</ECF>
Tipos de pago
Campo payment_type en /send. Corresponde al elemento TipoPago del e-CF (XSD de la DGII).
| Código | Descripción | Requiere |
|---|---|---|
"1" | Contado (valor por defecto si no se envía) | — |
"2" | Crédito | payment_due_date (genera FechaLimitePago) |
"3" | Gratuito | — |
Códigos de modificación
Usados en E33 (Notas de Débito) y E34 (Notas de Crédito) en el campo modification_code.
| Código | Descripción |
|---|---|
"1" | Anulación de la factura referenciada |
"2" | Corrección de la información de la factura |
"3" | Descuento posterior |
"4" | Devolución de bienes o rescisión de servicios |
"5" | Error en la tasa del ITBIS |
Tipos de ingreso
Campo income_type en comprobantes E31, E32, E33, E45, E46, E47.
| Código | Descripción |
|---|---|
"01" | Ingresos por operaciones (actividad principal) |
"02" | Ingresos financieros |
"03" | Ingresos extraordinarios |
"04" | Ingresos por arrendamientos |
"05" | Ingresos por venta de activos depreciables |
"06" | Otros ingresos |
Tipos de gasto
Campo expense_type en comprobantes E43 (Régimen Especial).
| Código | Descripción |
|---|---|
"01" | Gastos de personal |
"02" | Gastos por trabajo, suministros y servicios |
"03" | Arrendamientos |
"04" | Gastos de activos fijos |
"05" | Representación y otros gastos deducibles |
"06" | Otras deducciones permitidas |
"07" | Gastos computados a tasas especiales |
"08" | Gastos no deducibles |
"09" | Costo de ventas |
"10" | Adquisiciones de activos |
"11" | Gastos de seguro |
Tipos de cliente
Campo type_client en el endpoint POST /new/client.
| Valor | Descripción | RNC requerido |
|---|---|---|
tax_payer | Contribuyente registrado (persona jurídica o natural) | Sí |
non_payer | Consumidor final (sin RNC) | No |
nonprofit | Organización sin fines de lucro | Sí |
special | Régimen tributario especial | Sí |
governmental | Institución gubernamental | Sí |
foreigner | Persona o empresa extranjera | Sí |
Facturación del conector
El conector incluye un sistema de facturación mensual automático para cobrar a los clientes que usan el servicio.
Ciclo de facturación
Un cron job se ejecuta diariamente a las 15:59 UTC. Al llegar al último día del mes, cierra el ciclo activo y genera automáticamente facturas de uso a cada conector activo.
| Campo del modelo | Descripción |
|---|---|
price_by_ncf | Precio a cobrar por cada comprobante emitido |
ncf_count | Cantidad de comprobantes emitidos en el mes actual |
amount_to_paid | Total a cobrar = price_by_ncf × ncf_count |
billing_date | Fecha de inicio del ciclo de facturación |
Estados del conector
| Estado | Descripción | Puede crear facturas |
|---|---|---|
active | Conector operativo | Sí |
inactive | Desactivado manualmente | No |
pending_paid | Pendiente de pago del ciclo anterior | No |
active una vez que se registra el pago correspondiente y se reinicia el ciclo de facturación.¿Listo para integrarte?
Solicita tu API Key y conecta tu sistema con la facturación electrónica dominicana en minutos.
Solicitar tu API Key