Inicio rápido
Cuatro pasos para emitir tu primer e-CF. Los ejemplos usan curl; en la Referencia API tienes el código en C#, JavaScript, Python y otros lenguajes.
1. Obtén un token
- cURL
- C#
- JavaScript
curl -X POST https://sender.emitexrd.com/api/v1/Auth/login \
-H "Content-Type: application/json" \
-d '{ "usuario": "erp-miempresa", "clave": "TU_CONTRASENA", "rnc": "131000001" }'
using var http = new HttpClient { BaseAddress = new Uri("https://sender.emitexrd.com") };
var login = await http.PostAsJsonAsync("/api/v1/Auth/login",
new { usuario = "erp-miempresa", clave = "TU_CONTRASENA", rnc = "131000001" });
login.EnsureSuccessStatusCode();
var token = (await login.Content.ReadFromJsonAsync<JsonElement>()).GetProperty("token").GetString();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
const res = await fetch("https://sender.emitexrd.com/api/v1/Auth/login", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ usuario: "erp-miempresa", clave: "TU_CONTRASENA", rnc: "131000001" }),
});
const { token } = await res.json();
Respuesta:
{ "token": "eyJhbGciOi...", "fechaExpiracion": "2026-10-05T16:32:10Z", "codigo": 200, "mensaje": "Inicio de sesión exitoso." }
El token dura 120 minutos. Guárdalo y reutilízalo; pide uno nuevo solo cuando venza. Ver Autenticación.
2. Valida el comprobante (sin enviarlo)
validate ejecuta todas las validaciones y no envía nada a la DGII ni consume el e-NCF. Úsalo mientras desarrollas.
curl -X POST https://sender.emitexrd.com/api/v1/dgii-ecf/validate/0 \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d @factura.json
0 en la ruta significa "la empresa de mi credencial". Un factura.json de crédito fiscal (tipo 31):
factura.json
{
"ECF": {
"Encabezado": {
"Version": "1.0",
"IdDoc": {
"TipoeCF": 31,
"eNCF": "E310000000001",
"FechaVencimientoSecuencia": "31-12-2027",
"IndicadorMontoGravado": 0,
"TipoIngreso": "01",
"TipoPago": 1,
"TablaFormasPago": {
"FormasDePago": [{ "FormaPago": 1, "MontoPago": 1180.00 }]
}
},
"Emisor": {
"RNCEmisor": "131000001",
"RazonSocialEmisor": "Mi Empresa SRL",
"DireccionEmisor": "Av. Winston Churchill 100, Santo Domingo",
"FechaEmision": "05-10-2026",
"NumeroFacturaInterna": "FAC-1001"
},
"Comprador": {
"RNCComprador": "101010101",
"RazonSocialComprador": "Cliente Ejemplo SRL",
},
"Totales": {
"MontoGravadoTotal": 1000.00,
"MontoGravadoI1": 1000.00,
"ITBIS1": 18,
"TotalITBIS": 180.00,
"TotalITBIS1": 180.00,
"MontoTotal": 1180.00
}
},
"DetallesItems": {
"Item": [
{
"NumeroLinea": 1,
"IndicadorFacturacion": 1,
"NombreItem": "Servicio de consultoría",
"IndicadorBienoServicio": 2,
"CantidadItem": 1,
"PrecioUnitarioItem": 1000.00,
"MontoItem": 1000.00
}
]
}
}
}
Respuesta (siempre 200: mira data.valido):
{ "codigo": 200, "mensaje": "El comprobante pasó todas las validaciones locales.", "procesado": true,
"data": { "valido": true, "errores": [], "xml": "<ECF>...</ECF>" } }
3. Envíalo a la DGII
Mismo cuerpo, endpoint send:
curl -X POST "https://sender.emitexrd.com/api/v1/dgii-ecf/send/0?waitForFinal=10s" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "X-Correlation-Id: FAC-1001" \
-d @factura.json
{ "codigo": 200, "mensaje": "Documento procesado correctamente", "procesado": true,
"data": { "ecf": "E310000000001", "accepted": 1, "status": "Aceptado",
"securityCode": "A1b2C3", "trackId": "...", "alreadyProcessed": false } }
4. Consulta su estado
Si data.accepted llegó en null (la DGII aún no da el estado final):
curl https://sender.emitexrd.com/api/v1/dgii-ecf/document-status/131000001/E310000000001 \
-H "Authorization: Bearer $TOKEN"
Ver Flujo de emisión para el detalle de estados, reintentos e idempotencia.