# (ANAC) Italian Public Contracts & Tenders Scraper (`monkey.d.scraping/italian-public-contracts-scraper`) Actor

Search Italian public procurement (appalti pubblici) by supplier VAT, contracting authority, CIG, CPV, province, date and value. Get tenders, awards and winning suppliers from ANAC open data, 2007 to today, with new awards within hours.

- **URL**: https://apify.com/monkey.d.scraping/italian-public-contracts-scraper.md
- **Developed by:** [Monkey D. Scraping](https://apify.com/monkey.d.scraping) (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?

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

## Italian Public Contracts Scraper — Tenders, Awards & Winning Suppliers

**Find out who wins public money in Italy — and who spends it.**

This Actor extracts Italian public procurement data: tenders (*bandi di gara*), contract awards (*aggiudicazioni*), winning suppliers with their VAT numbers, contract values, CPV categories and contracting authorities (*stazioni appaltanti*). Records are available from **2007 to today**, and recent awards appear **within hours** of publication.

No account, no login, no manual downloads. You describe what you are looking for; you get a clean dataset back.

***

### What you can do with it

#### See who just won — within hours

Get contracts awarded in the last few days, with the winning company, its VAT number and the amount. Not last month's snapshot: today's. A company that just won public work has budget, a live project and a documented need — this is the moment to reach them.

#### Track a company's public sector business

Enter one or more VAT numbers and get every contract those companies were awarded — value, subject, buyer, procedure, award date. Works for competitors, prospects, partners or suppliers you are evaluating.

#### See everything a public body buys

Enter the tax code of a municipality, hospital, university or agency and get its full tender activity: what it puts out to tender, for how much, under which procedure, and who ends up winning.

#### Monitor a market segment

Filter by CPV category and province to follow a sector — construction, medical devices, IT services, catering, transport — across the whole country or in a single area.

#### Look up a specific contract

Paste one or more CIG codes and get the full record for each, including outcome and winners where published.

#### Build lead lists that are actually qualified

A company that just won a public contract has budget, a live project, and a documented need. Filter by value, date and category to find them.

***

### Who it's for

| | |
|---|---|
| **Sales & business development** | Find public bodies that buy what you sell, and companies that just won funded projects |
| **Competitive intelligence** | Track competitors' public sector wins, values and buyers over time |
| **Market research & consulting** | Size a segment, map suppliers, study procedure and pricing patterns |
| **Credit & risk analysis** | Verify a counterparty's public sector revenue and contract pipeline |
| **Journalism & civic research** | Investigate spending by any Italian public authority |
| **NRRP / PNRR tracking** | Isolate contracts funded by Italy's National Recovery and Resilience Plan |

***

### Key terms, briefly

Italian procurement has its own vocabulary. Here is what you need to read the output.

- **CIG** (*Codice Identificativo Gara*) — a unique 10-character code identifying a tender lot. Every public contract in Italy has one. It is the key that links a tender to its award and its winner.
- **CUP** (*Codice Unico di Progetto*) — identifies the wider public investment project a contract belongs to.
- **Stazione appaltante** — the contracting authority: the public body running the tender. Identified by its tax code (*codice fiscale*).
- **Aggiudicazione** — the award: the decision assigning a contract to a supplier, with the final value and any discount against the base price.
- **Aggiudicatario** — the winning supplier. A single contract can have several, when a consortium or a temporary grouping (*RTI*) wins together.
- **CPV** — the European Common Procurement Vocabulary, the standard category code for what is being bought. Hierarchical: `45` is all construction works, `45112000-5` is excavation.
- **Bando di gara** — the tender notice itself.
- **PNRR / NRRP** — Italy's National Recovery and Resilience Plan. Contracts funded by it carry a flag.

***

### Example input

Every contract awarded to a company in 2025:

```json
{
  "supplierTaxIds": ["00803890151"],
  "dateFrom": "2025-01-01",
  "dateTo": "2025-12-31"
}
```

All construction tenders over €500,000 published by a municipality:

```json
{
  "contractingAuthorityTaxIds": ["81000160465"],
  "cpvCodes": ["45"],
  "minAmount": 500000
}
```

NRRP-funded medical device contracts in Milan:

```json
{
  "cpvCodes": ["331"],
  "provinces": ["MILANO"],
  "onlyPnrr": true
}
```

***

### Example output

```json
{
  "cig": "B552431AE5",
  "lot_subject": "INTERVENTO DI RECUPERO DEL CONTESTO PAESAGGISTICO",
  "lot_amount": 38754.65,
  "cpv_code": "45112000-5",
  "cpv_description": "LAVORI DI SCAVO E MOVIMENTO TERRA",
  "procedure_type": "AFFIDAMENTO DIRETTO",
  "publication_date": "2025-01-24",
  "contracting_authority_name": "COMUNE DI GALLICANO",
  "contracting_authority_tax_code": "81000160465",
  "province": "LUCCA",
  "is_pnrr_pnc": false,
  "award_status": "awarded",
  "award": {
    "award_amount": 35120.4,
    "discount_percentage": 9.38,
    "bidding_companies": 3,
    "definitive_award_date": "2025-02-18"
  },
  "awardees": [
    {
      "tax_code": "01262740432",
      "name": "SCAVI E CONDOTTE S.R.L.",
      "role": "OPERATORE ECONOMICO MONOSOGGETTIVO"
    }
  ]
}
```

Every record carries the identifiers you need to join it with your own systems — CIG, CUP, CPV, ISTAT and NUTS territory codes, and the tax codes of both the buyer and the winners — plus a `provenance` block showing exactly which official publication it came from and when it was read.

**A note on dates.** When you search by supplier, the period refers to when contracts were *awarded* to that company. Everywhere else it refers to when the tender was *published*. A tender published years ago can be awarded today, and this keeps the results matching what you actually asked for.

***

### Search fields

| Field | What it does |
|---|---|
| `supplierTaxIds` | Contracts won by these companies (VAT / tax code) |
| `contractingAuthorityTaxIds` | Contracts published by these public bodies |
| `cigCodes` | Look up specific contracts by CIG |
| `searchTerms` | Keyword match on subject, category and authority name |
| `cpvCodes` | CPV category; a short code selects the whole family |
| `provinces` | Restrict to one or more provinces |
| `lookbackMonths` | How far back to search — 3 to 36 months, 6 by default |
| `dateFrom` / `dateTo` | Exact date range; overrides the preset above |
| `minAmount` / `maxAmount` | Contract value range in EUR |
| `onlyPnrr` | Only NRRP-funded contracts |
| `includeAwardDetails` | Add outcome and winning suppliers |
| `maxResults` | Cap the number of contracts returned |

Combine any of them. At least one search criterion is required.

***

### Integrations

The dataset is available as JSON, CSV, Excel and XML through the Apify API, so it drops straight into the tools you already use:

- **n8n / Make / Zapier** — trigger a run, push new contracts into a CRM, a spreadsheet or a Slack channel
- **Google Sheets / Excel** — pull results directly from the dataset URL
- **Your own backend** — call the REST API and consume JSON
- **Scheduling** — run it daily or weekly and use webhooks to get notified when new contracts appear for a company or an authority you follow

A common setup: schedule a daily run filtered to your sector and province, and route new awards straight into your CRM as leads.

***

### FAQ

**What data source does this use?**
Italian public contract data published as open data by ANAC, the national anti-corruption authority that maintains the national public contracts database. It is official government data, not a third-party aggregation.

**Do I need an account with any Italian portal?**
No. There is nothing to log into and nothing to configure.

**How far back does it go?**
Records are available from 2007 onwards. The **Time period** setting controls how far back a search reaches — it defaults to the last 6 months, and you can widen it to 36. For anything older, set exact `dateFrom` and `dateTo` values, which override the preset.

**How current is the data?**
Recent contracts appear within hours of being published, including awards and winning suppliers. Older records come from official datasets on a monthly cycle. Every run reports a freshness status and the date of the most recent record it saw, so you always know what you are looking at.

**Can I find out who won a specific tender?**
Yes. Enter the CIG code, or search by contracting authority, and the output includes the winning supplier with its VAT number and the awarded amount, where the award has been published.

**Can I find all contracts won by one company?**
Yes — that is what `supplierTaxIds` does. Enter the company's VAT number or tax code.

**Why do some contracts have no award information?**
Because the award has not been published yet — an open tender has no winner. Records are marked `not_awarded` in that case, which is different from missing data.

**Can one contract have several winners?**
Yes. Contracts awarded to a consortium or a temporary grouping (*RTI*) list every member, each with its role.

**Why is a field empty?**
Because it is empty at the source. Nothing is inferred, estimated or filled in.

**Why does a recent search return different fields than a historical one?**
Recent and historical records come from different official publications, and they do not carry exactly the same detail. Fields that are not published for a given contract stay empty rather than being guessed.

**Is the data accurate?**
It reproduces what the contracting authorities filed. Public procurement records are filled in by thousands of separate public bodies, so occasional gaps and typos exist at the source. Values that are clearly impossible are treated as missing rather than passed through as if they were real.

**How is the cost calculated?**
Three charges, all visible before you run:

| | |
|---|---|
| Starting a search | $0.02 |
| Searching a supplier's history | $0.15 — only when you search by supplier VAT |
| Each contract returned | $1.00 per 1,000 |

A daily watch on new awards in one region typically costs a few cents. Looking up a handful of CIG codes costs a fraction of a cent. `maxResults` gives you a hard ceiling, and your own per-run spending limit is respected — if it is reached, the run stops and tells you, rather than charging you for more.

**Why is searching by supplier charged separately?**
Because it is genuinely more work: reconstructing everything a company has won means going through the national award records, not just reading the latest notices. You only pay it when you use that field.

***

*Data source: ANAC — Banca Dati Nazionale dei Contratti Pubblici, published as open data under CC BY-SA 4.0.*

# Actor input Schema

## `supplierTaxIds` (type: `array`):

Find every contract awarded to these companies. Enter Italian VAT numbers (partita IVA) or tax codes (codice fiscale), one per line. Note: this searches by award date, and takes longer than the other searches.

## `contractingAuthorityTaxIds` (type: `array`):

Find every tender published by these public bodies. Enter the tax code (codice fiscale) of the authority, one per line.

## `cigCodes` (type: `array`):

Look up specific contracts by their CIG code (Codice Identificativo Gara).

## `searchTerms` (type: `array`):

Keep only contracts whose subject, category or authority name contains any of these words.

## `cpvCodes` (type: `array`):

Filter by CPV category. A short code selects the whole family: 45 covers all construction works, 331 covers medical devices.

## `provinces` (type: `array`):

Keep only contracts located in these Italian provinces, for example MILANO or ROMA.

## `period` (type: `string`):

How far back to search. This is the setting that decides how long a run takes: a week returns in a minute or two, a year takes considerably longer. Start small and widen it only if you need more history.

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

Optional exact start date, as YYYY-MM-DD. Overrides the time period above. Records are available from 2007 onwards.

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

Optional exact end date, as YYYY-MM-DD.

## `minAmount` (type: `integer`):

Keep only contracts worth at least this amount.

## `maxAmount` (type: `integer`):

Keep only contracts worth at most this amount.

## `onlyPnrr` (type: `boolean`):

Keep only contracts flagged as funded by the Italian National Recovery and Resilience Plan.

## `includeAwardDetails` (type: `boolean`):

Adds the award value, discount, number of bidders and the winning companies. Turn off for a faster, lighter run when you only need the tender details.

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

Stop after this many contracts.

## Actor input object example

```json
{
  "supplierTaxIds": [
    "09238800156"
  ],
  "contractingAuthorityTaxIds": [
    "81000160465"
  ],
  "cigCodes": [
    "B552431AE5"
  ],
  "searchTerms": [
    "trasporto scolastico"
  ],
  "cpvCodes": [
    "45",
    "331"
  ],
  "provinces": [
    "MILANO"
  ],
  "period": "7d",
  "onlyPnrr": false,
  "includeAwardDetails": true,
  "maxResults": 1000
}
```

# Actor output Schema

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

No description

## `awards` (type: `string`):

No description

## `identifiers` (type: `string`):

No description

## `runSummary` (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 = {
    "provinces": [
        "MILANO"
    ],
    "period": "7d"
};

// Run the Actor and wait for it to finish
const run = await client.actor("monkey.d.scraping/italian-public-contracts-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 = {
    "provinces": ["MILANO"],
    "period": "7d",
}

# Run the Actor and wait for it to finish
run = client.actor("monkey.d.scraping/italian-public-contracts-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 '{
  "provinces": [
    "MILANO"
  ],
  "period": "7d"
}' |
apify call monkey.d.scraping/italian-public-contracts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,monkey.d.scraping/italian-public-contracts-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/I6wXccith663cniNj/builds/V8wGRJz14bHM7JD7g/openapi.json
