# Italy Public Tenders - TED Bandi di Gara Feed (`arrasking/italy-public-tenders-ted-bandi-di-gara-feed`) Actor

Italian public tenders (bandi di gara, appalti) from official TED data. One clean row per procedure: lots, EUR value, earliest deadline, IT+DE text side by side for South Tyrol (Ausschreibungen Südtirol), CPV labels IT/DE/EN, and an only-new mode for daily tender alerts.

- **URL**: https://apify.com/arrasking/italy-public-tenders-ted-bandi-di-gara-feed.md
- **Developed by:** [Davide Arras](https://apify.com/arrasking) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 tender notices

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

**Italy Tenders Feed** gives you new **Italian public tenders** (bandi di gara, appalti pubblici) from the official EU **TED** database as a clean table, ready for a daily alert. You get one row per procedure, with the lots, total value, earliest deadline and **Italian and German text side by side** for South Tyrol (Ausschreibungen Südtirol). Pick your regions and CPV codes and press Start. No API key, no login.

**IT:** Bandi di gara italiani da TED, una riga pulita per procedura: lotti, valore totale, prima scadenza, testo IT/DE affiancato, etichette CPV in IT/DE/EN e modalità "solo nuovi" per avvisi giornalieri.
**DE:** Italienische Ausschreibungen aus TED, eine saubere Zeile pro Verfahren: Lose, Gesamtwert, früheste Frist, IT/DE-Text nebeneinander, CPV-Bezeichnungen auf IT/DE/EN und ein „nur neue“-Modus für tägliche Alerts.

Built for bidders, tender consultants and sales teams working with Italian public buyers, especially in bilingual **Alto Adige / Südtirol** and **Trentino**.

### What does Italy Tenders Feed do?

- **One row per procedure.** Lots come as a flat array with value, deadline and NUTS code. Total value and earliest deadline are already worked out, plus `daysToDeadline`.
- **Italian and German side by side.** Bilingual South Tyrol notices give you both texts. We never machine-translate: if TED has no English text, `eng` is `null`.
- **CPV labels in IT/DE/EN**, taken from TED's official labels.
- **"Only new" mode** for daily tender alerts: each run returns only notices you haven't received yet for the same filters.
- **Region-first filters:** NUTS prefixes such as `ITH1` (Bolzano/Bozen), `ITH2` (Trento), `ITC4` (Lombardy) or `IT` for all of Italy.
- **Privacy by design:** contact-person names, emails and phone numbers are never requested or stored.

### How to get Italian tender alerts every morning

1. Click **Try for free** and set your regions (`nutsCodes`) and, if you want, CPV prefixes or keywords.
2. Turn on **Only new notices**.
3. Run it once and check the **Output** tab.
4. Click **Schedule** and run it daily, for example at 07:00.
5. Connect the results to **Google Sheets, Slack or email** with Apify's built-in integrations.

### Input examples

South Tyrol and Trentino, all open calls from the last 7 days:

```json
{ "nutsCodes": ["ITH1", "ITH2"], "lookbackDays": 7 }
```

All of Italy, construction (CPV 45), above €1M:

```json
{ "nutsCodes": ["IT"], "cpvPrefixes": ["45"], "minValueEur": 1000000 }
```

Daily alert, only new notices (put this on a daily Apify schedule):

```json
{ "nutsCodes": ["ITH1"], "cpvPrefixes": ["33", "72"], "lookbackDays": 3, "onlyNew": true }
```

| Field | Meaning | Default |
|---|---|---|
| `nutsCodes` | NUTS prefixes for the place of performance. `IT` = all of Italy | `["ITH1","ITH2"]` |
| `cpvPrefixes` | CPV code prefixes, digits only | all |
| `keywords` | Full-text words, any language; any match counts | none |
| `noticeKind` | `competition` (open calls), `award`, `all` | `competition` |
| `lookbackDays` | Publication date window, 1–90 | 7 |
| `onlyNew` | Skip notices already returned for the same filters | false |
| `minValueEur` | Minimum total estimated value; notices without a EUR value are dropped when > 0 | 0 |
| `outputLanguages` | Any of `ita`, `deu`, `eng` | all three |
| `maxItems` | Upper limit of notices per run | 500 |

### What data do you get for each tender?

The **Output** tab shows a table: notice number, publication date, title (IT/DE/EN), buyer, CPV, value in EUR, deadline, days left, number of lots and TED links. Download it as Excel, CSV or JSON, or use the API. One dataset item per notice:

```json
{
  "publicationNumber": "600427-2026",
  "noticeType": "cn-standard",
  "procedureType": "open",
  "publicationDate": "2026-09-01",
  "title": { "ita": "FORNITURA DI AUTOBUS - DIVISA IN QUATTRO LOTTI", "deu": "LIEFERUNG VON BUSSEN - IN VIER LOSE GETEILT", "eng": null },
  "cpv": { "code": "34121100", "label": { "ita": "Autobus pubblici", "deu": "Busse für den öffentlichen Verkehr", "eng": "Public-service buses" } },
  "buyer": { "name": { "ita": "Sasa Spa", "deu": "Sasa Ag", "eng": null }, "city": { "ita": null, "deu": null, "eng": null }, "country": "ITA" },
  "nuts": ["ITH10"],
  "lots": [ { "lotId": "LOT-0001", "estimatedValueEur": 1740000.0, "deadline": "2026-10-19", "nuts": "ITH10" } ],
  "lotCount": 4,
  "totalEstimatedValueEur": 36980000.0,
  "earliestDeadline": "2026-10-19",
  "daysToDeadline": 6,
  "languagesInNotice": ["deu", "ita"],
  "links": { "ita": "https://ted.europa.eu/it/notice/-/detail/600427-2026", "deu": "https://ted.europa.eu/de/notice/-/detail/600427-2026", "pdf_ita": "https://ted.europa.eu/it/notice/600427-2026/pdf" },
  "isNew": true,
  "source": "TED – Publications Office of the EU (reuse per ted.europa.eu/legal-notice)",
  "fetchedAt": "2026-10-13T03:00:00Z"
}
```

Other fields: `description` (IT/DE/EN where present), `cpvCodes` (all CPV codes in the notice). `buyer.city` is often empty in TED data; use `nuts` for location.

### How much does it cost to get Italian tenders?

You pay per result: **$3 per 1,000 notices** ($0.003 each), plus Apify's tiny start fee. 100 notices cost about $0.30. A typical daily South Tyrol alert with **Only new** returns 0–10 notices, so it costs a few cents a week. Use `maxItems` to cap the cost of a run.

### Data source, licence and limits

- Data: [TED – Tenders Electronic Daily](https://ted.europa.eu), Publications Office of the EU, via the official TED Search API v3. TED notices may be reused for commercial and non-commercial purposes ([legal notice](https://ted.europa.eu/en/legal-notice)). Every item carries the source attribution.
- TED only covers tenders **above the EU thresholds**. Smaller Italian tenders are published nationally (ANAC) and are not included.
- Values and deadlines are what the buyer published. Always check the official notice before you bid.

### FAQ

#### How is this different from the TED website or other TED scrapers?

TED's own search and most TED Actors cover all of Europe and return raw notices. This Actor is built for Italy: region filters by NUTS code, one row per procedure with value and deadline already worked out, Italian and German text side by side, and an "only new" mode for daily alerts.

#### Why is `eng` often `null`?

Most Italian notices are only published in Italian (and German in South Tyrol). We don't invent translations.

#### Which NUTS codes do I need?

`ITH10` Bolzano/Bozen · `ITH20` Trento · `ITH3` Veneto · `ITC4` Lombardy · `ITI4` Lazio · `ITF3` Campania · `IT` all of Italy.

#### Do keywords work in German or Italian?

Yes, TED full-text search covers all languages in the notice.

#### Can I get contract award notices (who won)?

Yes, set `noticeKind` to `award`, or `all` for both.

#### Can I use it from my own code?

Yes, through the Apify API or the Apify client for Python and JavaScript. See the **API** tab.

### Changelog

- 0.1 – first release. Output tab with an overview table.

### Support

Open an issue in the Issues tab. Feature requests welcome.

# Actor input Schema

## `nutsCodes` (type: `array`):

NUTS prefixes for the place of performance. ITH1 = Bolzano/Bozen, ITH2 = Trento, ITC4 = Lombardy, IT = all of Italy.

## `cpvPrefixes` (type: `array`):

Digits only, e.g. 45 (construction), 33 (medical), 72 (IT services). Empty = all.

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

Full-text words in any language (IT/DE/EN). A notice matches if it contains any of them.

## `noticeKind` (type: `string`):

Open calls = tenders you can still bid on. Award notices = contracts already awarded (who won, at what price). All = both.

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

Only notices published in the last N days.

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

Return only notices this Actor has not returned before for the same filters. Use with a daily schedule.

## `minValueEur` (type: `integer`):

Notices without a EUR value are dropped when this is above 0.

## `outputLanguages` (type: `array`):

Languages to include in the output text (titles, descriptions, CPV labels).

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

Maximum number of notices to return in one run. You pay per result, so this also caps the cost.

## Actor input object example

```json
{
  "nutsCodes": [
    "ITH1",
    "ITH2"
  ],
  "cpvPrefixes": [],
  "keywords": [],
  "noticeKind": "competition",
  "lookbackDays": 7,
  "onlyNew": false,
  "minValueEur": 0,
  "outputLanguages": [
    "ita",
    "deu",
    "eng"
  ],
  "maxItems": 500
}
```

# Actor output Schema

## `results` (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 = {
    "nutsCodes": [
        "ITH1",
        "ITH2"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("arrasking/italy-public-tenders-ted-bandi-di-gara-feed").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 = { "nutsCodes": [
        "ITH1",
        "ITH2",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("arrasking/italy-public-tenders-ted-bandi-di-gara-feed").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 '{
  "nutsCodes": [
    "ITH1",
    "ITH2"
  ]
}' |
apify call arrasking/italy-public-tenders-ted-bandi-di-gara-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,arrasking/italy-public-tenders-ted-bandi-di-gara-feed"
        }
    }
}
```

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/KMfHSKDzSZw88ii4q/builds/Cnj2qGYJSaxu3zLse/openapi.json
