# Subito Lavoro Scraper - Italy Jobs, Salaries, Employers (`santamaria-automations/subito-it-jobs-scraper`) Actor

Scrape job listings from Subito.it Lavoro. Returns title, company, province, region, contract type, salary, phone, advertiser type, and full description. Business seller mode: logo, Google rating, address, social links, opening hours.

- **URL**: https://apify.com/santamaria-automations/subito-it-jobs-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 job from search pages

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

## Subito Lavoro Scraper - Italy Jobs, Phone Numbers, Salaries, Business Profiles

Scrape job listings from [Subito.it Lavoro](https://www.subito.it/annunci-italia/vendita/lavoro/), Italy's largest classifieds job section with over 170,000 active listings.

### Features

- Search by keyword, region, or paste any Subito Lavoro filtered URL
- Extracts job title, company, region, city, town, province code, contract type, sector, salary, and full description
- **Phone number extraction** (`includeContactPhone=true`): structured phone from Subito's contacts API — no browser needed, ~20% fill rate
- Italian employment types: Tempo determinato, Tempo indeterminato, Apprendistato, Tirocinio, Somministrazione
- Advertiser classification: private (type 0), agency (type 1), company (type 2) with shop profile details
- Province code (targa) and ISTAT code for every listing
- Salary extraction when listed (EUR per hour, month, or year)
- Image URLs from job posting photos (workplace/company images)
- Visibility flags: is\_urgent and is\_gallery (paid boost indicators)
- Contact email and phone extraction from description text
- URL extraction from plain-text descriptions (mentioned\_urls)
- **Business seller profiles** (`includeCompanyDetails=true`): logo, verified badge, Google rating + CID, address, website, social links, opening hours, active ads count
- All 20 Italian regions supported
- HTTP-only, 128 MB, pay-per-result

### How it works

1. Enter one or more keywords (e.g., "cameriere", "programmatore", "magazziniere")
2. Optionally filter by Italian region (e.g., "lombardia", "lazio")
3. Or paste any Subito Lavoro search URL directly
4. Enable `includeContactPhone` to extract phone numbers from Subito's contacts API
5. Enable `includeCompanyDetails` to fetch full business seller profiles for company listings
6. Run the actor and receive structured job data

### Output

#### Core Fields (all listings)

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Subito.it numeric listing ID |
| `ad_urn` | string | Full Subito ad URN for stable deduplication |
| `title` | string | Job title |
| `job_url` | string | Direct URL to the job listing |
| `mobile_url` | string | Mobile URL (null when same as job\_url) |
| `source_platform` | string | Always `"subito.it"` |
| `category_id` | string | Subito category ID (e.g., `"26"` = Offerte di lavoro) |
| `category_label` | string | Subito category label |
| `company_name` | string | Employer name |
| `advertiser_type` | integer | `0`=private, `1`=agency, `2`=company |
| `is_company` | boolean | True when poster is a business |
| `shop_id` | string | Subito store ID for business profiles |
| `shop_name` | string | Subito store name for business profiles |
| `country` | string | Always `"IT"` |
| `region` | string | Italian region (e.g., "Lombardia", "Lazio") |
| `city` | string | Province (e.g., "Milano", "Roma") |
| `town` | string | Municipality name |
| `province_code` | string | 2-letter province code (targa), e.g., `"MI"`, `"RM"`, `"NA"` |
| `province_istat` | string | ISTAT 3-digit province code, e.g., `"015"` for Milano |
| `location` | string | Combined: "Town, City, Region" |
| `employment_type` | string | Contract type (e.g., "Tempo indeterminato") |
| `work_schedule` | string | Schedule (e.g., "Full time", "Turni") |
| `sector` | string | Job sector category |
| `experience_level` | string | Experience level from ad |
| `education_level` | string | Minimum education required |
| `salary_min` | number | Minimum salary (null if not listed) |
| `salary_max` | number | Maximum salary (null if not listed) |
| `salary_currency` | string | Currency code (EUR) |
| `salary_period` | string | Period: `"ora"`, `"mese"`, or `"anno"` |
| `salary_text` | string | Raw salary text as shown on the listing |
| `description` | string | Full job description with preserved line breaks |
| `image_urls` | string\[] | CDN URLs of photos attached to the listing |
| `is_urgent` | boolean | True when marked urgent (paid boost) |
| `is_gallery` | boolean | True when gallery mode is enabled |
| `phone_number` | string | Advertiser's primary phone from Subito's contacts API (e.g., `"0302400024"`). Populated only when `includeContactPhone=true`. ~20% fill rate. Null when not requested or advertiser has no phone set. |
| `contact_emails` | string\[] | Email addresses found in description |
| `contact_phones` | string\[] | Phone numbers found in description text |
| `mentioned_urls` | string\[] | URLs mentioned in plain text of description (filtered: excludes subito.it, google.com, facebook.com, instagram.com) |
| `posted_at` | string | Publication datetime (ISO 8601 UTC) |
| `search_query` | string | Keyword that found this listing |
| `scraped_at` | string | Scrape timestamp (ISO 8601 UTC) |

#### Business Seller Profile Fields (`includeCompanyDetails=true`, company listings only)

These fields are populated when `includeCompanyDetails=true` and the listing is from a business seller (`is_company=true`). For private-seller listings they remain null.

| Field | Type | Description |
|-------|------|-------------|
| `advertiser_logo_url` | string | Logo image URL from the shop's impresapiu.subito.it profile |
| `advertiser_verified` | boolean | True when shop has a fully populated profile (website + address present), corresponding to the "Azienda verificata" badge |
| `advertiser_google_rating` | number | Google Maps average star rating (e.g., `4.8`). Populated only for shops with a linked Google Business Profile (~5-10% of shops). |
| `advertiser_google_reviews_url` | string | Google Maps URL for the shop's review page (includes CID parameter). Null when no Google profile is linked. |
| `advertiser_google_place_cid` | string | Numeric Google Maps CID for use with the Maps Places API. Null when no Google profile is linked. |
| `advertiser_address_full` | string | Full postal address of the business |
| `advertiser_website` | string | Business website URL |
| `advertiser_social_urls` | string\[] | All social media URLs (Facebook, Instagram, and any future platforms). Empty array when no social links are set. |
| `advertiser_opening_hours` | object\[] | Opening hours array: `{day, open, close, note}` with Italian day abbreviations (lun, mar, mer, gio, ven, sab, dom) |
| `advertiser_online_ads_count` | integer | Number of active listings from this advertiser on Subito |
| `advertiser_shop_url` | string | URL of the advertiser's impresapiu.subito.it shop page |

### Sample Output

#### With phone number (`includeContactPhone=true`)

```json
{
  "_type": "JobPosting",
  "id": "658988544",
  "ad_urn": "id:ad:612228663:list:658988544",
  "title": "Due Infermieri/Infermiere",
  "job_url": "https://www.subito.it/offerte-lavoro/due-infermieri-infermiere-rif86757-brescia-658988544.htm",
  "source_platform": "subito.it",
  "company_name": "During SpA",
  "advertiser_type": 1,
  "is_company": true,
  "region": "Lombardia",
  "city": "Brescia",
  "province_code": "BS",
  "province_istat": "017",
  "location": "Brescia, Lombardia",
  "employment_type": "Somministrazione",
  "phone_number": "0302400024",
  "contact_emails": [],
  "contact_phones": [],
  "posted_at": "2026-09-01T08:00:00Z",
  "scraped_at": "2026-09-01T14:00:00Z"
}
```

#### Business seller (with `includeCompanyDetails=true`)

```json
{
  "_type": "JobPosting",
  "id": "658619269",
  "ad_urn": "id:ad:612155202:list:658619269",
  "title": "RAGAZZA IMMAGINE nei migliori locali notturni",
  "job_url": "https://www.subito.it/offerte-lavoro/ragazza-immagine-nei-migliori-locali-notturni-taranto-658619269.htm",
  "company_name": "Agenzia Ragazze Immagine Miss Agency",
  "advertiser_type": 1,
  "is_company": true,
  "region": "Puglia",
  "city": "Taranto",
  "province_code": "TA",
  "location": "Taranto, Puglia",
  "phone_number": null,
  "contact_emails": ["info@missagency.vip"],
  "contact_phones": [],
  "advertiser_logo_url": "https://images.sbito.it/api/v1/sbt-shops-images-pro/images/c0/c0ec4a31-dc8e-40c2-a4aa-acff1c32b284?rule=shop_logo_medium_auto",
  "advertiser_verified": true,
  "advertiser_google_rating": 4.8,
  "advertiser_google_reviews_url": "https://maps.google.com/?cid=12361327604280049843",
  "advertiser_google_place_cid": "12361327604280049843",
  "advertiser_address_full": "Via V. de Gama, 90g, 62012 Civitanova Marche MC, Italia",
  "advertiser_website": "http://www.missagency.vip",
  "advertiser_social_urls": [
    "https://www.facebook.com/100093389807411/",
    "https://www.instagram.com/missagency_official/"
  ],
  "advertiser_opening_hours": [
    {"day": "lun", "open": "07:30", "close": "21:00"},
    {"day": "mar", "open": "07:30", "close": "21:00"}
  ],
  "advertiser_online_ads_count": 50,
  "advertiser_shop_url": "https://impresapiu.subito.it/shops/39751-agenzia-ragazze-immagine-miss-agency",
  "posted_at": "2026-09-01T10:08:56Z",
  "scraped_at": "2026-09-01T14:00:00Z"
}
```

### Pricing

This actor uses pay-per-event billing. There are three chargeable events:

| Event | Cost | When charged |
|-------|------|-------------|
| Actor start | $0.001 | Once per run, regardless of results |
| `job-serp-result` | $0.003 | Per job listing returned from search results. **All job data — title, description, salary, contract type, category, features — is included at this tier.** Subito's SERP embeds the complete job record inline. |
| `company-detail-result` | $0.005 | Per company listing when `includeCompanyDetails=true`. Fetches the business shop profile (logo, website, socials, Google rating, opening hours, address, active ads count). Only fires for `is_company=true` listings. Private sellers are not charged. |
| `phone-reveal-result` | $0.001 | Per listing where `includeContactPhone=true` AND a phone number is successfully retrieved from Subito's contacts API (~20% fill rate). HTTP 204 (no phone set) is not charged. |

**Why are full job details already in `job-serp-result`?**

Unlike most job boards, Subito embeds the complete job record in its search page (`__NEXT_DATA__` SSR JSON). Every listing on the SERP already contains the full description, salary, contract type, sector, experience level, and all other job fields. There is no separate "job detail page" needed to get job data — the `job-serp-result` event covers everything.

`includeCompanyDetails` is purely about the **seller's business profile** — fetching the advertiser's impresapiu.subito.it shop page to get logo, Google reviews, opening hours, etc. It is not needed to get job information.

**Cost examples:**

**SERP only (default):** 100 jobs = $0.30 | 1,000 jobs = $3.00

**With phones (`includeContactPhone=true`):** 100 jobs = ~$0.32 (20% have phones, +$0.001 each) | 1,000 jobs = ~$3.20

**With business profiles (`includeCompanyDetails=true`):** 100 company listings = $0.80 | 1,000 = $8.00

New Apify accounts receive $5 free monthly credit, enough for roughly 1,600 SERP-only listings per month at no cost.

### Examples

#### Search by keyword nationwide

```json
{
  "searchQueries": ["cameriere"],
  "maxResults": 100
}
```

#### Extract phones for lead generation

```json
{
  "searchQueries": ["infermiere", "medico", "operatore sanitario"],
  "maxResults": 500,
  "includeContactPhone": true
}
```

#### Extract business profiles (lead generation)

```json
{
  "searchQueries": ["commessa negozio", "addetto vendite"],
  "maxResults": 200,
  "includeCompanyDetails": true,
  "includeContactPhone": true
}
```

#### Search by keyword in a specific region

```json
{
  "searchQueries": ["programmatore"],
  "location": "lombardia",
  "maxResults": 100
}
```

#### Multiple keywords

```json
{
  "searchQueries": ["magazziniere", "corriere", "facchino"],
  "maxResults": 300,
  "maxResultsPerQuery": 100
}
```

#### Paste a filtered Subito Lavoro URL

```json
{
  "searchUrls": ["https://www.subito.it/annunci-lombardia/vendita/lavoro/?q=programmatore"],
  "maxResults": 200
}
```

### Phone Number Extraction

Enable `includeContactPhone=true` to extract structured phone numbers via Subito's internal contacts API (`hades.subito.it/v1/contacts/ads/{urn}`). The endpoint is unauthenticated — no login or browser session is required. It returns a clean numeric string (e.g., `"0302400024"`, `"3924088151"`) when the advertiser has registered a phone, or HTTP 204 (no content) when no phone is set.

Fill rate is approximately 20% across job listings — advertisers must explicitly opt in to show their phone number on Subito. The `contact_phones` field (regex from description text) remains available as a complementary source when advertisers write their phone number in the description body.

### Related Actors

**Italian Jobs**

- [Cliclavoro.it Scraper - Italy Government Jobs](https://apify.com/santamaria-automations/cliclavoro-it-scraper)
- [Subito.it Scraper - Italy Classifieds](https://apify.com/santamaria-automations/subito-it-scraper)

**European Jobs**

- [Indeed Scraper](https://apify.com/santamaria-automations/indeed-scraper)
- [Career Site Jobs Scraper](https://apify.com/santamaria-automations/career-site-jobs-scraper)

**Job Feed**

- [Job Feed Aggregator](https://apify.com/nanoscrape/job-feed)

### Support

Questions or issues? [Open an issue](https://console.apify.com/actors/subito-it-jobs-scraper/issues) or contact us at contact@nanoscrape.com

# Actor input Schema

## `searchQueries` (type: `array`):

One or more job titles or keywords to search on Subito.it Lavoro. Each entry runs as a separate search. Italian keywords give best results. Examples: 'cameriere', 'programmatore', 'magazziniere', 'infermiere'.

## `searchUrls` (type: `array`):

Direct Subito.it Lavoro search URLs to crawl. Paste any /annunci-\*/vendita/lavoro/ URL with your filters already set. Example: https://www.subito.it/annunci-lombardia/vendita/lavoro/?q=programmatore

## `location` (type: `string`):

Italian region to filter results. Use the region slug as it appears in the Subito.it URL. Examples: 'lombardia', 'lazio', 'campania', 'sicilia', 'toscana', 'piemonte'. Leave empty for all of Italy.

## `includeContactPhone` (type: `boolean`):

When enabled, fetches the advertiser's primary phone number from Subito's contacts API (hades.subito.it/v1/contacts/ads/{urn}). Returns the structured phone number (e.g. '0302400024' or '3924088151') for listings where the advertiser has registered a phone. Fill rate is approximately 20% — advertisers must opt in to show phone on Subito. Adds one lightweight HTTP call per listing (~84 byte response). Charges the phone-reveal-result PPE event ($0.001) only when a phone is successfully retrieved.

## `includeCompanyDetails` (type: `boolean`):

When enabled, fetches the business shop profile (impresapiu.subito.it) for each company listing (is\_company=true). Extracts: advertiser logo, verified badge, Google rating + CID, full address, website URL, social media links, opening hours, and active ads count. Note: all job data (title, description, salary, category, contract type) is already included for every listing from the SERP — this option only adds the seller's shop profile. Private-seller listings are skipped (no shop profile exists). Charges the company-detail-result PPE event ($0.005) per company listing fetched.

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

Total cap across all search queries and URLs.

## `maxResultsPerQuery` (type: `integer`):

Maximum results per individual search keyword or URL.

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

Maximum parallel SERP page fetches.

## Actor input object example

```json
{
  "searchQueries": [
    "cameriere"
  ],
  "location": "lombardia",
  "includeContactPhone": false,
  "includeCompanyDetails": false,
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 3
}
```

# Actor output Schema

## `jobListings` (type: `string`):

Dataset containing scraped Subito.it Lavoro job listings. Each row includes title, company, location (region/city/town/province\_code), employment\_type, sector, salary, phone\_number (when includeContactPhone=true, ~20% fill rate), image\_urls, advertiser details (advertiser\_type, is\_company, shop\_id, shop\_name), visibility flags (is\_urgent, is\_gallery), contact information, business seller profile (advertiser\_logo\_url, advertiser\_verified, advertiser\_google\_rating, advertiser\_address\_full, advertiser\_website, advertiser\_social\_urls, advertiser\_opening\_hours, advertiser\_online\_ads\_count, advertiser\_shop\_url — populated when includeCompanyDetails=true and is\_company=true), and mentioned\_urls.

# 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 = {
    "searchQueries": [
        "cameriere"
    ],
    "includeContactPhone": false,
    "includeCompanyDetails": false,
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/subito-it-jobs-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 = {
    "searchQueries": ["cameriere"],
    "includeContactPhone": False,
    "includeCompanyDetails": False,
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/subito-it-jobs-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 '{
  "searchQueries": [
    "cameriere"
  ],
  "includeContactPhone": false,
  "includeCompanyDetails": false,
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 3
}' |
apify call santamaria-automations/subito-it-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/subito-it-jobs-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/cNuH17ITTOhRfI9wy/builds/bPju0xLhIt630Y6n7/openapi.json
