# Albo Pretorio Monitor – Italian municipal notice boards (`aleksejsg/albo-pretorio-monitor`) Actor

Monitor 1,371 Italian municipal online notice boards (albo pretorio online) for keywords: tenders, concorsi, building permits, ordinances, grants. Pick comuni by name, region or province. Only-new mode for scheduled alerts.

- **URL**: https://apify.com/aleksejsg/albo-pretorio-monitor.md
- **Developed by:** [Aleksej Sg](https://apify.com/aleksejsg) (community)
- **Categories:** Business, Lead generation, News
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 notice returneds

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

## Albo Pretorio Monitor – Italian municipal notice boards

Get alerts when an Italian municipality publishes a notice that matters to you on its **albo pretorio online**: tenders (gare, bandi), competitions and job calls (concorsi, selezioni), building permits, ordinances, council and executive resolutions (delibere), managers' decisions (determine).

**1371 municipalities built in** (583 on Maggioli JCityGov, 608 on SaturnWeb, 158 on Halley, 22 on Maggioli SIPAL): just type a name like `Cagliari`, a region like `Sicilia`, or a province code like `TP`. No URLs needed.

### What it does

- Reads albi pretori on four platforms: **Maggioli JCityGov**, **Maggioli SIPAL** (albopretorio.sipalinformatica.it, e.g. Mondovì, Saluzzo, Savigliano, Lumezzane, Rovato, Casteggio, Stornara; verified 3 November 2026), **SaturnWeb** (servizipubblicaamministrazione.it, widely used by small comuni in Piemonte, Liguria, Lombardia, Valle d'Aosta) and **Halley** (hosted albi on halleysac.it and halleysardegna.com, many comuni in Veneto and Sardegna). All bundled lists were verified automatically on 2 November 2026 (each albo answered with a live notice list).
- SIPAL albi: every notice currently published is read in one request; add others by codice fiscale in `sipalAlbi`.
- SaturnWeb albi: the newest notices of the chronological list are read (one page per albo); add others by CE code in `saturnwebAlbi`.
- Halley albi: the newest page of `mc_p_ricerca.php` is read; add others by URL in `halleyAlbi`. A few albi hosted on halleyweb.com are included (Acciano, Agazzano, Altino, Asola, Bagnoli Irpino, Bagnoregio, Bellagio, Belvedere Ostrense, Beura-Cardezza): that host refuses non-Italian connections, so they are read through free public Italian proxies (public notice pages only, no cookies or credentials). Free proxies are unreliable: these albi may be slow or return a free error row on some runs.
- Pick sources by **municipality name**, by **whole region**, or by **province code**; you can still add any other JCityGov albo URL (ending in `/web/trasparenza/papca-ap`).
- Optionally reads RSS/Atom feeds (e.g. AlboPOP feeds).
- Filters by keywords (case-insensitive, on title, category and issuing office).
- With many albi and a low `maxItems`, results are taken round-robin across albi, so every comune gets its newest notices in.
- **Only-new mode** remembers seen notices, so with a daily Apify schedule you get (and pay for) only new notices.
- Albi are read in parallel: a whole region such as Sicilia (36 albi, 2 pages each) takes about 20–30 seconds.

### Use cases

- Contractors and consultants watching for **gare d'appalto, avvisi and manifestazioni di interesse** in their province.
- Job seekers tracking **concorsi and selezioni** in many comuni at once.
- Journalists and local associations following **ordinanze, delibere and determine**.
- Grant consultants catching **bandi e contributi** for businesses and associations.

### Output

One row per notice (same fields on both platforms): `comune`, `platform` (`jcitygov`/`saturnweb`/`halley`/`sipal`), `title`, `categoria`, `registro`, `numeroAtto`, `dal`/`al` (publication period), `proponente` (issuing office), `link`, `matched` keywords.

### Example input

```json
{"comuni": ["Messina", "Milazzo"], "regioni": ["Puglia"], "province": ["TP"],
 "keywords": ["bando", "concorso", "avviso", "ordinanz"], "onlyNew": true, "maxPages": 2}
```

```json
{"province": ["AT", "CN"], "saturnwebAlbi": ["cnll1486"], "keywords": ["ordinanza", "concorso"]}
```

Each page holds 20 notices, newest first. Sources that fail, and municipality names that are not in the list, are returned as a row with an `error` field and are **not billed**.

### Coverage by region

- Piemonte: 510
- Lombardia: 266
- Veneto: 119
- Emilia-Romagna: 90
- Toscana: 54
- Liguria: 48
- Campania: 43
- Sardegna: 41
- Sicilia: 37
- Calabria: 36
- Lazio: 31
- Valle d'Aosta: 26
- Abruzzo: 16
- Puglia: 16
- Marche: 15
- Umbria: 12
- Trentino-Alto Adige: 4
- Friuli-Venezia Giulia: 4
- Basilicata: 2
- Molise: 1

Largest municipalities included: Messina, Perugia, Livorno, Cagliari, Rimini, Monza, Terni, Novara, Lecce, Lucca, Marsala, Busto Arsizio, Lamezia Terme, Pavia, Imola, Bitonto, Trani, Modica, Acireale, Mazara del Vallo, Chioggia, Anzio, Martina Franca, Corato, Settimo Torinese, Alcamo, Capannori, Bassano del Grappa, Campi Bisenzio, Sassuolo.

Missing your comune? If its albo runs on JCityGov, paste the URL in `jcitygovAlbi`; if it runs on SaturnWeb, paste its CE code or Pubblicazioni.aspx URL in `saturnwebAlbi`; for Halley, paste the mc_p_ricerca.php URL in `halleyAlbi`; for SIPAL, paste the ente's codice fiscale in `sipalAlbi`; other platforms can be added on request through the Issues tab.

> Maintenance: after a box reboot (keyring loss), restore the CLI with `apify login -t "$APIFY_TOKEN"`; /workspace/apicall.mjs uses `APIFY_TOKEN` from env first.

# Actor input Schema

## `comuni` (type: `array`):

Italian municipality names, e.g. Messina, Cagliari, Canelli. Resolved from the bundled lists of albi verified on the Maggioli JCityGov, SaturnWeb and Halley platforms (see README). Unknown names return a free error row.

## `regioni` (type: `array`):

Monitor every bundled municipality in these regions, e.g. Sicilia, Puglia, Toscana.

## `province` (type: `array`):

Two-letter province codes, e.g. ME, TP, BA.

## `jcitygovAlbi` (type: `array`):

Optional: other albi on the Maggioli JCityGov platform not in the bundled list, ending in /web/trasparenza/papca-ap.

## `saturnwebAlbi` (type: `array`):

Optional: other SaturnWeb albi not in the bundled list: the CE code (e.g. cnll1486) or the full Pubblicazioni.aspx?RicCro=1\&CE=... URL. Reads the newest page of the chronological list.

## `halleyAlbi` (type: `array`):

Optional: other albi on the Halley platform not in the bundled list: full URL ending in /mc/mc_p_ricerca.php (e.g. https://sac3.halleysac.it/c001001/mc/mc_p_ricerca.php). Reads the newest page.

## `sipalAlbi` (type: `array`):

Optional: other albi on Maggioli SIPAL (albopretorio.sipalinformatica.it) not in the bundled list: the ente's codice fiscale (e.g. 00248770042) or the full ListPubblicazione?codfisc=... URL. Reads every notice currently published.

## `feeds` (type: `array`):

Optional RSS/Atom feeds, e.g. AlboPOP feeds of municipalities.

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

Case-insensitive keywords matched in the title, category and issuing office. Leave empty to return every notice.

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

Remember seen notices in a named key-value store; use with an Apify schedule for daily alerts.

## `stateStoreName` (type: `string`):

Key-value store for onlyNew mode. Use different names for different alert profiles.

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

Maximum notices returned per run (each is one billed event).

## `maxPages` (type: `integer`):

How many list pages (20 notices each, newest first) to read per albo.

## Actor input object example

```json
{
  "comuni": [
    "Messina"
  ],
  "keywords": [
    "determina",
    "delibera"
  ],
  "onlyNew": true,
  "stateStoreName": "albo-monitor-state",
  "maxItems": 200,
  "maxPages": 5
}
```

# Actor output Schema

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

One row per matching notice.

# 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 = {
    "comuni": [
        "Messina"
    ],
    "keywords": [
        "determina",
        "delibera"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aleksejsg/albo-pretorio-monitor").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 = {
    "comuni": ["Messina"],
    "keywords": [
        "determina",
        "delibera",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("aleksejsg/albo-pretorio-monitor").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 '{
  "comuni": [
    "Messina"
  ],
  "keywords": [
    "determina",
    "delibera"
  ]
}' |
apify call aleksejsg/albo-pretorio-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aleksejsg/albo-pretorio-monitor"
        }
    }
}
```

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/oHyc5bQ4sIOUwfw8l/builds/yJmOeAl3vNTXqsrft/openapi.json
