# New Company Registrations: France, Norway, Finland, UK (`datacraft-studio/new-company-registrations-europe`) Actor

Daily feed of newly registered companies in France (BODACC), Norway (Brreg), Finland (PRH) and the UK (Companies House). Filter by sector, city, postal code and legal form, and skip companies already delivered on a previous scheduled run. Pay per new company.

- **URL**: https://apify.com/datacraft-studio/new-company-registrations-europe.md
- **Developed by:** [Yahya Nouali](https://apify.com/datacraft-studio) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 new companies

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## New Company Registrations: France, Norway, Finland, UK

A daily feed of companies that have just been registered in France, Norway, Finland and the United Kingdom. One dataset row per company, then a `run_summary` row. You pay for a company only when it is delivered.

Built for lead generation and prospecting. A scheduled run with `onlyNew` remembers what it already sent, so the same company is not delivered or billed twice.

### Use cases

- **Lead generation.** Pull yesterday's new SAS in Paris, new AS in Oslo, new Oy in Helsinki and new Ltd in London, then load them into a sheet or a CRM.
- **Prospecting.** Restrict the feed with activity-code prefixes (NAF, NACE, TOL or SIC), cities, postal-code prefixes and legal forms. Sole traders can be left out.
- **Scheduled daily runs.** Run every morning. The overlap in `lookbackDays` catches a publication that landed after the previous run, and `onlyNew` drops the companies you already have.

### Input

```json
{
  "countries": ["FR", "NO", "FI", "UK"],
  "lookbackDays": 2,
  "naceCodes": ["62"],
  "cities": ["Paris", "Oslo", "Helsinki", "London"],
  "postalCodePrefixes": ["75"],
  "legalForms": ["SAS", "AS", "OY", "ltd"],
  "excludeSoleTraders": true,
  "onlyNew": true,
  "stateStoreName": "new-company-registrations-state",
  "maxItems": 1000
}
```

| Field | Default | What it does |
| --- | --- | --- |
| `countries` | FR, NO, FI, UK | `FR` France, `NO` Norway, `FI` Finland, `UK` Companies House. |
| `lookbackDays` | `2` | Civil days ending today in Europe/Paris, including today. `1` is today only. `2` is yesterday and today. Maximum 31. |
| `dateFrom`, `dateTo` | empty | Inclusive `YYYY-MM-DD` window. When both are set they replace `lookbackDays`. Maximum span 31 days. |
| `naceCodes` | empty | Prefixes. `62` matches French `62.01Z`, Norwegian `62.010`, Finnish `62100` and UK `62012`. |
| `cities` | empty | City name. Accents and case are ignored. `Paris` matches `Paris 2`, not `Parisot`. Norway also matches the municipality. |
| `postalCodePrefixes` | empty | `750` matches `75002`. `SW1` matches `SW1A 1AA`. |
| `legalForms` | empty | Code or label: `SARL`, `5710`, `SAS`, `AS`, `ENK`, `OY`, `ltd`, `plc`. |
| `maxCompanyAgeDays` | `60` | France only in practice. BODACC creation notices also announce a new branch, a purchased business or a re-registered sole trader. A company whose SIRENE creation date is more than this many days before the window start is skipped and not charged. `0` keeps every notice. |
| `excludeSoleTraders` | `false` | Drops French entrepreneurs individuels, Norwegian ENK and Finnish toiminimi. UK sole traders are not on Companies House. |
| `onlyNew` | `true` | Skip a company already stored in the named key-value store. Not charged. |
| `stateStoreName` | `new-company-registrations-state` | Store used when `onlyNew` is on. Keep the same name on every scheduled run. |
| `maxItems` | `1000` | Delivered companies only. Filtered, duplicate and failed items do not count. Maximum 20,000. |
| `companiesHouseApiKey` | empty | Secret override of `COMPANIES_HOUSE_API_KEY`. Leave it empty and set the Actor secret instead. |

A French row is included when the BODACC **publication** date falls in the window. `registrationDate` is the SIRENE creation date when that call succeeds, which can be a few days earlier. `announcementDate` is the BODACC date. Norway filters on `registreringsdatoEnhetsregisteret`. Finland filters on the business-id registration date (`businessIdRegistrationStart` / `businessIdRegistrationEnd`). The PRH `registrationDate` query also returns older companies whose name or form changed, so it is not the window. The UK calls advanced search with `incorporated_from` and `incorporated_to`, one day at a time.

### Output

Filter `recordType` = `company` when you export. The last row is `run_summary`.

The fragment below is the field layout. Names, dates and addresses come from the registers when you run the Actor.

```json
{
  "recordType": "company",
  "country": "FR",
  "id": "123456789",
  "name": "EXAMPLE SAS",
  "legalForm": "SAS, société par actions simplifiée",
  "legalFormCode": "5710",
  "registrationDate": "2026-10-20",
  "registeredAt": "2026-10-20",
  "announcementDate": "2026-10-23",
  "address": "1 rue de la Paix, 75002 Paris",
  "city": "Paris",
  "postalCode": "75002",
  "activityCode": "62.01Z",
  "activityLabel": "Programmation informatique",
  "activityScheme": "NAF",
  "soleTrader": false,
  "source": "BODACC + Recherche d'entreprises",
  "sourceUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/123456789",
  "sourceAnnouncementUrl": "https://www.bodacc.fr/pages/annonces-commerciales-detail/?q.id=id:A000000000",
  "licence": "Licence Ouverte 2.0",
  "firstSeenAt": "2026-10-25T05:00:00.000Z",
  "charged": true,
  "billingEvents": "new-company"
}
```

`registeredAt` is the same date as `registrationDate`. `activityScheme` is `NAF`, `NACE`, `TOL` or `SIC`. `sourceAnnouncementUrl` is set for BODACC and null otherwise. `firstSeenAt` is when this actor delivered the company. With `onlyNew`, that value is what the next run uses to skip it.

`run_summary` has `delivered`, `deliveredFr`, `deliveredNo`, `deliveredFi`, `deliveredUk`, `duplicatesSkipped`, `filteredOut`, `errors`, `chargedNewCompany`, `dateFrom`, `dateTo`, `stoppedReason` and `notes`. The same object is stored as the key-value record `RUN_SUMMARY`.

A company that fails (for example Recherche d'entreprises returns an error) is counted in `errors`, is not written as a company row, and is not charged. The next run can try it again. A SIREN that BODACC has announced but SIRENE does not list yet is still delivered, with `warnings` set and `activityCode` null, because the announcement itself is the lead.

### Pricing

Pay per event. There is no start fee and no per-row dataset fee.

| Event | Price | When |
| --- | --- | --- |
| `new-company` | $0.003 | A new company is delivered. This is the primary event. |

Not charged:

- a company already stored from an earlier run (`onlyNew`)
- the same SIREN appearing twice in one BODACC day
- an older French company whose BODACC creation notice is for a new branch or a purchased business (SIRENE creation date more than `maxCompanyAgeDays` before the window)
- a company outside the sector, city, postal-code or legal-form filter, including a sole trader when `excludeSoleTraders` is on
- a register error

1,000 delivered companies cost $3.00. A later run that only sees duplicates costs $0 in event fees.

Do not enable the synthetic events `apify-actor-start` or `apify-default-dataset-item` on this Actor. The full pricing document is in [PUBLISHING.md](PUBLISHING.md).

### Schedule it

In the Apify Console, open **Schedules**, create a schedule, and attach this Actor.

- Cron: `0 7 * * *`
- Timezone: `Europe/Paris`
- Input: [examples/input.daily.json](examples/input.daily.json)

`lookbackDays` defaults to **2** (yesterday and today), because 1 is often too short at 07:00: BODACC is a morning publication and it does not come out every calendar day. Keep 2 so a company published after the previous run is still inside the window. `onlyNew` keeps the overlap from being billed again. On Monday, **3** covers Friday through Monday when you do not run at the weekend.

Keep `stateStoreName` stable. A new name starts a fresh memory and will deliver companies you have already paid for.

France can publish more than 1,000 creations on a busy day. Raise `maxItems` if you want the whole country. Sector and city filters are applied before the French enrichment call when the announcement already has a city or postal code, which keeps the run smaller.

The UK needs the secret `COMPANIES_HOUSE_API_KEY` on the Actor. Without it, France, Norway and Finland still run and the summary says the UK was skipped. A UK-only run stops with an error instead of returning an empty success.

### Automate with Make, Zapier or n8n

Put the **Apify token** in the integration credentials. Never paste it into the Actor input. Put the Companies House key in the Actor secret, not in the scenario.

The synchronous "run and return dataset items" calls time out at **300 seconds**. A full unfiltered French day, with one Recherche d'entreprises call per company, can take longer. For that volume, schedule the Actor in Apify (the schedule above) and use **Get dataset items** afterwards, or keep `maxItems` modest for the sync call. A city and sector filter usually finishes inside the limit.

#### Make

App **Apify**, module **Run an Actor**.

1. Watch new rows in Google Sheets (or start from a Make scheduled scenario).
2. **Run an Actor**, synchronous, Actor `new-company-registrations-europe`, input from [examples/input.sector-city.json](examples/input.sector-city.json).
3. **Get dataset items**. Keep rows where `recordType` is `company`.
4. Add or update a row in the sheet, or create the lead in the CRM.

Map `name`, `country`, `city`, `activityCode` and `sourceUrl`. Leave the Apify token in the Make connection.

#### Zapier

App **Apify**.

1. Trigger: Schedule, or New Company in HubSpot if you want to enrich a market you already track.
2. Action: **Run Actor** with the same JSON input.
3. Formatter: keep `recordType` = `company`.
4. Action: Create or update the lead. A second Zap can use the trigger **Finished Actor Run** when the run is longer than the sync timeout, then **Get Dataset Items**.

#### n8n

Official node: [`@apify/n8n-nodes-apify`](https://docs.apify.com/platform/integrations/n8n). Authentication is an Apify API token or OAuth2 on n8n Cloud. Credentials stay in n8n.

Operations used here:

- **Run actor** when the run should be asynchronous
- **Run actor synchronously with input and get dataset items** (shown in the node as **Run an Actor and Get Dataset**) when you want the rows in the same execution and the run will finish within 300 seconds
- **Get items** on the Datasets resource when you already have a dataset id from a finished run

A starter workflow is in [examples/n8n-daily.json](examples/n8n-daily.json): a weekday 07:00 schedule, then the Apify node with resource `Actors` and an operation that runs the Actor and returns dataset items. Import it, select your Apify credential, and set the Actor id to the id this Actor has on your account (the name `new-company-registrations-europe` works as `username~new-company-registrations-europe`).

Typical continuation: IF `recordType` equals `company`, then Google Sheets or Slack. The example input caps `maxItems` at 200 so the sync call stays inside the timeout. For the full morning feed, use the Apify schedule and **Get items**.

### Sources and licences

This Actor is not an official service of DILA, INSEE, Brønnøysundregistrene, PRH or Companies House. Do not present the output as a registry extract, and do not use those organisations' logos.

| Country | Source | What is read | Licence |
| --- | --- | --- | --- |
| France | [BODACC](https://bodacc-datadila.opendatasoft.com/) dataset `annonces-commerciales`, `familleavis=creation`, then [Recherche d'entreprises](https://recherche-entreprises.api.gouv.fr/) for NAF, address and legal form | Immatriculations announced in the window | [Licence Ouverte 2.0 / Etalab](https://www.etalab.gouv.fr/licence-ouverte-open-licence) |
| Norway | [Brønnøysundregistrene Enhetsregisteret](https://data.brreg.no/enhetsregisteret/api/docs/index.html) `fraRegistreringsdatoEnhetsregisteret` | Entities registered in the window | [NLOD 2.0](https://data.norge.no/nlod/en/2.0) |
| Finland | [PRH open data, YTJ API v3](https://avoindata.prh.fi/opendata-ytj-api/v3/companies) `businessIdRegistrationStart` and `businessIdRegistrationEnd` | Business ids registered in the window | [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) |
| United Kingdom | [Companies House Public Data API](https://developer.company-information.service.gov.uk/) advanced search, `incorporated_from` / `incorporated_to` | Companies incorporated in the window | Companies House API terms. Register information includes public-sector information used under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/) where that licence applies. |

French NAF and legal-form labels are bundled from INSEE under the Licence Ouverte 2.0. See [src/data/SOURCES.md](src/data/SOURCES.md). Attribute the upstream register when you republish the rows.

Companies House allows 600 requests in 5 minutes. This Actor uses a shared token bucket at that limit and pages advanced search in slices of at most 5,000, split by day. Recherche d'entreprises is called at about 6 requests per second. PRH calls are at least 300 ms apart.

### En français

Cet acteur publie les **nouvelles immatriculations** en France, en Norvège, en Finlande et au Royaume-Uni. Une ligne par société, puis une ligne `run_summary`.

La France vient du BODACC (`familleavis` création) sur l'API ouverte de la DILA, enrichie par l'API Recherche d'entreprises (NAF, adresse, forme juridique). La Norvège vient de Brreg, filtré sur la date d'inscription à l'enhetsregisteret. La Finlande vient de l'API PRH YTJ v3, filtrée sur la date d'attribution du Y-tunnus. Le Royaume-Uni vient de Companies House (recherche avancée, `incorporated_from` / `incorporated_to`) et demande la clé secrète `COMPANIES_HOUSE_API_KEY`.

Les filtres portent sur le secteur (préfixes NAF, NACE, TOL ou SIC), la ville, le préfixe de code postal et la forme juridique. `excludeSoleTraders` écarte les entrepreneurs individuels, les ENK norvégiens et les toiminimi finlandais. `maxCompanyAgeDays` (60 par défaut) écarte, sans les facturer, les avis BODACC de création d'établissement ou d'achat de fonds d'une société plus ancienne.

`onlyNew` (activé par défaut) mémorise les sociétés déjà livrées dans le key-value store nommé `stateStoreName`. Une société déjà vue n'est pas renvoyée et n'est pas facturée. C'est le mode à garder pour une planification quotidienne.

Tarif : **0,003 $** par société nouvelle livrée (événement `new-company`). Les doublons, les sociétés hors filtre et les erreurs ne sont pas facturés. Il n'y a pas de frais de démarrage.

Planification conseillée : cron `0 7 * * *`, fuseau `Europe/Paris`, `lookbackDays` à 2 (3 le lundi) et `onlyNew` à true. Le BODACC ne paraît pas tous les jours calendaires ; la fenêtre qui se recouvre sert à ne rien manquer, le dédoublonnage sert à ne pas payer deux fois.

Les données sont des données publiques. Licence Ouverte 2.0 pour la France, NLOD 2.0 pour la Norvège, CC BY 4.0 pour la Finlande, conditions d'utilisation de Companies House pour le Royaume-Uni. Cet acteur n'est pas un service officiel.

### Local development

Node.js 20 or newer.

```bash
npm install
npm test
npm run smoke
npm run build
npm start
```

`npm test` uses mocked HTTP only. `npm run smoke` calls the live French, Norwegian and Finnish registers for the last two civil days in Europe/Paris. It does not call Companies House. If BODACC has not published inside that window, the script parses the latest publication day within the previous week and prints both results.

The UK path is covered by mocked tests (`test/run.test.ts`). A live UK check needs `COMPANIES_HOUSE_API_KEY` in the environment and is left to the publisher.

# Changelog

This Actor's version history is a separate document: https://apify.com/datacraft-studio/new-company-registrations-europe/changelog.md

# Actor input Schema

## `countries` (type: `array`):

Countries to read. FR is France (BODACC immatriculations), NO is Norway (Brreg), FI is Finland (PRH) and UK is Companies House. Aliases such as France, GB and Finland are accepted.

## `lookbackDays` (type: `integer`):

How many civil days to include, ending today in Europe/Paris. 1 is today only. 2 is yesterday and today. Ignored when both dateFrom and dateTo are set. Maximum 31.

## `dateFrom` (type: `string`):

Inclusive start date, YYYY-MM-DD. Set both dateFrom and dateTo to replace lookbackDays. The span cannot exceed 31 days.

## `dateTo` (type: `string`):

Inclusive end date, YYYY-MM-DD.

## `naceCodes` (type: `array`):

Optional prefixes matched per country: French NAF (62 or 62.01Z), Norwegian NACE (47.8), Finnish TOL (62 or 62100) and UK SIC (62012). Punctuation is ignored. A company matches when any of its codes starts with any prefix.

## `cities` (type: `array`):

Optional city names. Matching ignores case and accents. Paris matches Paris 2 and not Parisot. Norway also matches the municipality.

## `postalCodePrefixes` (type: `array`):

Optional prefixes. 750 matches 75002. SW1 matches SW1A 1AA. Spaces are ignored.

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

Optional forms, matched against the native code or the label. Examples: SARL, 5710, SAS, AS, ENK, OY, ltd, plc.

## `excludeSoleTraders` (type: `boolean`):

Drop French entrepreneurs individuels (personne physique), Norwegian ENK and Finnish toiminimi. UK sole traders are not on Companies House, so this has no effect there.

## `maxCompanyAgeDays` (type: `integer`):

France: BODACC creation notices also announce a new branch, a purchased business or a re-registered sole trader of an older company. A company whose SIRENE creation date is more than this many days before the window start is skipped and not charged. 0 keeps every notice. Norway, Finland and the UK already filter on the registration date.

## `onlyNew` (type: `boolean`):

When true, a company already stored in the named key-value store is skipped and not charged. Leave this on for a daily schedule. Turn it off to export the window again.

## `stateStoreName` (type: `string`):

Named key-value store used when onlyNew is true. The same name across scheduled runs is what stops a company from being delivered twice.

## `maxItems` (type: `integer`):

Stop after this many delivered companies. Filtered, duplicate and failed items do not count. A full French publication day can exceed the default.

## `companiesHouseApiKey` (type: `string`):

Optional. Overrides the COMPANIES_HOUSE_API_KEY secret for this run. Sent as the HTTP Basic username. Leave blank to use the Actor secret. Do not put the key in a Make, Zapier or n8n scenario.

## Actor input object example

```json
{
  "countries": [
    "FR",
    "NO",
    "FI",
    "UK"
  ],
  "lookbackDays": 2,
  "naceCodes": [
    "62"
  ],
  "cities": [
    "Paris"
  ],
  "legalForms": [
    "SAS"
  ],
  "excludeSoleTraders": false,
  "maxCompanyAgeDays": 60,
  "onlyNew": true,
  "stateStoreName": "new-company-registrations-state",
  "maxItems": 1000
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per delivered company, then a run summary.

## `summary` (type: `string`):

Counts, the date window and the price that applied.

# 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 = {
    "countries": [
        "FR",
        "NO",
        "FI",
        "UK"
    ],
    "naceCodes": [
        "62"
    ],
    "cities": [
        "Paris"
    ],
    "legalForms": [
        "SAS"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datacraft-studio/new-company-registrations-europe").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 = {
    "countries": [
        "FR",
        "NO",
        "FI",
        "UK",
    ],
    "naceCodes": ["62"],
    "cities": ["Paris"],
    "legalForms": ["SAS"],
}

# Run the Actor and wait for it to finish
run = client.actor("datacraft-studio/new-company-registrations-europe").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 '{
  "countries": [
    "FR",
    "NO",
    "FI",
    "UK"
  ],
  "naceCodes": [
    "62"
  ],
  "cities": [
    "Paris"
  ],
  "legalForms": [
    "SAS"
  ]
}' |
apify call datacraft-studio/new-company-registrations-europe --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datacraft-studio/new-company-registrations-europe"
        }
    }
}
```

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/syURjQfKM2atc0WK1/builds/kZrNQMMPDHvj3XRmP/openapi.json
