Cette documentation a deux parties. La première explique, sans jargon, comment trouver et suivre des entreprises depuis le site. La seconde s’adresse aux développeurs qui veulent intégrer les données dans leurs propres outils grâce à l’API et aux SDK.

Utiliser entreprise.page

Premiers pas

entreprise.page rassemble les informations publiques sur les entreprises françaises, publiées par des sources officielles : l’INSEE (le répertoire SIRENE), l’INPI et le registre du commerce. Vous n’avez rien à installer : tout se passe dans votre navigateur.

La recherche et les fiches entreprises sont accessibles librement. Un compte gratuit vous permet en plus de créer des listes, d’être alerté des changements et d’utiliser l’API.

  1. Rendez-vous sur Mon compte.
  2. Dans « Je m’inscris », indiquez le nom de votre organisation (votre société, votre association, ou simplement votre nom), vos prénom et nom, et votre adresse e-mail.
  3. Ouvrez l’e-mail de confirmation reçu et cliquez sur le lien.

Il n’y a pas de mot de passe. Pour vous connecter, saisissez votre adresse e-mail dans « Je me connecte » : un code vous est envoyé par e-mail, il suffit de le recopier.

Rechercher une entreprise

Tapez dans le champ de recherche en haut de la page le nom de l’entreprise, son numéro SIREN (9 chiffres) ou SIRET (14 chiffres). Des propositions s’affichent dès le troisième caractère : choisissez la bonne avec la souris, ou avec les flèches du clavier puis Entrée.

SIREN ou SIRET ? Le SIREN identifie l’entreprise dans son ensemble. Le SIRET identifie l’un de ses établissements (un magasin, une agence, une usine…) : ce sont les 9 chiffres du SIREN suivis de 5 chiffres. Vous les trouvez sur une facture, un devis ou un extrait Kbis.

Les entreprises qui ont cessé leur activité apparaissent aussi, signalées comme inactives.

Lire une fiche entreprise

Chaque entreprise a sa page, organisée en rubriques :

  • Informations légales : SIREN, forme juridique (SAS, SARL…), date de création, adresse du siège, convention collective.
  • Activité : le secteur d’activité principal et la tranche d’effectif.
  • Situation financière : chiffre d’affaires, résultat net et marge, lorsque l’entreprise a publié ses comptes.
  • Dirigeants : les personnes ou sociétés qui dirigent l’entreprise.
  • Établissements : la liste et la carte des lieux où l’entreprise exerce.

Un clic sur un numéro SIREN ou SIRET le copie, prêt à être collé ailleurs. Certaines entreprises ont demandé à ne pas diffuser leurs informations : leur fiche est alors volontairement réduite.

Suivre des entreprises avec les listes

Une liste regroupe des entreprises que vous voulez garder sous la main : vos clients, vos fournisseurs, vos prospects…

  1. Depuis Mon compte, créez une liste et donnez-lui un nom.
  2. Ajoutez des entreprises depuis leur fiche, ou d’un coup avec « Ajouter des entreprises » : collez une série de numéros SIREN, séparés par une virgule, un point-virgule ou un retour à la ligne.
  3. La liste affiche pour chaque entreprise son nom, son siège, son activité et si elle est toujours en activité.

Chaque entreprise ajoutée à une liste compte comme une « surveillance » dans votre plan.

Être alerté des changements

Sur une liste, le bouton « Configurer l’alerte » vous prévient quand une entreprise de la liste change. Choisissez les événements qui vous intéressent :

  • changement de siège social
  • changement d’activité principale
  • changement de dénomination
  • changement de forme juridique
  • changement de diffusion
  • fermeture de l’entreprise
  • nouvel établissement
  • fermeture d’un établissement
  • nouveau dirigeant

Puis indiquez comment être prévenu :

  • Par e-mail : un récapitulatif quotidien des changements est envoyé aux adresses que vous indiquez (une ou plusieurs, pas forcément la vôtre).
  • Par webhook : pour les équipes techniques qui veulent recevoir chaque changement, dès qu’il est connu, directement dans leurs outils (voir Webhook des alertes).

Activez enfin l’interrupteur « Activer l’alerte » et enregistrez. Une alerte doit avoir au moins un événement et un moyen d’être prévenu.

Travailler en équipe

Votre compte appartient à une organisation. Depuis Mon compte > Mon compte, un organisateur peut inviter des collègues : ils reçoivent un e-mail avec un lien pour rejoindre l’organisation et partagent les mêmes listes et le même plan. Le nombre d’utilisateurs dépend du plan.

Plans et quotas

Le plan Starter est gratuit. Les plans payants augmentent le nombre de listes, de surveillances, d’utilisateurs et d’appels à l’API : comparez-les sur la page Nos plans. La page Mes quotas indique combien d’appels à l’API ont été faits ce mois-ci.

