# Randstad Belgium Scraper — Staffing Agency Job Listings (`studio-amba/randstad-scraper`) Actor

Scrape job listings from Randstad Belgium, the world's largest staffing agency. Search by keyword in English, Dutch or French. No login or cookies required.

- **URL**: https://apify.com/studio-amba/randstad-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

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 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

## Randstad Belgium Scraper

Extract job listings from [Randstad Belgium](https://www.randstad.be), the Belgian arm of the world's largest staffing agency, as clean structured JSON. Search by keyword, pick your language, and get job titles, locations, employment type, posting dates and description excerpts in one run.

No login. No cookies. No browser automation. The actor reads the same server-rendered job data the Randstad Belgium website embeds on its search page, so it is fast and stable.

### What this actor does

Given a search keyword, this actor collects the matching job listings from Randstad Belgium and returns one row per job with:

- Job title
- Hiring company (Randstad, plus the end client when disclosed)
- Location (city, province)
- Language of the posting (English, Dutch or French)
- Employment type (contract type and working hours)
- Posting date
- A 300–400 character description excerpt
- The job's unique ID and direct URL

Randstad Belgium publishes listings in Dutch, French and English. You can search with keywords in any of the three languages and choose which language version of the site to crawl.

### Why use it

- **Staffing market research** — track what roles Belgium's largest staffing agency is placing, and where.
- **Recruitment and sourcing** — build a live feed of temp and permanent positions for a role or region.
- **Competitive intelligence** — compare Randstad's open roles against VDAB, Le Forem and Actiris public listings.
- **Aggregators and job boards** — feed Belgian staffing-agency listings into your own product.

### How to scrape Randstad data

1. Open the actor and set a **Search Query** (for example `warehouse`, `magazijnier`, `comptable` or `logistiek`).
2. Optionally set a **Location filter** such as `Antwerp`, `Brussels` or `Liège` to narrow results to that city or province.
3. Pick a **Language** (`en`, `nl` or `fr`) — this selects which language version of the Randstad Belgium site to crawl.
4. Set **Max Results** (up to 30 per run — see Limitations).
5. Leave the proxy on the default Belgian residential setting and click **Start**.

The actor fetches the Randstad Belgium search page for your query and language, extracts the job data embedded in the page, applies your location filter if set, and writes everything to the dataset. You can export the result as JSON, CSV or Excel.

### Input

| Field | Type | Description |
|-------|------|-------------|
| `searchQuery` | string | Keyword to search for. English, Dutch or French all work. Default: `warehouse`. |
| `location` | string | Optional city or province filter, applied client-side (e.g. `Antwerp`, `Liège`). |
| `language` | string | Site language to crawl: `en`, `nl` or `fr`. Default: `en`. |
| `maxResults` | integer | Maximum number of listings to return (max 30 — see Limitations). Default: `30`. |
| `proxyConfiguration` | object | Apify proxy settings. Default: Belgian residential. |

#### Example input

```json
{
    "searchQuery": "warehouse",
    "location": "Antwerp",
    "language": "en",
    "maxResults": 30,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "BE"
    }
}
```

### Output

Each dataset item looks like this:

```json
{
    "title": "Sewer",
    "company": "Randstad",
    "locationRaw": "Ronse, East Flanders",
    "locationParsed": { "city": "Ronse", "country": "Belgium" },
    "language": "en",
    "postedAt": "2026-08-04T13:56:13.636546466Z",
    "descriptionSnippet": "Are you looking for a stable job with daytime hours at a top company in Ronse? As a sewer, you will manufacture industrial insulation jackets using a sewing machine and enjoy a wage of €14.4939, meal vouchers, and an option for a permanent contract...",
    "url": "https://www.randstad.be/en/candidates/jobs/sewer_ronse_5c298002-967d-47ca-b556-313982d6f0ed/",
    "employmentType": "Permanent, Full-Time",
    "source": "randstad.be",
    "scrapedAt": "2026-08-04T17:16:12.303Z",
    "jobId": "5c298002-967d-47ca-b556-313982d6f0ed",
    "category": "Goods And Materials Production"
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `title` | string | Job title |
| `company` | string | Hiring company as posted — Randstad itself unless a client is disclosed |
| `clientCompany` | string | Randstad's end client, when disclosed on the listing |
| `locationRaw` | string | Location as shown on the listing |
| `locationParsed` | object | `{ city, country }` |
| `language` | string | ISO 639-1 language code of the posting (`en`, `nl` or `fr`) |
| `postedAt` | string | ISO 8601 posting timestamp |
| `descriptionSnippet` | string | 300–400 character plain-text excerpt of the description |
| `url` | string | Full job listing URL |
| `employmentType` | string | Contract type and working hours |
| `salaryRaw` | string | Raw salary data, when disclosed (rare) |
| `source` | string | Source site identifier (`randstad.be`) |
| `scrapedAt` | string | ISO 8601 timestamp of collection |
| `jobId` | string | Unique Randstad job identifier |
| `category` | string | Randstad's internal job classification category |

### Cost estimate

This actor makes a single lightweight HTTP request per run — no browser, no per-item detail fetches. Runs finish in a few seconds; cost is dominated by proxy traffic for one page load plus the per-result charge. Usage is only charged after a run finishes with status SUCCEEDED — a failed or aborted run doesn't bill for partial results.

### Limitations

- **Belgium only.** Randstad's country sites run on different platforms — Belgium uses a modern Next.js app that embeds job data directly in the page; the Netherlands uses a separate Angular widget; Germany and France run their own React apps with no equivalent embedded data. A single multi-country actor isn't feasible without separately reverse-engineering each country's platform, so this actor covers Belgium only.
- **Up to 30 results per query.** Randstad Belgium's search page renders a fixed batch of results with no working server-side pagination parameter (page/offset/pageNumber query params were all tested live and had no effect). Run multiple searches with different keywords for broader coverage.
- **Location filtering is client-side.** Randstad's search page does not expose a working location query parameter, so the `location` input filters the fetched results by substring match rather than querying the site directly.
- **Salary is rarely disclosed.** Most Randstad Belgium listings don't publish pay rates; `salaryRaw` is empty for the large majority of jobs.

### Related scrapers

Building a European staffing and public-employment dataset? These sibling actors follow the same clean-JSON approach:

- **VDAB Scraper** — Flemish public employment service
- **Le Forem Scraper** — Walloon public employment service
- **Actiris Scraper** — Brussels public employment service
- **StepStone Scraper** — Belgian commercial job board
- **Jobat Scraper** — Belgian job board

### Disclaimer

This actor collects publicly available data from Randstad Belgium for legitimate research and aggregation use. Respect Randstad's terms of service and applicable data protection law when using the output.

# Actor input Schema

## `searchQuery` (type: `string`):

Keyword to search for (e.g. 'warehouse', 'magazijnier', 'comptable', 'logistiek'). Randstad Belgium is trilingual — English, Dutch or French keywords all work.

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

Optional city or province to filter results by (e.g. 'Antwerp', 'Brussels', 'Liège'). Applied client-side after fetching — Randstad's search page does not expose a working server-side location parameter.

## `language` (type: `string`):

Site language to crawl. Randstad Belgium publishes jobs in Dutch, French and English depending on region — pick the language matching your target audience.

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

Maximum number of job listings to return. Randstad Belgium's search page renders a fixed set of up to 30 results per query with no working pagination parameter — run multiple searches with different keywords for broader coverage.

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

Proxy settings. A Belgian residential proxy is recommended for reliability.

## Actor input object example

```json
{
  "searchQuery": "warehouse",
  "language": "en",
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BE"
  }
}
```

# 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 = {
    "searchQuery": "warehouse",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "BE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/randstad-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 = {
    "searchQuery": "warehouse",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "BE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/randstad-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 '{
  "searchQuery": "warehouse",
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BE"
  }
}' |
apify call studio-amba/randstad-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Ugxvitu1c7WViR4t7/builds/LGMyIFKadIWLtkmW6/openapi.json
