# Leforem Jobs Search Scraper (`stealth_mode/leforem-jobs-search-scraper`) Actor

Scrape job listings from Le Forem, Belgium's official Walloon employment service. Extract titles, employer info, contract types, locations, languages, and 16 structured fields per listing — perfect for HR analysts, researchers, and job aggregators.

- **URL**: https://apify.com/stealth\_mode/leforem-jobs-search-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Categories:** Automation, Developer tools, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Le Forem Jobs Scraper: Extract Belgian Job Listings at Scale
 
---

### What Is Le Forem?

Le Forem is the official public employment and vocational training service of Wallonia, Belgium. Its job board publishes thousands of active listings across sectors, contract types, and work regimes — sourced directly from employers and public institutions. Collecting this data manually is impractical at scale. The **Le Forem Jobs Scraper** automates extraction from search result pages, delivering clean, structured records ready for analysis or integration.

---

### Overview

The **Le Forem Jobs Scraper** targets search result pages on `leforem.be` and extracts all visible job listings up to a configurable limit. It is suited for:

- **HR analysts** benchmarking Wallonian labor market demand
- **Researchers** studying employment trends by sector or region
- **Job aggregator developers** ingesting public listings
- **Recruiters** monitoring competitor postings or talent supply

---

### Input Format

```json
{
  "urls": [
    "https://www.leforem.be/recherche-offres/resultat-recherche-offre?&operateur=ET"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 50
}
````

| Field | Type | Description |
|---|---|---|
| `urls` | `array` | One or more Le Forem job search result page URLs. Supports bulk entry. Default prefill points to the general search page with `ET` (AND) operator. |
| `max_items_per_url` | `integer` | Maximum listings scraped per URL. Default: `20`. Set higher (e.g., `50`) for broader collection runs. |
| `ignore_url_failures` | `boolean` | If `true`, the scraper skips failed URLs and continues. Recommended for multi-URL batch runs. Default: `true`. |

> **Tip:** Refine the search URL using Le Forem's filters (sector, location, contract type) before pasting it as input. The scraper collects whatever the search returns.

***

### Output Format

**Sample output**

```json
{
  "id": 1905903,
  "numero": "1905903",
  "titre": "Cuisinier/Cuisinière (H/F/X)",
  "publication": "Publié aujourd'hui",
  "fin": "2026-06-30T00:00:00+02:00",
  "debut": "2026-05-21T00:00:00+02:00",
  "nom_employeur": "OEUVRES MEDICO-SOCIALES DE FAMENNE-ARDENNE - OEUVRES MEDICO-SOCIALE DE FAMENNE-ARDENNE",
  "type_contrat": "Remplacement",
  "regime_travail": "Temps partiel",
  "lieux_travail": [
    "Arrondissement de Marche-en-Famenne",
    "Nassogne"
  ],
  "langues": [
    "FR"
  ],
  "email": "secretariat@cmafa.be",
  "nombre_postes": 1,
  "logo": "27de7b67-31f8-4d60-f881-08deaa72aa50",
  "secteurs_activite": [
    "Activités des aides familiales à domicile, sauf soins à domicile"
  ],
  "is_postulable": true,
  "from_url": "https://www.leforem.be/recherche-offres/resultat-recherche-offre?&operateur=ET&page=1"
}
```

Each job listing returns a record with 16 fields:

#### Identification & Dates

| Field | Meaning |
|---|---|
| `ID` | Internal unique identifier for the listing |
| `Numero` | Le Forem's official job reference number |
| `Titre` | Job title as displayed on the listing |
| `Publication` | Date the listing was published |
| `Debut` | Expected start date of the role |
| `Fin` | Listing expiry / closing date |

#### Job & Contract Details

| Field | Meaning |
|---|---|
| `Type Contrat` | Contract type (e.g., CDI, CDD, interim) |
| `Regime Travail` | Work regime (e.g., full-time, part-time) |
| `Nombre Postes` | Number of open positions for this listing |
| `Is Postulable` | Boolean — whether the listing is currently open for applications |

#### Employer & Location

| Field | Meaning |
|---|---|
| `Nom Employeur` | Name of the hiring employer |
| `Logo` | URL of the employer's logo image |
| `Lieux Travail` | Work location(s) — city or municipality in Wallonia |
| `Secteurs Activite` | Industry/activity sectors associated with the role |

#### Contact & Language

| Field | Meaning |
|---|---|
| `Email` | Contact email for the listing (when provided) |
| `Langues` | Language requirements for the role |

***

### How to Use

1. **Build your search URL** — Go to [leforem.be](https://www.leforem.be/recherche-offres/resultat-recherche-offre), apply filters (sector, location, contract), and copy the results page URL.
2. **Configure input** — Paste the URL into the `urls` array. Adjust `max_items_per_url` based on how many results you need.
3. **Run the scraper** — Start the actor and monitor progress in the run log.
4. **Export** — Download results as JSON, CSV, or Excel.

**Common issues:**

- Ensure the URL points to a **search results page**, not a single job detail page.
- If a URL returns 0 results, verify the search still returns listings in the browser — filters may have changed.

***

### Use Cases & Business Value

- **Labor market analysis:** Track job demand by sector, location, or contract type across Wallonia
- **Compensation research:** Correlate job titles and regimes with market supply data
- **Aggregators:** Sync Le Forem listings into custom platforms or dashboards
- **Policy research:** Analyze public employment trends from an official government source

***

### Conclusion

The **Le Forem Jobs Scraper** provides structured access to Belgium's primary Wallonian job board. With 16 clean output fields and flexible search URL support, it enables rapid, repeatable data collection for any use case involving the Wallonian labor market.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the jobs list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://www.leforem.be/recherche-offres/resultat-recherche-offre?&operateur=ET"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://www.leforem.be/recherche-offres/resultat-recherche-offre?&operateur=ET"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/leforem-jobs-search-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 = {
    "urls": ["https://www.leforem.be/recherche-offres/resultat-recherche-offre?&operateur=ET"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/leforem-jobs-search-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.leforem.be/recherche-offres/resultat-recherche-offre?&operateur=ET"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call stealth_mode/leforem-jobs-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=stealth_mode/leforem-jobs-search-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Leforem Jobs Search Scraper",
        "description": "Scrape job listings from Le Forem, Belgium's official Walloon employment service. Extract titles, employer info, contract types, locations, languages, and 16 structured fields per listing — perfect for HR analysts, researchers, and job aggregators.",
        "version": "0.0",
        "x-build-id": "j4faHrWXMaba9g3eg"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/stealth_mode~leforem-jobs-search-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-stealth_mode-leforem-jobs-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/stealth_mode~leforem-jobs-search-scraper/runs": {
            "post": {
                "operationId": "runs-sync-stealth_mode-leforem-jobs-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/stealth_mode~leforem-jobs-search-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-stealth_mode-leforem-jobs-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "urls": {
                        "title": "URLs of the jobs list urls to scrape",
                        "type": "array",
                        "description": "Add the URLs of the jobs list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ignore_url_failures": {
                        "title": "Continue running even if some URLs fail to be scraped",
                        "type": "boolean",
                        "description": "If true, the scraper will continue running even if some URLs fail to be scraped."
                    },
                    "max_items_per_url": {
                        "title": "Max items per URL",
                        "type": "integer",
                        "description": "The maximum number of items to scrape per URL."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
