You want a list of companies in a French department: every business in Lozère, in Paris, or in one postcode, as a spreadsheet. For single lookups by SIREN or SIRET, see the SIREN lookup API tutorial; for lists by activity, see the companion guide on French companies by NAF code. This page covers lists by place with France Company Search (SIRENE), an Apify Actor, with no API key. Location search has two traps, and our real runs show both.
This Actor is independent: it is not affiliated with or endorsed by INSEE, DINUM or the French government, and is not a government service.
Department codes in 10 seconds: mainland departments use two characters, for example
48(Lozère) or75(Paris). Corsica uses2Aand2B. Overseas departments use971,972,973,974and976(there is no department975). See INSEE's geographic code list for 2026 (in French). Postcodes have 5 digits, and one postcode can cover several communes: according to La Poste's postcode database,48100covers 15 communes, including Marvejols.
Step-by-step: companies in one department
- Open France Company Search (SIRENE), click Try for free and sign in. Clear the pre-filled SIREN numbers.
- In Departments (
departments), add one or more codes, for example["48"]. - Optional: add NAF codes (
nafCodes, current NAF rév. 2 codes such as62.01Z) to narrow by activity, and set Status (status) to"active". The default is"any". - Set Max companies (
maxItems, 1 to 10,000) to cap how many companies are output and charged. - Click Start, then open the dataset and click Export for CSV or JSON.
Which address matches? Head office vs establishments
A French company (legal unit, SIREN) can have several establishments (sites, SIRET). The department and postcode filters match any establishment, not only the head office (siège). matchedEstablishmentSirets lists the sites that matched.
In a live run on 15 October 2026 at 16:07 (UTC+8) with {"nafCodes": ["62.01Z"], "departments": ["48"], "maxItems": 5}, 2 of the 5 companies had their head office in another department and matched through an establishment in Lozère. Both are sole traders, so they are not shown. In other words, a "Lozère list" also includes companies that only have a site there.
The other 3 have their head office in department 48. Here is one, shortened, with the street address removed:
{
"siren": "892371139",
"name": "SOLARIS BI",
"isIndividualEntrepreneur": false,
"headOffice": {"siret": "89237113900015", "city": "MARVEJOLS", "department": "48"},
"matchedEstablishmentSirets": ["89237113900015", "89237113900023"]
}
Both of its establishments matched, including the head office itself (89237113900015).
To keep only companies based in the area, filter on the head office after the run. Load the JSON export and flatten headOffice; codes stay strings, so leading zeros and 2A survive:
import json
import pandas as pd
with open("dataset.json", encoding="utf-8") as f:
df = pd.json_normalize(json.load(f))
based = df[df["headOffice.department"] == "48"] # or: df["headOffice.postalCode"] == "48100"
On the run above, this keeps 3 of 5 rows. In a CSV export, Apify names nested columns with a slash (headOffice/department). Read it with pd.read_csv("dataset.csv", dtype=str), or "48" becomes the number 48 and the filter keeps 0 rows.
Step-by-step: companies in one postcode
Use Postal codes (postalCodes) instead of departments. It takes 5-digit codes and, like departments, matches any establishment. If you fill in both, each department is combined with each postcode, so one of the two is usually enough. This is the input of a live run on 17 October 2026 at 17:22 (UTC+8):
{"postalCodes": ["48100"], "status": "active", "maxItems": 5}
It returned 5 companies, all large companies (companyCategory GE) with head offices outside Lozère: three in Paris (75), one in Créteil (94) and one in Saint-Denis (93). Each matched through one or two local establishments. One record, shortened, with the street address removed:
{
"siren": "412280737",
"name": "SNCF RESEAU",
"status": "active",
"nafCode": "52.21Z",
"companyCategory": "GE",
"establishmentsCount": 2250,
"headOffice": {"siret": "41228073720375", "city": "SAINT-DENIS", "department": "93"},
"matchedEstablishmentSirets": ["41228073712067", "41228073712091"],
"diffusionStatus": "O",
"sourceUpdatedAt": "2026-10-16T08:04:58"
}
If you searched "companies in 48100", you probably want companies based there, not national groups with a local branch. Two fixes:
-
Filter on the head office with the snippet above, using
headOffice.postalCode == "48100". On this 5-row sample it returns 0 rows, because none of the 5 has its head office in 48100. The filter runs after the export, so set a largermaxItemsto reach the locally based companies. -
Add a NAF code (
nafCodes) so the search itself only returns companies in your activity.
Big cities: splitting Paris by postcode
Each query to the upstream API returns at most 10,000 results, and total_results never goes above 10,000. A live run on 15 October 2026 at 16:21 (UTC+8) used {"nafCodes": ["62.01Z"], "departments": ["75"], "incorporatedFrom": "2026-01-01", "maxItems": 10000}. Its log shows these warnings, verbatim:
RESULT_CAP_REACHED {'activite_principale': '62.01Z', 'departement': '75'} total_results=10000
DATE_FILTER_MAY_BE_INCOMPLETE: results may be incomplete, narrow the query with postal codes or NAF codes
The Actor applies the creation date filter itself, so it only sees those first 10,000 matches. The run scanned 6,800 results, filtered 5,677 out by creation date, and output 1,123 companies before it stopped on its time budget (stoppedReason: "time_budget"). Even here, 18 of the 1,123 had their head office outside Paris, 6 of them abroad.
For Paris and other dense departments, split by postcode. The Actor searches each postcode as a separate slice, so each one gets its own 10,000-result scan. La Poste's postcode database lists 21 postcodes for Paris: 75001 to 75020, plus 75116 (the 16th arrondissement has both 75016 and 75116):
{
"nafCodes": ["62.01Z"],
"postalCodes": ["75001", "75002", "75003", "75004", "75005", "75006", "75007",
"75008", "75009", "75010", "75011", "75012", "75013", "75014",
"75015", "75016", "75116", "75017", "75018", "75019", "75020"],
"incorporatedFrom": "2026-01-01",
"maxItems": 10000
}
A company found in several postcodes is output and charged only once per run. Check RUN-STATS after each run: if a warning still appears, add a NAF code, narrow the date range, or raise the run timeout.
Use cases
- Local market sizing: count companies in a department or postcode, optionally by activity.
- Territory planning (company-level): split a region into sales territories by postcode.
- Supplier sourcing: find companies based in a region, filtering on the head office.
- KYB address checks: compare a supplier's stated location with its head office and establishments.
Sole traders' company names are personal names, and units with diffusionStatus = "P" must not be used for marketing or prospecting. You are the data controller, and B2B prospecting must follow GDPR and CNIL rules (see the CNIL's guidance on electronic commercial prospecting, in French). This is not legal advice.
Cost
$0.003 per company written to the dataset ($3 per 1,000 companies). Example: 500 companies = 500 x $0.003 = $1.50.
FAQ
How do I get a list of all companies in a French department?
In France Company Search, put the code (e.g. 48, 2A or 971) in departments and export the results as CSV or JSON.
Can I search French companies by postcode?
Yes. Use postalCodes with one or more 5-digit codes, alone or combined with a NAF code.
Does the department filter use the head office address?
No. It matches any establishment, so a company based elsewhere is included if it has a site there. matchedEstablishmentSirets shows which site matched; filter on headOffice.department to keep locally based companies.
Why is my Paris list incomplete?
Each query returns at most 10,000 results. Split by postcode or add a NAF code or creation-date range. The run statistics warn when the cap is reached.
What are the department codes for Corsica and overseas France?
Corsica uses 2A and 2B; the overseas departments use 971, 972, 973, 974 and 976.
Do I need an API key?
No. The tool reads the public API Recherche d'entreprises, which needs no key.
How much does it cost?
$0.003 per company, $3 per 1,000.
Get started
Pick a department or postcode, add a NAF code if the area is dense, run, export, and filter on the head office if you want companies based there. Try France Company Search (SIRENE) on Apify. For number lookups and API calls, read the SIREN lookup API tutorial; for activity lists and NAF 2025, see French companies by NAF code.
Data: Annuaire des Entreprises / API Recherche d'entreprises (DINUM), INSEE Sirene and other French public registers, reused under Licence Ouverte 2.0.
This Actor is independent: it is not affiliated with or endorsed by INSEE, DINUM or the French government, and is not a government service.
Top comments (0)