French Companies · Search & SIREN Enrichment
Pricing
from $3.99 / 1,000 establishment retrieveds
French Companies · Search & SIREN Enrichment
Build B2B lead lists or CRM enrichment from France’s official company register. Search by pasted URL (Pappers or data.gouv) with NAF, region, and department filters—or paste SIRENs for full records. Returns identity, address, directors, headcount band, and more via recherche-entreprises.api.gouv.fr.
Pricing
from $3.99 / 1,000 establishment retrieveds
Rating
0.0
(0)
Developer
Corentin Robert
Maintained by CommunityActor stats
0
Bookmarked
53
Total users
16
Monthly active users
3 days ago
Last modified
Categories
Share
French Companies — Search, Nearby & SIREN Enrichment (Official INSEE API)
Get export-ready French company data in minutes: build prospect lists from a search URL, find all companies near a preset French city centre, or turn SIRENs into full profiles — names, locations, activities, directors, financials where published, legal form, VAT, and more. No API key. Data comes from France’s official register (recherche-entreprises.api.gouv.fr, INSEE-backed).
Built for: Sales & lead gen · Local prospecting · CRM enrichment · Compliance & KYB · Market research by sector or region
Need every branch and office, not just the headquarters? Use the French Establishments Scraper — paste the SIRENs from this Actor and get one row per site (SIRET), with address, NAF, headcount, and status.
What does this Actor do?
| Mode | Input | Behavior |
|---|---|---|
| Search URL | One or more URLs from Pappers or recherche-entreprises.data.gouv.fr | Query parameters are parsed into API filters. The Actor paginates through all matching companies (per URL). Multiple URLs are merged; rows are deduplicated by SIREN. |
| Near a location | Preset city + radius (1–50 km) | Finds all companies within a circular area around the selected city centre. Optional filters: NAF activity code, active status. Rows are deduplicated by SIREN. |
| SIREN list | Nine-digit French company IDs (SIREN) | Each SIREN is resolved to a full company record. Values shorter than nine digits are zero-padded. Duplicates are removed. |
The Apify Input form lists three modes: searchUrl, nearPoint, and sirens. Legacy keys search and enrich are still normalized in code for local input.json or older scripts.
What data does it extract?
| Category | Fields (representative) |
|---|---|
| Identity | siren, nom_complet, nom_raison_sociale, date_creation, etat_administratif |
| Activity | activite_principale (NAF), libelle_activite_principale, categorie_entreprise |
| Address | adresse, code_postal, ville, departement, departement_nom, region, region_nom, latitude, longitude |
| Legal & tax | forme_juridique, nature_juridique, tva_intracommunautaire, siret_siege |
| Scale | effectif_salarie (band), caractere_employeur, nombre_etablissements, nombre_etablissements_ouverts |
| Governance | dirigeants, dirigeant_1…dirigeant_5, role_1…role_5, birth year and nationality columns where available |
| Financials | chiffre_affaires, resultat_net, annee_finances (when published in the source) |
| Flags | est_entrepreneur_individuel, est_organisme_formation, donnees_diffusibles, convention_collective |
- Auditors (commissaires aux comptes) are excluded from director columns by design.
- Empty values are omitted from each row (no empty strings for missing fields).
donnees_diffusibles:falsewhen the register marks data as non-public.- If a SIREN cannot be matched, the dataset row contains
sirenand_errorwith a short message.
Input examples
Search URL — SAS IT & immobilier avec dirigeant 35–45 ans
{"mode": "searchUrl","searchUrls": ["https://www.pappers.fr/recherche?en_activite=true&forme_juridique=5710&activite=62.01Z,62.02A,62.02B,63.11Z","https://www.pappers.fr/recherche?en_activite=true&forme_juridique=5710&activite=68.10Z,68.20A,68.31Z"],"maxResults": 500,"requireDirigeant": true,"requireDirigeantPhysique": true,"dirigeantAgeMin": 35,"dirigeantAgeMax": 45,"maxCompanyAgeYears": 5,"excludeCategories": ["GE", "ETI"]}
Search URL — SAS créées sur 12 mois (sharding régional automatique)
{"mode": "searchUrl","searchUrls": ["https://www.pappers.fr/recherche?en_activite=true&forme_juridique=5710&date_creation_min=15-05-2025&date_creation_max=15-05-2026"],"maxResults": 0}
When a date filter is present, the Actor automatically expands this into 13 parallel regional queries to avoid the API cap and complete in ~17 min instead of waiting hours.
Near a location — all restaurants within 5 km of Lyon
{"mode": "nearPoint","nearCity": "Lyon","radiusKm": 5,"nearActivityCode": "56.10A","nearActiveOnly": true,"maxResults": 200}
SIREN enrichment
{"mode": "sirens","sirens": ["732829320", "552032534", "380129866"]}
All input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | "searchUrl" | searchUrl, nearPoint, or sirens. Aliases search / enrich are normalized when present in JSON (e.g. local input.json). |
searchUrls | string[] | (demo URL) | [Search] One URL per line from Pappers or data.gouv. Filters embedded in the URL are parsed automatically (see Pappers URL parsing below). Multiple URLs run in parallel and are deduplicated by SIREN. |
maxResults | integer | 25 | [Search/Near] Max companies per URL or geographic query. 0 = all matches (long runs — increase run timeout if needed). Ignored when a date filter is active; all pages are scanned in that case. |
dateCreationMin | string | — | [All modes] Keep only companies created on or after this date (YYYY-MM-DD). In Search URL mode, merged with maxCompanyAgeYears and any date_creation_min from the URL by intersection (the latest / strictest minimum wins). |
dateCreationMax | string | — | [All modes] Keep only companies created on or before this date (YYYY-MM-DD). In Search URL mode, merged with date_creation_max from the URL by intersection (the earliest / strictest maximum wins). |
dirigeantAgeMin | integer | — | [All modes] Minimum age of the primary director (dirigeant_1) only. Requires a real birth year in the register; [NON-DIFFUSIBLE] or missing year → row excluded when this or dirigeantAgeMax is set. |
dirigeantAgeMax | integer | — | [All modes] Maximum age for the same primary director rule. |
requireDirigeant | boolean | true | [All modes] When true (default), companies with no named director in the register are excluded. Turn off only if you need the full dataset regardless. |
requireDirigeantPhysique | boolean | true | [All modes] When true (default), excludes rows where the primary director has no usable birth year — typically holdings / legal-entity directors, or masked [NON-DIFFUSIBLE] values. |
maxCompanyAgeYears | integer | — | [All modes] Keep only companies created within the last N years (e.g. 5). Recomputed from today's date on every run. Combined with dateCreationMin globally; in Search URL mode, creation bounds from the URL are merged by intersection as well (see date rows above). |
excludeCategories | string[] | ["GE","ETI"] | [All modes] Size categories to exclude. GE = large groups, ETI = mid-market. Default keeps only PME and unclassified (micro / early-stage). Set to [] to disable. |
nearCity | string | "Paris" | [Near] City from the dropdown (e.g. "Lyon", "Bordeaux"). Coordinates are resolved automatically — custom GPS points are not supported. |
radiusKm | integer | 5 | [Near] Search radius in km (1–50). |
nearActivityCode | string | — | [Near] Optional NAF/APE code filter (e.g. 56.10A for restaurants). |
nearActiveOnly | boolean | true | [Near] When true, only active companies are returned. |
sirens | string[] | (3 demo SIRENs) | [Enrich] One SIREN per line (digits only; short values padded). |
Pappers URL parsing
When you paste a Pappers URL (pappers.fr/recherche?…), the Actor automatically converts supported parameters to official API filters or post-processing rules.
| Pappers parameter | How it is applied |
|---|---|
en_activite=true | API filter: etat_administratif=A |
activite=62.01Z,62.02A | API filter: activite_principale (comma-separated NAF codes supported) |
forme_juridique=5710 | API filter: nature_juridique (e.g. 5710 = SAS in SIRENE) |
ville=74160 | API filter: commune (INSEE commune code) |
date_creation_min=15-05-2025 | Post-filter on date_creation (format DD-MM-YYYY converted to ISO) |
date_creation_max=15-05-2026 | Post-filter on date_creation |
effectifs_min=0 | Post-filter using tranche_effectif_salarie INSEE band — approximate at band boundaries |
effectifs_max=10 | Post-filter using tranche_effectif_salarie |
departement, region, code_postal | API filter: passed directly |
age_dirigeant_min/max | Not available in the official API — use dirigeantAgeMin/Max input fields instead |
Tip: when a date filter is detected (from the URL or from
dateCreationMin/Maxinput fields), the Actor automatically splits the query into 13 parallel regional shards (one per French metropolitan region). This avoids the API's 10 000-result cap per query and reduces run time dramatically.
Developer note
Throughput and resilience (delays between requests, retries) are implemented in code — not in the Input form — so runs stay reliable against the official service without extra configuration.
Output example
{"siren": "732829320","nom_complet": "Example SAS","nom_raison_sociale": "EXAMPLE","activite_principale": "62.01Z","libelle_activite_principale": "Computer programming activities","adresse": "1 rue Example","code_postal": "75001","ville": "Paris","forme_juridique": "SAS","tva_intracommunautaire": "FR12345678901","dirigeants": "…"}
Download results as JSON, CSV, Excel, or HTML from the Dataset tab in the Apify Console.
How to use (Apify Console)
Search URL
- Open the Actor and select Search URL.
- Run a search on Pappers or data.gouv, then copy the full URL from the address bar.
- Paste one or more URLs into Search URLs (one per line).
- Optionally set Max results (higher for bigger extracts).
- Click Start.
- Open the Dataset tab when the run finishes and export your file format.
Near a location
- Select Near a location.
- Pick a City from the dropdown (Paris, Lyon, Marseille, and 40+ more). No coordinates needed.
- Set the Radius (1–50 km) and optionally a NAF activity code to filter by sector.
- Click Start and export from the Dataset.
SIREN list
- Select SIREN list.
- Paste your nine-digit SIRENs (one per line).
- Click Start and export from the Dataset.
Local development
$npm install
Edit the single root file input.json (search mode by default, with a small maxResults for quick tests). To run SIREN enrichment locally, set "mode": "sirens" and edit the "sirens" array (searchUrls is ignored in that mode).
On a local run (not Apify Cloud), the Actor reads input.json at the project root first (src/main.js), then falls back to the default INPUT in the key-value store if the file is missing.
$apify run --purge-none
Optional: copy to the default store (mirrors how input is supplied on the platform):
$npm run run:local
Use apify run for parity with the cloud (avoid plain npm start alone).
Performance and cost
- Compute: This Actor uses HTTP requests only (no browser). Cost is mainly Apify compute units and run duration.
- Reliability: The service can slow down when busy. The Actor is built to wait and retry automatically so you do not adjust technical settings in the form.
- Volume: Large searches (
maxResults: 0) can run for a long time; raise the run timeout under Options if needed.
| Scenario (indicative) | Notes |
|---|---|
| A few SIRENs | Usually completes in seconds to a few minutes |
| Single search URL, hundreds of rows | Depends on maxResults and API response time |
| Many URLs or thousands of SIRENs | Longer wall time; ensure timeout is sufficient |
See current Apify pricing for compute pricing.
Use cases
- Lead lists: Filter by NAF code, department, or city (via URL filters), then export to your CRM.
- Enrichment: Turn a spreadsheet of SIRENs into full legal and contact context from the register.
- Compliance / KYB: Pull official status, form, and published financial bands where available.
Legal and data protection
- Data is retrieved from the French administration’s public API; this Actor does not scrape private websites.
- Rows may contain personal data (e.g. director names) where the register publishes them; use and retention must comply with GDPR and your lawful basis for processing.
- For general context on web data and compliance, see Apify’s blog on legal scraping.
FAQ
Do director and company-size filters apply to Near mode and SIREN enrichment?
Yes. The same creation-date window (dateCreationMin / dateCreationMax / maxCompanyAgeYears), director rules (requireDirigeant, requireDirigeantPhysique, dirigeantAgeMin / Max), and excludeCategories apply in all three modes. Director age bounds apply to the primary director (dirigeant_1) only and require a real birth year — rows with [NON-DIFFUSIBLE] on that field fail requireDirigeantPhysique and any active age filter. For SIREN list, companies that match the API but fail post-filters are not written to the dataset; the run log reports filtered out separately from not found.
Do I need an API key? No. The government search API used here does not require a key for these calls.
Which Pappers URL filters are supported?
Most common ones are parsed automatically: en_activite, activite (NAF codes, comma-separated), forme_juridique (legal form code — e.g. 5710 for SAS), ville, departement, region, code_postal, date_creation_min/max, and effectifs_min/max. The age_dirigeant filter from Pappers is not available in the official API — use the dirigeantAgeMin / dirigeantAgeMax input fields instead.
How does director age filtering work? The official register provides director birth year and month (not full date). The Actor computes age from the birth year. Companies where the birth date is missing from the register are kept — they are never silently discarded.
Why does the Actor scan all pages when a date filter is set? The official API has no date sort and caps results at 10 000. Companies created recently can appear on any page. The Actor automatically shards by region (13 parallel queries) to cover the full dataset without missing recent companies.
What does nature_juridique=5710 mean?
5710 is the SIRENE code for SAS (Société par actions simplifiée) — confirmed by the official Pappers API. The form is labelled SAS in the output forme_juridique column.
Why do I see errors or retries in logs? The official service sometimes throttles heavy traffic. The Actor waits and retries for you. If a run still fails, try again later or split very large jobs into smaller runs.
Is every field always filled? No. Some companies have redacted or unpublished fields; optional columns may be missing from a row.
Related actors
- French Establishments Scraper — get every SIRET (branch address, NAF, headcount, status) for a list of SIRENs
- French Legal Announcements Scraper (BODACC) — monitor registrations, insolvencies, and business sales published on the official BODACC register, filtered by date or SIREN
Support
For questions, custom automation, or integrations: corentin@outreacher.fr
You can also use the Issues tab on this Actor’s Apify page after publish.