# B2B Company & Decision-Maker Finder — Official Registries (`foxlabs/b2b-company-finder`) Actor

Find B2B companies by country, sector and size from official public registries, with named decision-makers and published contact where the source carries it. One unified row per company. France and Mexico. No API key.

- **URL**: https://apify.com/foxlabs/b2b-company-finder.md
- **Developed by:** [Berkan Kaplan](https://apify.com/foxlabs) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 company rows

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

## B2B Company & Decision-Maker Finder — Official Registries

Find **B2B companies by country, sector and size** straight from official public registries — and get each
company's **named decision-makers** and **published contact** in the same row, with **no API key** and no setup.
Pick a country, a sector and a minimum size; get back a clean, unified list you can use for sales, sourcing or
company research. Covers **France** (INSEE Sirene + INPI RNE), **Mexico** (INEGI DENUE), **Czechia** (ARES),
the **United Kingdom** (Companies House) and **Norway** (Enhetsregisteret / brreg), with more official
registries on the way.

This Actor runs on the Apify platform, so you get API access, scheduling, integrations, monitoring and dataset
export (JSON, CSV, Excel) out of the box.

### Why use B2B Company & Decision-Maker Finder?

- **One input, one output, many sources.** A French record and a Mexican record line up column-for-column, so you
  stop stitching together one scraper per country.
- **Primary official sources, not guesses.** Data comes from government registries — not from scraped LinkedIn
  profiles or pattern-guessed emails. That means names and numbers you can trust, and no fragile anti-bot games.
- **Decision-makers included.** Where the registry lists directors/officers (France, Czechia, the UK, Norway),
  every company row carries their names and roles — no second tool, no extra charge.
- **Real contact where it is public.** Where the source publishes contact (Mexico email/phone/website, Norway
  website), you get it in the row. The size filter is also the contact lever: in Mexico, email coverage rises
  from ~23% for the smallest firms to ~85% for companies with 50+ staff (measured).
- **Honest scope.** The French registry does not publish company email/phone, so this Actor does not pretend to —
  it gives you decision-maker names and firmographics instead. No empty "email" column that is never filled.

### How to use it

1. Choose a **Country** (or "All countries" to search several at once).
2. Pick a **Sector** (Manufacturing, Wholesale & retail, IT & software, …) or pass a raw NAF/SCIAN code.
3. Optionally narrow by **Region** (a French department or a Mexican state) and **Minimum employees**.
4. Tick **Only with published contact** or **Only with a named decision-maker** if you need those.
5. Click **Start**. Each company comes back as one row; you are charged one record per delivered company.

### Input

| Field | What it does |
|---|---|
| `country` | `fr`, `mx`, or leave as "All countries". |
| `sector` | Friendly sector mapped to each country's own classification (NACE for France, SCIAN for Mexico). |
| `region` | France: department code or name (`69` / `Rhône`). Mexico: state code or name (`14` / `Jalisco`). |
| `minEmployees` | Keep companies with at least this many employees (uses the source's size band). In Mexico it also raises contact coverage. |
| `onlyWithContact` | Keep only companies with a published email/phone/website (use for Mexico). |
| `onlyWithDecisionMakers` | Keep only companies with a named director/officer (use for France). |
| `sectorCode` | Advanced: a raw NAF code (`62.01Z`) for France or a SCIAN code (`31`) for Mexico. |
| `keywords` | Optional name / activity keywords. |
| `maxResults` | Total companies to return across all selected countries. |

Example input:

```json
{
  "country": "mx",
  "sector": "manufacturing",
  "region": "Jalisco",
  "minEmployees": 11,
  "onlyWithContact": true,
  "maxResults": 100
}
```

### Output

Each company is one row. You can download the dataset in JSON, HTML, CSV or Excel.

```json
{
  "country": "MX",
  "companyName": "CONTROL TECNICO Y REPRESENTACIONES RIO MAGALLANES",
  "sector": "Comercio al por mayor de equipo e instrumental médico",
  "sectorScheme": "SCIAN",
  "sizeBand": "251 y más personas",
  "employeesMin": 251,
  "city": "Monterrey",
  "region": "NUEVO LEÓN",
  "email": "ivan.ontiveros@ctr.com.mx",
  "phone": "8115722508",
  "website": null,
  "hasContact": true,
  "contactMethods": ["email", "phone"],
  "decisionMakers": [],
  "decisionMakersCount": 0,
  "companyId": "...",
  "companyIdType": "DENUE ID",
  "source": "INEGI DENUE (Directorio Estadístico Nacional de Unidades Económicas)",
  "sourceUrl": "https://www.inegi.org.mx/app/mapa/denue/default.aspx?idee=...",
  "scrapedAt": "2026-10-26T..."
}
```

A French row carries `decisionMakers` (directors with roles), `legalForm`, `revenueFormatted` and the registry
link instead of contact:

```json
{
  "country": "FR",
  "companyName": "GROUPE PROGRES SA",
  "sector": "Information & communication",
  "sizeBand": "250–499 employees",
  "city": "LYON",
  "region": "Auvergne-Rhône-Alpes",
  "revenueFormatted": "82.4M EUR",
  "decisionMakers": [
    { "type": "person", "fullName": "Soizic Bouju", "role": "Directeur Général" },
    { "type": "person", "fullName": "Pierre Fanneau", "role": "Administrateur" }
  ],
  "decisionMakersCount": 7,
  "hasContact": false,
  "sourceUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/..."
}
```

### Data fields

Identity (`companyName`, `legalName`, `companyId`, `companyIdType`), classification (`sector`, `sectorCode`,
`sectorScheme`), size (`sizeBand`, `employeesMin`), firmographics (`status`, `legalForm`, `incorporatedOn`,
`revenue*`), address + geo (`address`, `city`, `region`, `postalCode`, `latitude`, `longitude`), contact
(`email`, `phone`, `website`, `hasContact`, `contactMethods`), decision-makers (`decisionMakers[]`,
`decisionMakersCount`, `decisionMakersText`), and provenance (`source`, `license`, `sourceUrl`, `scrapedAt`).

### Coverage by country

| Country | Source | Discover by | Decision-makers | Contact |
|---|---|---|---|---|
| 🇫🇷 France | INSEE Sirene + INPI RNE (recherche-entreprises.api.gouv.fr) | sector (NACE), department, size, name | ✅ directors + roles | ❌ (registry publishes none) |
| 🇲🇽 Mexico | INEGI DENUE | sector (SCIAN), state, size, keyword | ❌ (directory has none) | ✅ email/phone/website (self-reported) |
| 🇨🇿 Czechia | ARES registry + public register (VR) | sector (CZ-NACE), city, name | ✅ directors + supervisory board | ❌ (registry publishes none) |
| 🇬🇧 United Kingdom | Companies House | sector (UK SIC 2007, active companies), name | ✅ directors + officers | ❌ (registry publishes none) |

More official registries (Norway, IndiaMART for India) are planned on the same unified shape.

### Pricing

Pay per result: you are charged for each **delivered company row**. Status rows that explain an empty search are
free, and companies dropped by your filters are never delivered or charged. Data comes from free official APIs,
so there is no proxy surcharge. All features work on the Apify free plan.

### Tips

- In Mexico, set **Minimum employees** to 11+ (or 51+) to get a contact-rich list — contact coverage climbs
  sharply with company size.
- In France, use **Only with a named decision-maker** to get boardroom contacts for outreach.
- Use **All countries** with a sector to build a cross-border list in one run; results are balanced across the
  countries you selected.
- Narrow by **Region** to keep runs small and focused (and cheaper).

### FAQ, limitations & disclaimer

- **Is this legal?** The sources are official open-data registries whose licences permit commercial reuse with
  attribution (France: Licence Ouverte / Etalab 2.0; Mexico: INEGI Términos de Libre Uso — "Fuente: INEGI").
  Business contact details come from what companies themselves publish in those public registries.
- **Why no email for France?** The French registry simply does not publish company email or phone. Rather than
  ship an always-empty column, this Actor gives you decision-maker names and firmographics for France.
- **Empty result?** The run finishes successfully with a short status row saying why (no match, or everything
  filtered out) — you are not charged for it.
- Found a bug or want another country? Open an issue on the Actor's Issues tab.

# Changelog

This Actor's version history is a separate document: https://apify.com/foxlabs/b2b-company-finder/changelog.md

# Actor input Schema

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

Which registry to search. Leave as "All" to search every country in one run.

## `sector` (type: `string`):

Pick a business sector. Mapped to each country's own classification (NACE for France, SCIAN for Mexico). Leave empty to use a raw code or keywords instead.

## `region` (type: `string`):

Narrow to a region. France: a department code or name (e.g. "69" or "Rhône"). Mexico: a state code or name (e.g. "14" or "Jalisco"). Czechia: a city (e.g. "Praha"). Norway: a municipality (e.g. "OSLO", "BERGEN"). Leave empty for the whole country.

## `minEmployees` (type: `integer`):

Keep only companies with at least this many employees (uses the source's size band). In Mexico this is also the lever that raises contact coverage — email fill goes from ~23% (≤5 staff) to ~85% (≥51 staff). Companies whose size is not published are excluded when this is above 0.

## `onlyWithContact` (type: `boolean`):

Keep only companies that publish an email, phone or website in the source. France registry carries no contact, so this empties French results — use it for Mexico.

## `onlyWithDecisionMakers` (type: `boolean`):

Keep only companies that list at least one director / officer. France lists directors; Mexico's directory does not, so this empties Mexican results.

## `sectorCode` (type: `string`):

Instead of the sector picker, pass a raw classification code: a NAF code for France (e.g. "62.01Z") or a SCIAN code for Mexico (e.g. "31"). Overrides Sector for the selected country.

## `keywords` (type: `array`):

Optional name / activity keywords to search in addition to or instead of a sector (e.g. "valves", "logistics").

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

Total number of company rows to return across all selected countries. Each delivered company is one billed record.

## Actor input object example

```json
{
  "country": "mx",
  "sector": "manufacturing",
  "region": "Jalisco",
  "minEmployees": 11,
  "onlyWithContact": true,
  "onlyWithDecisionMakers": false,
  "maxResults": 50
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "country": "mx",
    "sector": "manufacturing",
    "region": "Jalisco",
    "minEmployees": 11,
    "onlyWithContact": true,
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("foxlabs/b2b-company-finder").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 = {
    "country": "mx",
    "sector": "manufacturing",
    "region": "Jalisco",
    "minEmployees": 11,
    "onlyWithContact": True,
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("foxlabs/b2b-company-finder").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 '{
  "country": "mx",
  "sector": "manufacturing",
  "region": "Jalisco",
  "minEmployees": 11,
  "onlyWithContact": true,
  "maxResults": 50
}' |
apify call foxlabs/b2b-company-finder --silent --output-dataset

```

## MCP server setup

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

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/YOcncnOaTjGaKuwSW/builds/NVaFdxgVn91Xkw5V2/openapi.json
