# Randstad Search Scraper (`jobsapi/randstad-jobs-search-scraper`) Actor

Scrape rich, location-validated job records from Randstad.com using Chrome and the site's structured job data.

- **URL**: https://apify.com/jobsapi/randstad-jobs-search-scraper.md
- **Developed by:** [Jobs API](https://apify.com/jobsapi) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 1,000 job details

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Randstad public jobs scraper

This Apify Actor retrieves complete, source-verified job records from Randstad's public global jobs pages. It uses bounded streaming HTTPS requests and parses the official page's embedded route data, JobPosting JSON-LD, semantic HTML, metadata, and public application link.

The Actor is local-test friendly and fail-closed: it never fabricates missing fields or treats a blocked or failed page as a dataset record; optional Apify Proxy routing is honored when configured.

### Supported modes

- search: query the official jobs collection, follow detail pages, and return complete records.
- single: fetch one exact official Randstad job URL.
- multiple: fetch several exact official Randstad job URLs.
- jobUrls: compatibility alias that maps one URL to single and several URLs to multiple.

Search defaults to:

```
https://www.randstad.com/jobs/q-developer/
```

Direct URLs must use www.randstad.com or randstad.com and end with a numeric job ID. The Actor accepts query, keyword, location, startUrls, jobUrl, jobUrls, jobs, maxItems, maxCandidates, maxPages, timeoutMs, retries, and maxRequests. Optional Apify Proxy configuration is honored; legacy browser and concurrency controls are not exposed.

### Dataset

Every emitted item is a complete record with a stable recordId and verified canonical job URL. Required identity and quality fields include:

- recordId, jobId, title, jobUrl, canonicalUrl
- companyName, companyId, accountId
- location, city, region, country, countryCode, postalCode, coordinates, remote
- employmentType, workingHours, role, industry, sector, specialism
- salary, salaryMin, salaryMax, salaryCurrency, salaryPeriod, benefits
- description, descriptionHtml, headings, sections, bullets, links, responsibilities, requirements, qualifications, skills
- published, modified, and expiration dates
- contact details are recursively redacted from descriptions and embedded source records
- sourceRecord, request receipt, field coverage, data quality, and verification metadata

Unavailable optional values are omitted. Empty strings, nulls, placeholder text, empty arrays, and empty objects are removed. Records are written only after identity, detail, source, HTTP, and minimum-description checks pass.

Run state is written to the local key-value store under RUN\_SUMMARY, RUN\_DIAGNOSTICS, RUN\_METADATA, and RUN\_HEALTH. These records include request receipts, retry counts, blocked-source signals, runtime, and accurate executionEnvironment, localOnly, apifyCallUsed, and apifyPushUsed markers.

### Local commands

Install from the lockfile:

```
npm ci --ignore-scripts --no-audit --no-fund
```

Run static checks and unit tests:

```
npm test
npm run check
```

Run the bounded primary fixture:

```
apify run --purge --input-file INPUT.json
npm run validate
```

The repository also includes INPUT-single.json and INPUT-multiple.json for direct-detail mode checks. Local validation inspects the actual storage/datasets/default records and all four key-value store state files.

### Responsible use

Use only publicly accessible Randstad pages and respect the site's terms, robots guidance, rate limits, and applicable law. This Actor does not bypass authentication, CAPTCHA, paywalls, or access controls.

### Cloud execution and privacy

The Actor runs locally and on Apify, supports optional Apify Proxy routing, caps response bodies and request attempts, and recursively redacts email addresses and phone numbers from emitted records. Use proxy access only when needed and within your authorized budget.

# Actor input Schema

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

Search the official Randstad jobs collection or fetch one or more exact official job URLs.

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

Job title or keyword, for example developer, nurse, or driver.

## `keyword` (type: `string`):

Compatibility alias for query.

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

City, region, country, or postal code. Every returned detail must contain all requested terms.

## `startUrls` (type: `array`):

Optional official Randstad /jobs listing URL for search mode, or exact job URLs in legacy jobUrls mode.

## `jobUrl` (type: `string`):

One official Randstad job URL ending with a numeric job ID.

## `jobUrls` (type: `array`):

Exact official Randstad job URLs for direct detail mode.

## `jobs` (type: `array`):

Exact official Randstad job URL references with optional labels.

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

Maximum complete, verified records to write.

## `maxCandidates` (type: `integer`):

Maximum unique listing candidates to enrich before stopping.

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

Maximum bounded official search pages.

## `timeoutMs` (type: `integer`):

Timeout for each official Randstad request.

## `timeoutSecs` (type: `integer`):

Compatibility alias for timeoutMs.

## `retries` (type: `integer`):

Bounded retries for transient official request failures.

## `maxRequestRetries` (type: `integer`):

Compatibility alias for retries.

## `maxRequests` (type: `integer`):

Hard cap on official listing and detail requests.

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

Optional Apify Proxy configuration for cloud access when the source challenges direct traffic.

## Actor input object example

```json
{
  "mode": "search",
  "query": "developer",
  "startUrls": [
    {
      "url": "https://www.randstad.com/jobs/q-developer/"
    }
  ],
  "jobUrls": [],
  "jobs": [],
  "maxItems": 3,
  "maxCandidates": 30,
  "maxPages": 1,
  "timeoutMs": 20000,
  "timeoutSecs": 20,
  "retries": 2,
  "maxRequests": 60,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

## `runDiagnostics` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("jobsapi/randstad-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("jobsapi/randstad-jobs-search-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 '{}' |
apify call jobsapi/randstad-jobs-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jobsapi/randstad-jobs-search-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/QnvHpPXc7KsMncAnG/builds/58TIdhM7b6b4KC5Do/openapi.json
