TED Contract Expiry Radar - Recompete Leads
Find EU public contracts approaching expiry from TED award notices: incumbent, buyer, value, end date and renewal options.
datagrit › Company data › French Company Finder - Sirene Financials
Company dataFrench company lead lists from Sirene screened by net result and revenue, with net margin, size, matching establishment and optional directors.
French Company Finder searches the official Sirene register of French companies and returns each company as a clean record: identity, legal form, activity code, size, employer flag, head office address with coordinates, and the latest published financials. Beyond a plain lookup you can screen companies by profitability: filter on net result (profitable or loss-making) as well as revenue, and every record comes with the net margin already calculated. Location filters are checked on every record, so a company is returned only when it has an open establishment in the place you asked for. Export the data as JSON, CSV or Excel, call it through the Apify API, or plug it into n8n, Make and AI agents through MCP.
Fields you leave out stay neutral: a SIREN lookup called through the API returns only that company, and a filter-only call searches with the filters alone. Only an input with no search term, no number and no filter at all runs a small example search (boulangerie in department 75, not charged per result), and the status message says so.
Each record contains the SIREN, names and acronym, active or closed status with creation and closure dates, legal form with a label for the common codes, NAF activity code and section, size category, employee band with its label, the number of establishments (total and open), the head office SIRET, address, postal code, city, department, region and coordinates, the VAT number, and the latest published financials: revenue, its year, net result and net margin. Flags show social economy, organic, employer and association status. The employer flag is true when the head office is registered as an employer or the company employee band shows at least one employee. Directors, with their roles, are available on request.
Revenue and net result exist only for companies that publish their accounts, and the register exposes the latest published year only.
The Sirene register matches a location against every establishment of a company, including establishments closed decades ago. In a sample of 450 companies returned by the register for eight departments on 2026-09-30, 128 had only closed establishments in the requested department. The Actor therefore checks every record itself: with Only active companies on (the default), a company is returned only when it has an open establishment in the location, and the status message counts the companies it skipped. The head office is checked first, because the register does not always list it among the matching establishments.
Each record carries the establishment that matched (SIRET, address, postal code, city, department, region, open or closed, closure date) next to the head office address, and the number of establishments of the company in the location. The Actor asks the register for up to 100 matching establishments per company, so a count of 100 means 100 or more. Switch off Only active companies to also get closed companies and companies whose only establishment in the location is closed. Switch on Head office only when you want companies whose head office itself is in the location. Without a location filter the matched establishment fields stay empty.
The Actor reads only open data that the French state publishes through its public company search API. It does not log in or bypass any access control. Company data is open data; directors' names are personal data, so they are off by default and you are responsible for using them in line with data protection law. This description is not legal advice.
Every result is one flat record, so it drops straight into a spreadsheet, a database or a CRM.
| Field | Type | Description | Example |
|---|---|---|---|
query | string | The search term or number this result came from; null for filter-only searches. | boulangerie |
siren | string | Nine-digit company identifier. | 403052111 |
name | string | Company display name. | BOULANGERIES PAUL |
legalName | string | Registered company name. | BOULANGERIES PAUL |
acronym | string | Registered acronym when there is one. | |
isActive | boolean | True while the company is active, false when it has ceased activity. | true |
creationDate | string | Date of creation, YYYY-MM-DD. | 1995-12-07 |
closureDate | string | Date of cessation, YYYY-MM-DD. | |
legalFormCode | string | INSEE legal form code. | 5710 |
legalForm | string | Legal form label for the common codes; null when the code is not in the built-in list. | Simplified joint-stock company (SAS) |
activityCode | string | Main activity code, NAF rev. 2. | 10.71A |
sectionCode | string | Letter of the activity section. | C |
companySize | string | PME, ETI or GE. | ETI |
employeeBandCode | string | INSEE employee band code. | 41 |
employeeBand | string | Employee band label. | 500-999 employees |
employeeBandYear | number | Year the employee band refers to. | 2023 |
establishments | number | Number of establishments ever registered. | 315 |
establishmentsOpen | number | Number of establishments currently open. | 125 |
headOfficeSiret | string | Fourteen-digit identifier of the head office. | 40305211102616 |
address | string | Head office address. | 344 AVENUE DE LA MARNE 59700 MARCQ-EN-BARŒUL |
postalCode | string | Head office postal code. | 59700 |
city | string | Head office city. | MARCQ-EN-BARŒUL |
departmentCode | string | Department code of the head office. | 59 |
regionCode | string | INSEE region code of the head office. | 32 |
latitude | number | Head office latitude. | 50.678029398 |
longitude | number | Head office longitude. | 3.1169136021 |
vatNumber | string | Intra-community VAT number. | FR32403052111 |
revenue | number | Latest published revenue in EUR. | 73611839 |
revenueYear | number | Financial year of the latest revenue. | 2024 |
netResult | number | Latest net result in EUR. | -2197350 |
netMarginPct | number | Net result divided by revenue. | -3 |
isSocialEconomy | boolean | Part of the social and solidarity economy. | false |
isOrganic | boolean | Registered in the organic agency register. | false |
isEmployer | boolean | True when the head office is registered as an employer or the company employee band shows at least one employee; false when the head office is registered as a non-employer or the band says the company has no employees; null when the register has neither. | true |
isAssociation | boolean | Is an association. | false |
matchedEstablishmentSiret | string | Establishment in your location filter (or the SIRET you looked up); empty when no location filter is used. The head office is used when it is in the location; otherwise another establishment there. It can differ from the head office. | 32868651400105 |
matchedEstablishmentAddress | string | Address of the matched establishment. | 17 AV CHARLES DE GAULLE 69370 SAINT-DIDIER-AU-MONT-D OR |
matchedEstablishmentPostalCode | string | Postal code of the matched establishment. | 69370 |
matchedEstablishmentCity | string | City of the matched establishment. | SAINT-DIDIER-AU-MONT-D OR |
matchedEstablishmentDepartment | string | Department of the matched establishment, from its INSEE commune code. | 69 |
matchedEstablishmentRegion | string | INSEE region code of the matched establishment. | 84 |
matchedEstablishmentIsHeadOffice | boolean | True when the matched establishment is the head office. | false |
matchedEstablishmentIsActive | boolean | Whether the matched establishment is open. Always true while "Only active companies" is on (companies whose establishments in the location are all closed are skipped); can be false when you switch that option off or look up the SIRET of a closed establishment. | true |
matchedEstablishmentClosureDate | string | Closure date of the matched establishment, YYYY-MM-DD; null while it is open. | |
matchedEstablishmentsListed | integer | Number of establishments of this company in the location found in the register response (the head office plus the matching establishments). The Actor asks the register for up to 100 matching establishments per company, so 100 means 100 or more. Empty when no location filter is used. | 1 |
directorCount | number | Number of directors listed in the register (names only when requested). | 4 |
directors | string | Names and roles joined with semicolons; only when directors are requested. | |
sourceUrl | string | Public company page. | https://annuaire-entreprises.data.gouv.fr/entreprise/403052111 |
updatedAt | string | Last update of the record in the register. | 2026-09-17T04:38:04 |
found | boolean | False only for the single status row emitted when a search has no results. | true |
scrapedAt | string | ISO 8601 timestamp of extraction. | 2026-09-30T08:00:00.000Z |
{
"query": "boulangerie",
"siren": "403052111",
"name": "BOULANGERIES PAUL",
"legalName": "BOULANGERIES PAUL",
"acronym": null,
"isActive": true,
"creationDate": "1995-12-07",
"closureDate": null,
"legalFormCode": "5710",
"legalForm": "Simplified joint-stock company (SAS)",
"activityCode": "10.71A",
"sectionCode": "C",
"companySize": "ETI",
"employeeBandCode": "41",
"employeeBand": "500-999 employees",
"employeeBandYear": 2023,
"establishments": 315,
"establishmentsOpen": 125,
"headOfficeSiret": "40305211102616",
"address": "344 AVENUE DE LA MARNE 59700 MARCQ-EN-BARŒUL",
"postalCode": "59700",
"city": "MARCQ-EN-BARŒUL",
"departmentCode": "59",
"regionCode": "32",
"latitude": 50.678029398,
"longitude": 3.1169136021,
"vatNumber": "FR32403052111",
"revenue": 73611839,
"revenueYear": 2024,
"netResult": -2197350,
"netMarginPct": -3,
"isSocialEconomy": false,
"isOrganic": false,
"isEmployer": true,
"isAssociation": false,
"matchedEstablishmentSiret": "32868651400105",
"matchedEstablishmentAddress": "17 AV CHARLES DE GAULLE 69370 SAINT-DIDIER-AU-MONT-D OR",
"matchedEstablishmentPostalCode": "69370",
"matchedEstablishmentCity": "SAINT-DIDIER-AU-MONT-D OR",
"matchedEstablishmentDepartment": "69",
"matchedEstablishmentRegion": "84",
"matchedEstablishmentIsHeadOffice": false,
"matchedEstablishmentIsActive": true,
"matchedEstablishmentClosureDate": null,
"matchedEstablishmentsListed": 1,
"directorCount": 4,
"directors": null,
"sourceUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/403052111",
"updatedAt": "2026-09-17T04:38:04",
"found": true,
"scrapedAt": "2026-09-30T08:00:00.000Z"
}
| Field | Name | Type | What it does |
|---|---|---|---|
queries | Search terms | array | Company names, activities or keywords, for example boulangerie or logiciel. Each term is searched separately. Leave empty when you search by filters or by SIREN/SIRET number only. If the input has no search term, no number and no filter at all, the Actor runs a small free example search (boulangerie in department 75) and says so in the status message. |
sirens | SIREN or SIRET numbers | array | Look up specific companies by 9-digit SIREN or 14-digit SIRET. These lookups ignore the filters below and also return closed companies; a SIRET returns exactly that establishment. Numbers that are not in the public register get a free status row and are listed in the status message; when the input has only numbers and none exists, the run fails. |
departments | Departments | array | French department codes, for example 75 for Paris, 69 for Rhône or 2A for Corse-du-Sud. A company is returned when it has an establishment in one of these departments; with "Only active companies" on (default) that establishment must be open. The establishment is returned in the matchedEstablishment fields. Switch on "Head office only" to require the head office itself. |
regions | Regions | array | INSEE region codes, for example 11 for Île-de-France or 84 for Auvergne-Rhône-Alpes. Same rule as departments: an establishment in the region, open when "Only active companies" is on, or the head office when "Head office only" is on. |
postalCodes | Postal codes | array | Postal codes, for example 75011. Same rule as departments: an establishment with this postal code, open when "Only active companies" is on, or the head office when "Head office only" is on. |
headOfficeOnly | Head office only | boolean | Keep only companies whose head office is in the requested departments, regions or postal codes. Off by default: any establishment of the company in the location counts. |
activityCodes | Activity codes (NAF) | array | Main activity codes in the NAF classification, for example 62.01Z for computer programming or 10.71C for bakeries. |
companySizes | Company size categories | array | Official size category: PME (small and medium), ETI (mid-sized) or GE (large). |
employeeBands | Employee bands | array | INSEE employee band codes, for example 11 for 10-19 employees, 12 for 20-49, 21 for 50-99, 22 for 100-199. |
legalForms | Legal forms | array | INSEE legal form codes, for example 5710 for SAS, 5499 for SARL or 5599 for SA. |
minRevenue | Minimum revenue (EUR) | integer | Only companies whose latest published revenue is at least this amount. Only companies that file their accounts publicly have revenue data. |
maxRevenue | Maximum revenue (EUR) | integer | Only companies whose latest published revenue is at most this amount. |
minNetResult | Minimum net result (EUR) | integer | Only companies whose latest net result is at least this amount. Use 1 to keep only profitable companies. |
maxNetResult | Maximum net result (EUR) | integer | Only companies whose latest net result is at most this amount. Use 0 to find loss-making companies. |
onlyActive | Only active companies | boolean | Skip companies that have ceased activity. With a location filter it also skips companies whose establishments in the location are all closed, and the status message counts them. |
employersOnly | Employers only | boolean | Keep only companies flagged as employers: the head office is registered as an employer or the company employee band shows at least one employee (the isEmployer field). Checked by the Actor on every record. |
socialEconomyOnly | Social and solidarity economy only | boolean | Keep only companies flagged as part of the social and solidarity economy (the isSocialEconomy field). |
includeDirectors | Include company directors | boolean | Adds the names and roles of the directors listed in the register. Off by default because it contains personal data; when you switch it on you are responsible for using it in line with data protection law. |
maxItems | Maximum results | integer | Stop after this many companies in total. The register search returns at most 10,000 results per search. |
proxyConfiguration | Proxy configuration | object | Optional proxy. Leave disabled: the Sirene search API is public and needs none. |
Run the Actor and get the results in one request. Replace YOUR_APIFY_TOKEN with the token from your Apify account settings.
curl -X POST "https://api.apify.com/v2/acts/datagrit~french-company-finder/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"queries":["logiciel"],"departments":["69"],"minRevenue":1000000,"maxItems":25}'import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('datagrit/french-company-finder').call({
"queries": [
"logiciel"
],
"departments": [
"69"
],
"minRevenue": 1000000,
"maxItems": 25
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]);Install with npm i apify-client.
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("datagrit/french-company-finder").call(run_input={
"queries": [
"logiciel"
],
"departments": [
"69"
],
"minRevenue": 1000000,
"maxItems": 25
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(len(items), items[0] if items else None)Install with pip install apify-client.
Paste its SIREN or SIRET number. Number lookups ignore the filters and also return closed companies and closed establishments. A SIRET lookup returns exactly that establishment.
The run lists the numbers that are not in the public register in its status message and adds a free status row for each. If the input contains only numbers and none of them exists, the run fails with that list, so a scheduled run cannot turn green on a wrong input. Companies that opted out of public listing are not in the register.
Many companies do not publish their accounts, and the register only holds what is filed publicly. The status message says how many returned companies have revenue.
Every run reads the live register.
Yes, use Apify schedules or call the Actor from your own workflow.
Open an issue with the input you used; changes at the source are fixed quickly.
Find EU public contracts approaching expiry from TED award notices: incumbent, buyer, value, end date and renewal options.
Ashby job postings with normalized annual salary ranges, equity flags and new-since-last-run detection.
Open jobs from Greenhouse, Lever, Ashby, Workday, Workable, SmartRecruiters, Recruitee and Personio in one schema with normalized salaries.
Greenhouse job postings with published pay ranges by zone, annualised pay, filters and new-since-last-run detection.