How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
552081317in SIREN / SIRET / VAT numbers. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
France Company & SIRET Search looks up French companies in the official Sirene directory. Add SIREN, SIRET or French VAT numbers, or search by company name with department, postal code, NAF code and status filters. You get one clean row per company, with legal form, NAF activity, size, dates, head office and a clear status: active, ceased or not found.
- Identifier lookup. Each SIREN, SIRET or VAT number is an exact match. A SIRET also returns that establishment. A wrong or unknown number returns a
not_foundrow, so no input is lost. - Name search. A full-text search on company names, brands and addresses, with filters. Results are ranked by the source. Check
sirenandnamebefore you use a search result as a verified match.
Good for
- Check that a supplier or customer exists and is still active (KYB, onboarding).
- Fill CRM records with the official name, legal form, NAF code, VAT number and head office.
- Build a list of companies in a department or with a NAF code.
- Find the open and closed establishments of a company.
Not a good fit
- Directors, shareholders, phone numbers or emails. The Actor does not output them. Note: a sole trader (entrepreneur individuel) is registered under a person's name, and Sirene shows that name as the company name, unless the person hid it.
- Companies that asked to hide their data (non-diffusible). The public API does not serve them.
- A full copy of the Sirene database. Use the official Sirene files for bulk downloads.
- Legal certificates such as a Kbis extract.
Who uses it
KYB and onboarding teams
Check that a French client exists and is still active.
CRM owners
Fill records with the official name, NAF code and VAT number.
Prospecting teams
List companies in a department or with one NAF code.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.002 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Company record | $0.0072 | One found French company (complete or partial row) saved to the Dataset. |
| Not-found lookup | $0.001 | One valid SIREN/SIRET/VAT lookup that is not in the public Sirene index, saved as a not_found row. |
| Establishment record | $0.0003 | One establishment (SIRET) row saved to the Dataset when establishments are requested or a SIRET is looked up. |
Examples
- One company: about $0.0092.
- 1,000 companies: about $7.20.
- Every day 100 companies, for 30 days: about $21.66 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 690 companies.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Do I need an INSEE API key?
No. The source is open and free. You only need an Apify account.
Are company directors included?
No. They are personal data. The tool gives company data only.
Can I get a Kbis extract?
No. The tool gives public register data, not legal certificates.
Can I reuse the data commercially?
Yes. Sirene data is under Licence Ouverte 2.0, with attribution.
Do I need an API key or a French account?
No. The source is open and free. You only need your Apify account.
Is a search result a verified match?
No. Search is fuzzy. For verification, use the SIREN or SIRET. Exact lookups show matchedBy: "siren_exact" or "siret_exact".
How fresh is the data?
Each run reads the source live. Each row has fetchedAt (our read time) and sourceUpdatedAt (the source update time of that record).
Details
Step by step on Apify
- Open the Input tab. The form already has three SIREN numbers: EDF, TotalEnergies and LVMH.
- Click Start.
- Open the Companies view in the Output tab. Check
name,administrativeStatusandheadOfficeAddress. - Replace the numbers with your own list (up to 100). Turn on Include establishments if you need SIRET rows.
Use cases
| Task | Input | You get | Key fields |
|---|---|---|---|
| Verify a company (KYB) | identifiers | company row | status, administrativeStatus, closureDate, legalFormLabel |
| Clean CRM records | identifiers (SIREN, SIRET or VAT) | company row | name, vatNumber, nafCode, headOfficeAddress |
| Map a company's sites | identifiers + includeEstablishments | establishment rows | siret, address, administrativeStatus, isHeadOffice |
| Prospect list by area and activity | query + departments / nafCodes | company rows | name, employeeRangeLabel, companyCategory, searchRank |
Tips for better results
- Use SIREN or SIRET for checks. Name search is fuzzy.
- A SIRET also returns that one establishment of the company.
- Spaces, dots and dashes in numbers are fine. The tool removes them.
Limits and good to know
- Up to 100 identifiers per run, or up to 100 companies per search
- Up to 100 establishments per company. The source cannot list more. Check
establishmentsComplete: in our test of 100 transport companies, 96 had their full list - In search mode, establishments are the ones that matched your search or filters, not all establishments of the company
- The Actor sends at most about 3 requests per second. The source allows 7 per second per IP and shares a limit across cloud providers, so a busy moment can give
RATE_LIMITEDrows. Run them again later - Internal time budget is 240 seconds. 100 identifiers with establishments took 94 seconds in our test
naf2025Codeis a temporary field of the source. The source says it may be removed after 2027-01-01
Troubleshooting
| Symptom | Check | Action |
|---|---|---|
not_found for a real company | checksumValid | false means a typo. If true, the company may be non-diffusible or very new. |
| A ceased company | administrativeStatus, closureDate | This is correct data, not an error. |
Address is null | diffusionStatus, hiddenFields | The company hides some data by law. |
RATE_LIMITED rows | RUN_SUMMARY.http.rateLimited | Run the failed identifiers again later. |
Fewer establishments than establishmentsTotal | establishmentsComplete, maxEstablishmentsPerCompany | Raise the limit up to 100. Above 100, the source gives a subset. |
INVALID_INPUT | RUN_SUMMARY.message | Common causes: identifiers and a search in one run; no valid SIREN/SIRET/VAT in the list; an unknown NAF code; a search query shorter than 3 characters without a filter. |
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"recordType": "company",
"status": "complete",
"input": "552100554",
"matchedBy": "siren_exact",
"siren": "552100554",
"name": "PEUGEOT SA",
"legalFormLabel": "SA à directoire (s.a.i.)",
"nafCode": "70.10Z",
"nafVersion": "NAFRev2",
"naf2025Code": null,
"administrativeStatus": "ceased",
"creationDate": "1955-01-01",
"closureDate": "2021-01-16",
"vatNumber": null,
"establishmentsTotal": 5,
"establishmentsOpen": 0,
"headOfficeSiret": "55210055400054",
"headOfficeCity": "VELIZY-VILLACOUBLAY",
"headOfficeStatus": "closed",
"annuaireUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/552100554",
"sourceUpdatedAt": "2026-10-08T09:06:03"
}Use it from code
Actor ID: cliqtomedia/france-sirene-company-search. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/france-sirene-company-search").call(run_input={
"identifiers": [
"552081317",
"542051180",
"775670417"
],
"companyStatus": "any"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~france-sirene-company-search/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"identifiers": ["552081317", "542051180", "775670417"], "companyStatus": "any"}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/france-sirene-company-search")
result = tool.invoke({"run_input": {"identifiers": ["552081317", "542051180", "775670417"], "companyStatus": "any"}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (40)
| Field | Type | Meaning |
|---|---|---|
recordType | string | Row type: company or establishment. Filter on it, or use the Companies / Establishments view. |
status | string | Row result: complete, partial, not_found or error. See statusReason and errorCode. |
statusReason | string | Plain-English reason for a partial, not_found or error row; null when complete. |
errorCode | string | Machine code for error rows, e.g. INVALID_IDENTIFIER, RATE_LIMITED, SOURCE_UNAVAILABLE; null otherwise. |
input | string | Your input value as given (identifier), or null for search rows. |
matchedBy | string | How the row was found: siren_exact, siret_exact, search; for establishments also head_office, company_establishments, search_match. |
siren | string | 9-digit SIREN company number. |
siret | string | 14-digit SIRET establishment number (establishment rows). |
companyName | string | Name of the parent company (establishment rows). |
isHeadOffice | boolean | true if this establishment is the current head office (siège). |
wasHeadOffice | boolean | true if this establishment was a head office in the past. |
administrativeStatus | string | Company: active or ceased. Establishment: active or closed. |
administrativeStatusCode | string | INSEE code: A (active), C (ceased company) or F (closed establishment). |
creationDate | string | Creation date, YYYY-MM-DD. |
activityStartDate | string | Start date of the establishment activity, YYYY-MM-DD. |
closureDate | string | Closure date, YYYY-MM-DD; null if active. |
address | string | Full establishment address as one line; null if hidden. |
postalCode | string | 5-digit postal code of the establishment. |
city | string | City of the establishment. |
communeCode | string | INSEE commune code of the establishment. |
department | string | Department code of the establishment, e.g. 75, 2A, 971. |
region | string | INSEE region code of the establishment. |
latitude | number | Latitude (WGS84) of the establishment; null if unknown or hidden. |
longitude | number | Longitude (WGS84) of the establishment; null if unknown or hidden. |
nafCode | string | Main activity, NAF rev. 2 code, e.g. 62.01Z. |
nafVersion | string | NAF nomenclature of nafCode, e.g. NAFRev2. |
nafLabel | string | French label of nafCode. |
naf2025Code | string | Main activity in the new NAF 2025 nomenclature; temporary source field, can be null. |
employeeRangeCode | string | INSEE headcount band code (tranche d'effectif). |
employeeRangeLabel | string | Headcount band label, e.g. 10 000 salariés et plus. |
employeeRangeYear | number | Year of the headcount band. |
isEmployer | boolean | Employer flag from the source; often null at company level. |
tradeNames | array | Trade names (enseignes) of the establishment. |
commercialName | string | Commercial name (dénomination usuelle) of the establishment. |
diffusionStatus | string | public, or partial when some data is hidden by law (non-diffusible fields). |
hiddenFields | array | Fields hidden by the source for privacy; they are null in this row. |
annuaireUrl | string | Public page on annuaire-entreprises.data.gouv.fr. |
source | string | Data source name and licence. |
sourceUrl | string | Source API URL used for this row. |
fetchedAt | string | When the Actor read the source, ISO 8601 UTC. |
Input settings (9)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| SIREN / SIRET / VAT numbers | identifiers | array | ["552081317", "542051180", "775670417"] |
| Search by name or address | query | string | |
| Departments | departments | array | |
| Postal codes | postalCodes | array | |
| NAF / APE activity codes | nafCodes | array | |
| Company status | companyStatus | string | "any" |
| Max companies (search) | maxResults | integer | 25 |
| Include establishments (SIRET rows) | includeEstablishments | boolean | false |
| Max establishments per company | maxEstablishmentsPerCompany | integer | 20 |
Use cases with this tool
Each guide shows all the steps and the other tools.
