La estructura: 49 dígitos en 10 campos
| # | CAMPO | LONGITUD | EJEMPLO |
|---|---|---|---|
| 1 | Fecha de emisión (ddmmaaaa) | 8 | 02112026 |
| 2 | Tipo de comprobante | 2 | 01 |
| 3 | RUC del emisor | 13 | 1790000000001 |
| 4 | Ambiente | 1 | 1 |
| 5 | Establecimiento | 3 | 001 |
| 6 | Punto de emisión | 3 | 001 |
| 7 | Secuencial | 9 | 000000123 |
| 8 | Código numérico | 8 | 12345678 |
| 9 | Tipo de emisión | 1 | 1 |
| 10 | Dígito verificador | 1 | 9 |
Los primeros 48 dígitos son los campos 1 al 9. El dígito 49 es el verificador.
Códigos que debes conocer
| CAMPO | VALORES |
|---|---|
| Tipo de comprobante | 01 factura · 03 liquidación de compra · 04 nota de crédito · 05 nota de débito · 06 guía de remisión · 07 comprobante de retención |
| Ambiente | 1 pruebas · 2 producción |
| Tipo de emisión | 1 emisión normal |
El dígito verificador: módulo 11
Sirve para detectar errores de digitación o de construcción. El cálculo es:
- Toma los 48 primeros dígitos Son los campos 1 al 9 de la clave.
- Multiplica de derecha a izquierda Cada dígito por un factor que va de 2 a 7 y vuelve a empezar: 2, 3, 4, 5, 6, 7, 2, 3, 4…
- Suma todos los productos Obtienes un solo número.
- Calcula 11 − (suma mod 11) Ese es el candidato a dígito verificador.
- Ajusta los casos especiales Si el resultado es 11, el dígito es 0. Si es 10, el dígito es 1. En cualquier otro caso, es el resultado.
En código
// Dígito verificador (módulo 11) de la clave de acceso del SRI
export function digitoVerificador(cuarentaYOcho) {
const factores = [2, 3, 4, 5, 6, 7];
let suma = 0;
let i = 0;
// De derecha a izquierda, con los factores 2, 3, 4, 5, 6, 7, 2, 3...
for (let pos = cuarentaYOcho.length - 1; pos >= 0; pos--) {
suma += Number(cuarentaYOcho[pos]) * factores[i % factores.length];
i++;
}
const resultado = 11 - (suma % 11);
if (resultado === 11) return 0;
if (resultado === 10) return 1;
return resultado;
}
export function claveAcceso({ fecha, tipo, ruc, ambiente, serie, secuencial, codigo, tipoEmision = "1" }) {
const base = `${fecha}${tipo}${ruc}${ambiente}${serie}${secuencial}${codigo}${tipoEmision}`;
if (!/^\d{48}$/.test(base)) {
throw new Error("La base de la clave debe tener exactamente 48 dígitos");
}
return base + digitoVerificador(base);
}
// Ejemplo
console.log(
claveAcceso({
fecha: "02112026", // ddmmaaaa
tipo: "01", // 01 = factura
ruc: "1790000000001",
ambiente: "1", // 1 = pruebas, 2 = producción
serie: "001001", // establecimiento + punto de emisión
secuencial: "000000123",
codigo: "12345678", // código numérico de 8 dígitos
})
);def digito_verificador(cuarenta_y_ocho: str) -> int:
"""Módulo 11 del SRI: factores 2..7 de derecha a izquierda."""
factores = [2, 3, 4, 5, 6, 7]
suma = sum(
int(d) * factores[i % len(factores)]
for i, d in enumerate(reversed(cuarenta_y_ocho))
)
resultado = 11 - (suma % 11)
if resultado == 11:
return 0
if resultado == 10:
return 1
return resultado
base = "02112026" "01" "1790000000001" "1" "001001" "000000123" "12345678" "1"
assert len(base) == 48
print(base + str(digito_verificador(base)))Con los datos del ejemplo, ambos programas producen la misma clave de 49 dígitos:
0211202601179000000000110010010000001231234567819Errores frecuentes al armar la clave
| ERROR | QUÉ PROVOCA |
|---|---|
| Fecha en otro formato (aaaa-mm-dd, o sin ceros) | Clave con longitud o contenido incorrecto |
| Secuencial sin rellenar con ceros a 9 dígitos | Clave de menos de 49 dígitos |
| Mezclar establecimiento y punto de emisión | La serie debe ser de 6 dígitos: 3 + 3 |
| Código de ambiente que no coincide con el endpoint | Rechazo por ambiente |
| Cambiar la clave en un reintento | Genera un comprobante nuevo en vez de reenviar el mismo |
| Dígito verificador mal calculado | Rechazo por estructura de la clave |
¿Tengo que calcularla yo?
Si usas una API de facturación, no: la API arma la clave de acceso y te la devuelve en la respuesta. Guárdala en tu sistema: es la llave para consultar el XML y el estado de cualquier comprobante.
Conclusión
La clave de acceso es un identificador con significado: fecha, tipo, emisor, ambiente, numeración y un dígito de control. Si la armas tú, calcula el verificador con módulo 11 y nunca la cambies en un reintento.