Documentación Datcor e-CF API

API REST para integrar sistemas POS, ERP, Ecommerce y plataformas SaaS con la Facturación Electrónica DGII en República Dominicana.

URL Base

https://sandbox.datcorapp.com

Autenticación

La API utiliza autenticación mediante API KEY enviada como Bearer Token.

Authorization: Bearer TU_API_KEY
Content-Type: application/json
Accept: application/json

Endpoint principal

POST /api/ecf/issue

Primer e-CF en 5 minutos

Para emitir tu primer comprobante electrónico, necesitas una API Key activa, un eNCF válido y un JSON con los datos mínimos del documento.

1. Obtén tu API Key

Solicita una clave de acceso para sandbox o producción.

2. Prepara el JSON

Incluye tipo_ecf, encf, items y totales fiscales.

3. Envía el documento

Realiza un POST al endpoint principal y guarda la respuesta.

Consideraciones importantes

El ambiente no se envía por JSON

El ambiente se controla internamente según la API Key. No envíes el campo environment en el payload.

El eNCF debe coincidir

El eNCF debe corresponder al tipo_ecf enviado. Ejemplo: tipo_ecf 32 debe usar E32.

No reutilizar eNCF aceptados

No reenvíes comprobantes ya aceptados o con trazabilidad fiscal.

Tipos de e-CF soportados

Tipo Descripción
31 Factura Crédito Fiscal Electrónica
32 Factura Consumidor Final Electrónica
33 Nota de Débito Electrónica
34 Nota de Crédito Electrónica
41 Compras Proveedor Informal Electrónica
43 Gastos Menores Electrónico
44 Régimen Especial Electrónico
45 Factura Gubernamental Electrónica
46 Exportación Electrónica
47 Pago al Exterior Electrónico

Request JSON oficial

El ambiente no debe enviarse en el JSON. Se controla internamente según la API Key.

{
  "tipo_ecf": "32",
  "encf": "E320000000001",
  "fecha_emision": "2026-05-24",
  "emisor": {
    "rnc": "133673632",
    "razon_social": "DATCOR SRL",
    "nombre_comercial": "DATCOR",
    "direccion": "Santo Domingo"
  },
  "comprador": {
    "rnc": "101010101",
    "razon_social": "CLIENTE SRL",
    "direccion": "Santo Domingo"
  },
  "items": [
    {
      "codigo": "P001",
      "descripcion": "Laptop Dell",
      "bien_o_servicio": "1",
      "cantidad": 1,
      "precio_unitario": 1000,
      "descuento_monto": 0,
      "monto_item": 1180,
      "itbis": 180
    }
  ],
  "totales": {
    "monto_gravado_total": 1000,
    "monto_gravado_i1": 1000,
    "monto_exento": 0,
    "total_itbis": 180,
    "total_itbis1": 180,
    "monto_total": 1180
  }
}

Responses

HTTP 202 — Documento aceptado para procesamiento

{
  "Satisfactorio": true,
  "CodigoSeguridad": null,
  "CodigoQR": null,
  "LinkApiQR": null,
  "LinkApiPDF": null,
  "LinkApiXML": null,
  "TrackId": "TRACK_ID",
  "ENCF": "E320000000001",
  "Estado": "processing",
  "IdempotentReplay": false
}

HTTP 422 — Error de validación

{
  "Satisfactorio": false,
  "Estado": "validation_error",
  "Mensajes": "El e-CF no fue enviado a DGII porque falló una validación local.",
  "Errores": {
    "encf": [
      "El eNCF E320000000001 no corresponde al tipo_ecf 31."
    ]
  }
}

Estados posibles

Estado Descripción
processing Procesando
accepted Aceptado por DGII
rejected Rechazado
validation_error Error de validación local
error Error técnico

Buenas prácticas recomendadas

Guardar trazabilidad

Guarda el JSON enviado, response recibido, eNCF, fecha, hora y logs del sistema.

Validar antes de enviar

Verifica montos, tipo_ecf, eNCF, ITBIS, retenciones y datos del comprador.

No duplicar eNCF

No reenvíes comprobantes ya aceptados o con TrackId registrado.

Soporte técnico

Al reportar una incidencia, envía la siguiente información:

Datos del documento

eNCF, tipo_ecf, fecha y hora del envío.

Payload y respuesta

JSON enviado y response completo recibido desde la API.

Logs

Mensajes de error, código HTTP y cualquier log generado por tu sistema.

Ejemplo cURL

curl --location 'https://sandbox.datcorapp.com/api/ecf/issue' \
--header 'Authorization: Bearer TU_API_KEY' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data '{
  "tipo_ecf": "32",
  "encf": "E320000000001",
  "fecha_emision": "2026-05-24",
  "items": [
    {
      "descripcion": "Producto Demo",
      "cantidad": 1,
      "precio_unitario": 1000,
      "monto_item": 1180,
      "itbis": 180
    }
  ],
  "totales": {
    "monto_gravado_total": 1000,
    "total_itbis": 180,
    "monto_total": 1180
  }
}'

Ejemplo PHP Laravel

use Illuminate\Support\Facades\Http;

$payload = [
    'tipo_ecf' => '32',
    'encf' => 'E320000000001',
    'fecha_emision' => now()->format('Y-m-d'),
    'items' => [
        [
            'descripcion' => 'Producto Demo',
            'cantidad' => 1,
            'precio_unitario' => 1000,
            'monto_item' => 1180,
            'itbis' => 180,
        ]
    ],
    'totales' => [
        'monto_gravado_total' => 1000,
        'total_itbis' => 180,
        'monto_total' => 1180,
    ]
];

$response = Http::withHeaders([
    'Authorization' => 'Bearer TU_API_KEY',
    'Accept' => 'application/json'
])->post(
    'https://sandbox.datcorapp.com/api/ecf/issue',
    $payload
);

$data = $response->json();

Ejemplo C# .NET

using System.Net.Http;
using System.Text;
using Newtonsoft.Json;

var payload = new
{
    tipo_ecf = "32",
    encf = "E320000000001",
    fecha_emision = "2026-05-24"
};

var client = new HttpClient();

client.DefaultRequestHeaders.Add(
    "Authorization",
    "Bearer TU_API_KEY"
);

var json = JsonConvert.SerializeObject(payload);

var content = new StringContent(
    json,
    Encoding.UTF8,
    "application/json"
);

var response = await client.PostAsync(
    "https://sandbox.datcorapp.com/api/ecf/issue",
    content
);

var result = await response.Content.ReadAsStringAsync();
¿Necesitas ayuda?