Skip to content

Certificación DGI

Esta guía cubre el proceso oficial de la DGI para habilitar la emisión de CFEs en producción.

Inscripción → Certificado Digital → Solicitar CAE → Homologación → Producción

  1. Ingresar a DGI en línea con usuario y contraseña del contribuyente.

  2. Ir a Gestión CFE → Inscripción como Emisor Electrónico.

  3. Completar los datos de la empresa y los tipos de CFE a emitir.

  4. Esperar la aprobación de DGI (generalmente días hábiles).


El certificado debe ser:

  • Formato X.509 en archivo .p12 / .pfx
  • Emitido por una CA reconocida por AGESIC
  • Vinculado al RUT del emisor
ProveedorContacto
ABITABabitab.com.uy
Correo Uruguayocorreo.com.uy
CertiSurcertisur.com
var config = new UruFacturaConfig
{
RutaCertificado = "/ruta/certificado.p12",
PasswordCertificado = Environment.GetEnvironmentVariable("CERT_PASSWORD")!,
// ...
};

  1. Ingresar a DGI en línea → Gestión CFE → Solicitud de CAE.

  2. Seleccionar el tipo de CFE (ej: e-Ticket 101).

  3. Indicar la cantidad de comprobantes necesarios.

  4. DGI devuelve el CAE con número de serie, rango y fecha de vencimiento.

  5. Registrar en el SDK:

    client.Cae.RegistrarCae(new Cae
    {
    NroSerie = "CAE2025001",
    TipoCfe = TipoCfe.ETicket,
    RangoDesde = 1,
    RangoHasta = 1000,
    FechaVencimiento = new DateOnly(2026, 12, 31),
    });

La DGI exige un proceso de homologación antes de habilitar producción. El SDK usa el endpoint de homologación automáticamente con Ambiente.Homologacion.

var config = new UruFacturaConfig
{
// ...
Ambiente = Ambiente.Homologacion, // https://efacturahomologacion.dgi.gub.uy/...
};
  1. Emitir los CFE de prueba requeridos (tipos y cantidades según instructivo DGI):

    var eticket = client.CrearETicket();
    eticket.Numero = 1;
    eticket.Detalle.Add(new LineaDetalle
    {
    NroLinea = 1,
    NombreItem = "Servicio de prueba",
    Cantidad = 1,
    PrecioUnitario = 100m,
    IndFactIva = TipoIva.Basico,
    });
    var respuesta = await client.EnviarCfeAsync(eticket);
    Console.WriteLine(respuesta.Exitoso ? "✅ Aceptado" : $"{respuesta.Mensaje}");
  2. Enviar el Reporte Diario de prueba:

    var resultado = await client.EnviarReporteDiarioAsync(
    DateTime.Today,
    new[] { eticket }
    );
  3. Consultar el estado de cada CFE:

    var estado = await client.ConsultarEstadoCfeAsync(eticket);
    Console.WriteLine($"Estado DGI: {estado.Mensaje}");
  4. Notificar a DGI la finalización de las pruebas vía portal DGI en línea.


Una vez aprobada la homologación por DGI:

var config = new UruFacturaConfig
{
// ...
Ambiente = Ambiente.Produccion, // https://efactura.dgi.gub.uy/...
};

ObligaciónPeriodicidad
Reporte DiarioDiario (obligatorio aunque sea 1 CFE)
Resguardo de XMLConservar 5+ años
Renovar CAEAntes del vencimiento o agotamiento
Renovar certificadoCada 1-3 años (según proveedor)

AmbienteURL
Homologaciónhttps://efacturahomologacion.dgi.gub.uy/ePresentacionSoap/service
Producciónhttps://efactura.dgi.gub.uy/ePresentacionSoap/service

Ejemplo end-to-end de un e-Ticket configurado, firmado, enviado y renderizado como PDF:

// 1. Configurar
var config = new UruFacturaConfig
{
RutEmisor = "210000000012",
RazonSocialEmisor = "Mi Empresa S.A.",
DomicilioFiscal = "Av. 18 de Julio 1234",
Ciudad = "Montevideo",
Departamento = "Montevideo",
Ambiente = Ambiente.Produccion,
RutaCertificado = "/ruta/certificado.p12",
PasswordCertificado = Environment.GetEnvironmentVariable("CERT_PASSWORD")!,
};
using var client = new UruFacturaClient(config);
// 2. Registrar CAE
client.Cae.RegistrarCae(new Cae
{
NroSerie = "CAE2025001",
TipoCfe = TipoCfe.ETicket,
RangoDesde = 1,
RangoHasta = 1000,
FechaVencimiento = new DateOnly(2026, 12, 31),
});
// 3. Crear comprobante
var eticket = client.CrearETicket();
eticket.Numero = 1;
eticket.Detalle.Add(new LineaDetalle
{
NroLinea = 1,
NombreItem = "Servicio de consultoría",
Cantidad = 1,
PrecioUnitario = 5000m,
IndFactIva = TipoIva.Basico,
});
// 4. Calcular, firmar y enviar
eticket.CalcularTotales();
var respuesta = await client.EnviarCfeAsync(eticket);
if (!respuesta.Exitoso)
throw new Exception($"DGI rechazó el CFE: {respuesta.Mensaje}");
// 5. Generar representación impresa
byte[] pdf = client.GenerarPdfA4(eticket);
await File.WriteAllBytesAsync("eticket_001.pdf", pdf);

RecursoEnlace
Portal DGI en líneadgi.gub.uy
Esquemas XML CFEFactura Electrónica — DGI
Instructivo técnicoPortal DGI → Gestión CFE
AGESIC (CAs habilitadas)agesic.gub.uy
Soporte DGIContacto

CódigoSignificado
00✅ Aceptado
01⚠️ Aceptado con observaciones
05❌ Rechazado
06❌ RUT emisor no habilitado
09❌ Número de CAE inválido o vencido
11❌ Error en la firma digital
99❌ Error interno del servidor DGI

Ver Códigos DGI completos para más detalles.