Questions fréquentes

D’où viennent les données ?
Uniquement de sources publiques officielles : INSEE, INPI, registre du commerce et annonces légales. Elles sont mises à jour régulièrement, mais vérifiez à la source une information décisive.
Je ne reçois pas le code de connexion.
Regardez dans vos courriers indésirables, puis vérifiez l’adresse saisie. Si votre adresse n’a pas encore été confirmée, la page de connexion propose de renvoyer l’e-mail de confirmation.
Une information est fausse ou mon entreprise ne devrait pas apparaître.
Nous reprenons les registres officiels : la correction doit être faite auprès de l’INSEE ou du greffe. Vous pouvez aussi demander la non-diffusion de vos données auprès de l’INSEE. Pour toute question, contactez-nous.

Développeurs

L’API en bref

L’API REST expose les mêmes données que le site, en JSON. La référence complète, générée depuis le code, est disponible sur api.entreprise.page.

  • URL de base : https://api.entreprise.page/v1
  • Authentification : en-tête X-API-Key
  • Trois SDK officiels : PHP, JavaScript/TypeScript, et un composant d’autocomplétion pour le navigateur.
curl -H "X-API-Key: $ENTREPRISE_PAGE_API_KEY" \
  https://api.entreprise.page/v1/organisation/entreprise/443061841

Clé d’API

La clé de votre organisation se trouve dans Mon compte > Connecteurs & API. Seul un organisateur peut en générer une nouvelle, ce qui invalide l’ancienne.

Gardez la clé côté serveur. Placée dans du code envoyé au navigateur, elle serait lisible par n’importe quel visiteur, qui consommerait votre quota. Les endpoints publics (suggestion et dictionnaires) n’en ont pas besoin.

Endpoints

EndpointRôleClé d’API
GET /organisation/entreprise/{siren}Fiche d’une entrepriseoui
GET /organisation/rechercheRecherche multicritère (activités, zone, état…)oui
GET /organisation/suggestionAutocomplétion par nom, SIREN ou SIRETnon
GET /organisation/etablissement/{siret}Fiche d’un établissementoui
GET /organisation/entreprise/{siren}/etablissementÉtablissements d’une entrepriseoui
GET /organisation/entreprise/{siren}/annonceAnnonces légalesoui
GET /dictionnaire/activite[/{code}]Codes d’activité (NAF)non
GET /dictionnaire/recherche/activiteRecherche d’activités en texte libreoui
GET /dictionnaire/convention-collective[/{code}]Conventions collectives (IDCC)non
GET /dictionnaire/forme-juridique[/{code}]Formes juridiquesnon
GET /quotaConsommation du moisoui

SDK PHP

Paquet Composer entreprise-page/api-client, PHP 7.4 ou plus. Il fonctionne avec n’importe quel client HTTP PSR-18 et fabrique PSR-17, et renvoie des objets typés. Sources : entreprise-page/api-client-php.

composer require entreprise-page/api-client symfony/http-client nyholm/psr7
use EntreprisePage\ApiClient\Client;
use EntreprisePage\ApiClient\Query\RechercheEntrepriseQuery;

$client = new Client(getenv('ENTREPRISE_PAGE_API_KEY'));

$entreprise = $client->entreprises()->get('443061841');
echo $entreprise->denominationSociale;

$codes = array_map(
    static fn ($activite) => $activite->code,
    $client->activites()->search('plombier')->resultats,
);

// Les critères sont immuables : chaque with…() renvoie une copie.
$resultats = $client->entreprises()->search(
    RechercheEntrepriseQuery::create('*')
        ->withActivites($codes)
        ->withActif(true)
        ->withZone(45.7672724, 4.8340594, 10)
        ->withParPage(50)
);

Dans une application Symfony, déclarez le client comme un service qui réutilise le client HTTP du framework :

# config/services.yaml
services:
    entreprise_page.http_client:
        class: Symfony\Component\HttpClient\Psr18Client
        arguments: ['@http_client']

    EntreprisePage\ApiClient\Client:
        arguments:
            $apiKey: '%env(ENTREPRISE_PAGE_API_KEY)%'
            $httpClient: '@entreprise_page.http_client'
            $requestFactory: '@entreprise_page.http_client'

SDK JavaScript / TypeScript

Paquet npm @entreprise-page/api-client, sans dépendance, pour Node.js 22+, Deno, Bun et les navigateurs récents. Les réponses sont validées et typées, en camelCase. Sources : entreprise-page/api-client-js.

npm install @entreprise-page/api-client

Il propose deux points d’entrée, pour que la clé ne parte jamais dans le navigateur :

  • @entreprise-page/api-client : Client, clé obligatoire, tous les endpoints, côté serveur uniquement.
  • @entreprise-page/api-client/browser : PublicClient, sans clé, limité à la suggestion et aux dictionnaires (environ 2 ko gzippés).

