Base Sirene : la liste des entreprises par code NAF et département

Ce qu'est la base Sirene, comment lire un code NAF, et comment obtenir la liste des entreprises par code NAF et département, gratuitement, avec l'API ouverte ou les fichiers de data.gouv.fr.

Requêtes et scripts testés le 26 octobre 2026.

Vous cherchez toutes les sociétés de développement logiciel de Gironde, les boulangeries du Rhône ou les cabinets d'ingénierie d'Île-de-France ? La base Sirene contient la réponse, et elle est gratuite. Ce guide explique ce qu'est la base Sirene, comment lire un code NAF, puis comment obtenir la liste des entreprises par code NAF et par département, filtrée par effectif salarié et date de création, avec l'API publique (sans clé) ou le fichier Sirene. Tous les exemples ont été testés le 26 octobre 2026.

La base Sirene en bref

Sirene est le répertoire des entreprises et de leurs établissements tenu par l'Insee. Deux identifiants à retenir :

  • le SIREN (9 chiffres) identifie l'entreprise, appelée « unité légale » ;
  • le SIRET (14 chiffres) identifie chaque établissement : le SIREN suivi d'un numéro interne à 5 chiffres (NIC).

Une entreprise a donc un SIREN et autant de SIRET que d'établissements, dont un siège. Il existe plusieurs façons d'accéder aux données :

Accès Clé ou compte Fraîcheur Idéal pour
Fichiers stock sur data.gouv.fr (CSV et Parquet) aucun mensuelle extractions complètes, analyses
API Sirene de l'Insee compte et souscription sur le portail quotidienne toutes les variables Sirene, à jour
API Recherche d'entreprises aucune quotidienne recherches filtrées rapides

Le fichier Sirene sur data.gouv (la « base Sirene des entreprises et de leurs établissements ») est une image du répertoire au dernier jour du mois précédent, diffusée sous Licence Ouverte. En octobre 2026, le fichier des unités légales pèse environ 714 Mo en Parquet et celui des établissements environ 2,2 Go. Les deux API, elles, sont mises à jour chaque jour : seuls les fichiers stock ont jusqu'à un mois de retard.

Comment fonctionnent les codes NAF et APE

Le code APE (activité principale exercée) est attribué par l'Insee à chaque entreprise et à chaque établissement. D'après la définition de l'Insee, c'est l'activité qui génère le plus de valeur ajoutée, estimée en pratique par la répartition du chiffre d'affaires. Ce code est tiré de la NAF, la nomenclature d'activités française.

La NAF rév. 2 compte cinq niveaux : 21 sections (une lettre), 88 divisions (2 chiffres), 272 groupes, 615 classes et 732 sous-classes (4 chiffres et une lettre). Dans Sirene, le code APE en vigueur est une sous-classe. Exemple avec 62.01Z : section J (Information et communication), division 62, groupe 62.0, classe 62.01, sous-classe 62.01Z.

Liste des codes NAF courants

Code NAF Libellé officiel
10.71C Boulangerie et boulangerie-pâtisserie
41.20A Construction de maisons individuelles
43.21A Travaux d'installation électrique dans tous locaux
43.22A Travaux d'installation d'eau et de gaz en tous locaux
56.10A Restauration traditionnelle
56.10C Restauration de type rapide
62.01Z Programmation informatique
62.02A Conseil en systèmes et logiciels informatiques
68.20B Location de terrains et d'autres biens immobiliers
69.20Z Activités comptables
70.22Z Conseil pour les affaires et autres conseils de gestion
71.12B Ingénierie, études techniques
96.02A Coiffure

La liste complète des codes NAF est consultable et téléchargeable sur la page NAF de l'Insee.

À savoir pour 2027 : l'Insee passe à la NAF 2025 au 1er janvier 2027. Depuis décembre 2025, le futur code est déjà diffusé à titre informatif, dans les fichiers stock comme dans l'API Recherche d'entreprises (champ activite_principale_naf25). Dans nos réponses, une boulangerie codée 10.71C portait par exemple le code NAF 2025 10.71H. Si vous construisez une liste récurrente, prévoyez une table de correspondance (l'Insee en publie sur la même page).

Filtrer par code NAF, département et effectif avec l'API ouverte

