# Company Registry Lookup – Companies House & Europe (`oldjard/company-registry-lookup`) Actor

Company lookup from official registries: UK Companies House, Spain's BORME filings, France's Sirene/RNE, Finland's PRH and Norway's Brønnøysund register. Search by name or company number, or get daily feeds of new companies. One schema, source links, no scraping. $2 per 1,000 companies.

- **URL**: https://apify.com/oldjard/company-registry-lookup.md
- **Developed by:** [Joshua White](https://apify.com/oldjard) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## Company Registry Lookup: Companies House (UK), Spain, France, Finland, Norway

**Company lookup from five official registers**, starting with **UK Companies House**: one actor, the same core fields (ID, name, legal form, status, address, dates, source link, credit) across five official company registers, all read from the governments' own open data:

| Country | Source | What you get | Look up by | Feed |
|---|---|---|---|---|
| **United Kingdom** | Companies House Public Data API | Current record: company number, type, status, registered office, SIC codes, previous names, accounts and confirmation-statement dates, latest 25 filings; officers on request. Needs your own free API key | Name, company number (`00445790`, `SC045551`) | Companies incorporated on each day |
| **Spain** | BORME, the Mercantile Registry's gazette (BOE) | Filing history: incorporations, officer changes, capital, address, dissolutions | Name, registry sheet (`M 672338`) | Filings by publication date and province |
| **France** | API Recherche d'entreprises (INSEE Sirene + INPI RNE) | Current record: SIREN, legal form, status, head office, NAF code, VAT number, size band, officers | Name, SIREN or SIRET | Not available (the API has no date filter) |
| **Finland** | PRH open data (Finnish Trade Register) | Current record: Business ID, form, status, address, TOL code, website, earlier and auxiliary names | Name, Business ID (`0112038-9`) | Companies registered on each day |
| **Norway** | Brønnøysund Register Centre (Enhetsregisteret) | Current record: org. number, form, status, address, capital, industry, employees, purpose, roles | Name, organisation number | Entities registered on each day |

**Try it in one click:** the input is prefilled with the latest Spanish filings, capped at 20 companies (about 5
cents). For an instant lookup, try `{"country": "NO", "companies": ["Equinor"]}`: a few seconds, under a cent.

### How to look up a company in 3 steps

1. Choose the **country**: United Kingdom, Spain, France, Finland or Norway.
2. Enter **company names or registry IDs** (a UK company number, a SIREN, a Business ID, an organisation number), or
   leave it empty for a **feed of new companies** in a date range.
3. Click **Start**. Download the table as CSV, Excel or JSON, or schedule it daily for new companies.

### UK company lookup: Companies House API

Look up any UK company by name or number (`{"country": "GB", "companies": ["Tesco", "SC045551"]}`),
or get every company incorporated on a day (a few thousand a weekday) with SIC codes and registered office. The UK
needs **your own free Companies House API key**, entered in *Companies House API key*. Getting one takes about five
minutes, with no payment and no ID check:

1. Create a Companies House account at https://find-and-update.company-information.service.gov.uk/signin.
2. At https://developer.company-information.service.gov.uk/ choose **Your applications** → **Create an application**
   (environment **Live**), then **Create new key** with client type **API key** (the REST key). Leave restricted IPs
   empty, since Apify's IPs change.
3. Paste the key into the actor input. It is stored as a secret and sent only to Companies House.

### How much does a company registry lookup cost?

**$2 per 1,000 company records**, so Apify's $5 monthly free credit covers about 2,500 companies. Details by country
are under *Pricing (all countries)* below.

### Spain (BORME)

Look up **Spanish companies and their full registry history** from the **BORME**, Spain's official gazette of the
Mercantile Registry (Boletín Oficial del Registro Mercantil). You get new companies, appointments and resignations,
changes of address, name, purpose and capital, mergers, dissolutions, extinctions and insolvency, each with its
publication date, registry details and a link to the official source. Search by company name or registry sheet, or
get a **daily feed of new Spanish companies** by province.

The data comes from the BOE's open-data service, not from a third-party directory, so nothing blocks it and nothing
goes stale. No login, no proxies, no browser.

#### What you get

- **Company records:** current name, earlier names, legal form (SL, SA, SLU...), registry ID, status (active,
  dissolved, extinct, insolvency) as of the latest filing found, registered address, business purpose, share capital,
  incorporation date, and every filing found in the date range.
- **Filing history:** each publication with its acts, parsed into fields: incorporation (start date, purpose, address,
  capital), capital increases and reductions (amount and resulting capital), changes of address, name and purpose,
  dissolution reason, and the positions appointed, removed or re-elected (role and count).
- **Feeds:** every filing in a date range, optionally only certain acts (e.g. only **new companies**, only
  **dissolutions**) and certain provinces. Schedule it daily for a lead list of companies founded yesterday.
- **Source on every row:** BORME reference, link to the BOE text page and the official PDF, and the credit line the
  BOE's reuse terms require.
- **Complete and checked.** BORME numbers its entries consecutively through each day's issue, so a day's count can be
  checked independently. On live test days from 2009, 2012, 2017 and 2026, the actor read exactly as many entries as
  the numbering says (1,267 to 2,914 a day). Every entry had a registry sheet; on the 2012 to 2026 days fewer than
  0.1% lacked a full registry ID (2% on the 2009 day, see below).

#### How to use it

1. Leave **Companies to look up** empty for a feed, or enter names (`Reveni SL`) or registry IDs (`M 672338`).
2. Set the **date range** (`7 days`, `3 months`, `2026-01-01`) and, for long ranges, the **provinces**.
3. Optionally keep only some **acts** (e.g. *New companies*), choose **one row per company** or **one row per
   filing**, and run.

##### Example: new companies in Madrid and Barcelona this week

```json
{
    "dateFrom": "7 days",
    "regions": ["28", "08"],
    "actTypes": ["incorporation"],
    "outputMode": "companies"
}
```

##### Example: a company's history

```json
{
    "companies": ["Reveni SL", "M 672338"],
    "dateFrom": "2015-01-01",
    "regions": ["28"]
}
```

A company found by name is followed by its registry ID from then on, so later filings are found even after it
changes its name. Use the registry ID to find filings from before a rename.

##### Example: dissolutions and insolvencies, all of Spain, yesterday

```json
{
    "dateFrom": "yesterday",
    "dateTo": "yesterday",
    "actTypes": ["dissolution", "extinction", "insolvency"],
    "outputMode": "filings"
}
```

#### Output example

One company (officers off, the default):

```json
{
    "country": "ES",
    "companyId": "VI 23266",
    "companyName": "BAT BATEAN, S.L.",
    "legalForm": "SL",
    "previousNames": [],
    "status": "active",
    "region": "Araba/Álava",
    "address": "C/ ALDABE, Nº 34 1º DCHA 01012 (VITORIA-GASTEIZ)",
    "postalCode": "01012",
    "city": "VITORIA-GASTEIZ",
    "purpose": "La organización, promoción y contratación de conciertos musicales, festivales musicales y otros espectáculos...",
    "capital": 3000,
    "currency": "EUR",
    "incorporationDate": "2026-09-25",
    "firstFilingDate": "2026-10-02",
    "lastFilingDate": "2026-10-02",
    "filingsCount": 1,
    "filings": [
        {
            "region": "Araba/Álava",
            "publishedDate": "2026-10-02",
            "registrationDate": "2026-09-25",
            "filingId": "BORME-A-2026-191-01#439821",
            "actTypes": ["Constitución", "Nombramientos"],
            "acts": [
                {
                    "type": "Constitución",
                    "category": "incorporation",
                    "fields": {
                        "startOfOperations": "2026-09-16",
                        "purpose": "La organización, promoción y contratación de conciertos musicales...",
                        "address": "C/ ALDABE, Nº 34 1º DCHA 01012 (VITORIA-GASTEIZ)",
                        "capital": 3000
                    },
                    "text": "Comienzo de operaciones: 16.09.26. Objeto social: ... Capital: 3.000,00 Euros"
                },
                {
                    "type": "Nombramientos",
                    "category": "appointment",
                    "fields": {},
                    "text": null,
                    "positions": [{ "role": "Adm. Solid.", "count": 2 }]
                }
            ],
            "registryData": { "seccion": "8", "hoja": "VI 23266", "inscripcion": "1" },
            "sourceUrl": "https://www.boe.es/diario_borme/txt.php?id=BORME-A-2026-191-01",
            "sourcePdfUrl": "https://www.boe.es/borme/dias/2026/10/02/pdfs/BORME-A-2026-191-01.pdf"
        }
    ],
    "attribution": "Basado en datos de la Agencia Estatal Boletín Oficial del Estado (https://www.boe.es)"
}
```

With **One row per filing**, each row is one filing with `companyName`, `companyId` and `legalForm` added (a filing's `registrationDate` is the date the registry inscribed it). The run
summary (`OUTPUT` in the key-value store) lists the pages read, any that failed, counts, and the source and licence.

Act categories for filtering: `incorporation`, `appointment`, `resignation`, `revocation`, `re-election`,
`address-change`, `name-change`, `purpose-change`, `bylaws-change`, `capital-increase`, `capital-reduction`,
`sole-shareholder`, `merger`, `demerger`, `transformation`, `dissolution`, `extinction`, `insolvency`,
`registry-closure`, `registry-reopening`, `correction`, `other`. The original Spanish act name is always in `type`.

#### Personal data (GDPR)

BORME publishes the names of directors, attorneys, auditors, liquidators and sole shareholders. They are public by
law, but they are still **personal data** under the GDPR and Spain's LOPDGDD, and the BOE's reuse terms require full
compliance with both. So by default this actor:

- reports positions as **role and count only**, without the names of natural persons;
- keeps the names of **companies** that hold positions (a parent company as sole shareholder, an audit firm), because
  those are not personal data;
- withholds the free text of acts that can name people (corrections, insolvency notices, "other" acts);
- skips filings about **sole traders** (where the registered name is a person's).

**Include officer names** turns this off. Use it only if you have a lawful basis to process those names, typically
legitimate interests with a documented balancing test (for example know-your-business checks or credit risk), and
only for that purpose: you become the controller of what you do with them, including people's rights to object and to
erasure. Don't use them for unsolicited marketing to individuals. This actor never enriches people: it doesn't look up
emails, phone numbers or profiles. This is not legal advice.

#### Source, licence and attribution

Data: BORME section A ("Actos inscritos"), published by the Agencia Estatal Boletín Oficial del Estado at
[boe.es](https://www.boe.es), read through its open-data index and its public text pages. The BOE's
[reuse conditions](https://www.boe.es/informacion/aviso_legal/index.php) allow commercial reuse with credit. Every row
carries the credit line *"Basado en datos de la Agencia Estatal Boletín Oficial del Estado"*. If you republish the
data, keep that credit and a link to https://www.boe.es.

This actor extracts and restructures the published text. Its output is **not an official publication** and is not
endorsed by the BOE; only the BORME published at boe.es is official and authentic. Fields such as `status` and
`category` are this actor's reading of the acts. Documents that boe.es withdraws in its robots.txt are skipped and
listed in the run summary.

#### Good to know

- **No tax ID (CIF/NIF).** BORME does not print it. Companies are identified by their registry sheet (`M 672338` =
  Madrid registry, sheet 672338), which is unique and stable for the life of the company.
- **History from 2009.** Some 2009 pages print sheets without the registry letters; those filings keep the sheet
  number in `registryData.hoja` but get no `companyId`.
- **Status reflects the filings found.** A company with no status-changing act in the range shows `unknown`. Widen the
  range for a fuller picture.
- **Business purpose may be cut off.** The BORME itself shortens long purposes; the text is as published.
- **Speed.** A province takes one page per publication day; all of Spain is up to 45 pages a day. A week of new
  companies in Madrid takes about 10 seconds; a week of all of Spain a few minutes. A run reads up to 15,000 pages
  (about 15 months of all of Spain, or decades of one province).
- **Name searches read the whole range.** BORME is a gazette, not a search engine, so a name search reads every page
  in the date range. Measured on Apify:
  - **All of Spain:** about **1 minute and 150 pages per week** of range, so about 5 minutes and **$0.06 per month**
    in registry pages (about 600 pages at $0.10 per 1,000). A year is about an hour and $0.70.
  - **One province:** about **1 minute and 21 pages per month** of range ($0.002); 9 months of Madrid took 8 minutes.
  - So for a long search, choose the province where the company is registered. The log says up front how many
    publication days it will read and roughly how long that takes. If a name is not found, the status says so and
    names the dates searched.
- **Gentle on the source.** At most about 3 requests a second to boe.es, honouring robots.txt and backing off on
  errors.

### France, Finland, Norway and the United Kingdom (register records)

These registers publish each company's **current record** rather than a gazette of filings, so a row is one company
as the register holds it today. Every row has the same fields across these countries:

`companyId` (SIREN, Business ID, organisation number or UK company number), `companyName`, `previousNames`, `legalForm` (`SAS`, `OY`, `AS`...),
`legalFormName`, `legalFormCode`, `status` (`active`, `in-liquidation`, `insolvency`, `extinct`, `unknown`) and
`statusDetail` (the register's own words, e.g. *Cessée*, *Ceased*, *Konkurs*), `address`, `postalCode`, `city`,
`region`, `purpose`, `capital`, `currency`, `incorporationDate`, `registrationDate`, `closedDate`, `industryCode`,
`industry`, `website`, `employees`, `positions`, `sourceUrl` (the registry's public page), `apiUrl`, `details`
(fields only that country has) and `attribution`.

#### How to use it

- **Look up companies:** choose the country and enter names or IDs. A name is searched in the register, then kept when
  it matches **exactly** (legal form, accents and punctuation ignored; earlier names and trade or auxiliary names count)
  or, with *Name contains these words*, when the words appear in the name. A name search reads up to 200 results in
  France and 1,000 in Finland and Norway; the run summary flags a query that had more (use the ID or more words).
- **Feed of new companies (Finland, Norway):** leave *Companies to look up* empty and set the date range. You get every
  company registered on each day of the range, newest day first. Finland lists companies entered in the Trade
  Register; Norway lists every entity entered in the Central Coordinating Register (companies, associations,
  foundations...). France's API has no date filter, so a French feed is not possible.
- *Provinces*, *acts* and *one row per filing* apply to Spain only; they are ignored (and named in the summary) for the
  other countries.

#### Examples

```json
{ "country": "FR", "companies": ["Danone", "552120222"] }
```

```json
{ "country": "NO", "dateFrom": "7 days", "maxResults": 1000 }
```

```json
{ "country": "GB", "companies": ["Tesco", "SC045551"] }
```

#### Output example (Norway, officers off)

```json
{
    "country": "NO",
    "companyId": "923609016",
    "companyName": "EQUINOR ASA",
    "legalForm": "ASA",
    "legalFormName": "Allmennaksjeselskap",
    "previousNames": ["STATOIL ASA", "STATOILHYDRO ASA", "Den norske stats oljeselskap a.s"],
    "status": "active",
    "statusDetail": "Registrert (registered)",
    "address": "Forusbeen 50, 4035 STAVANGER",
    "city": "STAVANGER",
    "capital": 5976872600,
    "currency": "NOK",
    "incorporationDate": "1972-09-18",
    "registrationDate": "1995-03-12",
    "industryCode": "06.100",
    "industry": "Utvinning av råolje",
    "website": "www.equinor.com",
    "employees": 21272,
    "positions": [
        { "role": "Daglig leder", "count": 1 },
        { "role": "Styremedlem", "count": 8 },
        { "role": "Revisor", "count": 1, "entities": ["ERNST & YOUNG AS (976389387)"] }
    ],
    "sourceUrl": "https://virksomhet.brreg.no/nb/oppslag/enheter/923609016",
    "attribution": "Contains data under the Norwegian licence for Open Government data (NLOD) distributed by Brønnøysundregistrene"
}
```

#### Checked against the source

A live check pages through whole days of the Finnish and Norwegian feeds: the rows plus the sole traders left out
equal the register's own count for the day (Finland 163 and 122, Norway 478 and 328 on 29 Sep and 1 Oct 2026), with
unique IDs and every registration date on that day. Known companies are found by ID and by exact name in all three
countries.

#### Good to know

- **France:** non-diffusible companies are not in the API. Status is INSEE's: `extinct` means *cessée* (ceased).
  `industry` is empty (the API gives the NAF code, `industryCode`, without its label); capital and purpose are not in
  the API. `details` has the VAT number, size band, number of establishments, latest turnover and net result when
  published, and the date of last update.
- **Finland:** the open data has no officers, no sole traders, and no phone numbers or emails. `extinct` covers
  *Ceased* and *Removed from register*; bankruptcy and re-organisation are `insolvency`, liquidation is
  `in-liquidation`. `details` has the EUID, parallel and auxiliary names, situations and the registers the company is
  entered in (VAT, employer, prepayment...).
- **Norway:** companies registered before 1995 show the 1995 transfer as `registrationDate`; `incorporationDate` is
  the founding date. Deleted entities are not returned by the API. Phone numbers and emails are never output. Roles
  (`positions`) are read for lookups only (one extra request per company), not for feeds.
- **United Kingdom:** `country` is `GB` (`UK` also works). A UK lookup reads the company's profile and its latest 25
  filings (`details.filingHistory`: `registrationDate`, `filingId`, form type, category, description in words, `sourcePdfUrl`, the free PDF), so it
  is 2 to 3 requests per company. `details` also has every SIC code with its label, previous names with their dates,
  accounts and confirmation-statement dates (and whether they are overdue), jurisdiction, and whether the company has
  charges or an insolvency history. UK *dissolved* (struck off) is `extinct`; liquidation is `in-liquidation`;
  administration, receivership, voluntary arrangements and insolvency proceedings are `insolvency`. Capital and
  purpose are not in the API (`capital` is null). The feed lists every company incorporated on each day (UK: a few
  thousand a weekday), with SIC codes, but without filings. Companies House allows 600 requests per 5 minutes, so UK
  runs keep to under 2 requests a second and at most 3,000 requests a run (about 1,000 company lookups). The limit is
  per key, and you use your own key, so it is yours alone. A UK run without a key stops at once with a message saying
  how to get one. A name search reads at most the first 500 results (5 pages), most relevant first.
- **Speed:** a lookup takes a second or two per company; a day of the Finnish or Norwegian feed takes a few seconds.

### Personal data for France, Norway and the United Kingdom

France's officers (dirigeants) and Norway's roles name natural persons, and both registers include **sole traders**
(France: *entrepreneurs individuels*; Norway: *enkeltpersonforetak*, ENK), whose record is a person's. By default the
actor reports positions as **role and count only**, keeps companies that hold positions (an audit firm, a parent
company), and **skips sole traders** (counted in the run summary). French sole traders who opposed the diffusion of
their data (`statut_diffusion` "P") are always skipped. Birth dates are never output. *Include officer names* turns the
names and sole traders on; the GDPR guidance in the Spain section applies the same way.

**United Kingdom:** officers are not read at all unless *Include officer names* is on. With it on, `positions` lists
the current officers by role (directors, secretaries, LLP members...), with the names of people and of corporate
officers. Officer addresses, dates of birth, nationality, occupation and country of residence are never output, and
people with significant control (PSCs) are not read. In filing descriptions, people's names (*Appointment of (withheld)
as a director*) appear only with officers on. The UK register has no sole traders.

### Pricing (all countries)

Pay per result: **$2.00 per 1,000 company records** (one row per company, with all its filings) or **$1.00 per
1,000 filings** (one row per filing), plus **$0.10 per 1,000 registry pages** read (one province, one day), which
only matters for long name searches. Pages that fail are not charged. Runs stop at 100 results unless you raise
**maxResults** (0 = no limit). For scale: a week of *all* filings across Spain touches about 11,000 companies (about
$22); new companies only (act type: incorporation) is roughly 2,400 a week.

For France, Finland and Norway, a company record is charged per row, and a registry page per API request (one search
page, one ID lookup, or one Norwegian roles request). A day of the Norwegian feed is about 300 company rows and 5
requests.

### Sources, licences and attribution (France, Finland, Norway, United Kingdom)

- **France:** API Recherche d'entreprises (recherche-entreprises.api.gouv.fr), run by the French government (DINUM) on
  INSEE's Sirene register and INPI's national company register (RNE), under the
  [Licence Ouverte / Open Licence 2.0](https://www.etalab.gouv.fr/licence-ouverte-open-licence). Credit on every row:
  *"Source : API Recherche d'entreprises (data.gouv.fr), données Insee Sirene et INPI RNE, Licence Ouverte 2.0"*; the
  date of last update is in `details.lastUpdated`.
- **Finland:** Finnish Patent and Registration Office (PRH) open data, [avoindata.prh.fi](https://avoindata.prh.fi),
  under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). Credit on every row: *"Source: Finnish Patent and
  Registration Office (PRH), avoindata.prh.fi, CC BY 4.0"*. The data has been restructured (fields renamed and
  combined). This actor is not a PRH service and does not use PRH or YTJ logos.
- **Norway:** Brønnøysund Register Centre, [Enhetsregisteret open API](https://data.brreg.no/enhetsregisteret/api),
  under the [Norwegian Licence for Open Government Data (NLOD) 2.0](https://data.norge.no/nlod/en/2.0). Credit on every
  row: *"Contains data under the Norwegian licence for Open Government data (NLOD) distributed by
  Brønnøysundregistrene"*. Only the open API is used, never the access-controlled endpoints.
- **United Kingdom:** Companies House, [Public Data API](https://developer.company-information.service.gov.uk/).
  Companies House sets *"no rules or requirements on how the information on the public register is used"*
  ([Companies House data products](https://www.gov.uk/guidance/companies-house-data-products)); its content is under
  the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).
  Credit on every row: *"Contains public sector information licensed under the Open Government Licence v3.0
  (Companies House)"*. You remain responsible for data protection law when you use officer names.

If you republish the data, keep the credit line. The output is restructured by this actor; it is not an official
publication and is not endorsed by any of these registries. Requests are kept to about 3 a second per registry
(France allows 7; the UK under 2), and the actor waits when a registry asks it to slow down.

### More tools from oldjard

- [Tech Stack Detector](https://apify.com/oldjard/tech-stack-detector): what any list of websites is built with.
- [Sitemap URL Extractor](https://apify.com/oldjard/sitemap-url-extractor): every URL on a website, for RAG and SEO.
- [Shopify Products Scraper & Price Monitor](https://apify.com/oldjard/shopify-products-price-monitor): catalogs and price changes from any Shopify store.
- [Workday, Greenhouse, Lever & Ashby Jobs Scraper](https://apify.com/oldjard/ats-career-site-jobs): every open job from company career sites.
- [Bulk Website Screenshot & URL to PDF](https://apify.com/oldjard/screenshot-pdf): screenshots and PDFs of any list of pages.
- [Website Change Monitor](https://apify.com/oldjard/website-change-monitor): a before/after diff by webhook, Slack or Discord when a page changes.
- [AI Web Scraper (your own key)](https://apify.com/oldjard/ai-web-scraper): describe fields in English, get JSON.
- [UK & EU Public Tenders](https://apify.com/oldjard/uk-eu-public-tenders): Find a Tender and TED notices in one table, with daily only-new alerts.

### FAQ

**Is this an official Companies House service?** No. It reads Companies House's official Public Data API with your
own free key, and the other registers' official open data. It is not affiliated with any of these registries.

**Why does the UK need my own API key?** Companies House gives every key its own rate limit (600 requests per 5
minutes). With your own key that limit is yours alone, and the key costs nothing. A UK run without one stops at once
with the steps to get one.

**Can I get directors' names?** Only with *Include officer names* on (UK, France, Norway). Off by default. Dates of birth
are never output, and neither are UK officers' addresses.

**Can I get a list of new companies every day?** Yes, for the UK, Norway and Finland (companies registered each day)
and Spain (BORME filings, filtered to *New companies*). Leave *Companies to look up* empty and schedule it daily.

### Use it from an AI agent or the API

- **Minimal input:** `{"country": "FR", "companies": ["Danone"], "maxResults": 3}`. Set `maxResults` to cap the work
  and the cost (default 100).
- **Cost:** $0.002 per company record or $0.001 per filing, plus $0.0001 per registry page read. Failed pages are
  free. 100 Spanish filings ≈ $0.10.
- **Run time (our runs):** France 3 s, Norway 7 s, Finland about 28 s for a name lookup; Spain 4–6 s for two
  provinces' filings over 14 days; 85–90 s for a Spanish name search over the default 7 days (it reads
  every province's daily bulletin, so longer ranges take longer).
- **Results:** the default dataset (companies or filings); the run summary is the `OUTPUT` record in the key-value
  store. Every row type uses the same keys: `country`, `companyId`, `companyName`, `legalForm`, `region`,
  `sourceUrl`/`attribution`; company rows (every country) also share `previousNames`, `status`, `address`,
  `postalCode`, `city`, `purpose`, `capital`, `currency`, `incorporationDate`; dates are `YYYY-MM-DD`.
- Works over the Apify MCP server (`search-actors`, then `call-actor`).

### Coming next

Tell us in the Issues tab which country you need next.

# Actor input Schema

## `country` (type: `string`):

The registry to read. Spain returns registry filings (history) by publication date. France, Finland, Norway and the United Kingdom return each company's current register record; Finland, Norway and the United Kingdom can also list the companies registered (UK: incorporated) in a date range (France cannot: look companies up by name or SIREN).

## `companies` (type: `array`):

Company names (accents, punctuation and the legal form are ignored, e.g. "Reveni SL", "Nokia", "Equinor") or registry IDs: Spain: registry sheet as BORME prints it ("M 672338"); France: SIREN or SIRET ("552032534"); Finland: Business ID ("0112038-9"); Norway: organisation number ("923609016"); United Kingdom: company number ("00445790", "SC123456"). Leave empty for a feed: Spain's filings in the date range, or the companies registered in the range in Finland, Norway and the United Kingdom.

## `matchMode` (type: `string`):

Exact: "Reveni" matches "REVENI SL" only. Contains: "Reveni" also matches "REVENI GLOBAL SL".

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

First publication date to read: YYYY-MM-DD, or relative such as "7 days", "3 months", "1 year". Spain has data from 2009. For France, Finland, Norway and the United Kingdom the dates apply to feeds only (registration date); a lookup returns the current record. Default: 7 days ago.

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

Last publication date to read (inclusive): YYYY-MM-DD, "today", "yesterday" or e.g. "7 days". Default: today.

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

Spain only: read only these provinces (where the company is registered). Empty = all of Spain. Choosing provinces makes long date ranges fast: one province reads one page per publication day. Leave empty for other countries.

## `actTypes` (type: `array`):

Spain only: keep only filings that contain at least one of these acts. For a new-companies feed choose "New companies". Empty = all acts. (A Finland, Norway or United Kingdom feed already lists newly registered companies.)

## `outputMode` (type: `string`):

Companies: one record per company. For Spain, with its latest name, status, address, capital and the filings found; filings output (Spain only) writes one row per published filing as the scan goes. France, Finland and Norway always return one row per company.

## `includeOfficers` (type: `boolean`):

Off (default): positions are reported as role and count only, names of natural persons are left out (company names in those roles are kept), and sole traders are skipped (Spain: sole-trader entries and free-text acts that can name people; France: entrepreneurs individuels; Norway: enkeltpersonforetak). Birth dates are never output. Turn on only if you have a lawful basis under the GDPR to process these names (see the README). United Kingdom: officers are read only when this is on; corporate officers are then named too, and officer addresses are never output. Finland's open data has no officers or sole traders.

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

United Kingdom only, and required for it. Your own free Companies House API key: create an account and a REST key at https://developer.company-information.service.gov.uk/ (about 5 minutes, no payment, no ID check; see the README). Stored as a secret and sent only to Companies House. Your key gets the full Companies House rate limit (600 requests per 5 minutes) to itself. Not needed for Spain, France, Finland or Norway.

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

Stop after this many rows (companies or filings). 0 = no limit. Default 100 keeps a first run cheap; 0 = no limit.

## `failOnError` (type: `boolean`):

For health checks and pipelines: any page that cannot be read fails the run instead of being listed in the summary.

## Actor input object example

```json
{
  "country": "ES",
  "companies": [],
  "matchMode": "exact",
  "dateFrom": "7 days",
  "outputMode": "companies",
  "includeOfficers": false,
  "maxResults": 20,
  "failOnError": false
}
```

# Actor output Schema

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

Dataset. Companies mode: one row per company, the same keys in every country (country, companyId, companyName, legalForm, previousNames, status, region, address, postalCode, city, purpose, capital, currency, incorporationDate, attribution); Spain adds firstFilingDate, lastFilingDate, filingsCount and filings; register countries add statusDetail, registrationDate, closedDate, industryCode, industry, website, employees, positions, sourceUrl, details. Filings mode (Spain): one row per filing (companyName, companyId, legalForm, region, publishedDate, registrationDate, filingId, actTypes, acts, sourceUrl, sourcePdfUrl, attribution).

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

Run summary (JSON): the query and date range, registry pages read and failed, filings seen and matched, rows output, events charged, why the scan stopped, and the source and attribution.

# 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 = {
    "companies": [],
    "dateFrom": "7 days",
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("oldjard/company-registry-lookup").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 = {
    "companies": [],
    "dateFrom": "7 days",
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("oldjard/company-registry-lookup").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 '{
  "companies": [],
  "dateFrom": "7 days",
  "maxResults": 20
}' |
apify call oldjard/company-registry-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,oldjard/company-registry-lookup"
        }
    }
}
```

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/3UGBz3hDQU1cxLelx/builds/BlFBtg9AkYSA8FcVP/openapi.json