Côté serveur

import { Client } from '@entreprise-page/api-client';

const client = new Client({ apiKey: process.env.ENTREPRISE_PAGE_API_KEY! });

const entreprise = await client.entreprises().get('443061841');
console.log(entreprise.denominationSociale);

const { resultats: activites } = await client.activites().search('plombier');

const resultats = await client.entreprises().search({
  query: '*',
  activites: activites.map((activite) => activite.code),
  actif: true,
  zone: { latitude: 45.7672724, longitude: 4.8340594, rayon: 10 },
  parPage: 50,
});

Côté navigateur

import { PublicClient } from '@entreprise-page/api-client/browser';

const client = new PublicClient();
let controller;

input.addEventListener('input', async () => {
  // Seule la dernière frappe compte : on annule la requête précédente.
  controller?.abort();
  controller = new AbortController();

  const suggestions = await client.entreprises().suggest(input.value, 10, { signal: controller.signal });
  render(suggestions);
});

Toutes les méthodes acceptent en dernier argument { signal } pour annuler la requête. Pour les endpoints qui demandent une clé, votre front appelle votre serveur, qui utilise Client.

Composant Suggestion

Le paquet @entreprise-page/suggestion ajoute à n’importe quel champ de saisie l’autocomplétion de la page d’accueil, en JavaScript natif, Vue 3.5+ ou React 18+. Il n’a pas besoin de clé d’API, gère le délai entre les frappes, l’annulation des requêtes et la navigation au clavier, et respecte le motif d’accessibilité ARIA combobox. Sources : entreprise-page/suggestion.

Sans outil de build, depuis un CDN

<input type="search" name="entreprise" placeholder="Dénomination sociale, SIREN, SIRET">

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@entreprise-page/suggestion@1/dist/style.css">
<script src="https://cdn.jsdelivr.net/npm/@entreprise-page/suggestion@1/dist/suggestion.min.js"></script>
<script>
  EntrepriseSuggestion.attach(document.querySelector('input[name="entreprise"]'), {
    onSelect: (suggestion) => (window.location.href = `https://entreprise.page/${suggestion.slug}`),
  });
</script>

En production, fixez la version exacte (@1.2.3) plutôt que la majeure.

Avec npm

npm install @entreprise-page/suggestion
import { attach } from '@entreprise-page/suggestion';
import '@entreprise-page/suggestion/style.css';

const widget = attach(document.querySelector('input[name="entreprise"]'), {
  onSelect: (suggestion) => console.log(suggestion.siren),
});

// widget.destroy() retire la liste et les écouteurs.

Vue

<script setup>
import { ref } from 'vue';
import { EntrepriseSuggestion } from '@entreprise-page/suggestion/vue';

const saisie = ref('');
</script>

<template>
  <EntrepriseSuggestion
    v-model="saisie"
    name="entreprise"
    placeholder="SIREN, nom…"
    @select="(s) => $router.push(`/${s.slug}`)"
  />
</template>

React

import { EntrepriseSuggestion } from '@entreprise-page/suggestion/react';

<EntrepriseSuggestion
  inputProps={{ name: 'entreprise', placeholder: 'SIREN, nom…' }}
  onSelect={(s) => navigate(`/${s.slug}`)}
/>;

Options

OptionDéfautRôle
limit10nombre de suggestions, de 1 à 10
minLength3nombre de caractères avant d’appeler l’API
debounce150délai en ms après la dernière frappe
clientPublicClient à réutiliser
baseUrlhttps://api.entreprise.page/v1URL de l’API, si client n’est pas fourni
fetchglobalThis.fetchpour ajouter cache, retries ou logs
source(query, signal) => Promise<Suggestion[]>, remplace l’appel à l’API
onSelectappelé avec la suggestion choisie
onErrorappelé si l’appel échoue (pas pour une annulation)

Une suggestion contient siren, nom, localite, activite, active et slug.

Webhook des alertes

Le webhook d’une alerte transmet chaque changement à votre serveur, au fil des mises à jour des registres. Contrairement à l’e-mail, rien n’est regroupé : un appel part pour chaque événement, sur chaque liste dont l’alerte est active, avec le webhook activé et l’événement coché. Une entreprise suivie dans deux listes configurées déclenche donc deux appels.

Le webhook se configure depuis une liste, avec le bouton « Configurer l’alerte » : une URL en https et un token de votre choix.

La requête

  • Méthode POST, corps en JSON (Content-Type: application/json).
  • En-tête X-Entreprise-Page-Auth : le token de l’alerte, tel que vous l’avez saisi.
  • En-tête User-Agent: entreprise.page-webhook/1.0.

