# Italy Company Registry Scraper - Registro Imprese, PEC, Bilanci (`memo23/italy-company-registry-scraper`) Actor

Scrape Italian company data from ufficiocamerale.it (Registro Imprese): VAT, tax code, REA, legal form, ATECO, registered address, revenue, profit, share capital, employees, SDI code and PEC certified email. Search by name, VAT or REA, or paste direct URLs. Cloudflare handled. JSON/CSV.

- **URL**: https://apify.com/memo23/italy-company-registry-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Business, Lead generation, Agents
- **Stats:** 5 total users, 4 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 company record scrapeds

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/platform/actors/running/actors-in-store#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

## Italy Company Registry Scraper — Registro Imprese, PEC, Bilanci

**Turn any Italian company name, VAT number, or REA code into structured registry data.** This scraper pulls company records from [ufficiocamerale.it](https://www.ufficiocamerale.it), the public gateway to Italy's Camera di Commercio (Registro Imprese). Get VAT, REA, legal form, ATECO code, registered address, revenue, profit, share capital, employees, SDI e-invoicing code, and the PEC certified email — one clean row per company.

Search by name, VAT (Partita IVA), or REA — or paste direct company page URLs. Cloudflare and Italy-geolocated proxies are handled for you. JSON or CSV out.

![How Italy Company Registry Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-ufficiocamerale.png)

### Why Use This Scraper?

- **Authoritative source.** Data comes straight from ufficiocamerale.it — the public window onto Italy's official Camera di Commercio registry — not a stale data reseller.
- **Financials included, for free.** Revenue (Fatturato), profit (Utile), and share capital (Capitale sociale) are captured directly from the company page, each with its filing year.
- **PEC certified email, decoded.** The PEC address is pulled straight from the page (and de-obfuscated from Cloudflare's email protection) — no separate INI-PEC round-trip required.
- **SDI e-invoicing code.** The `codice destinatario` (Codice Destinatario / SDI) is captured when the company publishes it — ready for electronic invoicing.
- **Cloudflare handled automatically.** The site sits behind Cloudflare bot management; the scraper routes through Italy-exit residential proxies so you never touch proxy or CAPTCHA settings.
- **Pay per result.** One dataset row per company. No padding rows.

### Overview

The Italy Company Registry Scraper is for anyone who needs authoritative Italian company data at scale: KYC/KYB teams, B2B lead generation, credit and due-diligence analysts, and data-enrichment pipelines keyed on VAT.

Each run returns a flat list of company records. You choose companies three ways:

1. **Search** by company name, VAT number, or REA code.
2. **Province filter** (name mode) to narrow results to a single Camera di Commercio.
3. **Direct URLs** — paste exact company page links to skip discovery entirely.

The dataset shape is one JSON object per company, with 25+ fields spanning identity, address, activity classification, financials, certified contact, and e-invoicing.

### Supported Inputs

The actor accepts either a **search** (mode + query) or a list of **direct company URLs**.

**Search modes:**

- `by_name` — matches the company name against company page slugs (e.g. `BCC Felsinea`).
- `by_vat_number` — matches companies whose VAT (Partita IVA) appears in the page slug (e.g. `00159560366`).
- `by_rea_number` — matches companies whose REA number appears in the slug (e.g. `MO-187940`).

**Direct company URLs** look like:

```
https://www.ufficiocamerale.it/1295/bcc-felsinea-banca-di-credito-cooperativo-dal-1902-sc
```

**Not supported:** login-gated visura/bilancio PDFs, the paid "ACQUISTA VISURA / ACQUISTA BILANCIO" reports, and any data behind purchase (directors list, shareholder breakdown, insolvency detail). Those fields are returned as `null` — see the FAQ.

### Use Cases

| Team | What they build |
|------|----------------|
| **KYC / KYB compliance** | Verify company identity, legal form, VAT, and registration before onboarding |
| **B2B sales & lead gen** | Prospect lists filtered by ATECO industry code, province, and company size |
| **Credit & risk analysts** | Screen revenue, profit, share capital, and filing status before extending credit |
| **Due diligence & legal** | Pull authoritative registry identifiers (VAT, REA, CCIAA) for entity mapping |
| **Accounting & tax** | Bulk-retrieve PEC certified emails and SDI codes for invoicing and correspondence |
| **Data enrichment** | Append Italian company attributes to CRM records using VAT as the join key |

### How It Works

1. **Provide a query or direct URLs.** Enter a company name, VAT, or REA code — or paste exact company page URLs to skip discovery.
2. **Company URLs are discovered.** The scraper resolves your query to company page URLs using a public index of the site, then caps the candidate list to your `maxItems`.
3. **Each page is fetched through an Italy residential proxy.** ufficiocamerale.it is behind Cloudflare; the scraper uses Italy-geolocated residential IPs so requests pass, with no proxy setup on your side.
4. **Fields are parsed.** Registry fields (VAT, REA, ATECO, financials, capital, SDI code) come from the server-rendered page and JSON-LD; the PEC certified email is decoded from the page.
5. **One row per company is pushed** to the dataset, honouring your province filter and item cap.

### Input Configuration

| Field | Type | Required | Default | Description |
|-------|------|----------|---------|-------------|
| `mode` | string | No | `by_name` | Search mode: `by_name`, `by_vat_number`, or `by_rea_number` |
| `query` | string | \* | — | Company name, VAT number, or REA code, matching `mode` |
| `province` | string | No | — | Two-letter CCIAA province code to filter name-search results (e.g. `MI`, `RM`, `BO`) |
| `directUrls` | array | \* | — | Exact ufficiocamerale.it company page URLs. Overrides `mode`/`query` |
| `maxItems` | integer | No | 10 | Maximum companies to return (1–10,000) |
| `maxConcurrency` | integer | No | 8 | Company pages fetched in parallel |

\* Provide either `query` or `directUrls`.

**Search by name, filtered by province:**

```json
{
  "mode": "by_name",
  "query": "BCC Felsinea",
  "province": "BO",
  "maxItems": 10
}
```

**Direct URL — when you already have the company link:**

```json
{
  "directUrls": [
    "https://www.ufficiocamerale.it/1295/bcc-felsinea-banca-di-credito-cooperativo-dal-1902-sc"
  ],
  "maxItems": 1
}
```

**Lookup by VAT number:**

```json
{
  "mode": "by_vat_number",
  "query": "00602670556",
  "maxItems": 1
}
```

### Output Overview

Each company is one flat JSON object. Fields group into: **identity** (VAT, tax code, REA, legal name/form, status), **address** (registered address plus structured locality/province/postal code), **classification** (ATECO code and description), **financials** (revenue, profit, share capital, employees — each with its year), and **contact & e-invoicing** (PEC certified email, SDI codice destinatario). Fields not published on the free page (or behind the paid visura) are returned as `null`.

### Output Samples

Sample row from a direct-URL run on `TERNINOX S.P.A.`:

```json
{
  "vat_number": "00602670556",
  "tax_code": "00602670556",
  "rea_number": "TR-63492",
  "cciaa_chamber": "TR",
  "legal_name": "TERNINOX S.P.A.",
  "trade_name": null,
  "legal_form": "SOCIETA' PER AZIONI",
  "status": "attiva",
  "incorporation_date": "15/10/1991",
  "cessation_date": null,
  "share_capital_eur": 20800000,
  "share_capital_year": 2024,
  "registered_address": "VIALE B. BRIN 218 - 05100 - TERNI (TR)",
  "address_locality": "TERNI",
  "address_province": "TR",
  "address_postal_code": "05100",
  "ateco_code": "241",
  "ateco_description": "SIDERURGIA",
  "employees_count": 54,
  "employees_year": 2024,
  "revenue_eur": 124885370,
  "revenue_year": 2023,
  "profit_eur": -17218371,
  "profit_year": 2023,
  "pec_email": "terninox@pec.acciaiterni.info",
  "phone": null,
  "website": null,
  "codice_destinatario": "YZW23AT",
  "amministratori": null,
  "soci": null,
  "has_filed_bilancio": true,
  "latest_bilancio_year": 2023,
  "bilancio_xbrl_url": null,
  "has_insolvency": null,
  "last_modification_date": null,
  "source_url": "https://www.ufficiocamerale.it/4527/terninox-spa",
  "scraped_at": "2026-07-22T22:41:53.000Z"
}
```

### Key Output Fields

**Identity**

| Field | Type | Description |
|-------|------|-------------|
| `vat_number` | string | Partita IVA (Italian VAT number) |
| `tax_code` | string | Codice Fiscale (tax code) |
| `rea_number` | string | REA number with province prefix (e.g. `TR-63492`) |
| `cciaa_chamber` | string | Camera di Commercio province code |
| `legal_name` | string | Denominazione sociale (official legal name) |
| `trade_name` | string | Trading name if different (often `null`) |
| `legal_form` | string | Forma giuridica (SRL, SPA, SNC, cooperativa, …) |
| `status` | string | `attiva` or `cessata` |
| `incorporation_date` | string | Registration date (DD/MM/YYYY) |
| `cessation_date` | string | Cessation date if any |

**Address**

| Field | Type | Description |
|-------|------|-------------|
| `registered_address` | string | Sede legale as a formatted string |
| `address_locality` | string | City / comune |
| `address_province` | string | Province code |
| `address_postal_code` | string | CAP (postal code) |

**Classification & financials**

| Field | Type | Description |
|-------|------|-------------|
| `ateco_code` | string | Codice ATECO (Italian activity code) |
| `ateco_description` | string | ATECO activity description |
| `employees_count` | number | Number of employees |
| `employees_year` | number | Year the employee count refers to |
| `revenue_eur` | number | Fatturato (revenue) in EUR |
| `revenue_year` | number | Year of the revenue figure |
| `profit_eur` | number | Utile (net profit) in EUR |
| `profit_year` | number | Year of the profit figure |
| `share_capital_eur` | number | Capitale sociale in EUR |
| `share_capital_year` | number | Year of the capital figure |
| `has_filed_bilancio` | boolean | Whether a bilancio (annual accounts) figure is on record |
| `latest_bilancio_year` | number | Most recent bilancio year seen |

**Contact & e-invoicing**

| Field | Type | Description |
|-------|------|-------------|
| `pec_email` | string | PEC (Posta Elettronica Certificata) certified email |
| `codice_destinatario` | string | SDI Codice Destinatario for electronic invoicing |
| `phone` | string | Phone if published (often `null`) |
| `website` | string | Website if published (often `null`) |
| `source_url` | string | The company page the data came from |
| `scraped_at` | string | ISO timestamp of extraction |

### FAQ

**How do I search Italian companies by name?**
Set `mode` to `by_name` and put the company name in `query`. Add a `province` code to narrow results to one Camera di Commercio. Short or common names may match several companies — use `province` or switch to `directUrls`.

**Can I look up a company by VAT number (Partita IVA)?**
Yes, via `by_vat_number` mode — with a caveat: most companies use their name (not their VAT) in the page URL, so VAT lookup only finds companies whose VAT appears in the slug. For guaranteed hits, use `by_name` or supply `directUrls`.

**What is PEC email and why does it matter?**
PEC (Posta Elettronica Certificata) is Italy's certified email system — legally equivalent to registered post for official communications and invoicing. The scraper reads it directly from the company page (decoding Cloudflare's email obfuscation), so you get it without a separate lookup.

**Which fields does the scraper NOT return?**
The full directors list (`amministratori`), shareholder breakdown (`soci`), insolvency detail (`has_insolvency`), and the XBRL bilancio file (`bilancio_xbrl_url`) sit behind ufficiocamerale.it's paid "ACQUISTA VISURA / ACQUISTA BILANCIO" wall and are returned as `null`. Everything on the free public page is captured.

**Do I need to configure proxies?**
No. ufficiocamerale.it is behind Cloudflare, so the scraper uses Italy-geolocated residential proxies automatically. There is nothing to set up.

**How many companies can I scrape per run?**
Up to 10,000 via `maxItems`. Discovery caps the candidate list to what you need.

### Support

Need a field we don't yet capture, a different Italian registry source, or a bulk export? Open an issue on the actor's **Issues** tab or get in touch — feature requests go straight to the backlog, usually answered within 24 hours.

### Additional Services

We build custom scrapers and data pipelines: tailored fields, scheduled bulk runs, CRM enrichment, and delivery to your warehouse or webhook. Ask about custom Italian company-data feeds keyed on VAT.

### Explore More Scrapers

Browse our other actors on Apify: [memo23 on Apify](https://apify.com/memo23).

### 🤖 For AI Agents & LLM Apps

This actor is MCP-friendly. Quick reference for agents calling it via the Apify MCP server or API:

- **Purpose:** Fetch Italian company registry data (VAT, REA, ATECO, financials, PEC) from ufficiocamerale.it.
- **Minimal input that runs:**

```json
{ "mode": "by_name", "query": "BCC Felsinea", "maxItems": 5 }
```

- **Or, if you already have the page URL:**

```json
{ "directUrls": ["https://www.ufficiocamerale.it/1295/bcc-felsinea-banca-di-credito-cooperativo-dal-1902-sc"], "maxItems": 1 }
```

- **Output:** flat JSON rows. Key fields: `vat_number`, `tax_code`, `rea_number`, `cciaa_chamber`, `legal_name`, `legal_form`, `status`, `registered_address`, `ateco_code`, `ateco_description`, `employees_count`, `revenue_eur`, `profit_eur`, `share_capital_eur`, `pec_email`, `codice_destinatario`, `source_url`.
- **Billing:** pay per result (one row per company). Proxies included.
- **Behaviors to know:** `by_vat_number` / `by_rea_number` only match when the identifier is in the page slug — prefer `by_name` or `directUrls` for reliability. Paywalled fields (`amministratori`, `soci`, `has_insolvency`, `bilancio_xbrl_url`) are always `null`.

### ⚠️ Disclaimer

This actor is not affiliated with, endorsed by, or sponsored by ufficiocamerale.it, Openapi S.p.A., or the Italian Camere di Commercio / Unioncamere. All product names, trademarks, and registered trademarks are the property of their respective owners and are used here only to describe the data source.

The scraper collects only publicly available information published on ufficiocamerale.it. It does not bypass authentication, purchase paywalled documents, or access private data. Users are responsible for complying with the website's Terms of Service, applicable data-protection law (including GDPR), and any restrictions on the use of company and personal data. Use the extracted data lawfully and responsibly.

### SEO Keywords

Italy company registry scraper, Registro Imprese scraper, ufficiocamerale scraper, Camera di Commercio data, Partita IVA lookup, Italian VAT number scraper, REA number lookup, PEC email scraper, codice destinatario SDI, ATECO code data, Italian company data API, visura camerale data, bilancio aziendale data, KYC KYB Italy, B2B lead generation Italy, Italian business directory scraper, company financials Italy, Italian company enrichment, due diligence Italy data, share capital revenue profit Italy

# Actor input Schema

## `mode` (type: `string`):

How to interpret the Search query. by\_name matches the company name in the page URL slug; by\_vat\_number / by\_rea\_number match companies whose VAT / REA appears in the slug.

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

Company name (e.g. BCC Felsinea), VAT number (e.g. 00159560366) or REA code (e.g. MO-187940), matching the selected mode.

## `province` (type: `string`):

Optional two-letter Italian province code to filter name-search results (e.g. MI, RM, BO, NA). Applied to the company's registered chamber of commerce.

## `directUrls` (type: `array`):

Exact ufficiocamerale.it company page URLs (e.g. https://www.ufficiocamerale.it/1295/bcc-felsinea-banca-di-credito-cooperativo-dal-1902-sc). Overrides mode/query.

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

Hard cap on the number of company records collected.

## `maxConcurrency` (type: `integer`):

Maximum number of company pages fetched in parallel.

## `sp_intended_usage` (type: `string`):

Please describe how you plan to use the data extracted by this crawler.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

Provide your email address so we can get in touch with you.

## Actor input object example

```json
{
  "mode": "by_name",
  "query": "BCC Felsinea",
  "maxItems": 10,
  "maxConcurrency": 8
}
```

# 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 = {
    "query": "BCC Felsinea"
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/italy-company-registry-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 = { "query": "BCC Felsinea" }

# Run the Actor and wait for it to finish
run = client.actor("memo23/italy-company-registry-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 '{
  "query": "BCC Felsinea"
}' |
apify call memo23/italy-company-registry-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/italy-company-registry-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/kYv0LdmLJd2bk1w0S/builds/YefakEIukT3IqGGDs/openapi.json
