Docs / Integración / Envío de Documentos

Envío de Documentos

Emite facturas, notas de crédito y débito a través de la API.

⚙
Como cliente emisor no necesitas llamar a este endpoint manualmente: tu ERP o el dashboard lo hacen por ti cuando creas un documento. Si integras por cuenta propia, cámbiate a la vista Desarrollador.

Endpoint

POST /{env}/documentos-ecf

Headers requeridos

HeaderValor
AuthorizationBearer <accessToken>
X-API-KEYecf_sk_...
Content-Typeapplication/json

Ejemplo E31: Factura de Crédito Fiscal

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

Respuesta exitosa

200 OK
{
  "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"
}

Ejemplo E32: Factura de Consumo

Las facturas de consumo (E32) no requieren RNC del comprador:

JSON (body)
{
  "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
        }
      ]
    }
  }
}
💡
Para E32 con 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.

Validar sin enviar

Agrega el parámetro ?validate=true para validar la estructura del documento sin enviarlo a la DGII:

POST /{env}/documentos-ecf?validate=true

La respuesta indica si el documento es válido o lista los errores encontrados.

Estados de documentos

EstadoDescripción
RECIBIDOLa DGII recibió el documento. Aún no procesado.
PROCESANDOLa DGII está validando el documento.
ACEPTADODocumento aprobado por la DGII.
RECHAZADODocumento rechazado. Revisa el mensaje de error.
EN_COLAEl documento está en la cola de envío (aún no enviado a DGII).

Manejo de errores

HTTPTipoDescripción
400ValidaciónCampos faltantes o formato inválido. Revisa error.details.
401AutenticaciónToken expirado o inválido. Refresca el token.
403AutorizaciónAPI Key inválida o tenant inactivo.
409ConflictoeNCF duplicado. El documento ya fue emitido.
429Rate limitDemasiadas peticiones. Espera según Retry-After.
500ServidorError interno. Reintenta con backoff exponencial.