Guide technique mis à jour pour 2026
CNPJ Alphanumérique : Guide Complet pour les Développeurs et les Entreprises
Comprenez le nouveau format, le calendrier de déploiement de juillet 2026 et toutes les modifications nécessaires dans les formulaires, les bases de données, les API, les validations, les masques et les projets Laravel.
Résumé rapide
À partir de juillet 2026, la Receita Federal prévoit de commencer l’attribution progressive de CNPJ alphanumériques pour les nouvelles inscriptions. Les CNPJ existants ne seront pas modifiés. L’identifiant conservera 14 positions, mais les 12 premières pourront combiner lettres et chiffres ; seuls les deux derniers chiffres de contrôle resteront obligatoirement numériques. Pour les équipes technologiques, la conséquence est directe : un CNPJ ne pourra plus être traité comme une simple suite de chiffres.
Introduction : un petit changement dans le document, un grand changement pour les systèmes
Pendant des décennies, les développeurs brésiliens ont traité le CNPJ comme une séquence de 14 chiffres. Les formulaires utilisent des claviers numériques, les bases de données stockent les valeurs dans des colonnes entières ou décimales, les API suppriment tout ce qui n’est pas un chiffre et les expressions régulières recherchent exactement 14 chiffres. Cet ensemble de décisions semble naturel puisqu’il correspond au format traditionnel, mais il n’est plus compatible avec le CNPJ alphanumérique.
Le changement annoncé par la Receita Federal ne supprime pas le format actuel. En pratique, les deux formats coexisteront : les organisations déjà enregistrées continueront d’utiliser leurs CNPJ numériques, tandis que les nouvelles inscriptions pourront recevoir des identifiants contenant des lettres et des chiffres à partir du déploiement. Cela rend la migration plus délicate, car il ne suffit pas de remplacer une ancienne règle par une nouvelle. Les systèmes doivent accepter les deux formats sans modifier les données historiques, sans supprimer les zéros initiaux et sans rejeter les lettres légitimes.
Ce guide a été rédigé pour les équipes de développement, d’architecture, de données, de qualité, de produit, de fiscalité et d’exploitation. Son objectif est de traduire la réglementation officielle en décisions pratiques : comment stocker un CNPJ, normaliser les entrées, calculer les chiffres de contrôle, adapter les expressions régulières et les masques, réviser les contrats d’API et organiser les tests avant l’entrée en vigueur du nouveau modèle.
Qu’est-ce que le CNPJ alphanumérique
Le CNPJ alphanumérique est l’évolution de l’identifiant utilisé pour reconnaître les entreprises et autres entités auprès de l’administration publique brésilienne. Il reste un code de 14 positions et conserve sa présentation visuelle habituelle, avec des points, une barre oblique et un tiret. La différence réside dans l’ensemble des caractères autorisés dans les 12 premières positions.
Les huit premières positions constituent la racine du CNPJ. Les quatre suivantes représentent l’ordre de l’établissement, tel que le siège ou une succursale. Dans le nouveau format, ces deux groupes pourront contenir des lettres de A à Z et des chiffres de 0 à 9. Les deux dernières positions restent réservées aux chiffres de contrôle et demeurent numériques. Une représentation structurelle simple est SS.SSS.SSS/SSSS-NN, où S accepte une lettre ou un chiffre et N accepte uniquement un chiffre.
Un exemple publié à des fins de test est 12.ABC.345/01DE-35. Il montre que les lettres peuvent apparaître aussi bien dans la racine que dans l’ordre de l’établissement, tandis que le suffixe 35 reste numérique. L’exemple traditionnel 12.345.678/0001-95 demeure également structurellement valide. Cette coexistence est l’idée la plus importante de toute la migration.
Pourquoi la Receita Federal a créé ce nouveau format
La raison principale est d’augmenter le nombre de combinaisons disponibles. La croissance continue du nombre d’entreprises, d’entités, de sièges et de succursales exerce une pression sur l’espace de numérotation offert par le modèle exclusivement décimal. En introduisant des lettres dans les 12 positions d’identification, le nombre possible de codes augmente considérablement sans accroître la longueur totale du document.
Le maintien de 14 positions réduit l’impact visuel et évite une rupture encore plus importante dans les documents, les écrans et les intégrations. La ponctuation peut également rester identique. Toutefois, la compatibilité en termes de longueur ne signifie pas une compatibilité automatique : toute implémentation ayant associé « 14 positions » à « 14 chiffres » doit être révisée.
Selon la Receita Federal, cette solution vise à garantir la continuité des inscriptions et à préserver la disponibilité des identifiants. Cette modification a été officialisée par l’Instruction Normative RFB n° 2.229 du 15 octobre 2024, qui a modifié les règles du CNPJ. Pour suivre les mises à jour, consultez la page officielle consacrée au CNPJ alphanumérique.
Calendrier de déploiement en juillet 2026
Le déploiement officiel est prévu à partir de juillet 2026. L’attribution concernera les nouvelles inscriptions et se fera progressivement. Par conséquent, juillet 2026 ne doit pas être interprété comme la date à laquelle tous les CNPJ brésiliens seront convertis ou à laquelle les entreprises existantes recevront automatiquement un nouveau numéro.
Les CNPJ actuels resteront valides. Cela signifie que les plateformes de paiement, ERP, CRM, systèmes fiscaux, émetteurs de documents, registres fournisseurs, banques, compagnies d’assurance, marketplaces et organismes publics devront traiter simultanément les identifiants traditionnels et alphanumériques. La période précédant le déploiement doit être utilisée pour l’inventaire, le développement, l’homologation et la communication avec les partenaires.
Cartographier les dépendances, adapter les modèles, réviser les fournisseurs et créer des tests automatisés.
Début prévu du déploiement progressif pour les nouvelles inscriptions.
Accepter et valider les deux formats sur tous les canaux et dans toutes les intégrations.
Différences entre le CNPJ traditionnel et le CNPJ alphanumérique
| Caractéristique | Traditionnel | Alphanumérique |
|---|---|---|
| Nombre de positions | 14 | 14 |
| Racine, positions 1 à 8 | Chiffres uniquement | Lettres et chiffres |
| Ordre, positions 9 à 12 | Chiffres uniquement | Lettres et chiffres |
| Chiffres de contrôle | Deux chiffres | Deux chiffres |
| Format visuel | 00.000.000/0000-00 | SS.SSS.SSS/SSSS-00 |
| Stockage recommandé | Texte | Texte |
Même avec le format traditionnel, le stockage sous forme de texte était déjà l’option la plus sûre, car un CNPJ peut commencer par un zéro et ne participe à aucune opération arithmétique. Avec l’introduction des lettres, cette recommandation devient une exigence fonctionnelle. L’identifiant n’est pas une quantité ; c’est une clé textuelle.
Impacts sur les systèmes, les bases de données et les intégrations
Le plus grand risque ne se situe généralement pas dans la fonction qui calcule le chiffre de contrôle, mais dans les dizaines de points qui transforment, transportent ou stockent le CNPJ. Une application peut valider correctement un formulaire tout en perdant des lettres dans une file d’attente, un fichier CSV, une procédure stockée, une intégration héritée ou un service exécutant une normalisation telle que replace(/\D/g, '').
Base de données
Les colonnes INT, BIGINT, DECIMAL ou équivalentes doivent être migrées vers un type textuel d’au moins 14 caractères sans ponctuation. Révisez les index uniques, les clés étrangères, les tables d’audit, les répliques, les entrepôts de données et les vues matérialisées. L’application doit définir une forme canonique, de préférence en lettres majuscules et sans ponctuation, afin d’éviter les doublons logiques.
API et contrats
Dans un document JSON, le CNPJ doit être représenté sous forme de chaîne de caractères. Les schémas OpenAPI, GraphQL, Protobuf ainsi que les validations de passerelle doivent refléter cette exigence. Les documentations décrivant ce champ comme un entier ou utilisant uniquement des exemples numériques doivent être mises à jour. Il est également important de réviser les signatures numériques, la génération de hachages, les clés d’idempotence et les règles de routage qui incluent le CNPJ.
Importations, exportations et analytique
Les feuilles de calcul peuvent tenter de convertir automatiquement les valeurs numériques ; les fichiers à largeur fixe peuvent accepter 14 positions mais rejeter les lettres ; les pipelines de données peuvent convertir la colonne en nombre ; les rapports peuvent trier ou regrouper les données de manière incorrecte. Testez les fichiers CSV, Excel, EDI, XML, les documents fiscaux, les webhooks, les files d’attente, les journaux et les outils de BI. La migration n’est complète que lorsque la valeur traverse l’ensemble du flux sans être modifiée.
Interfaces et accessibilité
Les champs utilisant type="number" ou inputmode="numeric" empêchent ou compliquent la saisie de lettres. Préférez type="text", une limite de longueur appropriée et une conversion visuelle en majuscules. Les messages tels que « saisissez les 14 chiffres » doivent devenir « saisissez les 14 positions du CNPJ ».
Exemple de validation du CNPJ alphanumérique en JavaScript
Le calcul reste basé sur le module 11. Pour chaque caractère des 12 premières positions, on utilise la valeur décimale du code ASCII moins 48. Ainsi, le caractère 0 vaut 0, 9 vaut 9 et A vaut 17. Les pondérations du premier et du second chiffre de contrôle sont ensuite appliquées.
function normalizeCnpj(value) {
return value
.toUpperCase()
.replace(/[.\-\/\s]/g, '');
}
function calculateDigit(base) {
const weights = base.length === 12
? [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
: [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
const sum = [...base].reduce((total, char, index) => {
const value = char.charCodeAt(0) - 48;
return total + value * weights[index];
}, 0);
const remainder = sum % 11;
return remainder < 2 ? 0 : 11 - remainder;
}
function isValidCnpj(value) {
const cnpj = normalizeCnpj(value);
if (!/^[A-Z0-9]{12}[0-9]{2}$/.test(cnpj)) {
return false;
}
if (/^([A-Z0-9])\1{11}[0-9]{2}$/.test(cnpj)) {
return false;
}
const firstDigit = calculateDigit(cnpj.slice(0, 12));
const secondDigit = calculateDigit(cnpj.slice(0, 12) + firstDigit);
return cnpj.endsWith(`${firstDigit}${secondDigit}`);
}
console.log(isValidCnpj('12.ABC.345/01DE-35')); // true
console.log(isValidCnpj('12.345.678/0001-95')); // true
L’expression régulière vérifie uniquement la structure. Elle ne remplace pas le calcul des chiffres de contrôle. En production, maintenez la normalisation, la validation structurelle et la validation mathématique comme étapes explicites couvertes par des tests unitaires.
Exemple de validation en PHP
En PHP, ord() fournit le code du caractère. La fonction ci-dessous accepte une entrée formatée ou non, convertit les lettres en majuscules et compare les deux chiffres de contrôle calculés avec la fin de l’identifiant.
<?php
function normalizeCnpj(string $value): string
{
return strtoupper(preg_replace('/[.\-\/\s]/', '', $value));
}
function calculateCnpjDigit(string $base): int
{
$weights = strlen($base) === 12
? [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
: [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
$sum = 0;
foreach (str_split($base) as $index => $char) {
$value = ord($char) - 48;
$sum += $value * $weights[$index];
}
$remainder = $sum % 11;
return $remainder < 2 ? 0 : 11 - $remainder;
}
function isValidCnpj(string $value): bool
{
$cnpj = normalizeCnpj($value);
if (! preg_match('/^[A-Z0-9]{12}[0-9]{2}$/', $cnpj)) {
return false;
}
$base = substr($cnpj, 0, 12);
$firstDigit = calculateCnpjDigit($base);
$secondDigit = calculateCnpjDigit($base.$firstDigit);
return substr($cnpj, -2) === $firstDigit.$secondDigit;
}
Dans une bibliothèque partagée, évitez de dupliquer cet algorithme dans les contrôleurs, les jobs et les importateurs. Créez un service ou un objet valeur unique pour normaliser, formater, identifier le type et valider les données. Cette centralisation réduit les divergences lorsque les règles ou les cas de test sont mis à jour.
Exemples d’adaptation dans Laravel
Dans Laravel, une règle de validation dédiée améliore la lisibilité du Form Request et permet sa réutilisation dans les endpoints web, les API et les commandes d’importation. La règle doit recevoir une chaîne de caractères, normaliser la valeur et déléguer le calcul à une implémentation testable.
<?php
namespace App\Rules;
use Closure;
use Illuminate\Contracts\Validation\ValidationRule;
final class Cnpj implements ValidationRule
{
public function validate(
string $attribute,
mixed $value,
Closure $fail
): void {
if (! is_string($value) || ! isValidCnpj($value)) {
$fail('O campo :attribute deve conter um CNPJ válido.');
}
}
}
$validated = $request->validate([
'cnpj' => ['required', 'string', 'max:18', new Cnpj()],
]);
$validated['cnpj'] = normalizeCnpj($validated['cnpj']);
La normalisation doit avoir lieu avant la persistance. Une alternative consiste à utiliser un mutateur dans le modèle, mais cela doit être documenté afin que les requêtes, les factories et les intégrations conservent le même comportement. Si l’application utilise des DTO ou des actions, effectuez la normalisation à la frontière de la couche métier.
La migration doit remplacer les types numériques par des chaînes de caractères tout en préservant les index. Pour les grandes bases de données, prévoyez les verrous, la création parallèle de colonnes, le backfill, la validation et une transition progressive plutôt qu’une modification bloquante.
Schema::table('companies', function (Blueprint $table) {
$table->string('cnpj', 14)->change();
});
Schema::create('companies', function (Blueprint $table) {
$table->id();
$table->string('cnpj', 14)->unique();
$table->string('name');
$table->timestamps();
});
Les tests Laravel doivent inclure au minimum : un CNPJ traditionnel valide, un CNPJ alphanumérique valide, une entrée avec ponctuation, des lettres minuscules normalisées, un caractère interdit, une longueur incorrecte, un chiffre de contrôle invalide et une persistance sans ponctuation. Les tests d’intégration doivent vérifier le JSON envoyé aux services externes, et pas seulement la valeur enregistrée localement.
Modifications des expressions régulières et des masques
Une ancienne expression régulière courante est ^\d{14}$. Elle rejette correctement les caractères inattendus dans le modèle actuel, mais elle rejette également tous les nouveaux identifiants. Pour la valeur normalisée, la structure de base devient ^[A-Z0-9]{12}[0-9]{2}$.
N’utilisez pas [A-z], car cet intervalle inclut des caractères supplémentaires de la table ASCII. N’acceptez pas non plus de lettres dans les deux derniers chiffres de contrôle. Si l’application reçoit des lettres minuscules, convertissez-les en majuscules avant d’appliquer l’expression régulière. Pour supprimer la ponctuation, retirez uniquement les séparateurs attendus ; un nettoyage indiscriminé peut masquer une entrée invalide.
Les masques basés sur des symboles représentant un « chiffre obligatoire » nécessitent une configuration alphanumérique. Lorsque la bibliothèque ne propose pas cette fonctionnalité, un formatage progressif simple peut être plus prévisible :
function formatCnpj(value) {
const cnpj = value
.toUpperCase()
.replace(/[^A-Z0-9]/g, '')
.slice(0, 14);
return cnpj
.replace(/^(.{2})(.{0,3})/, '$1.$2')
.replace(/^(.{2})\.(.{3})(.{0,3})/, '$1.$2.$3')
.replace(/^(.{2})\.(.{3})\.(.{3})(.{0,4})/, '$1.$2.$3/$4')
.replace(/^(.{2})\.(.{3})\.(.{3})\/(.{4})(.{0,2})/, '$1.$2.$3/$4-$5')
.replace(/[.\-\/]$/, '');
}
Le masque améliore la lisibilité, mais il ne doit pas être considéré comme la source de vérité. Le backend doit toujours valider la valeur. Les utilisateurs peuvent désactiver JavaScript, appeler directement l’API ou envoyer des fichiers sans passer par le formulaire.
Comment tester les formulaires et les intégrations
Une bonne stratégie combine des tests unitaires, d’intégration et de bout en bout. Dans les tests unitaires, validez le calcul et la normalisation. Dans les tests HTTP, envoyez les deux formats aux endpoints. Dans les tests de navigateur, vérifiez que le clavier, le masque, les fonctions copier-coller, les messages d’erreur et les lecteurs d’écran fonctionnent correctement. Pour les intégrations, utilisez des environnements de préproduction et vérifiez la valeur reçue de l’autre côté.
Pour générer des données fictives, utilisez le Générateur de CNPJ Utinix, qui propose le format alphanumérique par défaut tout en conservant l’option traditionnelle. Pour vérifier la structure et les chiffres de contrôle, utilisez le Validateur de CNPJ. Ces outils sont adaptés aux tests techniques ; les numéros générés ne représentent pas de véritables entreprises et n’ont aucune validité administrative.
Liste de contrôle de migration pour les développeurs et les entreprises
Utilisez la liste ci-dessous comme point de départ pour votre plan de mise en conformité. Dans les grandes organisations, attribuez un responsable, une échéance, une preuve de test et un niveau de criticité à chaque élément.
Erreurs de migration à éviter
La première erreur consiste à modifier uniquement le frontend. Une interface peut accepter des lettres alors que le backend continue à supprimer les caractères non numériques. La deuxième consiste à migrer la base de données tout en oubliant les systèmes satellites et les partenaires. La troisième est d’accepter n’importe quelle lettre à n’importe quelle position, y compris dans les chiffres de contrôle finaux. La quatrième est de considérer qu’un CNPJ mathématiquement valide constitue une preuve d’existence administrative.
Un autre risque est de maintenir deux implémentations indépendantes de l’algorithme, l’une pour le modèle traditionnel et l’autre pour le modèle alphanumérique. Comme la nouvelle règle est compatible avec les entrées numériques, une implémentation centralisée peut valider les deux formats. Cela réduit la duplication du code et facilite les tests. Évitez également de modifier les CNPJ déjà stockés : normaliser la ponctuation est différent de générer ou remplacer l’identifiant officiel d’une entreprise.
Enfin, n’attendez pas que le premier CNPJ contenant des lettres arrive en production. La migration implique des fournisseurs, des contrats et des données historiques ; elle nécessite donc du temps pour les homologations. Un inventaire bien réalisé révèle souvent des utilisations inattendues du document dans les noms de fichiers, les répertoires, les caches, les métriques, les URL, les permissions et les règles antifraude.
FAQ : questions fréquentes sur le CNPJ alphanumérique
Quand le CNPJ alphanumérique commencera-t-il à être utilisé ?
Le déploiement est prévu pour commencer progressivement en juillet 2026 pour les nouvelles inscriptions au CNPJ. Les numéros déjà existants resteront valides et ne seront pas convertis automatiquement.
Les entreprises existantes devront-elles changer de CNPJ ?
Non. La Receita Federal indique que les CNPJ déjà attribués resteront valides. Toutefois, les systèmes et les intégrations devront accepter simultanément le format numérique traditionnel et le nouveau format alphanumérique.
Combien de caractères comptera le CNPJ alphanumérique ?
Il conservera 14 positions. Les huit positions de la racine et les quatre positions de l’ordre de l’établissement pourront utiliser des lettres et des chiffres. Les deux positions finales resteront des chiffres de contrôle numériques.
Le calcul des chiffres de contrôle a-t-il changé ?
Le module 11 et les pondérations continuent d’être utilisés. L’adaptation principale consiste à transformer les lettres et les chiffres en valeurs numériques sur la base du code ASCII moins 48 avant d’appliquer le calcul.
Puis-je enregistrer un CNPJ dans une colonne numérique ?
Non. Le CNPJ doit être stocké sous forme de texte, par exemple VARCHAR(14), car il pourra contenir des lettres et parce que les zéros initiaux font partie de l’identifiant. Les colonnes numériques peuvent aussi provoquer des conversions et une perte de précision.
L’ancienne regex de CNPJ continuera-t-elle à fonctionner ?
Les regex qui acceptent uniquement 14 chiffres ne reconnaîtront plus les nouveaux CNPJ. La validation structurelle doit accepter 12 caractères alphanumériques suivis de deux chiffres numériques, en plus de valider le chiffre de contrôle.
Le CNPJ alphanumérique distingue-t-il les majuscules et les minuscules ?
L’entrée doit être normalisée en lettres majuscules avant le stockage et la validation. Cette normalisation évite les incohérences entre les formulaires, les API, les requêtes et les index uniques.
La validation du chiffre de contrôle confirme-t-elle que l’entreprise existe ?
Non. La validation mathématique confirme uniquement que la structure et les chiffres de contrôle sont cohérents. L’existence et la situation cadastrale doivent être vérifiées auprès des services officiels de la Receita Federal.
Les masques comme 00.000.000/0000-00 peuvent-ils encore être utilisés ?
L’apparence avec des points, une barre oblique et un tiret peut être conservée, mais chaque position de la racine et de l’ordre de l’établissement doit accepter une lettre ou un chiffre. Les bibliothèques configurées pour accepter uniquement des chiffres devront être ajustées ou remplacées.
Comment tester la migration avant juillet 2026 ?
Créez des cas de test automatisés avec des CNPJ traditionnels et alphanumériques, révisez les bases de données et les contrats d’API, puis utilisez le Générateur et le Validateur de CNPJ d’Utinix pour tester les formulaires, les importations et les intégrations sans utiliser de données réelles d’entreprises.
Conclusion
Le CNPJ alphanumérique conserve les 14 positions et les deux chiffres de contrôle numériques, mais il modifie une hypothèse profondément ancrée dans les logiciels brésiliens : ce document n’est plus exclusivement décimal. Les entreprises n’ont pas besoin de remplacer les CNPJ existants, mais leurs systèmes doivent être prêts à recevoir de nouveaux identifiants contenant des lettres à partir du déploiement prévu en juillet 2026.
La mise en conformité la plus sûre commence par un inventaire, se poursuit par la définition d’un format canonique textuel, centralise la normalisation et la validation, révise les contrats et se termine par des tests couvrant l’ensemble du flux. Plus les équipes techniques et métier traiteront rapidement ce sujet comme une migration de données et d’intégration, plus le risque de rejets d’inscription, de documents tronqués et d’erreurs silencieuses sera réduit.