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();