Répondez par un statut 2xx en moins de 10 secondes. Le corps de votre réponse n’est pas interprété. Si possible, enregistrez l’événement, répondez tout de suite, et faites le traitement ensuite.

Pas de nouvel essai. Un appel en échec (statut hors 2xx, délai dépassé, serveur injoignable) n’est pas rejoué. Les redirections ne sont pas suivies, et l’URL doit être publique : les adresses privées ou locales sont refusées. Rarement, un même événement peut arriver deux fois : votre traitement doit le supporter.

Le payload

{
  "evenement": "fermeture_etablissement",
  "date": "2026-11-12T14:00:00Z",
  "siren": "443061841",
  "siret": "44306184100047",
  "liste": { "id": 1, "nom": "Prospects" },
  "changement": { "ancienne_valeur": "ac", "nouvelle_valeur": "fe" },
  "entreprise": {
    "siren": "443061841",
    "denomination_sociale": "GOOGLE FRANCE",
    "forme_juridique": { "code": 5710, "libelle": "SAS, société par actions simplifiée" },
    "siege_social": { "siret": "44306184100047", "est_siege": true, "est_actif": true }
  },
  "etablissement": {
    "siret": "44306184100047",
    "est_siege": true,
    "est_actif": false,
    "adresse": { "code_postal": "75009" }
  }
}

Les fiches sont abrégées ici. Elles sont envoyées en entier.

ChampContenu
evenementle type d’événement (voir ci-dessous)
datela date d’envoi, en UTC, au format ISO 8601
sirenl’entreprise concernée
siretl’établissement concerné, pour un événement sur un établissement
listela liste dont l’alerte a déclenché l’appel
changementl’ancienne et la nouvelle valeur, absent quand l’événement n’en a pas
entreprisela fiche de GET /organisation/entreprise/{siren}, à jour du changement, ou null si elle est introuvable
etablissementla fiche de GET /organisation/etablissement/{siret}, pour un événement sur un établissement

Les événements

evenementchangementÉtablissement
changement_siege_socialSIRET de l’ancien et du nouveau siègenon
changement_activite_principalcodes d’activité (NAF), par exemple "70.10Z"non
changement_denominationdénomination, ou prénom et nom pour un entrepreneur individuelnon
changement_diffusiontrue ou false : l’entreprise est diffusible ou nonnon
changement_forme_juridiquecodes de forme juridique, en nombres, par exemple 5710non
fermeture_entrepriseétat : "ac" active, "ce" cessée, "fe" ferméenon
nouvel_etablissementabsentoui
fermeture_etablissementétat de l’établissement, comme pour l’entrepriseoui
nouveau_dirigeantabsent : consultez entreprise.dirigeantnon

Vérifier le token

Comparez l’en-tête reçu au token enregistré, avec une comparaison en temps constant, et refusez l’appel s’ils diffèrent.

// PHP
$token = $_SERVER['HTTP_X_ENTREPRISE_PAGE_AUTH'] ?? '';
if (!hash_equals(getenv('ENTREPRISE_PAGE_WEBHOOK_TOKEN'), $token)) {
    http_response_code(401);
    exit;
}

$evenement = json_decode(file_get_contents('php://input'), true);
// Enregistrez l'événement, traitez-le plus tard.
http_response_code(204);
// Node.js (Express)
import { timingSafeEqual } from 'node:crypto';

app.post('/webhook/entreprise-page', express.json(), (req, res) => {
  const recu = Buffer.from(req.get('X-Entreprise-Page-Auth') ?? '');
  const attendu = Buffer.from(process.env.ENTREPRISE_PAGE_WEBHOOK_TOKEN);
  if (recu.length !== attendu.length || !timingSafeEqual(recu, attendu)) {
    return res.sendStatus(401);
  }

  file.push(req.body); // Traitez-le plus tard.
  res.sendStatus(204);
});

Erreurs et quotas

Chaque appel authentifié est décompté du quota mensuel de votre plan ; au-delà, l’API répond 429. Les deux SDK traduisent les erreurs en exceptions typées :

CasPHPJavaScript
400 — paramètres refusésBadRequestExceptionBadRequestError
401 / 403 — clé absente ou invalideUnauthorizedExceptionUnauthorizedError
404 — introuvableNotFoundExceptionNotFoundError
429 — quota ou débit dépasséTooManyRequestsExceptionTooManyRequestsError
5xx — erreur du serveurServerExceptionServerError
Aucune réponse (réseau, timeout, CORS)TransportExceptionTransportError
Réponse hors contratUnexpectedResponseExceptionUnexpectedResponseError
Paramètres invalides avant l’envoiInvalidArgumentExceptionInvalidArgumentError

Consultez votre consommation avec compte().quota() ou sur la page Mes quotas. Pour toute question, contactez-nous, et suivez la disponibilité du service sur status.entreprise.page.