# Cheapest Subito Lavoro Scraper (`serp.cheap.ofc/cheapest-subito-lavoro-scraper`) Actor

Jobs from 🇮🇹 Subito Lavoro, the leading job board in Italy — full ad text, pay, employer and location, in one flat record per job.

- **URL**: https://apify.com/serp.cheap.ofc/cheapest-subito-lavoro-scraper.md
- **Developed by:** [serp.cheap](https://apify.com/serp.cheap.ofc) (community)
- **Categories:** Jobs, Business
- **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 searches

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

## Cheapest Subito Lavoro Scraper

Every job on **Subito Lavoro** 🇮🇹 (subito.it) — Italy's biggest classifieds site and the jobs section inside it. Ranked #1,342 on the web — bigger reach than any Italian job board with a scraper on the Store.

**No other actor on the Apify Store scrapes this board.**

### What you get

| Field | |
|---|---|
| `title` | Job title |
| `description` | The full ad text as published |
| `company.name` | Advertiser, and whether it is a company or a private individual |
| `location.region / city / district` | Region, town and neighbourhood |
| `employmentType` | Apprendistato, Tempo indeterminato, Stagionale, … |
| `workSchedule` | Full time / Part time |
| `education` | Required qualification |
| `category` | Subito's own job category |
| `published` | When the ad went up |

Fields the board does not publish come back as `null` rather than being dropped, so a dataset you
append to keeps the same shape run after run.

Every search result already carries the **entire ad body**, the contract type, the working hours and the education level, so one search run is usually all you need.

### Modes

**`search`** — give a keyword in Italian (e.g. `magazziniere` — warehouse worker) or leave it empty for the
newest jobs. Set **Max items** to how many you want back.

**`detail`** — paste Subito Lavoro job page URLs and get the full record for each.

**`selftest`** — free health check: one search page, reporting how many jobs parsed. Run it before a
big job if you want to be sure nothing has changed upstream.

### Output

One flat record per job:

```json
{
  "site": "subito",
  "country": "IT",
  "id": "655742966",
  "title": "Magazziniere",
  "url": "https://www.subito.it/offerte-lavoro/magazziniere-padova-655742966.htm",
  "description": "Rinomata Azienda di Albignasego è alla ricerca di una figura …",
  "published": "2026-09-06T18:45:55",
  "updated": null,
  "company": {
    "id": "49650",
    "name": "Autodemolizione Al Ponte",
    "isCompany": true
  },
  "salary": null,
  "location": {
    "country": "Italy",
    "region": "Veneto",
    "city": "Padova",
    "district": "Albignasego",
    "address": null,
    "lat": null,
    "lng": null
  },
  "category": "Acquisti - Logistica - Trasporti",
  "employmentType": "Apprendistato",
  "workSchedule": "Full time",
  "seniority": "Altro",
  "education": "Diploma di Maturita'",
  "tags": []
}
```

### Pricing

Pay per job. **No start fee**, no monthly subscription.

- **$0.003** per job from a search page
- **$0.005** per job page opened on its own (`detail` mode, or **Open every job page**)
- `selftest` is free, and a run that is blocked or finds nothing is never charged

See [PRICING.md](PRICING.md) for how that compares to what other job-board scrapers charge.

#### Free-call limit

Requests that return no billable job — a blocked page, a search that matches nothing, an ad that has been taken down,
and the whole free `selftest` mode — are capped at **300 per run**. Requests that do return jobs you
are charged for never count against it, so a normal run of any size does not come close to the limit.
If a run does reach it, it stops there, keeps and charges everything it had already collected, and
says so in the log.

# Actor input Schema

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

'search' = list jobs by keyword. 'detail' = full job page for URLs you already have. 'selftest' = free health check.

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

Free-text search (job title, role, skill) in Italian — e.g. "magazziniere" (warehouse worker). Leave empty to list the newest jobs.

## `detailUrls` (type: `array`):

For 'detail' mode: full Subito Lavoro job page URLs.

## `detailFollow` (type: `boolean`):

The search listing already carries the entire ad, so opening each job page adds little — leave it off unless you want the advertiser block. Costs one detail charge per job.

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

Cap on jobs returned.

## `concurrency` (type: `integer`):

How many search pages to fetch at once. 4 is a good balance; lower it to 1 if the board starts rate-limiting you.

## `proxyConfiguration` (type: `object`):

Leave the default. The run only reaches for a residential address on the requests that need one.

## `debug` (type: `boolean`):

Verbose per-request logging for troubleshooting.

## Actor input object example

```json
{
  "mode": "search",
  "query": "magazziniere",
  "detailFollow": false,
  "maxItems": 100,
  "concurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "debug": false
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

## `health` (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 = {
    "query": "magazziniere"
};

// Run the Actor and wait for it to finish
const run = await client.actor("serp.cheap.ofc/cheapest-subito-lavoro-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": "magazziniere" }

# Run the Actor and wait for it to finish
run = client.actor("serp.cheap.ofc/cheapest-subito-lavoro-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": "magazziniere"
}' |
apify call serp.cheap.ofc/cheapest-subito-lavoro-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,serp.cheap.ofc/cheapest-subito-lavoro-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/qugpxj55aycWC102Q/builds/kZEve4CxJxh5j35Si/openapi.json
