Actualizado el 10/03/2026: La Nota Técnica ENCAT 2025.001 confirmó las fechas de homologación (06/04/2026) y producción (06/07/2026) para los documentos fiscales electrónicos. La Receita Federal (la autoridad tributaria federal de Brasil) también señaló que el despliegue será gradual, comenzando por las grandes empresas. En breve publicaremos un artículo dedicado a los desdoblamientos de la implementación.
La Receita Federal publicó en octubre de 2024 la Instrução Normativa RFB nº 2.229/2024 (instrucción normativa), determinando que a partir de julio de 2026 las nuevas inscripciones en el CNPJ (el registro fiscal de las empresas en Brasil) pasarán a incluir caracteres alfanuméricos — letras de la A a la Z además de los dígitos del 0 al 9.
El cambio no afecta a los CNPJ ya existentes. Si su empresa tiene el CNPJ 12.345.678/0001-95, seguirá exactamente igual. El nuevo formato aplica solo a las nuevas inscripciones a partir de la fecha de corte.
El motivo es práctico: el sistema numérico actual admite cerca de 100 millones de combinaciones. Con aproximadamente 60 millones de registros activos y cerca de 6 millones de empresas nuevas por año, el agotamiento de las combinaciones disponibles es cuestión de pocos años. La introducción de letras expande el espacio de direccionamiento a miles de millones de combinaciones.
Este artículo aborda el tema desde la óptica del desarrollador: qué cambia en el formato, cómo calcular el nuevo dígito verificador, qué revisar en sus sistemas y código funcional para la validación.
Qué cambia en el formato
El CNPJ seguirá teniendo 14 posiciones — el mismo largo de hoy. La diferencia está en el conjunto de caracteres aceptados en cada grupo de posiciones:
| Posiciones | Función | Formato actual | Formato nuevo |
|---|---|---|---|
| 1–8 | Raíz (identificación) | Solo dígitos (0–9) | Alfanumérico (0–9, A–Z) |
| 9–12 | Orden del establecimiento | Solo dígitos (0–9) | Alfanumérico (0–9, A–Z) |
| 13–14 | Dígitos verificadores | Solo dígitos (0–9) | Solo dígitos (0–9) |
En la práctica, las primeras 12 posiciones pasan a aceptar letras mayúsculas, mientras que los dos dígitos verificadores siguen siendo numéricos.
La máscara de visualización con puntos, barra y guion mantiene el mismo patrón — lo que cambia es el contenido de cada posición.
Letras aceptadas
Hay indicios en discusiones técnicas del ENCAT de que algunas letras podrían excluirse del conjunto permitido (posiblemente I, O, U, Q y F, para evitar confusión visual). Hasta la fecha de publicación de este artículo, la Receita Federal no ha confirmado oficialmente la lista restringida. La recomendación es programar de forma defensiva: aceptar A–Z por ahora y ajustar cuando se publique la lista definitiva.
Siga la página oficial de la RFB: CNPJ Alfanumérico.
Nuevo cálculo del dígito verificador
El cálculo del dígito verificador sigue usando Módulo 11 con pesos de 2 a 9 — el mismo algoritmo conceptual de los CNPJ numéricos. La diferencia está en cómo se convierte cada carácter a valor numérico antes de la multiplicación.
Regla de conversión
Cada carácter (dígito o letra) se convierte según su valor decimal ASCII menos 48:
Valor para DV = código ASCII del carácter − 48
Esto produce la siguiente tabla:
| Carácter | ASCII | Valor DV |
|---|---|---|
0 |
48 | 0 |
1 |
49 | 1 |
2 |
50 | 2 |
| ... | ... | ... |
9 |
57 | 9 |
A |
65 | 17 |
B |
66 | 18 |
C |
67 | 19 |
| ... | ... | ... |
Z |
90 | 42 |
El detalle elegante de este enfoque: para los CNPJ numéricos, ord('0') - 48 = 0, ord('1') - 48 = 1, etc. — es decir, la conversión reproduce el comportamiento actual. El nuevo algoritmo es retrocompatible por diseño.
Paso a paso con ejemplo
Usando el CNPJ alfanumérico ficticio 12ABC34501DE (ejemplo de la documentación oficial del SERPRO):
Primer dígito verificador:
- Convertir cada carácter al valor DV:
CNPJ: 1 2 A B C 3 4 5 0 1 D E
Valor: 1 2 17 18 19 3 4 5 0 1 20 21
- Distribuir pesos de 2 a 9 de derecha a izquierda (reiniciando después del 9):
Peso: 5 4 3 2 9 8 7 6 5 4 3 2
- Multiplicar valor × peso y sumar:
5 + 8 + 51 + 36 + 171 + 24 + 28 + 30 + 0 + 4 + 60 + 42 = 459
- Calcular el resto:
459 % 11 = 8 - Como el resto es ≥ 2: 1er DV = 11 − 8 = 3
Segundo dígito verificador:
Repetir el proceso incluyendo el primer DV como carácter número 13:
CNPJ: 1 2 A B C 3 4 5 0 1 D E 3
Valor: 1 2 17 18 19 3 4 5 0 1 20 21 3
Peso: 6 5 4 3 2 9 8 7 6 5 4 3 2
Sumatoria: 6 + 10 + 68 + 54 + 38 + 27 + 32 + 35 + 0 + 5 + 80 + 63 + 6 = 424
Resto: 424 % 11 = 6 → 2do DV = 11 − 6 = 5
Resultado final: 12.ABC.345/01DE-35
Si el resto es 0 o 1, el dígito verificador es 0 (cero).
Impacto en sistemas existentes
El cambio es simple en concepto, pero el impacto depende de cuántos puntos de su sistema tocan campos de CNPJ. A continuación, los principales puntos de atención.
Base de datos
Si el campo de CNPJ está almacenado como INT, BIGINT o cualquier tipo numérico, necesita migrar a VARCHAR(14) o CHAR(14). Sin ese cambio, la base rechaza cualquier CNPJ con letras.
Para quien ya usa VARCHAR o TEXT, verifique si hay constraints que rechacen letras — un CHECK con regex del tipo ^\d{14}$ va a bloquear los nuevos CNPJ. Los índices creados sobre columnas numéricas pueden comportarse distinto (collation, ordenamiento) al migrar a string — vale la pena probar el rendimiento de las queries críticas después de la conversión.
Validación en el código
La mayoría de los sistemas valida el CNPJ con regex como ^\d{14}$ o ^\d{2}\.\d{3}\.\d{3}/\d{4}-\d{2}$. Ambas rechazan letras.
La regex actualizada para el CNPJ sin máscara debe aceptar alfanuméricos en las primeras 12 posiciones y dígitos en las 2 últimas:
^[A-Z0-9]{12}\d{2}$
Con máscara:
^[A-Z0-9]{2}\.[A-Z0-9]{3}\.[A-Z0-9]{3}/[A-Z0-9]{4}-\d{2}$
Además de la regex, la función de cálculo del DV necesita actualizarse para usar la conversión ASCII descrita en la sección anterior.
Frontend y máscaras de input
Los campos de formulario que formatean el CNPJ con máscara (puntos, barra, guion) generalmente solo aceptan dígitos. Es necesario permitir letras mayúsculas en las primeras 12 posiciones del input. El inputmode="numeric" en campos de CNPJ en mobile deberá removerse o ajustarse, ya que el teclado numérico no muestra letras.
Integraciones
Las APIs que envían o reciben CNPJ necesitan aceptar el nuevo formato. Eso incluye integraciones con gateways de pago, emisores de factura electrónica (NF-e, NFS-e — los comprobantes fiscales electrónicos brasileños), sistemas bancarios, CRMs y ERPs. Los schemas XML de los documentos fiscales electrónicos ya fueron actualizados por la SEFAZ (las administraciones tributarias estatales) para aceptar el formato alfanumérico.
Pruebas
La Receita Federal puso a disposición un Simulador Nacional de CNPJ Alfanumérico que genera CNPJ ficticios en el nuevo formato. Úselo para crear datos de prueba e incluya CNPJ alfanuméricos en su suite de pruebas automatizadas desde ya — no espere a julio de 2026.
La Nota Técnica ENCAT 2025.001 confirmó que el ambiente de homologación de las SEFAZ aceptará CNPJ alfanuméricos a partir del 06 de abril de 2026, y el ambiente de producción a partir del 06 de julio de 2026. Antes de esas fechas, los sistemas rechazarán cualquier CNPJ alfanumérico, aunque pase la validación de schema.
Código: validando el CNPJ alfanumérico
A continuación, implementaciones funcionales en Python y JavaScript. Ambas aceptan CNPJ con o sin máscara, soportan el formato numérico actual y el nuevo alfanumérico, y calculan los dos dígitos verificadores por Módulo 11 con conversión ASCII.
Python
import re
def validar_cnpj(cnpj: str) -> bool:
"""
Valida CNPJ numérico o alfanumérico.
Acepta con o sin máscara (puntos, barra, guion).
"""
# Remueve la máscara
cnpj = re.sub(r'[.\-/]', '', cnpj).upper()
# 14 caracteres: 12 alfanuméricos + 2 dígitos
if not re.match(r'^[A-Z0-9]{12}\d{2}$', cnpj):
return False
# Rechazar secuencias uniformes (ej.: "00000000000000")
if len(set(cnpj)) == 1:
return False
def char_value(c: str) -> int:
return ord(c) - 48
def calc_dv(chars: str, weights: list[int]) -> int:
total = sum(char_value(c) * w for c, w in zip(chars, weights))
remainder = total % 11
return 0 if remainder < 2 else 11 - remainder
# Primer DV: 12 caracteres, pesos [5,4,3,2,9,8,7,6,5,4,3,2]
weights_1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
dv1 = calc_dv(cnpj[:12], weights_1)
# Segundo DV: 13 caracteres, pesos [6,5,4,3,2,9,8,7,6,5,4,3,2]
weights_2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
dv2 = calc_dv(cnpj[:12] + str(dv1), weights_2)
return cnpj[-2:] == f"{dv1}{dv2}"
# Pruebas
assert validar_cnpj("12.ABC.345/01DE-35") == True # alfanumérico (ejemplo SERPRO)
assert validar_cnpj("12ABC34501DE35") == True # sin máscara
assert validar_cnpj("11.222.333/0001-81") == True # numérico tradicional
assert validar_cnpj("11.222.333/0001-82") == False # DV inválido
assert validar_cnpj("00.000.000/0000-00") == False # secuencia uniforme
print("Todos os testes passaram.")
JavaScript / Node.js
/**
* Valida CNPJ numérico o alfanumérico.
* Acepta con o sin máscara (puntos, barra, guion).
* @param {string} cnpj
* @returns {boolean}
*/
function validarCnpj(cnpj) {
// Remueve la máscara
cnpj = cnpj.replace(/[.\-/]/g, "").toUpperCase();
// 14 caracteres: 12 alfanuméricos + 2 dígitos
if (!/^[A-Z0-9]{12}\d{2}$/.test(cnpj)) return false;
// Rechazar secuencias uniformes
if (new Set(cnpj).size === 1) return false;
const charValue = (c) => c.charCodeAt(0) - 48;
function calcDv(chars, weights) {
const total = chars
.split("")
.reduce((sum, c, i) => sum + charValue(c) * weights[i], 0);
const remainder = total % 11;
return remainder < 2 ? 0 : 11 - remainder;
}
const weights1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
const weights2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
const dv1 = calcDv(cnpj.slice(0, 12), weights1);
const dv2 = calcDv(cnpj.slice(0, 12) + dv1, weights2);
return cnpj.slice(-2) === `${dv1}${dv2}`;
}
// Pruebas
console.assert(validarCnpj("12.ABC.345/01DE-35") === true);
console.assert(validarCnpj("12ABC34501DE35") === true);
console.assert(validarCnpj("11.222.333/0001-81") === true);
console.assert(validarCnpj("11.222.333/0001-82") === false);
console.assert(validarCnpj("00.000.000/0000-00") === false);
console.log("Todos os testes passaram.");
cURL + API de FonteData
Si no quiere mantener la lógica de validación en su sistema, puede delegarla a una API que ya maneja ambos formatos. FonteData acepta CNPJ alfanumérico en todas las consultas:
# Consulta con CNPJ alfanumérico — FonteData ya lo soporta
curl -H "X-API-Key: SUA_API_KEY" \
https://app.fontedata.com/api/v1/cnpj/A1B2C3D4E5F690
La respuesta devuelve los datos registrales completos del CNPJ, sin que el desarrollador tenga que implementar validación, conversión de formato ni manejo de errores relacionados con el nuevo estándar. La API acepta tanto el formato numérico actual como el alfanumérico, con o sin máscara.
Checklist de preparación
Resumen accionable para llevar al equipo de ingeniería:
- Base de datos: auditar los campos de CNPJ — migrar tipos numéricos a
VARCHAR(14)oCHAR(14), revisar constraints e índices - Regex de validación: actualizar para aceptar
[A-Z0-9]en las primeras 12 posiciones - Cálculo del DV: implementar la conversión vía ASCII (
ord(char) - 48) o adoptar una API que ya lo soporte - Frontend: actualizar las máscaras de input para aceptar letras mayúsculas, remover
inputmode="numeric"de los campos de CNPJ - Integraciones: verificar que APIs, webhooks y schemas XML acepten caracteres alfanuméricos en el campo de CNPJ
- Pruebas automatizadas: incluir CNPJ alfanuméricos generados por el Simulador de la RFB
- Monitoreo: seguir los comunicados de la RFB sobre la lista definitiva de letras aceptadas
Conclusión
La migración al CNPJ alfanumérico es directa en concepto — entran letras al identificador, el cálculo del DV gana una conversión vía ASCII y el largo sigue igual. El impacto real depende de cuántos sistemas de su stack tocan campos de CNPJ: base de datos, validaciones, máscaras, integraciones fiscales, gateways de pago.
Quien se prepare antes de julio de 2026 evita las corridas cuando los primeros CNPJ con letras empiecen a circular. El checklist de arriba cubre los puntos principales — empiece por la auditoría de la base de datos y por las funciones de validación.
FonteData ya soporta el CNPJ alfanumérico en todas las consultas. Cree su cuenta gratis y pruebe con R$50 en créditos (reales brasileños) — sin tarjeta de crédito.
Referencias
Pruebe la API de FonteData
Consulte datos de empresas y personas vía API — CNPJ, CPF, KYC, compliance y más. R$50 en créditos gratis para probar.
Crear cuenta gratis →