L'API Recherche d'entreprises répond sans inscription. Une première requête, ici les boulangeries actives (hors entrepreneurs individuels) de 10 à 49 salariés ayant un établissement dans le Rhône :

curl -A "mon-projet/1.0 (+https://exemple.fr)" \
  "https://recherche-entreprises.api.gouv.fr/search?activite_principale=10.71C&departement=69&etat_administratif=A&est_entrepreneur_individuel=false&tranche_effectif_salarie=11,12&per_page=5&minimal=true&include=siege"

Sous Windows PowerShell, tapez curl.exe et écrivez la commande sur une seule ligne, sans le \.

La réponse indiquait "total_results": 183 lors de notre test. Les paramètres utiles :

Paramètre Rôle
activite_principale un ou plusieurs codes NAF exacts, séparés par des virgules
section_activite_principale une section entière (lettre A à U)
departement code du département : 33, 2A, 974
tranche_effectif_salarie tranches d'effectif Insee (voir ci-dessous)
etat_administratif A (active) ou C (cessée)
est_entrepreneur_individuel false pour ne garder que les sociétés
minimal=true et include=siege réponse allégée, sans la liste des dirigeants
per_page, page 25 résultats par page au maximum

Attention, un code de division seul comme 62 est refusé : il faut lister les sous-classes (62.01Z,62.02A,...).

Les principales tranches d'effectif (référence au 31 décembre 2024 depuis la mise à jour d'octobre 2026) :

Code Effectif
NN unité non employeuse
00 0 salarié
01 / 02 / 03 1 à 2 / 3 à 5 / 6 à 9 salariés
11 / 12 10 à 19 / 20 à 49 salariés
21 / 22 50 à 99 / 100 à 199 salariés
31 à 53 200 salariés et plus

Deux pièges à connaître

  1. Le filtre departement porte sur les établissements, pas sur le siège. Une entreprise dont le siège est à Nantes mais qui a un bureau à Bordeaux apparaît dans une recherche sur la Gironde. Dans notre test (NAF 62.01Z, Gironde, 10 à 199 salariés), 59 des 119 résultats avaient leur siège hors du département. Vérifiez siege.departement.
  2. Il n'existe pas de filtre sur la date de création. Le champ date_creation est présent dans chaque résultat : filtrez-le de votre côté.

Le script complet en Python

Ce script, sans dépendance externe, récupère toutes les pages, garde les entreprises dont le siège est en Gironde, créées depuis 2015, et écrit un CSV que l'on peut ouvrir directement dans Excel. Il s'arrête à la première page incomplète plutôt que de se fier au nombre de pages annoncé, qui n'est qu'une estimation.

import csv
import json
import time
import urllib.error
import urllib.parse
import urllib.request

API = "https://recherche-entreprises.api.gouv.fr/search"
USER_AGENT = "mon-projet/1.0 (+https://exemple.fr)"  # identifiez-vous

DEPARTEMENT = "33"            # Gironde
CREEES_DEPUIS = "2015-01-01"  # filtre appliqué côté client
PER_PAGE = 25                 # maximum autorisé par l'API
PARAMS = {
    "activite_principale": "62.01Z",            # Programmation informatique
    "departement": DEPARTEMENT,
    "etat_administratif": "A",                   # entreprises actives
    "tranche_effectif_salarie": "11,12,21,22",   # 10 à 199 salariés
    "est_entrepreneur_individuel": "false",      # sociétés seulement
    "minimal": "true",
    "include": "siege",                          # pas de dirigeants dans la réponse
    "per_page": PER_PAGE,
}


def get_page(page):
    url = API + "?" + urllib.parse.urlencode({**PARAMS, "page": page})
    req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT})
    for _ in range(5):
        try:
            with urllib.request.urlopen(req, timeout=30) as resp:
                return json.load(resp)
        except urllib.error.HTTPError as err:
            if err.code != 429:
                raise
            time.sleep(int(err.headers.get("Retry-After") or 5))
    raise RuntimeError("trop de réponses 429, réessayez plus tard")


