Primeros pasos
Esta guía te lleva de cero a tu primera emisión aceptada por DGII en ~5 minutos, asumiendo que ya cumples los pre-requisitos.
Pre-requisitos
Antes de usar la API necesitas:
- Ser Emisor Electrónico certificado por DGII. Si todavía no lo eres, el portal fe-portal.appworkcloud.com (opens in a new tab) tiene una guía paso a paso gratuita que te acompaña hasta la aprobación. El proceso suele tomar pocas semanas dependiendo de DGII.
- Tu certificado digital
.p12subido al portal. El certificado NO lo emite DGII: lo solicita el representante legal de la empresa (o un usuario a nombre de uno de sus representantes legales) ante una de las entidades de certificación autorizadas por INDOTEL — por ejemplo la Cámara de Comercio (Digifirma). - Una cuenta activa en el portal (fe-portal.appworkcloud.com (opens in a new tab)) con permisos de administrador.
- Tu RNC y datos fiscales configurados en el portal.
- Tus secuencias NCF asignadas y vigentes para los prefijos que vayas a emitir (E31, E32, E33, E34, etc.).
Sin la certificación de Emisor Electrónico, DGII rechaza cualquier e-CF a nombre de tu RNC — sin importar que el proveedor técnico (nosotros) esté correctamente certificado. Es un requisito legal del lado del contribuyente.
Crea tu cuenta y activa el API en el portal
Todo el proceso se hace desde el portal de Facturación Electrónica, sin necesidad de usar Digimart:
- Entra a fe-portal.appworkcloud.com (opens in a new tab) y crea tu cuenta.
- Configura tu empresa (o empresas): RNC, datos fiscales y certificado
digital
.p12. - Certifica cada empresa como Emisor Electrónico ante DGII siguiendo la guía del portal.
- Activa el API de Facturación Electrónica desde el mismo portal, lee el acuerdo de cobros automáticos y márcalo.
- Opcional: agrega un correo de contacto técnico para notificaciones operativas.
A partir de ese momento tu cuenta queda lista para generar API keys y emitir.
Genera tu primera API key
En el mismo panel:
- Click en "Nueva API key".
- Asigna un nombre descriptivo (ej. "Servidor de producción").
- Elige el ambiente:
- Producción (
ecf) → emite e-CFs reales facturables. - Certificación (
certecf) → pruebas oficiales DGII, gratis. - Pruebas (
testecf) → desarrollo libre, gratis.
- Producción (
- Click en "Crear".
El apiSecret se muestra UNA sola vez. Guárdalo inmediatamente en un
gestor de contraseñas o variable de entorno. Si lo pierdes, deberás revocar
la key y crear una nueva.
Intercambia tus credenciales por un JWT
curl -X POST https://digimart-api-v2.appworkcloud.com/api/v1/fe/login \
-H "Content-Type: application/json" \
-d '{
"apiKeyId": "fak_a1b2c3d4e5f6",
"apiSecret": "tu_secret_aqui"
}'Respuesta:
{
"accessToken": "eyJhbGciOiJIUzI1NiIs...",
"tokenType": "Bearer",
"expiresIn": 3600,
"environment": "ecf",
"scopes": ["invoices:write", "invoices:read", "usage:read", "billing:read"]
}El JWT dura 1 hora. Vuelve a hacer POST /login cuando expire.
Emite tu primer e-CF
curl -X POST https://digimart-api-v2.appworkcloud.com/api/v1/fe/invoices \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"format": "digimart",
"clientRequestId": "factura-001-2026-06-15",
"payload": {
"Encabezado": {
"Version": "1.0",
"IdDoc": {
"eNCF": "E310000000001",
"IndicadorMontoGravado": "0",
"TipoIngresos": "01",
"TipoPago": "1"
},
"Comprador": {
"RNCComprador": "101672919",
"RazonSocialComprador": "Cliente B2B SRL"
}
},
"DetallesItems": {
"Item": [{
"NumeroLinea": 1,
"IndicadorFacturacion": "1",
"NombreItem": "Servicio profesional",
"CantidadItem": 1,
"PrecioUnitarioItem": 10000,
"MontoItem": 10000
}]
}
}
}'¿Notaste lo que NO está en el payload? No mandamos TipoeCF,
FechaVencimientoSecuencia, Emisor ni Totales — los rellenamos
por ti del tenant y los items. Si prefieres mandar el shape completo
tal cual lo espera DGII (control total), también funciona — solo
agrega esos 4 campos y los respetamos. Más detalles en
POST /invoices →.
Respuesta inmediata (202):
{
"dgiiLogId": "a3f...",
"status": "queued",
"environment": "ecf",
"billable": true,
"message": "Invoice queued for processing"
}El clientRequestId es opcional pero recomendado — si reintentas la
misma request con el mismo id, devolvemos el envío existente en vez de
duplicar.
Consulta el estado
DGII responde típicamente en 1-3 segundos. Consulta el estado:
curl https://digimart-api-v2.appworkcloud.com/api/v1/fe/invoices/a3f... \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Respuesta cuando DGII ya respondió:
{
"dgiiLogId": "a3f...",
"trackId": "DGII-2026-06-15-...",
"environment": "ecf",
"status": "Aceptado",
"qrCodeUrl": "https://ecf.dgii.gov.do/...",
"securityCode": "abc123",
"ncfExpiration": "31-12-2026",
"fechaHoraFirma": "2026-06-15T14:23:11Z",
"submittedAt": "2026-06-15T14:23:10Z",
"updatedAt": "2026-06-15T14:23:13Z"
}status: "Aceptado" significa que DGII aceptó tu e-CF. Eres oficialmente
emisor. 🎉
¿Qué sigue?
- Autenticación → — Detalles del JWT, rotación de secrets, scopes.
- Endpoints → — Referencia completa de cada endpoint con todos los campos opcionales.
- Códigos de error → — Qué hacer cuando algo sale mal.
- Ejemplos completos → — Snippets para integraciones reales.