France Companies Scraper avatar

France Companies Scraper

Pricing

from $7.85 / 1,000 results

Go to Apify Store
France Companies Scraper

France Companies Scraper

Scrape France's SIRENE and RNE company register with no API key. Search 30M companies by name, director, location, NAF code, revenue range or certificationsn look up SIREN/SIRET in batch; or list companies near a GPS point. Clean rows with directors and multi-year revenue and net income.

Pricing

from $7.85 / 1,000 results

Rating

0.0

(0)

Developer

Norm Data

Norm Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Norm Data

🇫🇷 France Companies Scraper

Scrape the French company register (SIRENE and RNE) with no API key and no login. Search 30 million French companies by name, by director, by location or by structured filters, look up a batch of SIREN or SIRET numbers, or list every company near a GPS point. Get clean structured company data for KYB, compliance, credit screening and B2B lead generation: legal form, NAF activity, employee band, head-office address with coordinates, VAT number, the full board and directors, and multi-year revenue and net income, all in one request.

Here is one real row (trimmed), for Danone:

{
"siren": "552032534",
"name": "DANONE",
"active": true,
"status": "active",
"created_date": "1955-01-01",
"age_years": 71,
"legal_form_code": "5599",
"legal_form": "SA (other)",
"company_category": "GE",
"naf_code": "70.10Z",
"naf_label": "Head office and management consultancy activities",
"employee_range": "1000 to 1999",
"is_employer": true,
"establishments_total": 19,
"hq_address": "59-61 RUE LA FAYETTE 75009 PARIS",
"hq_postal_code": "75009",
"hq_city": "PARIS",
"hq_department": "75",
"hq_latitude": 48.8763540066087,
"hq_longitude": 2.34353640229216,
"collective_agreements": ["9999"],
"officers_count": 13,
"officers": [
{ "type": "person", "name": "ANTOINE BERNARD DE SAINT AFFRIQUE", "role": "Directeur Général", "birth_date": "1964-12" }
],
"finances": [{ "year": "2024", "revenue": 27376000000, "net_result": 0 }],
"last_revenue": 27376000000,
"last_revenue_year": "2024",
"query": null,
"error": null,
"url": "https://annuaire-entreprises.data.gouv.fr/entreprise/552032534",
"scraped_at": "2026-09-08T19:52:24.000Z"
}

What it does

Reads the official French business registry (SIRENE, held by INSEE, and the RNE company data), served as open data by the state. Three modes:

  • Search companies by name and any of: director name, department, region, commune, postal code, NAF activity code or section, legal form, size class, employee band, revenue range, net income range, administrative status, and certification labels. Filters combine with AND.
  • Look up by SIREN or SIRET: paste a batch of nine or fourteen-digit numbers, get the full record for each. Numbers that do not resolve come back as a row with error: "not found", so the output always has one row per input. The KYB / CRM-refresh workflow.
  • Companies near a point: every company with an establishment inside a radius (up to 50 km) of a latitude and longitude, optionally narrowed by NAF code.

Every row carries the directors, the filed establishments and multi-year revenue and net income in the same request. There are no per-company enrichment calls and no add-on charges.

Legal form, size class, status, employee band and NAF division are decoded to readable labels. Missing source values are returned as null, never invented.

Why this scraper

  • No API key, no login, no captcha. Public open data, delivered clean and flat.
  • Filters no other France scraper on Apify has: revenue and net-income range, director name and birth-date range, geographic radius search, and certification labels (RGE, Qualiopi, ESS, organic, societe a mission, SIAE, EPV).
  • Directors and multi-year financials on every row, not behind a paid add-on.
  • Region, commune and multi-establishment aware. The department and postal filters match companies with any establishment there, and the matching establishments come back in the row.
  • One flat price. No per-attempt contact-finder fees, no AI upsells.

How it compares