rows, lus, page = [], 0, 1
while True:
    resultats = get_page(page)["results"]
    lus += len(resultats)
    for ent in resultats:
        siege = ent.get("siege") or {}
        if siege.get("departement") != DEPARTEMENT:
            continue  # établissement dans le 33, siège ailleurs
        if (ent.get("date_creation") or "") < CREEES_DEPUIS:
            continue
        rows.append({
            "siren": ent["siren"],
            "siret_siege": siege.get("siret"),
            "nom": ent.get("nom_raison_sociale") or ent.get("nom_complet"),
            "code_naf": ent.get("activite_principale"),
            "tranche_effectif": ent.get("tranche_effectif_salarie"),
            "date_creation": ent.get("date_creation"),
            "code_postal": siege.get("code_postal"),
            "commune": siege.get("libelle_commune"),
        })
    if len(resultats) < PER_PAGE:
        break  # page incomplète : c'était la dernière
    if page * PER_PAGE >= 10_000:
        print("Attention : plafond de 10 000 résultats atteint, découpez la requête.")
        break
    page += 1
    time.sleep(0.2)  # rester bien sous 7 requêtes par seconde

# utf-8-sig et point-virgule : le fichier s'ouvre directement dans Excel
with open("entreprises_62.01Z_33.csv", "w", newline="", encoding="utf-8-sig") as f:
    writer = csv.DictWriter(f, fieldnames=list(rows[0].keys()) if rows else ["siren"],
                            delimiter=";")
    writer.writeheader()
    writer.writerows(rows)

print(f"{lus} résultats lus, {len(rows)} lignes écrites")

Sortie lors de notre test : 119 résultats lus, 36 lignes écrites. Changez le code NAF, le département ou les tranches pour l'adapter à votre cible.

Les limites de l'API

Deux limites encadrent l'usage de l'API :

  • 7 requêtes par seconde par adresse IP (et 30 par seconde par ASN, ce qui peut gêner sur un cloud public), d'après la documentation officielle. Au-delà, l'API renvoie une erreur 429 avec un en-tête Retry-After.
  • 10 000 résultats au maximum par recherche : c'est le message d'erreur de l'API elle-même qui l'indique (« Le nombre total de résultats est restreint à 10 000 »). page * per_page ne doit pas dépasser 10 000, sinon l'API répond par une erreur 400, et total_results plafonne à 10 000. C'était le cas pour toutes les entreprises actives en 62.01Z en France.

