Emite facturas, notas de crédito y débito a través de la API.
/{env}/documentos-ecf
| Header | Valor |
|---|---|
Authorization | Bearer <accessToken> |
X-API-KEY | ecf_sk_... |
Content-Type | application/json |
curl -X POST https://ecf.frandeone.com/TesteCF/documentos-ecf \
-H "Authorization: Bearer eyJhbGci..." \
-H "X-API-KEY: ecf_sk_a1b2c3..." \
-H "Content-Type: application/json" \
-d '{
"ECF": {
"Encabezado": {
"Version": "1.0",
"IdDoc": {
"TipoeCF": 31,
"TipoIngresos": "01",
"TipoPago": 1
},
"Emisor": {
"RNCEmisor": "131880657",
"RazonSocialEmisor": "Frande Connection SRL",
"DireccionEmisor": "Calle Principal #123, Santiago",
"FechaEmision": "15-04-2026T10:30:00"
},
"Comprador": {
"RNCComprador": "101123456",
"RazonSocialComprador": "Empresa Compradora SRL"
},
"Totales": {
"MontoGravadoTotal": 10000.00,
"MontoGravadoI1": 10000.00,
"TotalITBIS": 1800.00,
"ITBIS1": 1800.00,
"MontoTotal": 11800.00
}
},
"DetallesItems": {
"Item": [
{
"NumeroLinea": 1,
"IndicadorFacturacion": 1,
"NombreItem": "Servicio de consultoria",
"IndicadorBienOServicio": 2,
"CantidadItem": 1,
"PrecioUnitarioItem": 10000.00,
"MontoItem": 10000.00
}
]
}
}
}'
const document = {
ECF: {
Encabezado: {
Version: "1.0",
IdDoc: {
TipoeCF: 31,
TipoIngresos: "01",
TipoPago: 1
},
Emisor: {
RNCEmisor: "131880657",
RazonSocialEmisor: "Frande Connection SRL",
DireccionEmisor: "Calle Principal #123, Santiago",
FechaEmision: "15-04-2026T10:30:00"
},
Comprador: {
RNCComprador: "101123456",
RazonSocialComprador: "Empresa Compradora SRL"
},
Totales: {
MontoGravadoTotal: 10000.00,
MontoGravadoI1: 10000.00,
TotalITBIS: 1800.00,
ITBIS1: 1800.00,
MontoTotal: 11800.00
}
},
DetallesItems: {
Item: [{
NumeroLinea: 1,
IndicadorFacturacion: 1,
NombreItem: "Servicio de consultoria",
IndicadorBienOServicio: 2,
CantidadItem: 1,
PrecioUnitarioItem: 10000.00,
MontoItem: 10000.00
}]
}
}
};
const response = await fetch('https://ecf.frandeone.com/TesteCF/documentos-ecf', {
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'X-API-KEY': 'ecf_sk_a1b2c3...',
'Content-Type': 'application/json'
},
body: JSON.stringify(document)
});
const result = await response.json();
console.log(result.data.encf); // E310000000001
console.log(result.data.trackId); // UUID de rastreo DGII
$document = [
'ECF' => [
'Encabezado' => [
'Version' => '1.0',
'IdDoc' => [
'TipoeCF' => 31,
'TipoIngresos' => '01',
'TipoPago' => 1
],
'Emisor' => [
'RNCEmisor' => '131880657',
'RazonSocialEmisor' => 'Frande Connection SRL',
'DireccionEmisor' => 'Calle Principal #123, Santiago',
'FechaEmision' => '15-04-2026T10:30:00'
],
'Comprador' => [
'RNCComprador' => '101123456',
'RazonSocialComprador' => 'Empresa Compradora SRL'
],
'Totales' => [
'MontoGravadoTotal' => 10000.00,
'MontoGravadoI1' => 10000.00,
'TotalITBIS' => 1800.00,
'ITBIS1' => 1800.00,
'MontoTotal' => 11800.00
]
],
'DetallesItems' => [
'Item' => [[
'NumeroLinea' => 1,
'IndicadorFacturacion' => 1,
'NombreItem' => 'Servicio de consultoria',
'IndicadorBienOServicio' => 2,
'CantidadItem' => 1,
'PrecioUnitarioItem' => 10000.00,
'MontoItem' => 10000.00
]]
]
]
];
$ch = curl_init('https://ecf.frandeone.com/TesteCF/documentos-ecf');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
"Authorization: Bearer {$accessToken}",
'X-API-KEY: ecf_sk_a1b2c3...'
],
CURLOPT_POSTFIELDS => json_encode($document)
]);
$response = json_decode(curl_exec($ch), true);
echo $response['data']['encf']; // E310000000001
echo $response['data']['trackId']; // UUID
curl_close($ch);
var document = new {
ECF = new {
Encabezado = new {
Version = "1.0",
IdDoc = new { TipoeCF = 31, TipoIngresos = "01", TipoPago = 1 },
Emisor = new {
RNCEmisor = "131880657",
RazonSocialEmisor = "Frande Connection SRL",
DireccionEmisor = "Calle Principal #123, Santiago",
FechaEmision = "15-04-2026T10:30:00"
},
Comprador = new {
RNCComprador = "101123456",
RazonSocialComprador = "Empresa Compradora SRL"
},
Totales = new {
MontoGravadoTotal = 10000.00m,
MontoGravadoI1 = 10000.00m,
TotalITBIS = 1800.00m,
ITBIS1 = 1800.00m,
MontoTotal = 11800.00m
}
},
DetallesItems = new {
Item = new[] {
new {
NumeroLinea = 1,
IndicadorFacturacion = 1,
NombreItem = "Servicio de consultoria",
IndicadorBienOServicio = 2,
CantidadItem = 1,
PrecioUnitarioItem = 10000.00m,
MontoItem = 10000.00m
}
}
}
}
};
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {accessToken}");
client.DefaultRequestHeaders.Add("X-API-KEY", "ecf_sk_a1b2c3...");
var json = JsonSerializer.Serialize(document);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync(
"https://ecf.frandeone.com/TesteCF/documentos-ecf", content);
var result = await response.Content.ReadAsStringAsync();
{
"success": true,
"data": {
"rnc": "131880657",
"encf": "E310000000001",
"internalTrackId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"securityCode": "AB12CD",
"signedDate": "2026-04-15T10:30:00Z",
"qr_url": "https://ecf.dgii.gov.do/ecf/...",
"estado": "RECIBIDO"
},
"requestId": "req_xyz789"
}
Las facturas de consumo (E32) no requieren RNC del comprador:
{
"ECF": {
"Encabezado": {
"Version": "1.0",
"IdDoc": {
"TipoeCF": 32,
"TipoIngresos": "01",
"TipoPago": 1
},
"Emisor": {
"RNCEmisor": "131880657",
"RazonSocialEmisor": "Frande Connection SRL",
"DireccionEmisor": "Calle Principal #123, Santiago",
"FechaEmision": "15-04-2026T11:00:00"
},
"Totales": {
"MontoGravadoTotal": 500.00,
"MontoGravadoI1": 500.00,
"TotalITBIS": 90.00,
"ITBIS1": 90.00,
"MontoTotal": 590.00
}
},
"DetallesItems": {
"Item": [
{
"NumeroLinea": 1,
"IndicadorFacturacion": 1,
"NombreItem": "Producto de consumo",
"IndicadorBienOServicio": 1,
"CantidadItem": 2,
"PrecioUnitarioItem": 250.00,
"MontoItem": 500.00
}
]
}
}
}
MontoTotal < 250,000 RD$, la API genera automáticamente el RFCE (Resumen de Factura de Consumo Electrónico) y lo envía a la DGII.Agrega el parámetro ?validate=true para validar la estructura del documento sin enviarlo a la DGII:
/{env}/documentos-ecf?validate=true
La respuesta indica si el documento es válido o lista los errores encontrados.
| Estado | Descripción |
|---|---|
RECIBIDO | La DGII recibió el documento. Aún no procesado. |
PROCESANDO | La DGII está validando el documento. |
ACEPTADO | Documento aprobado por la DGII. |
RECHAZADO | Documento rechazado. Revisa el mensaje de error. |
EN_COLA | El documento está en la cola de envío (aún no enviado a DGII). |
| HTTP | Tipo | Descripción |
|---|---|---|
400 | Validación | Campos faltantes o formato inválido. Revisa error.details. |
401 | Autenticación | Token expirado o inválido. Refresca el token. |
403 | Autorización | API Key inválida o tenant inactivo. |
409 | Conflicto | eNCF duplicado. El documento ya fue emitido. |
429 | Rate limit | Demasiadas peticiones. Espera según Retry-After. |
500 | Servidor | Error interno. Reintenta con backoff exponencial. |