# France SIRENE Company Scraper - SIREN/SIRET Lookup & Search (`neverempty/france-sirene-company-scraper`) Actor

Search French companies by name, city, department, postcode, NAF/APE code, legal form, size or status, or look up SIREN and SIRET numbers in bulk (check digits verified first). One row per company with head office, VAT number, officers, revenue and matching establishments. No API key.

- **URL**: https://apify.com/neverempty/france-sirene-company-scraper.md
- **Developed by:** [NeverEmpty](https://apify.com/neverempty) (community)
- **Categories:** Lead generation, Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.30 / 1,000 company returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## France SIRENE Company Scraper - SIREN/SIRET Lookup & Search

Search French companies by name, department, postcode, commune, region, NAF/APE activity code, legal form, size category, employee band, status or sole-trader status, or look up **SIREN** and **SIRET** numbers in bulk. No API key, no browser, no proxy.

This Actor reads the French government's public **Recherche d'entreprises** API (`recherche-entreprises.api.gouv.fr`, the search behind annuaire-entreprises.data.gouv.fr), which is built from INSEE's **Sirene** register and the national business register (**RNE**). It is not affiliated with INSEE, DINUM or the French administration.

Each result is **one row per company (SIREN)**: company name, legal name, acronym, **VAT number**, active or closed, creation and closing date, legal form (INSEE code and its name), size category (PME / ETI / GE), employee band, NAF/APE code with its label and the NAF 2025 code, the **head office** (SIRET, address, postcode, city, commune code, department, region, coordinates, trade name, shop signs), number of establishments and open establishments, the **establishments that matched your search**, the **officers** (name and role), and the latest **revenue and net income** the source holds.

Typical uses: B2B lead lists by town, department and activity (bakeries in Lyon, construction companies in Ile-de-France, large companies in Hauts-de-Seine), KYC and supplier checks from a list of SIREN or SIRET numbers, VAT number lookup, and checking whether companies are still active.

### What this source is, and what it is not

- It is a **search**, not the whole Sirene database. Every search stops at 10,000 results (see below), and a bulk lookup is one request per number. A name search can also miss a company that is in the register: in postcode 76450, DAVID PIGNE (SIREN 488970997, a closed bakery, NAF 10.71C, shop sign "BOULANGERIE LES 3 MARCHES") is not among the results for `boulangerie`, which returns one company there (2026-09-11).
- The name search looks at **names, not at the activity**. To get every bakery rather than every company called "boulangerie", search by NAF code `10.71C` (and `10.71D` for pastry shops) instead of by name.
- Companies whose data is not public ("non-diffusibles") and companies refused registration are **not in the source at all** (stated in the source's own documentation). Neither the source nor this Actor returns them; a lookup of such a number comes back as `not-found`.
- A company row lists **only the establishments that matched your search**, up to `maxEstablishmentsPerCompany` (10 by default, 100 at most, the source's limit), not every establishment of the company. `matchingEstablishmentsListed` is how many are listed, not how many match: ELIOR RESTAURATION FRANCE has 3,208 open establishments and 10 are listed by default. `matchingEstablishmentsMayBeMore` is `true` when the list reached the limit. `establishmentCount` and `openEstablishmentCount` give the company's totals; the source gives no total of matching establishments.

### What the source gets wrong, and what this Actor does about it

Measured against the live API on 2026-09-11. Counts are from that day and change as the register is updated.

| The source's behaviour | What you get here |
|---|---|
| A name search also matches addresses, officers and elected officials: `renault` in postcode 76450 returned 9 companies, of which BR IMMO (an officer is named Renault) and COMMUNE DE THIOUVILLE (no Renault in its name or among its officers) are not Renault companies | **Company names only** by default: a company is kept when every word of your query appears in its name, legal name, acronym, trade name or shop sign (checked against all 4,091 companies of postcode 76450: the same 7 companies). Choose `everything` to get what the source returns. When nothing is left, the row says how many were left out and why |
| Every search stops at 10,000 results: page × page size above 10,000 is refused with HTTP 400, and the reported total is capped at 10,000. Splitting by department alone misses every company whose head office is outside France, because department filters only match establishments in France (legal form 3120, foreign companies registered in France: the sections add up to 34,586 companies, a department-only split found 31,702; `airbus` finds 245 companies, 35 of them with a head office abroad) | When more than 10,000 match and you ask for more, the search is **split by department** (and a department still over 10,000 by NAF section), then **each NAF section is read on its own without a department**, which reaches the companies based abroad. Companies already returned are skipped, so each company is charged once. At the end the section counts are added up and compared with the companies found; if some could not be reached, an `incomplete` row (free) says how many. Measured on Apify for legal form 3120 on 2026-09-11: **34,774 companies** in 1,991 seconds (34,571 of the 34,586 the sections count, plus 203 companies with no section), and one `incomplete` row naming the 15 not reached. Two kinds of company can still be missed without a count: companies with neither a NAF section nor an establishment in France beyond the first 10,000 results, and, where a department had to be split by section, companies with no NAF section there; a row says when that can have happened |
| Location filters match any establishment: a search for bakeries in departments 75 and 92 returns BOULANGERIES PAUL, whose head office is in department 59 | The establishments inside your area are listed in `matchingEstablishments` (address, postcode, city, SIRET, active or closed), so you can see why the company is there |
| A lookup by SIREN returns no establishments: Renault SAS (780129987) has 224 establishments and the lookup lists none, even when asking for 100 | `matchingEstablishments` is `null` with `matchingEstablishmentsListed: 0`, and `establishmentCount` / `openEstablishmentCount` give the totals. Look up a **SIRET** to get that establishment |
| Paris, Lyon and Marseille are filed under their arrondissements: commune code 75056 (Paris) returns 0 bakeries, 75111 (Paris 11e) returns 57 | 75056, 69123 and 13055 are sent as their arrondissement codes (75101-75120, 69381-69389, 13201-13216), and the search description says so |
| A commune code that does not exist (69999) returns 0 results, exactly like a commune without companies | The empty-result row says that an unknown commune code (or postcode) gives the same empty answer |
| The reported total can be larger than what the pages return: postcode 76450 says 4,104 companies, the last page stops at 4,091 | Reading stops at the last page and the result is not reported as incomplete; the count reported by the source is in the log |
| Partly public companies and establishments come back with the text `[NON-DIFFUSIBLE]` in the address, postcode, coordinates, acronym and shop signs | Those values are `null`, never the placeholder text, and `headOfficeAddressWithheld` / `addressWithheld` / `partiallyWithheld` say which records the source withheld. The city and department that the source does publish are kept |
| A mistyped SIREN or SIRET is simply "not found" | Every number is checked against its **Luhn** check digit before it is sent (with INSEE's separate rule for La Poste's SIRETs, which do not satisfy Luhn), and a typo comes back as `bad-input` with the reason. A French VAT number (FR + key + SIREN) is accepted and its key is checked. If a spreadsheet dropped a leading zero, the row suggests the corrected number |
| The source publishes the birth month and year of officers who are natural persons | Officers are returned with **name and role only**; birth month, birth year and nationality are not returned |
| Rate limit: 7 requests per second per IP and 30 per second per network (ASN), "likely to be hit on public clouds" (source documentation). From Apify's network, three quick requests already got HTTP 429 with `retry-after: 4` | One request at a time with a pause, `retry-after` honoured, up to 6 attempts with growing waits. If the source still does not answer, you get a `failed` or `incomplete` row saying so; nothing is guessed |
| Queries shorter than 3 characters, unknown department, NAF, legal form or employee band codes are refused with a French error message | Obvious mistakes are caught before anything is sent, with the reason in English; anything the source still refuses comes back as `bad-input` with the source's own message |

### Input

Give **SIREN/SIRET numbers** for a bulk lookup, **or** any combination of the search fields. If both are given, the numbers are looked up and a row says the search fields were not used. If nothing at all is given, three example numbers (Renault SA 441639465, Societe Generale 552120222 and the head office of Renault SAS 78012998704037) are looked up so the Actor always returns something, and every row records what was looked up in its `input` column.

| Field | Default | What it does |
|---|---|---|
| `ids` | - | SIREN (9 digits) or SIRET (14 digits) numbers, up to 3,000 per run. New lines, commas and semicolons separate numbers; spaces and dots inside a number are fine (`552 120 222`). A French VAT number is read as its SIREN. Numbers beyond 3,000 are counted in one row |
| `query` | - | Words to search for (at least 3 characters). Case, accents and hyphens are ignored; whole words; every word must appear |
| `searchIn` | `names` | `names`: keep only companies whose own names contain every word. `everything`: also companies matched through an address, an officer or an elected official (as the source does) |
| `departments` | - | Department codes such as `75`, `92`, `69`, `2A`, `971` (a single digit is read with a leading zero). Several means any of them |
| `postalCodes` | - | 5-digit postcodes such as `75011` |
| `communeCodes` | - | 5-character INSEE commune codes such as `92012` (not postcodes). Paris, Lyon and Marseille are expanded to their arrondissements |
| `regions` | - | 2-digit INSEE region codes such as `11` (Ile-de-France) or `84` (Auvergne-Rhone-Alpes) |
| `nafCodes` | - | NAF rev. 2 codes such as `62.01Z` or `10.71C` (`6201Z` is read as `62.01Z`) |
| `sections` | - | NAF section letters `A` to `U` |
| `legalForms` | - | INSEE legal category codes such as `5710` (SAS), `5499` (SARL), `5599` (SA), `1000` (sole trader), `9220` (association) |
| `companyCategories` | - | `PME`, `ETI`, `GE` |
| `employeeBands` | - | INSEE headcount bands: `NN`, `00`, `01` (1-2), `02` (3-5), `03` (6-9), `11` (10-19), `12` (20-49), `21` (50-99), `22` (100-199), `31` (200-249), `32` (250-499), `41` (500-999), `42` (1,000-1,999), `51` (2,000-4,999), `52` (5,000-9,999), `53` (10,000+) |
| `status` | `any` | `active` or `closed` companies |
| `soleTraders` | `any` | `only` or `exclude` sole traders (entreprises individuelles) |
| `maxResults` | `100` | Most companies a search returns, up to 50,000 (above 10,000 the search is split as described above) |
| `maxEstablishmentsPerCompany` | `10` | How many matching establishments to list per company, 1 to 100 |

#### Examples

Bulk lookup (SIREN, SIRET or VAT numbers, in any mix):

```json
{ "ids": ["441639465", "552 120 222", "78012998704037", "FR63441639465"] }
```

Bakeries in Lyon (all arrondissements), active only:

```json
{ "query": "boulangerie", "communeCodes": ["69123"], "status": "active", "maxResults": 500 }
```

Construction companies with 10 to 49 employees in Hauts-de-Seine:

```json
{ "departments": ["92"], "sections": ["F"], "employeeBands": ["11", "12"], "maxResults": 1000 }
```

Software companies (NAF 62.01Z) in Paris that are SAS:

```json
{ "departments": ["75"], "nafCodes": ["62.01Z"], "legalForms": ["5710"], "maxResults": 2000 }
```

### Output

One row per company. Example (Renault SA, shortened):

```json
{
  "status": "ok",
  "input": "441639465",
  "lookupType": "siren",
  "siren": "441639465",
  "name": "RENAULT (RENAULT)",
  "legalName": "RENAULT",
  "vatNumber": "FR63441639465",
  "isActive": true,
  "createdOn": "2002-04-01",
  "legalFormCode": "5510",
  "legalForm": "SA nationale à conseil d'administration",
  "companyCategory": "GE",
  "nafCode": "64.20Z",
  "nafLabel": "Activités des sociétés holding",
  "revenueEur": 56232000000,
  "netIncomeEur": 891000000,
  "financialYear": 2024,
  "headOfficeSiret": "44163946500091",
  "headOfficeAddress": "122-122 122 B AVENUE DU GENERAL LECLERC 92100 BOULOGNE-BILLANCOURT",
  "headOfficeCity": "BOULOGNE-BILLANCOURT",
  "headOfficeDepartment": "92",
  "establishmentCount": 9,
  "openEstablishmentCount": 1,
  "officerCount": 18,
  "officers": [{ "type": "person", "name": "MICHELLE STRAKA BARON", "lastName": "BARON", "firstNames": "MICHELLE STRAKA", "role": "Administrateur", "siren": null }],
  "annuaireUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/441639465"
}
```

All columns: `siren`, `siret` (the SIRET you looked up), `lookupType` (`siren`, `siret` or `search`), `name`, `legalName`, `acronym`, `vatNumber`, `isActive`, `administrativeStatus` (`active` / `closed`), `createdOn`, `closedOn`, `legalFormCode`, `legalForm`, `companyCategory`, `companyCategoryYear`, `employeeBandCode`, `employeeBand`, `employeeBandYear`, `nafCode`, `nafLabel`, `naf2025Code`, `activitySection`, `activitySectionLabel`, `isSoleTrader`, `isAssociation`, `isSocialEconomy`, `collectiveAgreementCodes`, `revenueEur`, `netIncomeEur`, `financialYear`, `headOfficeSiret`, `headOfficeAddress`, `headOfficePostalCode`, `headOfficeCity`, `headOfficeCommuneCode`, `headOfficeDepartment`, `headOfficeRegion`, `headOfficeLatitude`, `headOfficeLongitude`, `headOfficeIsActive`, `headOfficeTradeName`, `headOfficeSigns`, `headOfficeIsEmployer`, `headOfficeAddressWithheld`, `partiallyWithheld`, `establishmentCount`, `openEstablishmentCount`, `matchingEstablishmentsListed` (how many are listed, not how many match), `matchingEstablishmentsMayBeMore` (`true` when the list reached `maxEstablishmentsPerCompany`; `null` for SIREN/SIRET lookups), `matchingEstablishments`, `officerCount`, `officers`, `sourceUpdatedAt`, `annuaireUrl`, `checkedAt`, plus `status`, `note`, `input` and `source`.

Each entry of `matchingEstablishments`: `siret`, `isHeadOffice`, `isActive`, `address`, `postalCode`, `city`, `communeCode`, `latitude`, `longitude`, `nafCode`, `tradeName`, `signs`, `createdOn`, `closedOn`, `employeeBandCode`, `addressWithheld`. Each entry of `officers`: `type` (`person` or `company`), `name`, `lastName`, `firstNames`, `role`, `siren` (for a company acting as officer, such as a statutory auditor).

Labels (`legalForm`, `nafLabel`, `employeeBand`, `activitySectionLabel`) are INSEE's French labels, taken from the source's own open-source label tables. Values the source does not hold are `null`, never `0`, `false`, an empty string or an empty list. Revenue and net income are in euros, for the latest year the source holds, and are missing for most small companies.

Rows with a `status` other than `ok` explain themselves in `note` and are never charged: `bad-input` (rejected before sending, or refused by the source), `not-found` (valid check digit, nothing in the source), `no-results` (the search matched nothing), `failed` (no answer after retries), `incomplete` (part of a search could not be read, or it reached the 10,000 limit and could not be split), `duplicate-input` (the same number given twice: looked up and charged once), `not-looked-up` (over 3,000 numbers, the charge limit or the time limit), `filters-ignored` (numbers and search fields given together).

### Speed

Measured on Apify on 2026-09-11: a search returned **2,500 companies in 61 seconds** (100 pages of 25); a bulk lookup of **300 SIREN numbers took 172 seconds** (about 0.6 seconds each, one at a time), during which the source answered HTTP 429 seven times and every one of those numbers went through on retry. A full run of 3,000 numbers therefore takes about half an hour. A search for `boulangerie` asking for 10,100 companies went past the 10,000 limit by splitting by department and returned **10,100 different companies in 366 seconds** (431 requests; 63 companies that matched only through an address or a person's name were left out and not charged).

### Personal data

Officers are returned as the public register publishes them, with name and role only; their birth month, birth year and nationality are not returned. A sole trader's company name is the owner's own name, and the source publishes the business address of sole traders whose record is public; this Actor returns it as published. Records and addresses the source marks as not public are not returned by the source, and this Actor does not return them either.

### Pricing

Pay per result: you are charged for each company row returned. Rows that only explain a rejected input, a number the source does not hold, an empty search or a failed lookup are free.

### Source and licence

Data comes from the Recherche d'entreprises API run by the French interministerial digital directorate (DINUM), built from INSEE's Sirene register and the RNE, published as open data under the Licence Ouverte / Open Licence 2.0 (Etalab). The label tables come from the API's own open-source repository (MIT licence). This Actor is not affiliated with INSEE, DINUM or the French administration.

### Support

Found a wrong value or a missing field? Open an issue in the Issues tab with the input you used and the SIREN or SIRET concerned.

# Actor input Schema

## `ids` (type: `array`):

SIREN (9 digits, a company) or SIRET (14 digits, one establishment) numbers to look up in bulk, up to 3,000 per run. Spaces and dots inside a number are fine (552 120 222); a French VAT number such as FR63441639465 is read as its SIREN. Every number is checked against its Luhn check digit before it is sent, so a typo is reported as a typo instead of 'not found'. When numbers are given, the search fields below are not used.

## `query` (type: `string`):

Words to search for, at least 3 characters, for example boulangerie or renault. Case, accents and hyphens are ignored. The source matches whole words and also searches addresses and the names of officers and elected officials; see 'Match the words in' below.

## `searchIn` (type: `string`):

Company names (default) keeps only companies whose own name, acronym, trade name or shop sign contains every word: the source on its own also returns companies whose street or officer has that name (on 2026-09-11, 'renault' in postcode 76450 returned 9 companies, 2 of them only because of an officer's name). Everything returns what the source returns.

## `departments` (type: `array`):

French department codes, for example 75, 92, 69, 2A, 971. Several codes mean any of them. Location filters match any establishment of the company, so a company whose head office is elsewhere is returned when one of its establishments is in the area; those establishments are listed in matchingEstablishments.

## `postalCodes` (type: `array`):

5-digit postcodes, for example 75011 or 69002. Several codes mean any of them.

## `communeCodes` (type: `array`):

5-character INSEE commune codes (not postcodes), for example 92012 for Boulogne-Billancourt. The source files Paris, Lyon and Marseille under their arrondissements, so 75056, 69123 and 13055 are sent as their arrondissement codes (75101-75120, 69381-69389, 13201-13216).

## `regions` (type: `array`):

2-digit INSEE region codes, for example 11 (Ile-de-France), 84 (Auvergne-Rhone-Alpes), 93 (Provence-Alpes-Cote d'Azur).

## `nafCodes` (type: `array`):

NAF rev. 2 codes of the main activity, for example 62.01Z (computer programming) or 10.71C (bakery). 6201Z is read as 62.01Z. Several codes mean any of them.

## `sections` (type: `array`):

NAF section letters A to U, for example F (construction), I (accommodation and food), J (information and communication).

## `legalForms` (type: `array`):

INSEE legal category codes (4 digits), for example 5710 (SAS), 5499 (SARL), 5599 (SA), 1000 (sole trader), 9220 (declared association).

## `companyCategories` (type: `array`):

Any of PME (small and medium), ETI (intermediate-sized) and GE (large).

## `employeeBands` (type: `array`):

INSEE headcount band codes: NN (no employee data), 00 (0 employees), 01 (1-2), 02 (3-5), 03 (6-9), 11 (10-19), 12 (20-49), 21 (50-99), 22 (100-199), 31 (200-249), 32 (250-499), 41 (500-999), 42 (1,000-1,999), 51 (2,000-4,999), 52 (5,000-9,999), 53 (10,000 or more).

## `status` (type: `string`):

Active or closed (ceased) companies, or both.

## `soleTraders` (type: `string`):

Include, exclude or return only sole traders. A sole trader's company name is the owner's own name.

## `maxResults` (type: `integer`):

The most companies a search returns, up to 50,000. The source stops every search at 10,000 results; above that this Actor splits the search by department, then reads each activity section on its own to reach companies whose head office is outside France, and skips companies already returned. If the section counts show companies that could not be reached, a row says how many.

## `maxEstablishmentsPerCompany` (type: `integer`):

How many of a company's establishments that matched the search to list in each row (1 to 100, the source's limit). A company can have more matching establishments than this: matchingEstablishmentsMayBeMore is true when the list reached this number.

## Actor input object example

```json
{
  "ids": [
    "441639465",
    "552120222",
    "78012998704037"
  ],
  "searchIn": "names",
  "status": "any",
  "soleTraders": "any",
  "maxResults": 100,
  "maxEstablishmentsPerCompany": 10
}
```

# Actor output Schema

## `results` (type: `string`):

One row per French company (SIREN): name, legal form, NAF/APE activity, size, status, VAT number, head office address and SIRET, officers (name and role), latest revenue and net income, and the establishments that matched the search, plus one row when an input was rejected, not found, or could not be read.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "ids": [
        "441639465",
        "552120222",
        "78012998704037"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/france-sirene-company-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "ids": [
        "441639465",
        "552120222",
        "78012998704037",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("neverempty/france-sirene-company-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "ids": [
    "441639465",
    "552120222",
    "78012998704037"
  ]
}' |
apify call neverempty/france-sirene-company-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neverempty/france-sirene-company-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/7Oe4WSYmnd7T0qDwZ/builds/dRW1Lac16ywsI9zuH/openapi.json