Pour une liste plus grande, découpez la requête (par département, par tranche d'effectif, par catégorie juridique) puis dédoublonnez par SIREN. La documentation rappelle aussi que cette API sert à rechercher des entreprises, pas à extraire toute la base Sirene : pour un export complet, passez par les fichiers.

Exporter une liste complète

Gratuit et sans code : l'outil « Constituer une liste »

L'Annuaire des Entreprises propose un outil officiel gratuit, Constituer une liste, qui télécharge un CSV depuis le navigateur, sans compte. On y choisit notamment :

  • les codes NAF et la zone (département, région, commune ou code postal) ;
  • la tranche d'effectif, la catégorie d'entreprise et la catégorie juridique ;
  • la date de création et l'état (actives, cessées ou les deux) ;
  • tous les établissements ou les seuls sièges.

Le fichier contient une ligne par établissement (ou par siège), et un export est limité à 200 000 lignes, d'après le code source ouvert du site. Pour une liste ponctuelle sans code, c'est la première option à essayer. Choisissez vos catégories juridiques si vous voulez écarter les entrepreneurs individuels.

Gratuit : interroger le fichier Sirene avec DuckDB

Les fichiers stock Parquet de data.gouv.fr se lisent directement à distance avec DuckDB, sans tout télécharger. La requête ci-dessous reproduit le filtre du script : elle joint les unités légales à leur établissement siège, et la date de création devient un simple WHERE.

COPY (
  SELECT ul.siren,
         e.siret                           AS siret_siege,
         ul.denominationUniteLegale        AS nom,
         ul.activitePrincipaleUniteLegale  AS code_naf,
         ul.trancheEffectifsUniteLegale    AS tranche_effectif,
         ul.dateCreationUniteLegale        AS date_creation,
         e.codePostalEtablissement         AS code_postal,
         e.libelleCommuneEtablissement     AS commune
  FROM read_parquet('https://www.data.gouv.fr/api/1/datasets/r/350182c9-148a-46e0-8389-76c2ec1374a3') AS ul
  JOIN read_parquet('https://www.data.gouv.fr/api/1/datasets/r/a29c1297-1f92-4e2a-8f6b-8c902ce96c5f') AS e
    ON e.siren = ul.siren AND e.etablissementSiege
  WHERE ul.activitePrincipaleUniteLegale = '62.01Z'
    AND ul.etatAdministratifUniteLegale = 'A'
    AND ul.trancheEffectifsUniteLegale IN ('11', '12', '21', '22')
    AND ul.categorieJuridiqueUniteLegale <> 1000
    AND ul.statutDiffusionUniteLegale = 'O'
    AND ul.dateCreationUniteLegale >= DATE '2015-01-01'
    AND e.codeCommuneEtablissement LIKE '33%'
) TO 'sirene_62.01Z_33.csv' (HEADER);

Les deux URL sont les liens stables data.gouv.fr des fichiers Parquet « StockUniteLegale » et « StockEtablissement », que data.gouv.fr recommande pour l'automatisation. La catégorie juridique 1000 correspond aux entrepreneurs individuels, et statutDiffusionUniteLegale = 'O' écarte les unités en diffusion partielle. Dans notre test, la requête a pris quelques minutes et a renvoyé exactement les mêmes 36 SIREN que le script API. Le fichier ayant jusqu'à un mois de retard, une entreprise créée la semaine dernière n'y figure pas encore.

La base Sirene contient des données personnelles (les entrepreneurs individuels en particulier). data.gouv.fr rappelle que leur traitement relève du RGPD et qu'il faut respecter le statut de diffusion de chaque personne. Exclure les entrepreneurs individuels, comme ci-dessus, simplifie beaucoup les choses pour une prospection B2B.

Automatiser et suivre les créations : notre Actor sur Apify

Chez Quarrywise, nous publions un outil qui automatise la méthode API ci-dessus : SIRENE API: Export French Company Lists by NAF Code, sur l'Apify Store. C'est un outil indépendant, sans lien avec l'Insee ni avec la DINUM. Il lit la même API Recherche d'entreprises, donc pas de clé Insee, et il :

  • accepte des codes NAF, une division entière comme 62, des départements, des tranches d'effectif, des catégories juridiques et une date de création (date fixe ou période glissante comme 30 days) ;
  • ne garde par défaut que les entreprises dont le siège est dans vos départements ;
  • découpe automatiquement les grosses requêtes pour dépasser le plafond de 10 000 résultats, puis dédoublonne par SIREN ;
  • exclut les entrepreneurs individuels et ne renvoie jamais les dirigeants ; les sociétés portant le nom d'une personne sont filtrées au mieux, et l'adresse s'arrête à la commune sauf si vous demandez le détail ;
  • livre le résultat en CSV, Excel ou JSON, ou par l'API d'Apify, et propose un mode « nouvelles entreprises » qui, lancé chaque semaine, ne renvoie que les sociétés apparues depuis le passage précédent.

La facturation se fait à l'usage, principalement par ligne d'entreprise enregistrée, avec le prix affiché sur la page Store avant tout lancement. Si une liste ponctuelle vous suffit, l'outil officiel et les deux méthodes gratuites de ce guide font l'affaire. L'Actor sert surtout au suivi planifié des nouvelles entreprises, au filtre des noms de personnes, à la sortie Excel, JSON ou API, et aux listes de plus de 200 000 entreprises.

En résumé

  • Une liste ponctuelle sans code, jusqu'à 200 000 lignes : l'outil officiel « Constituer une liste ».
  • Une recherche de moins de 10 000 résultats dans votre code : l'API Recherche d'entreprises, en filtrant le siège et la date de création côté client.
  • Un export complet ou une analyse : le fichier Sirene Parquet de data.gouv.fr avec DuckDB.
  • Toutes les variables Sirene, à jour : l'API Sirene de l'Insee, avec un compte.
  • Un suivi planifié des nouvelles entreprises, ou une liste prête pour un CRM ou un agent : un outil comme notre Actor.

Dans tous les cas, identifiez-vous avec un User-Agent explicite, restez sous les limites de débit et citez la source (Insee, base Sirene) quand vous réutilisez les données.

Sources