CapabilityThis actorOther France registry scrapers on Apify
Name / SIREN / SIRET search and lookupyesyes
Department, NAF, legal form, status filtersyesyes
Revenue range and net-income range filtersyesno
Director name and birth-date searchyesno
Geographic radius (near a point) searchyesno
Certification / label filters (RGE, Qualiopi, ESS, ...)yesno
Directors and multi-year financials on every rowyesadd-on or partial
Readable labels for legal form, NAF, size, employee bandyessome
Region / commune filters, multi-department in one runyesno
Declared dataset schema + free-plan previewyesrare
Flat price, no AI or contact-finder add-onsyesno

Use cases

  • B2B lead generation. Target by NAF activity, department or region, size class and revenue band ("SAS in Ile-de-France, computer services, turnover above 5M EUR"), with head-office address and coordinates.
  • KYB and compliance. Verify a French counterparty by SIREN, capture legal form, status, directors and financials for the onboarding file.
  • Credit and risk screening. Filter or sort by filed revenue and net income, pull the multi-year finances series for a portfolio.
  • Due diligence on people. Find every company where a named director is on record, narrowed by birth-date range.
  • Local market mapping. Use near-a-point mode to list every restaurant, retailer or workshop within 2 km of an address.
  • Segment by label. Build lists of RGE (green building), Qualiopi (training), ESS or organic-certified companies.

Quickstart

{
"mode": "search",
"query": "Danone",
"maxItems": 10
}

Computer-services companies in Paris with turnover above 5M EUR:

{
"mode": "search",
"department": "75",
"nafCode": "62.01Z",
"revenueMin": 5000000,
"maxItems": 200
}

Every company where a director named Bernard Arnault is on record:

{ "mode": "search", "personName": "Arnault", "personFirstName": "Bernard" }

Refresh a list of companies by number:

{ "mode": "lookup", "ids": ["552032534", "77567227200015"] }

Restaurants within 2 km of central Paris:

{ "mode": "near", "latitude": "48.8566", "longitude": "2.3522", "radiusKm": 2, "nafCode": "56.10A" }

Input reference

FieldApplies toDescription
maxItemsallCeiling on rows written.
modeallsearch, lookup or near.
querysearchFull-text over name, trade name, address and directors. Most relevant first.
department / region / communeCode / postalCodesearchLocation. Department and postal match on establishments.
nafCode / nafSectionsearch, nearFull NAF (APE) code (e.g. 62.01Z), or a single-letter section (e.g. J) for a whole sector.
legalFormsearchINSEE legal category code (5710 SAS, 5499 SARL, ...).
companyCategorysearchPME, ETI or GE.
employeeRangesearchINSEE headcount band.
revenueMin / revenueMaxsearchFiled turnover range, EUR.
netResultMin / netResultMaxsearchFiled net income range, EUR (can be negative).
statussearchactive, ceased or any.
personName / personFirstNamesearchDirector name search.
personBornAfter / personBornBeforesearchDirector birth-date range, YYYY or YYYY-MM-DD.
labelssearchKeep only companies with every selected label (RGE, Qualiopi, ESS, ...).
sortBySizesearchBiggest companies first.
idslookupNine-digit SIREN or fourteen-digit SIRET numbers.
latitude / longitude / radiusKmnearCentre point and radius (1 to 50 km).

Output reference (selected)

Columns are ordered for reading: identity, classification, size, head office, people, financials, labels, establishments, provenance.

