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.
- Rendez-vous sur Mon compte.
- 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.
- 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.
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…
- Depuis Mon compte, créez une liste et donnez-lui un nom.
- 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.
- 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.
Endpoints
| Endpoint | Rôle | Clé d’API |
GET /organisation/entreprise/{siren} | Fiche d’une entreprise | oui |
GET /organisation/recherche | Recherche multicritère (activités, zone, état…) | oui |
GET /organisation/suggestion | Autocomplétion par nom, SIREN ou SIRET | non |
GET /organisation/etablissement/{siret} | Fiche d’un établissement | oui |
GET /organisation/entreprise/{siren}/etablissement | Établissements d’une entreprise | oui |
GET /organisation/entreprise/{siren}/annonce | Annonces légales | oui |
GET /dictionnaire/activite[/{code}] | Codes d’activité (NAF) | non |
GET /dictionnaire/recherche/activite | Recherche d’activités en texte libre | oui |
GET /dictionnaire/convention-collective[/{code}] | Conventions collectives (IDCC) | non |
GET /dictionnaire/forme-juridique[/{code}] | Formes juridiques | non |
GET /quota | Consommation du mois | oui |
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
| Option | Défaut | Rôle |
limit | 10 | nombre de suggestions, de 1 à 10 |
minLength | 3 | nombre de caractères avant d’appeler l’API |
debounce | 150 | délai en ms après la dernière frappe |
client | PublicClient à réutiliser | |
baseUrl | https://api.entreprise.page/v1 | URL de l’API, si client n’est pas fourni |
fetch | globalThis.fetch | pour ajouter cache, retries ou logs |
source | (query, signal) => Promise<Suggestion[]>, remplace l’appel à l’API | |
onSelect | appelé avec la suggestion choisie | |
onError | appelé 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.
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.
| Champ | Contenu |
evenement | le type d’événement (voir ci-dessous) |
date | la date d’envoi, en UTC, au format ISO 8601 |
siren | l’entreprise concernée |
siret | l’établissement concerné, pour un événement sur un établissement |
liste | la liste dont l’alerte a déclenché l’appel |
changement | l’ancienne et la nouvelle valeur, absent quand l’événement n’en a pas |
entreprise | la fiche de GET /organisation/entreprise/{siren}, à jour du changement, ou null si elle est introuvable |
etablissement | la fiche de GET /organisation/etablissement/{siret}, pour un événement sur un établissement |
Les événements
evenement | changement | Établissement |
changement_siege_social | SIRET de l’ancien et du nouveau siège | non |
changement_activite_principal | codes d’activité (NAF), par exemple "70.10Z" | non |
changement_denomination | dénomination, ou prénom et nom pour un entrepreneur individuel | non |
changement_diffusion | true ou false : l’entreprise est diffusible ou non | non |
changement_forme_juridique | codes de forme juridique, en nombres, par exemple 5710 | non |
fermeture_entreprise | état : "ac" active, "ce" cessée, "fe" fermée | non |
nouvel_etablissement | absent | oui |
fermeture_etablissement | état de l’établissement, comme pour l’entreprise | oui |
nouveau_dirigeant | absent : consultez entreprise.dirigeant | non |
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 :
| Cas | PHP | JavaScript |
| 400 — paramètres refusés | BadRequestException | BadRequestError |
| 401 / 403 — clé absente ou invalide | UnauthorizedException | UnauthorizedError |
| 404 — introuvable | NotFoundException | NotFoundError |
| 429 — quota ou débit dépassé | TooManyRequestsException | TooManyRequestsError |
| 5xx — erreur du serveur | ServerException | ServerError |
| Aucune réponse (réseau, timeout, CORS) | TransportException | TransportError |
| Réponse hors contrat | UnexpectedResponseException | UnexpectedResponseError |
| Paramètres invalides avant l’envoi | InvalidArgumentException | InvalidArgumentError |
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.