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
Proveedor Contacto
ABITAB abitab.com.uy
Correo Uruguayo correo.com.uy
CertiSur certisur.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 su número de autorización, serie, rango y fecha de vencimiento.

  5. Registrar en el SDK:

    await client.RegistrarCaeAsync(new Cae
    {
    NumeroAutorizacion = "90110001945", // CAE_ID entregado por la DGI
    TipoCfe = TipoCfe.ETicket,
    Serie = "A",
    RangoDesde = 1,
    RangoHasta = 1000,
    FechaVencimiento = new DateOnly(2027, 12, 31),
    });

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

var config = new UruFacturaConfig
{
// ...
Ambiente = Ambiente.Homologacion, // servicios de prueba de la DGI (puertos 6443 / 6460)
};
  1. Emitir los CFE de prueba requeridos (tipos y cantidades según instructivo DGI):

    var eticket = await client.EmitirAsync(new Cfe(TipoCfe.ETicket)
    {
    Detalle = [new LineaDetalle { NombreItem = "Servicio de prueba", Cantidad = 1, PrecioUnitario = 100m }],
    });
    var acuse = await client.EnviarAsync(eticket);
    Console.WriteLine(acuse.Recibido ? "✅ Sobre recibido (consultar el estado del CFE)" : $"❌ {acuse.Mensaje}");
  2. Enviar el Reporte Diario de prueba:

    // Resume los CFE emitidos en la fecha (de Uruguay, no la del servidor)
    var reporte = await client.EnviarReporteDiarioAsync(HoraUruguay.Hoy());
  3. Consultar el estado de cada CFE:

    await client.ConsultarEnvioAsync(acuse); // o client.ConsultarCfeAsync(eticket)
    Console.WriteLine($"Estado DGI: {eticket.EstadoDgi} {eticket.MensajeDgi}");
  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,
// En Producción no hay URL por defecto: usá las que entrega la DGI al habilitar el ambiente
UrlEnvio = "https://…/ws_efactura",
UrlConsultas = "https://…/ws_consultas",
};

Obligación Periodicidad
Reporte Diario Diario (obligatorio aunque sea 1 CFE)
Resguardo de XML Conservar 5+ años
Renovar CAE Antes del vencimiento o agotamiento
Renovar certificado Cada 1-3 años (según proveedor)

Ambiente Servicio URL
Homologación Envío (ws_efactura) https://efactura.dgi.gub.uy:6443/ePrueba/ws_eprueba
Homologación Consultas (ws_consultas) https://efactura.dgi.gub.uy:6460/ePrueba/ws_consultasPrueba
Producción ambos Configurar UrlEnvio y UrlConsultas con las URL que entrega la DGI al habilitar el ambiente

// 1. Configurar (en producción, con un almacenamiento durable: ver Gestión de CAE)
var config = new UruFacturaConfig
{
Emisor = new Emisor
{
Rut = "219999820013",
RazonSocial = "Mi Empresa S.A.",
DomicilioFiscal = "Av. 18 de Julio 1234",
Ciudad = "Montevideo",
Departamento = "Montevideo",
},
Ambiente = Ambiente.Produccion,
UrlEnvio = "https://…/ws_efactura", // obligatorias en Producción:
UrlConsultas = "https://…/ws_consultas", // las entrega la DGI
RutaCertificado = "/ruta/certificado.p12",
PasswordCertificado = Environment.GetEnvironmentVariable("CERT_PASSWORD"),
};
using var client = new UruFacturaClient(config, store: miStoreDurable);
// 2. Emitir: valida, numera, firma y registra
var eticket = await client.EmitirAsync(new Cfe(TipoCfe.ETicket)
{
Detalle = [new LineaDetalle { NombreItem = "Servicio de consultoría", Cantidad = 1, PrecioUnitario = 5000m }],
});
// 3. Enviar: acuse del sobre (AS / BS)
var acuse = await client.EnviarAsync(eticket);
if (!acuse.Recibido)
throw new Exception($"DGI rechazó el sobre: {acuse.Mensaje}");
// 4. Resultado del comprobante
await client.ConsultarEnvioAsync(acuse);
if (!eticket.AceptadoPorDgi)
throw new Exception($"DGI no aceptó el CFE ({eticket.EstadoDgi}): {eticket.MensajeDgi}");
// 5. Representación impresa (paquete UruFactura.Pdf)
await File.WriteAllBytesAsync("eticket.pdf", CfePdf.GenerarA4(eticket));

Recurso Enlace
Portal DGI en línea dgi.gub.uy
Esquemas XML CFE Factura Electrónica — DGI
Instructivo técnico Portal DGI → Gestión CFE
AGESIC (CAs habilitadas) agesic.gub.uy
Soporte DGI Contacto

Estado Mensaje Significado
AS ACKSobre Sobre recibido (no implica que los CFE hayan sido aceptados)
BS ACKSobre Sobre rechazado: ver los motivos (S01…S20) en acuse.Motivos
BA ACKSobre / ACKRepDiario Archivo rechazado
AR ACKRepDiario Reporte diario recibido
BR ACKRepDiario Reporte diario rechazado
AE ACKCFE Comprobante aceptado
BE ACKCFE Comprobante rechazado (CFE): motivos en cfe.MensajeDgi y EstadoEnvio.Comprobantes[i].Motivos
CE ACKCFE Comprobante observado (CFC)
FE ACKCFE Comprobante reliquidado

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