FieldDescription
sirenNine-digit company number.
name / legal_name / acronymNames as filed.
active / statusWhether the legal unit is still active.
legal_form / legal_form_codeLegal category, decoded and raw.
company_categoryINSEE size class: PME, ETI, GE.
naf_code / naf_label / naf_sectionMain activity, code and English label.
employee_range / employee_range_codeHeadcount band.
is_employerWhether the company employs staff.
establishments_total / establishments_openEstablishment counts.
vat_numberIntra-EU VAT number where derivable.
hq_address ... hq_longitudeHead-office address, split, with coordinates.
hq_naf_code / hq_naf_label / hq_trade_name / hq_signsHead-office activity and trade names.
collective_agreementsCollective-agreement IDs (IDCC) at the head office.
officers / officers_countDirectors: type, name, role, birth date, nationality, and SIREN for corporate officers.
financesArray of { year, revenue, net_result }, newest first.
last_revenue / last_revenue_year / last_net_resultMost recent filed figures.
certificationsHuman list derived from the label flags.
is_rge / is_qualiopi / is_ess / is_bio / is_mission_company / is_training_org / is_work_integration / is_living_heritage / is_association / is_sole_trader / is_public_body / is_local_authorityLabel flags.
association_idRNA number for associations.
establishmentsMatching establishments (sample): SIRET, address, department, coordinates, activity, HQ flag, status.
updated_at / updated_at_insee / updated_at_rneSource update timestamps.
queryIn Look up mode, the SIREN or SIRET you asked for. null on search and near rows.
errornull on a normal row. "not found" on a Look up row whose number did not resolve (every other field is then null).
urlLink to the public annuaire-entreprises page.
scraped_atISO 8601 timestamp of when the row was collected.

Run via API and CLI

curl -X POST "https://api.apify.com/v2/acts/USERNAME~france-companies-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"mode":"search","department":"75","nafCode":"62.01Z","revenueMin":5000000,"maxItems":200}'
$apify call USERNAME/france-companies-scraper --input '{"mode":"lookup","ids":["552032534"]}'

Fetch results

# JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"
# CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"
# Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"

<DATASET_ID> is defaultDatasetId on the run object.

Billing and limits

  • Pay per result. Billed per company row written to the dataset. The current rate is on the Actor's Pricing tab. Directors and financials are included, not billed separately.
  • No charge on failure. A run that produces zero rows fails with a message and is not billed.
  • A Look up number that does not resolve still writes one error: "not found" row and is billed like any other row, so your output count matches your input list.
  • Free Apify plans run the built-in 10-row sample only. Upgrade to run your own settings.
  • Very large segments are capped at about 25,000 rows per distinct query. Split the query (by department, NAF code or a date facet) to go past that.
  • Department and postal-code filters match on establishments, so a result's head office can be in another department. The matching establishments are in the establishments array.
  • The registry is French government open data (Licence Ouverte / Etalab 2.0), which permits commercial reuse and redistribution. This Actor adds the filtering, decoding and structure; it stores nothing and needs no account.

FAQ and troubleshooting

Do I need an API key or login? No. The French company registry is public open data, no key, no login, no captcha.

Why did a department filter return a company whose head office is elsewhere? The department and postal filters match any establishment, not just the head office. Check the establishments array for the site that matched. This is intended: you also catch large companies with a branch in your target area.

Why is finances empty? The company has not filed accounts. Many sole traders, associations and small companies do not. Setting a revenue or net-income filter excludes non-filers.

Why is legal_form null but legal_form_code set? The code is outside the common set this actor decodes. The raw INSEE code is always there.

A number in my Look up list did not resolve. What happens? You still get a row for it, with query set to the number you gave, error set to "not found", and every other field null. That keeps one row per input so you can join the output back to your list. It is billed like a normal row.

Can I search by a company's director? Yes. Use personName (last name) and optionally personFirstName and a birth-date range. Note that a plain query also matches directors, so it can pull in companies whose officer has that name.

How current is the data? It reflects SIRENE and the RNE at run time. updated_at, updated_at_insee and updated_at_rne show when each source last changed the record.

Is this an official INSEE tool? No. Independent, not affiliated with INSEE, INPI or the French government. It reads only data published as open data.

Local development

bun install
bun test # offline: input parsing and normalisation against synthetic fixtures
bun run src/main.ts # reads storage/key_value_stores/default/INPUT.json