French Companies · Search & SIREN Enrichment
Pricing
from $4.99 / 1,000 results
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 $4.99 / 1,000 results
Rating
0.0
(0)
Developer
Corentin Robert
Actor stats
0
Bookmarked
45
Total users
20
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 any GPS point, 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
v2.0 — no more 10 000-result cap. When a search hits the API ceiling, the Actor automatically re-runs the query département by département and aggregates all results. A query like "all active companies with 500+ employees" previously returned 200 rows before crashing — it now returns the full 5 500.
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, annuaire-entreprises.data.gouv.fr, or recherche-entreprises.data.gouv.fr | Filters are parsed automatically. The Actor paginates all matching companies. When the API 10 000-result cap is hit, the query is auto-split by département (101 sub-queries) to return every result. Multiple URLs are merged; rows are deduplicated by SIREN. |
| Near a location | GPS coordinates + radius (1–50 km) | Finds all companies within a circular area. 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 (larger extraction)
{"mode": "searchUrl","searchUrls": ["https://www.pappers.fr/recherche?ville=74160&en_activite=true","https://recherche-entreprises.data.gouv.fr/search?departement=75&activite_principale=62.01Z"],"maxResults": 500}
Near a location — all restaurants within 5 km of Lyon
{"mode": "nearPoint","nearCity": "Lyon","radiusKm": 5,"nearActivityCode": "56.10A","nearActiveOnly": true,"maxResults": 200}
Custom GPS coordinates (advanced — when your city is not in the dropdown):
{"mode": "nearPoint","latitude": 43.6,"longitude": 3.9,"radiusKm": 10,"nearActiveOnly": true}
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. |
nearCity | string | "Paris" | [Near] City name from the dropdown (e.g. "Lyon", "Bordeaux"). Coordinates are resolved automatically. Leave blank to use custom lat/lng instead. |
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. |
latitude | number | — | [Near — advanced] Latitude when nearCity is blank (e.g. 43.6). |
longitude | number | — | [Near — advanced] Longitude when nearCity is blank (e.g. 3.9). |
sirens | string[] | (3 demo SIRENs) | [Enrich] One SIREN per line (digits only; short values padded). |
maxResults | integer | 25 | [Search/Near] Max companies per query. 0 = all matches (long runs — increase run timeout if needed). |
Supported URL sources
You can paste URLs from three sources — all filter parameters are mapped automatically:
| Source | Notes |
|---|---|
recherche-entreprises.data.gouv.fr | Direct API format — every parameter maps 1:1 |
annuaire-entreprises.data.gouv.fr | etat=A, naf, terme, sap, tranche_effectif_salarie (multi-value), label, type, cp_dep, director fields (fn, n, dmin, dmax) |
pappers.fr | ville → commune, en_activite → active status, activite → NAF |
All 30+ API filters are supported, including: activity section (A–U), employee band, legal form (nature_juridique), financial thresholds (ca_min/max, resultat_net_min/max), director name/birthdate, certifications (est_rge, est_bio, est_qualiopi, est_siae…), geography (epci, code_commune)…
Developer note
Throughput and resilience (parallel batching, retries on 429 and network errors, per-request timeouts) 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.
For a city not in the list, leave City blank and enter custom Latitude / Longitude at the bottom of the form.
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 rate-limits heavy traffic (HTTP 429). The Actor retries automatically on both rate-limit responses and network-level timeouts.
- Volume: Large searches (
maxResults: 0) can run for a long time. When the 10 000-result cap is triggered, the Actor automatically splits by département — this multiplies the number of requests but ensures complete data. Raise the run timeout under Options for very broad queries. - Live progress: Every page log shows
% completeand a dynamically recalibrated ETA.
| Scenario (indicative) | Notes |
|---|---|
| A few SIRENs | Usually completes in seconds to a few minutes |
| Single URL, up to 10 000 results | ~14 min (3 parallel pages) |
| Single URL, capped at 10 000 (auto-split) | ~60–90 min for 50 000+ results depending on distribution |
| 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 I need an API key?
No. The government search API used here does not require a key for these calls.
Can I use Pappers-only filters?
Only parameters that map to the official API are applied (see README table). Unsupported Pappers-only filters are ignored.
Why do I see "HTTP 429" warnings in logs?
The official API rate-limits at ~7 req/s. These are expected for large queries — the Actor backs off and retries automatically. They do not indicate a failure.
Why do I see "API cap detected — auto-splitting by département"?
The API returns at most 10 000 results per query (Elasticsearch default). When your filters match more than 10 000 companies, the Actor reruns the same query for each of the 101 French départements and merges the results. The run takes longer but returns the complete dataset.
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.