[ Les identifiants de l'entreprise ]

Le code NAF, le code APE, et pourquoi ils se trompent souvent

NAF et APE sont deux mots pour la même chose, ce qui explique la moitié des recherches sur le sujet. Le reste des questions vient d'une autre découverte, généralement faite trop tard : le code ne dit pas forcément ce que l'entreprise fait.

Deux sigles, un seul code

La NAF est la nomenclature : le catalogue des activités possibles, tenu par l'Insee. L'APE est l'activité principale exercée, c'est-à-dire le code de ce catalogue que l'Insee attribue à une entreprise donnée. Dans la vie courante, « code NAF » et « code APE » désignent le même numéro, celui qui figure sur votre avis de situation.

Le format est toujours le même : quatre chiffres et une lettre, comme 62.01Z pour la programmation informatique ou 10.71C pour la boulangerie-pâtisserie. Les deux premiers chiffres donnent le secteur, les suivants affinent, la lettre finale est une subdivision proprement française.

Où le trouver

  • Sur l'avis de situation au répertoire Sirene, gratuit, délivré immédiatement par l'Insee à partir du SIREN.
  • Sur l'annuaire des entreprises de l'administration, dans la fiche de la société.
  • Sur le bulletin de paie de vos salariés, où sa mention est obligatoire.
  • Sur l'extrait Kbis, avec l'objet social rédigé en toutes lettres.

Le code se conteste, et se fait modifier auprès de l'Insee, ce qui est utile quand il conditionne une convention collective ou une aide sectorielle. Encore faut-il s'en apercevoir.

Pourquoi le code décrit mal le métier réel

Le code APE est attribué à la création, à partir de ce que le fondateur a décrit dans son formulaire. Il n'est jamais recalculé ensuite. Une entreprise qui a pivoté trois fois en dix ans garde le code de son premier métier, sauf démarche volontaire, que presque personne n'entreprend.

S'ajoutent des codes fourre-tout, qui absorbent tout ce qui ne rentre pas ailleurs. 47.78C, « autres commerces de détail spécialisés divers », réunit des activités qui n'ont rien à voir entre elles. 70.22Z, « conseil pour les affaires et autres conseils de gestion », contient à la fois des consultants indépendants, des cabinets de stratégie et des holdings sans activité opérationnelle.

Ce qu'il faut croiser pour retrouver le vrai métier

Le code NAF reste un excellent point de départ, à condition de le confronter à des signaux qui, eux, décrivent l'activité d'aujourd'hui :

  • La catégorie de la fiche Google de l'établissement. Elle est choisie par le commerçant lui-même, dans une nomenclature bien plus proche du langage courant que la NAF, et elle est mise à jour parce qu'elle conditionne la visibilité locale.
  • Le secteur déclaré sur la page LinkedIn, qui reflète la façon dont l'entreprise se présente à ses pairs et à ses candidats.
  • Le contenu du site web, quand il existe : c'est la source la plus à jour, et la seule où l'entreprise décrit son métier avec ses mots.
  • La convention collective appliquée, qui découle du métier réel et pas du code déclaré. Voir la page qui lui est consacrée.

Un filtre par activité qui rend un résultat propre est toujours un filtre qui croise plusieurs de ces signaux. Un filtre construit sur le seul code NAF rend des listes dont vous jetterez la moitié.

La nomenclature change, et vos fichiers ne le savent pas

La NAF est révisée périodiquement pour suivre l'apparition de métiers qui n'existaient pas et la disparition de ceux qui ne se pratiquent plus. À chaque révision, des codes changent de libellé, se scindent, ou fusionnent.

Conséquence pour quiconque manipule de la donnée : deux fichiers de millésimes différents peuvent classer la même entreprise sous deux codes distincts, sans qu'aucun des deux soit faux. Avant de comparer deux extractions, vérifiez qu'elles parlent la même version de la nomenclature.

Cibler un ou plusieurs codes NAF et sortir le libellé officiel avec chaque ligne

Vous savez quel code vous visez. Ce qui manque, c'est la preuve que les lignes obtenues le portent vraiment, sans avoir à ouvrir une fiche sur deux. Le libellé officiel voyage avec chaque enregistrement, à l'écran comme dans le fichier, et sans réglage de colonnes.

Dans la plateforme, pas à pas

  1. Ouvrez la recherche entreprise.
  2. Dans le filtre Activité, tapez le code tel quel. La ponctuation et la casse n'ont pas d'importance : « 62.01Z », « 6201z » et « 62 01 z » remontent la même suggestion, chaque code étant indexé sous ses deux formes, avec et sans séparateur.
  3. Retenez la suggestion marquée NAF : elle affiche le libellé officiel à côté du code (« 62.01Z – Programmation informatique »), ce qui vous laisse vérifier avant de valider que c'est bien celui que vous vouliez.
  4. Ajoutez les autres codes de la même façon. Ils se cumulent en OU : une entreprise ressort dès qu'elle porte l'un d'eux.
  5. Laissez cochée la bascule « Entreprises actives uniquement », active par défaut. Un établissement cessé garde son code et remonterait sinon.
  6. Lisez le compteur avant d'extraire : le comptage ne consomme rien, l'extraction si.
  7. Exportez. Le CSV porte les colonnes legal_naf et legal_naf_label sur chaque ligne, il n'y a aucune colonne à choisir.

Un code NAF n'existe que sur les fiches du registre. Dès que le filtre porte sur un code, les fiches Google et LinkedIn sans contrepartie légale quittent le résultat. Le volume affiché baisse pour cette raison, pas parce que la sélection est mauvaise.

Par l'API : POST /companies/find

{
  "filters": {
    "naf_code": { "include": ["62.01Z", "62.02A", "62.02B"] },
    "company_ceased": false
  },
  "limit": 50
}

La réponse rend `total`, `leads` et `pagination.nextToken` à repasser en `paginationToken` pour la page suivante. Chaque fiche issue du registre porte `naf_code` et `naf_code_label` : le code retenu et son libellé officiel, contrôlables directement dans le résultat. Deux réserves sur les chiffres, propres à l'appel par clé d'API. Le `total` d'une recherche ordinaire est plafonné à 100 000 : au-delà, la réponse porte `totalCapped: true` et un message dans `meta.countCapNotice`, et le vrai nombre est plus grand. Et `pagination.nextToken` cesse d'être rendu une fois la profondeur de pagination maximale atteinte. Pour le volume seul, renvoyez le même corps avec `"countOnly": true` : ce mode contourne le plafond, le total est exact et aucune fiche n'est débitée.

Le suffixe `.x` prend une division entière : `"naf_code": { "include": ["41.x"] }` retient tous les codes commençant par `41.`. Le filtre `headquarters_naf_code` est routé sur le même champ que `naf_code` : posez l'un ou l'autre, jamais les deux, car deux clauses sur un même champ se combinent en ET et vous obtiendriez l'intersection des deux listes, donc rien dès qu'elles diffèrent. La taille de page va jusqu'à 1 000. Pour le fichier, rejouez le même objet `filters` sur `POST /companies/export` (flux CSV, colonnes `legal_naf` et `legal_naf_label` comprises), ou sur `POST /exports` avec `"source": "companies"` pour un export asynchrone à récupérer ensuite par `GET /exports/{jobId}/download`, plus sûr sur les gros volumes.

Le détail des champs, des filtres et des codes de réponse est dans la documentation de l'API.

Avec Claude, en langage courant

Combien d'entreprises en activité sont codées 62.01Z, 62.02A ou 62.02B ? Donne-moi les cent premières avec leur code NAF et son libellé officiel.

Claude enchaîne basile_count, basile_search_companies puis basile_export.

Le comptage passe d'abord : basile_count est gratuit et rend un total exact, là où la recherche débite une fiche par ligne renvoyée et rend un total plafonné à 100 000. Si le code ne vous revient pas, donnez le métier plutôt que le numéro : basile_activity_suggest remonte les codes candidats avec leur libellé, et vous tranchez.

Rattraper les entreprises mal codées en filtrant sur l'activité réelle plutôt que sur le code

Un code fourre-tout laisse entrer ce dont vous ne voulez pas et laisse dehors ce que vous cherchez. Le filtre d'activité interroge trois vocabulaires à la fois : les codes NAF du registre, la catégorie de la fiche Google et le secteur déclaré sur LinkedIn. Un menuisier resté sur le code de son premier métier ressort quand même, parce que sa fiche Google, elle, le dit menuisier.

Dans la plateforme, pas à pas

  1. Ouvrez la recherche entreprise.
  2. Dans le filtre Activité, tapez le métier en français courant plutôt que le code : « menuiserie », « plomberie », « cabinet de conseil ».
  3. Retenez la suggestion de métier, pas celle marquée NAF, Google ou LinkedIn. La suggestion de métier embarque d'un coup les codes NAF, les catégories Google et les secteurs LinkedIn qui lui correspondent ; le code seul ne ramène que les fiches du registre qui le portent.
  4. Restreignez la zone par la région, ou par la ville. Ces deux critères sont compris par les trois sources, là où un département, un code postal, une forme juridique ou une borne de capital ramènent la recherche au registre seul et annulent tout le bénéfice.
  5. Ouvrez une vingtaine de fiches avant d'extraire. Les fiches venues de Google affichent leur catégorie, celles venues de LinkedIn leur secteur : c'est là que se voit si la sélection colle au métier.
  6. Si la sélection ratisse trop large, retirez le métier et reconstituez-le avec les seuls codes, catégories Google et secteurs LinkedIn que vous validez, ajoutés un par un depuis la même liste de suggestions (chaque ligne y porte son étiquette de source).

La taxonomie sur-matche encore sur certains concepts. Tapez un mot générique de commerce de détail et vous remontez des dizaines de métiers d'un coup : sur les 328 concepts de la taxonomie, 29 en portent le vocabulaire. Et le code 47.78C, « autres commerces de détail spécialisés divers », sert de fourre-tout à des activités qui n'ont rien à voir. Sur ces zones, une sélection par métier rend des lignes hors sujet : contrôlez avant d'extraire, et rabattez-vous sur une liste choisie à la main quand c'est le cas.

Par l'API : POST /companies/find

{
  "filters": {
    "activity": { "include": ["menuiserie_batiment"] },
    "region": { "include": ["Pays de la Loire"] },
    "company_ceased": false
  },
  "limit": 50
}

Le résultat mélange les trois sources, chaque ligne portant sa `source`. Une fiche du registre porte `naf_code` et `naf_code_label`, une fiche Google sa `category`, une fiche LinkedIn son `industry_main` : trois façons de vérifier le métier, et la raison pour laquelle une entreprise mal codée reste dans le lot. `meta.sources` dit quelles sources ont réellement répondu, `meta.notice` explique une éventuelle mise à l'écart, et `meta.unknownFilters` liste les clés que vous avez envoyées sans qu'elles soient reconnues, plutôt que de les ignorer en silence.

Une valeur d'`activity` est soit un identifiant de métier (`"menuiserie_batiment"`), soit une valeur préfixée qui ne vise qu'une source : `"naf:43.32A"`, `"gmb:Carpenter"`, `"lki:Building Finishing Contractors"`. L'identifiant de métier se déplie dans les trois vocabulaires ; une valeur préfixée ne parle qu'à la sienne, et les deux autres sources ne rendent alors rien. `GET /companies/activity-suggest?q=menuiserie` donne les identifiants disponibles avec leur libellé et leur type (concept, naf, gmb, lki). Le piège à connaître : poser `naf_code`, `headquarters_naf_code`, `headquarters_department_code`, `headquarters_region_code`, `headquarters_postal_code`, `legal_form`, `legal_category`, `siren`, `capital_min`/`capital_max` ou une borne de date de création à côté d'`activity` restreint la recherche au registre et fait disparaître les fiches Google et LinkedIn que le filtre venait justement chercher. Deux autres clés font tomber la seule source Google sans ramener au registre : `headquarters_country_code` et l'effectif (`headcount_min`/`headcount_max`), le résultat restant alors registre plus LinkedIn. Vérifiez `meta.sources` en cas de doute.

Le détail des champs, des filtres et des codes de réponse est dans la documentation de l'API.

Avec Claude, en langage courant

Trouve les entreprises de menuiserie en Pays de la Loire, y compris celles dont le code NAF ne le dit pas. Combien y en a-t-il, et montre-moi vingt fiches avec la source de chacune.

Claude enchaîne basile_activity_suggest, basile_count puis basile_search_companies.

basile_activity_suggest convertit le métier en identifiant avant tout comptage : c'est ce passage qui fait travailler les trois sources au lieu du seul code. Ne lui ajoutez pas un département, un code postal ni une forme juridique dans la même demande, sinon la recherche retombe sur le registre seul et le résultat ressemble à celui qu'on cherchait à éviter.

Exclure les codes parasites d'un segment déjà constitué

Votre sélection tient sur le fond, à ceci près qu'elle charrie des holdings et des sièges administratifs. Ceux-là ont leur propre code, ce qui suffit à les retirer sans défaire le ciblage ni recommencer la recherche.

Dans la plateforme, pas à pas

  1. Repartez de la recherche telle qu'elle est, sans toucher aux filtres qui la définissent.
  2. Notez d'abord le total affiché : c'est votre point de comparaison.
  3. Dans le filtre Activité, cherchez ce que vous ne voulez jamais voir, puis excluez-le : soit depuis la ligne de suggestion, soit en posant la pastille et en la retournant avec le bouton cercle barré. Pour les structures sans activité opérationnelle, cela vise « Activités des sociétés holding » (64.20Z), « Fonds de placement et entités financières similaires » (64.30Z) et « Activités des sièges sociaux » (70.10Z).
  4. Relisez le compteur. Le filtre replié affiche le nombre d'exclusions en rouge, et l'écart avec le total noté à l'étape 2 mesure exactement ce que les parasites pesaient dans votre segment.
  5. Ouvrez quelques fiches restantes pour vérifier que l'exclusion n'a pas emporté des entreprises légitimes, ce qui arrive quand un opérationnel est classé au siège social.
  6. Exportez une fois le compte stabilisé.

L'exclusion travaille sur le code réellement porté, et pas sur la nature de l'entreprise. Une holding sans activité codée 70.22Z, « conseil pour les affaires et autres conseils de gestion », exactement comme les cabinets que vous ciblez, ne peut être séparée par aucune exclusion de code. Pour celle-là, il faut passer par un autre signal (la catégorie Google, le secteur LinkedIn, l'absence de site) ou par un tri à la main.

Par l'API : POST /companies/find

{
  "filters": {
    "activity": {
      "include": ["conseil_management_strategie"],
      "exclude": ["holding_societes_financieres", "siege_social_holding_operationnelle"]
    },
    "region": { "include": ["Île-de-France"] },
    "company_ceased": false
  },
  "limit": 50
}

Rien ne change dans la forme de la réponse : le `total` chute de ce qui a été écarté. Envoyez le même corps deux fois, avec puis sans le bloc `exclude`, en `"countOnly": true` : la différence entre les deux totaux est la mesure exacte du nettoyage, elle ne coûte rien, et elle échappe au plafond de comptage qui s'applique aux recherches ordinaires par clé d'API.

Variante littérale par code : `"naf_code": { "exclude": ["64.20Z", "64.30Z", "70.10Z"] }`. Attention, la seule présence de la clé `naf_code`, même en exclusion et sans aucun `include`, restreint la recherche aux fiches du registre : les fiches Google et LinkedIn disparaissent du résultat. `activity.exclude` n'a pas cet effet et retire la même chose sur les trois sources, puisqu'il écarte à la fois les codes NAF, les catégories Google et les secteurs LinkedIn rattachés aux métiers exclus. Préférez-la, sauf si votre segment était déjà limité au registre. L'exclusion accepte aussi les valeurs préfixées, `"naf:70.10Z"` par exemple, pour ne retirer qu'un code précis sans emporter tout le métier auquel il appartient : une exclusion préfixée ne parle qu'à sa source, les deux autres ne perdent rien.

Le détail des champs, des filtres et des codes de réponse est dans la documentation de l'API.

Avec Claude, en langage courant

Reprends la recherche de cabinets de conseil en Île-de-France et retire les holdings et les sièges sociaux. Dis-moi combien de lignes ça enlève.

Claude enchaîne basile_activity_suggest, basile_count puis basile_search_companies.

Demandez-lui explicitement les deux comptages, avec et sans l'exclusion : basile_count ne débite rien, l'écart est donc gratuit et c'est la seule mesure honnête de ce que le nettoyage a retiré. Si l'écart est nul, ce n'est pas que l'exclusion a échoué : c'est que les parasites portent le même code que vos cibles, et il faut alors changer de signal.

À lire ensuite