# Randstad.nl Jobs \[Only $1] Scraper (`memo23/randstad-nl-scraper`) Actor

Extract job data from Randstad.nl including job titles, salaries, locations, contact details, company info, work hours, contract types, education requirements, and full descriptions. Get structured data with metadata, benefits, and application details for market research and recruitment.

- **URL**: https://apify.com/memo23/randstad-nl-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Jobs, Automation, Lead generation
- **Stats:** 12 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.00 / 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.

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

## Randstad.nl Job Scraper

### How it works

This actor allows you to scrape job listings from Randstad.nl (https://www.randstad.nl/vacatures) and extract important details such as job title, company, location, salary, contact information, benefits, and other relevant data. The scraper is designed to help you gather comprehensive data on job vacancies posted by Randstad in the Netherlands, which can be useful for job market research, recruitment, or analyzing employment trends.

### Features

- **Flexible URL-Based Search:** Simply provide Randstad.nl search URLs with your desired filters
- **Advanced Filtering Support:** The scraper automatically handles all Randstad.nl filter parameters including:
  - **Keyword Search:** Search for specific job titles or keywords (`zoekterm`)
  - **Location:** Filter jobs by location (`locatie`)
  - **Distance:** Search radius from location (`afstand`)
  - **Contract Type:** Multiple contract types (Detachering, Tijdelijk, Vast, etc.) (`soortdienstverband`)
  - **Hours per Week:** Multiple hour ranges (0-8, 9-16, 17-24, 25-32, 33-40, 40+ hours) (`urenperweek`)
  - **Education Levels:** Filter by education levels (Geen, Basisonderwijs, VMBO, MBO, HBO, WO, etc.) (`opleidingsniveau`)
  - **Work Experience:** Filter by required experience (`werkervaring`)
  - **Languages:** Filter by required languages (`taal`)
  - **Driving License:** Filter by required driving license types (`rijbewijs`)
  - **Working Hours:** Office hours or shift work (`werktijden`)
  - **Job Field:** Filter by job sector/field (Techniek, Administratief, Financieel, etc.) (`vakgebied`)
  - **Country:** Filter jobs by country (`land`)
- **Multi-Value Filter Support:** Handles multiple selections for the same filter (e.g., multiple hour ranges, multiple job fields)
- **Direct Job Detail URLs:** Can scrape individual job posting pages directly

### How to Use

1. **Set Up:** Ensure you have an Apify account and access to the Apify platform.
2. **Get Search URLs:** Go to [Randstad.nl](https://www.randstad.nl/vacatures) and apply your desired filters (keyword, location, contract type, hours, etc.). Copy the resulting URL(s).
3. **Configure Input:** Add your Randstad.nl search URLs to the `startUrls` array in the actor input.
4. **Configure Proxy Settings:** (Optional) For enhanced reliability, configure proxy settings.
5. **Run the Scraper:** Execute the scraper and obtain the extracted data in your preferred format, such as JSON, CSV, Excel, or others as supported by Apify.

### Input Data

Here's an example of how to set up a job search:

```json
{
    "startUrls": [
        "https://www.randstad.nl/vacatures?afstand=20&zoekterm=development&locatie=",
        "https://www.randstad.nl/vacatures?afstand=20&zoekterm=sales&locatie=amsterdam",
        "https://www.randstad.nl/vacatures?afstand=20&zoekterm=manager&locatie=&soortdienstverband=Vast&urenperweek=37%20-%2040%2B%20uur",
        "https://www.randstad.nl/vacatures/713431/orderpicker-fulltime-3-shifts"
    ],
    "maxItems": 20,
    "maxConcurrency": 50,
    "minConcurrency": 1,
    "maxRequestRetries": 100,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
}
````

### Input Options

#### Required Parameters

- **Start URLs** (`startUrls`): Array of Randstad.nl URLs to scrape. Can include:
  - Search result pages with filters: `https://www.randstad.nl/vacatures?afstand=20&zoekterm=development&locatie=amsterdam`
  - Direct job detail pages: `https://www.randstad.nl/vacatures/713431/orderpicker-fulltime-3-shifts`

#### URL Filter Parameters

When creating search URLs on Randstad.nl, you can use the following filter parameters:

- **Keyword** (`zoekterm`): Search keyword (e.g., 'development', 'sales', 'manager')
- **Location** (`locatie`): City or region name (e.g., 'amsterdam', 'rotterdam')
- **Distance** (`afstand`): Search radius in kilometers (e.g., '20', '50')
- **Contract Type** (`soortdienstverband`): Can have multiple values:
  - `Detachering` - Secondment
  - `Tijdelijk` - Temporary
  - `Vast` - Permanent
  - `Mogelijk vast` - Possibly permanent
- **Hours per Week** (`urenperweek`): Can have multiple values:
  - `0 - 8 uur`
  - `9 - 16 uur`
  - `17 - 24 uur`
  - `25 - 32 uur`
  - `33 - 36 uur`
  - `37 - 40+ uur`
- **Education Level** (`opleidingsniveau`): Can have multiple values:
  - `Geen` - None
  - `Basisonderwijs` - Primary education
  - `VMBO` - Pre-vocational secondary education
  - `MBO` - Secondary vocational education
  - `HBO` - Higher professional education
  - `WO` - University education
- **Work Experience** (`werkervaring`): Required years of experience
- **Language** (`taal`): Required language skills
- **Driving License** (`rijbewijs`): Required driving license types (A, B, C, CE, etc.)
- **Working Hours** (`werktijden`): Shift type (office hours, shift work, etc.)
- **Job Field** (`vakgebied`): Can have multiple values:
  - `Techniek` - Technical
  - `Administratief` - Administrative
  - `Financieel` - Financial
  - `Personeel & Organisatie` - HR & Organization
  - `Beveiliging` - Security
  - `Schoonmaak` - Cleaning
  - `Webcare` - Web care
  - And many more...
- **Country** (`land`): Country code (NL, BE, DE, etc.)

#### Scraper Configuration

- **Max Items** (`maxItems`): Maximum number of job listings that will be scraped. Default is `20`.
- **Max Concurrency** (`maxConcurrency`): Maximum number of pages that can be processed at the same time. Default is `50`.
- **Min Concurrency** (`minConcurrency`): Minimum number of pages that will be processed at the same time. Default is `1`.
- **Max Request Retries** (`maxRequestRetries`): Number of times the scraper will retry a failed request before giving up. Default is `100`.
- **Proxy Configuration** (`proxy`): Specifies proxy servers that will be used by the scraper to hide its origin, ensuring greater reliability and anonymity. For more details, see the [Proxy configuration](https://apify.com/apify/web-scraper#proxy-configuration).

### Output Structure

The output data typically includes:

```json
{
  "vacancyNumber": "684048",
  "title": "Junior Sales Executive",
  "datePosted": "2025-05-02",
  "validThrough": "2026-02-22",
  "educationRequirements": "MBO",
  "experienceRequirements": "Minimaal 0 jaar relevante werkervaring",
  "workHours": "40 uur per week",
  "skills": "",
  "industry": "Commercieel / Verkoop",
  "description": "<p>Wil jij werken bij de grootste kantoorfruitleverancier van de Benelux binnen een jong en gemotiveerd team? Ben je op zoek naar een uitdagende startersbaan in de sales waar je veel verantwoordelijkheid krijgt? Dan is de functie Junior Sales Executive iets voor jou! Wij groeien snel en zijn daarom per direct op zoek naar enthousiaste en zelfverzekerde sales talenten die ons team in Amsterdam komen versterken!</p>\n<strong class=\"vacancy_subheader\">wat bieden wij jou</strong>\n<br>\n<ul class=\"vacancy-benefits\">\n <li class=\"benefit-rnl-reward\">‘Sky is the limit’ bonusregeling</li>\n <li class=\"benefit-rnl-contract\">Direct op contract bij Fruitful Office</li>\n <li class=\"benefit-rnl-development\">Internationale sales ervaring op doen</li>\n <li class=\"benefit-rnl-location\">Joan Muyskenweg 32A</li>\n <li class=\"benefit-rnl-fun\">Werken in een leuk en jong team</li>\n <li class=\"benefit-rnl-employer\">Training en persoonlijke begeleiding</li>\n</ul>\n<strong class=\"vacancy_subheader\">wie ben jij</strong>\n<br>\n<p>Als Junior Sales Executive bij Fruitful Office ga jij je richten op de markt in de Benelux. Jij bent de eerste schakel tussen de klant en onze service. Je benadert prospects, adviseert hen en sluit deals. Met jouw scherpe inzicht speel je feilloos in op de behoefte van de klant en begeleid je het salestraject van A tot Z.</p>\n<ul class=\"vacancy-bullets\">\n <li>Je hebt een afgeronde HBO opleiding met maximaal 2 jaar werkervaring (saleservaring is een pré, maar niet noodzakelijk);</li>\n <li>Je hebt een uitstekende beheersing van de Nederlandse, Engelse en Franse taal</li>\n <li>Je bent flexibel, sociaal en sales driven;</li>\n <li>Je bent in het bezit van rijbewijs B;</li>\n <li>Je bent woonachtig in of rondom Amsterdam;</li>\n <li>Je staat volledig achter de visie van Fruitful Office en gelooft in een gezonde levensstijl;</li>\n <li>Je weet je goed staande te houden in hectische situaties, bent zelfverzekerd en staat open voor constructieve feedback;</li>\n <li>Klant- en oplossingsgericht met een positieve instelling.</li>\n</ul>\n<strong class=\"vacancy_subheader\">wat ga je doen</strong>\n<br>\n<p>Dagelijks houd je je bezig met telefonische acquisitie, het opvolgen van leads en het versturen van offertes. Daarnaast ga je geregeld op afspraak bij klanten om hen persoonlijk te adviseren en deals te sluiten. Een uitdagende rol waarin je veel verantwoordelijkheid krijgt en jezelf snel kunt ontwikkelen!</p>\n<ul class=\"vacancy-bullets\">\n <li>Richten op de markt in de Benelux als eerste schakel tussen klant en service;</li>\n <li>Benaderen, adviseren en sluiten van deals met prospects;</li>\n <li>Verantwoordelijkheid voor het gehele salestraject van A tot Z;</li>\n <li>Dagelijkse taken: telefonische acquisitie, opvolgen van leads, versturen van offertes en afspraken bij klanten;</li>\n <li>Actief op zoek naar nieuwe prospects en samenwerkingen;</li>\n <li>Werken met een beschikbare database van leads;</li>\n <li>Kansen voor ontwikkeling door trainingen en begeleiding.</li>\n</ul>\n<strong class=\"vacancy_subheader\">waar ga je werken</strong>\n<br>\n<p>Fruitful Office is de #1 fruitleverancier voor bedrijven in de Benelux. Als specialist in het bezorgen van kantoorfruit voorzien wij al meer dan 3.500 bedrijven van een gezonde dosis dagelijkse vitaminen. Ons fruit is vers, lokaal en seizoensgebonden en bij alles wat wij doen besteden we aandacht aan duurzaamheid. Daarnaast zetten wij ons in voor verschillende maatschappelijke projecten zoals Ripple Africa, Emma at Work en de Voedselbank.</p>\n<ul class=\"vacancy-bullets\">\n <li>Een goed salaris + ‘sky is the limit’ bonusregeling (€36.500 OTE per jaar);</li>\n <li>Training en persoonlijke begeleiding;</li>\n <li>De mogelijkheid om internationale sales ervaring op te doen;</li>\n <li>Werken in een leuk en jong team met veel verantwoordelijkheid;</li>\n <li>Onbeperkt fruit op kantoor!</li>\n</ul>\n<strong class=\"vacancy_subheader\">sollicitatie</strong>\n<br>\n<p>Als je binnen het plaatje past komt er een telefonische intake. Hierna volgen interviews (maximaal 2) met Fruitful Office zelf.<br><br>Klinkt deze functie jou als muziek in de oren? Twijfel niet en solliciteer snel!</p>",
  "responsibilities": "<p>Wil jij werken bij de grootste kantoorfruitleverancier van de Benelux binnen een jong en gemotiveerd team? Ben je op zoek naar een uitdagende startersbaan in de sales waar je veel verantwoordelijkheid krijgt? Dan is de functie Junior Sales Executive iets voor jou! Wij groeien snel en zijn daarom per direct op zoek naar enthousiaste en zelfverzekerde sales talenten die ons team in Amsterdam komen versterken!</p>\n<strong class=\"vacancy_subheader\">wat bieden wij jou</strong>\n<br>\n<ul class=\"vacancy-benefits\">\n <li class=\"benefit-rnl-reward\">‘Sky is the limit’ bonusregeling</li>\n <li class=\"benefit-rnl-contract\">Direct op contract bij Fruitful Office</li>\n <li class=\"benefit-rnl-development\">Internationale sales ervaring op doen</li>\n <li class=\"benefit-rnl-location\">Joan Muyskenweg 32A</li>\n <li class=\"benefit-rnl-fun\">Werken in een leuk en jong team</li>\n <li class=\"benefit-rnl-employer\">Training en persoonlijke begeleiding</li>\n</ul>\n<strong class=\"vacancy_subheader\">wie ben jij</strong>\n<br>\n<p>Als Junior Sales Executive bij Fruitful Office ga jij je richten op de markt in de Benelux. Jij bent de eerste schakel tussen de klant en onze service. Je benadert prospects, adviseert hen en sluit deals. Met jouw scherpe inzicht speel je feilloos in op de behoefte van de klant en begeleid je het salestraject van A tot Z.</p>\n<ul class=\"vacancy-bullets\">\n <li>Je hebt een afgeronde HBO opleiding met maximaal 2 jaar werkervaring (saleservaring is een pré, maar niet noodzakelijk);</li>\n <li>Je hebt een uitstekende beheersing van de Nederlandse, Engelse en Franse taal</li>\n <li>Je bent flexibel, sociaal en sales driven;</li>\n <li>Je bent in het bezit van rijbewijs B;</li>\n <li>Je bent woonachtig in of rondom Amsterdam;</li>\n <li>Je staat volledig achter de visie van Fruitful Office en gelooft in een gezonde levensstijl;</li>\n <li>Je weet je goed staande te houden in hectische situaties, bent zelfverzekerd en staat open voor constructieve feedback;</li>\n <li>Klant- en oplossingsgericht met een positieve instelling.</li>\n</ul>\n<strong class=\"vacancy_subheader\">wat ga je doen</strong>\n<br>\n<p>Dagelijks houd je je bezig met telefonische acquisitie, het opvolgen van leads en het versturen van offertes. Daarnaast ga je geregeld op afspraak bij klanten om hen persoonlijk te adviseren en deals te sluiten. Een uitdagende rol waarin je veel verantwoordelijkheid krijgt en jezelf snel kunt ontwikkelen!</p>\n<ul class=\"vacancy-bullets\">\n <li>Richten op de markt in de Benelux als eerste schakel tussen klant en service;</li>\n <li>Benaderen, adviseren en sluiten van deals met prospects;</li>\n <li>Verantwoordelijkheid voor het gehele salestraject van A tot Z;</li>\n <li>Dagelijkse taken: telefonische acquisitie, opvolgen van leads, versturen van offertes en afspraken bij klanten;</li>\n <li>Actief op zoek naar nieuwe prospects en samenwerkingen;</li>\n <li>Werken met een beschikbare database van leads;</li>\n <li>Kansen voor ontwikkeling door trainingen en begeleiding.</li>\n</ul>\n<strong class=\"vacancy_subheader\">waar ga je werken</strong>\n<br>\n<p>Fruitful Office is de #1 fruitleverancier voor bedrijven in de Benelux. Als specialist in het bezorgen van kantoorfruit voorzien wij al meer dan 3.500 bedrijven van een gezonde dosis dagelijkse vitaminen. Ons fruit is vers, lokaal en seizoensgebonden en bij alles wat wij doen besteden we aandacht aan duurzaamheid. Daarnaast zetten wij ons in voor verschillende maatschappelijke projecten zoals Ripple Africa, Emma at Work en de Voedselbank.</p>\n<ul class=\"vacancy-bullets\">\n <li>Een goed salaris + ‘sky is the limit’ bonusregeling (€36.500 OTE per jaar);</li>\n <li>Training en persoonlijke begeleiding;</li>\n <li>De mogelijkheid om internationale sales ervaring op te doen;</li>\n <li>Werken in een leuk en jong team met veel verantwoordelijkheid;</li>\n <li>Onbeperkt fruit op kantoor!</li>\n</ul>\n<strong class=\"vacancy_subheader\">sollicitatie</strong>\n<br>\n<p>Als je binnen het plaatje past komt er een telefonische intake. Hierna volgen interviews (maximaal 2) met Fruitful Office zelf.<br><br>Klinkt deze functie jou als muziek in de oren? Twijfel niet en solliciteer snel!</p>",
  "salary": {
      "currency": "EUR",
      "unitText": "HOUR"
  },
  "employmentType": [
      "FULL_TIME"
  ],
  "hiringOrganization": {
      "name": "Randstad",
      "website": "https://www.randstad.nl",
      "logo": "https://static.randstadgroep.nl/randstad/images/randstad_logo.png"
  },
  "jobLocation": {
      "streetAddress": "",
      "postalCode": "1114 AN",
      "addressLocality": "Amsterdam",
      "addressRegion": "Amsterdam",
      "addressCountry": "NL"
  },
  "contact": {
      "name": "Felix, Florine en Suzanne",
      "title": "Intercedenten",
      "phone": "020 520 8800",
      "email": "amsterdam.zuidwest@nl.randstad.com",
      "message": "Vragen over deze vacature of functie? Bel ons!"
  },
  "benefits": [],
  "sections": {
      "whoYouAre": "",
      "whatWillYouDo": "",
      "whereWillYouWork": "",
      "apply": ""
  },
  "metadata": {
      "vacancyVersion": "3",
      "textAnalysisScore": "64.734",
      "textReadingLevel": "B2",
      "listingType": "regular",
      "expectedEndDate": "2026-02-22",
      "jobUnit": "RRL-U6270",
      "jobCodeMondriaan": "4xwtg7zhh5abnm24gxs2qhlq7h",
      "jobNaamMondriaan": "Sales support medewerker",
      "jobWerkErvaring": "0.0",
      "jobDienstverband": "Vast",
      "yachtVacature": "nee",
      "vdpVideo": "nee",
      "bedrijfsNummer": "C-NL-0d719e8d-da2c-4838-9906-f73c6af42a3e",
      "companyName": "Fruitful Office",
      "metaDescription": "Wij zijn op zoek naar een Junior Sales Executive in Amsterdam voor 40 uur uur bij Fruitful Office",
      "ogTitle": "Junior Sales Executive Amsterdam",
      "ogDescription": "Wij zijn op zoek naar een Junior Sales Executive in Amsterdam voor 40 uur uur bij Fruitful Office",
      "canonicalUrl": "https://www.randstad.nl/vacatures/684048/junior-sales-executive"
  },
  "url": "https://www.randstad.nl/vacatures/684048/junior-sales-executive",
  "basicInfo": {
      "opco": "RANDSTAD",
      "rnlVacancy": true,
      "ttgVacancy": false,
      "ygnVacancy": false,
      "ygnItVacancy": false,
      "title": "Junior Sales Executive",
      "languageCode": null,
      "meta": {
          "hours": "40 uur",
          "external": false,
          "employmentTypeSchemaOrg": "\"FULL_TIME\"",
          "education": "MBO",
          "workday": "5 dagen per week",
          "salaryTimeUnitSchemaOrg": "HOUR",
          "salarySchemaOrg": "14.53",
          "location": "Amsterdam",
          "salary": "14,53",
          "salaryTimeUnit": "uur"
      },
      "date": "02 mei 2025",
      "summary": "Wil jij werken bij de grootste kantoorfruitleverancier van de Benelux binnen een jong en gemotiveerd team? Ben je op zoek naar een uitdagende startersbaan in de <span class=\"highlight\">sales</span> waar je veel verantwoordelijkheid krijgt? Dan is de functie Junior <span class=\"highlight\">Sales</span> Executive iets voor jou! Wij groeien snel en zijn daarom per direct op zoek naar enthousiaste en zelfverzekerde <span class=\"highlight\">sales</span> talenten die ons team in Amsterdam ...",
      "appetizer": "",
      "detailUrl": "/vacatures/684048/junior-sales-executive",
      "sollicitatieUrl": null,
      "student": false,
      "logoUrl": null,
      "companyLogoId": null,
      "saved": false,
      "showOnline": false,
      "vacancyNumber": "684048",
      "canonicalUrl": null,
      "vacancyUnitNr": 0,
      "vacancyUnitCode": "RRL-U6270",
      "videoUrl": null,
      "videoTitle": null,
      "youtubeId": null,
      "workLocation": null,
      "contractType": [
          {
              "value": "V",
              "description": "Vast"
          }
      ],
      "industries": null,
      "validThroughDate": null,
      "experienceRequirements": null,
      "recommendedVacancy": false,
      "permanentEmployment": true,
      "workFromHome": false,
      "salesforceFormId": null,
      "salesforceKillerQuestion": null,
      "legacyModel": false,
      "recruiter": null,
      "company": "Fruitful Office",
      "companyId": null,
      "globalClientId": null,
      "educationLevel": null,
      "functionDetails": null
  }
}
```

### Output Fields Explanation

#### Main Job Information

- `vacancyNumber`: Unique vacancy number/ID for the job posting.
- `title`: Job title/position name.
- `datePosted`: Date when the job was posted (format: YYYY-MM-DD).
- `validThrough`: Date until which the job posting is valid (format: YYYY-MM-DD).
- `educationRequirements`: Required education level (e.g., "MBO", "HBO", "WO").
- `experienceRequirements`: Required work experience description.
- `workHours`: Working hours per week (e.g., "40 uur per week").
- `skills`: Required skills for the position.
- `industry`: Industry/sector category (e.g., "Commercieel / Verkoop").
- `description`: Full HTML description of the job vacancy including benefits, requirements, and responsibilities.
- `responsibilities`: Detailed HTML description of job responsibilities and requirements.
- `url`: Direct URL to the job posting on Randstad.nl.

#### Salary Information

- `salary`: Object containing salary details:
  - `currency`: Currency code (e.g., "EUR").
  - `unitText`: Time unit for salary (e.g., "HOUR", "MONTH", "YEAR").

#### Employment Details

- `employmentType`: Array of employment types (e.g., \["FULL\_TIME"], \["PART\_TIME"]).

#### Hiring Organization

- `hiringOrganization`: Object containing recruiter/agency information:
  - `name`: Name of the hiring organization (typically "Randstad").
  - `website`: Website URL of the hiring organization.
  - `logo`: Logo URL of the hiring organization.

#### Job Location

- `jobLocation`: Object with work location details:
  - `streetAddress`: Street address of the job location.
  - `postalCode`: Postal code of the work location.
  - `addressLocality`: City/locality name.
  - `addressRegion`: Region/province name.
  - `addressCountry`: Country code (e.g., "NL").

#### Contact Information

- `contact`: Object containing contact details:
  - `name`: Name(s) of the contact person(s).
  - `title`: Job title of the contact person (e.g., "Intercedenten").
  - `phone`: Contact phone number.
  - `email`: Contact email address.
  - `message`: Additional contact message or instructions.

#### Benefits and Sections

- `benefits`: Array of job benefits and perks.
- `sections`: Object containing structured job description sections:
  - `whoYouAre`: Section describing ideal candidate profile.
  - `whatWillYouDo`: Section describing job responsibilities.
  - `whereWillYouWork`: Section describing the workplace/company.
  - `apply`: Section with application instructions.

#### Metadata

- `metadata`: Object containing additional job posting metadata:
  - `vacancyVersion`: Version number of the vacancy posting.
  - `textAnalysisScore`: Text quality/analysis score.
  - `textReadingLevel`: Reading level of the job description (e.g., "B2").
  - `listingType`: Type of listing (e.g., "regular").
  - `expectedEndDate`: Expected end date of the posting.
  - `jobUnit`: Randstad unit/branch code.
  - `jobCodeMondriaan`: Internal job code in Mondriaan system.
  - `jobNaamMondriaan`: Job name in Mondriaan system.
  - `jobWerkErvaring`: Required work experience in years.
  - `jobDienstverband`: Contract type (e.g., "Vast", "Tijdelijk").
  - `yachtVacature`: Indicates if it's a Yacht (Randstad subsidiary) vacancy.
  - `vdpVideo`: Indicates if the vacancy has a video.
  - `bedrijfsNummer`: Company number/ID.
  - `companyName`: Name of the client company.
  - `metaDescription`: SEO meta description.
  - `ogTitle`: Open Graph title for social sharing.
  - `ogDescription`: Open Graph description for social sharing.
  - `canonicalUrl`: Canonical URL of the job posting.

#### Basic Information Summary

- `basicInfo`: Object containing summarized job information:
  - `opco`: Operating company (e.g., "RANDSTAD").
  - `rnlVacancy`: Boolean indicating if it's a Randstad.nl vacancy.
  - `ttgVacancy`: Boolean indicating if it's a Tempo-Team vacancy.
  - `ygnVacancy`: Boolean indicating if it's a Yacht vacancy.
  - `ygnItVacancy`: Boolean indicating if it's a Yacht IT vacancy.
  - `title`: Job title.
  - `languageCode`: Language code of the posting.
  - `meta`: Object with additional metadata:
    - `hours`: Working hours description.
    - `external`: Boolean indicating if it's an external posting.
    - `employmentTypeSchemaOrg`: Schema.org employment type.
    - `education`: Required education level.
    - `workday`: Working days description.
    - `salaryTimeUnitSchemaOrg`: Schema.org salary time unit.
    - `salarySchemaOrg`: Salary amount in Schema.org format.
    - `location`: Job location.
    - `salary`: Formatted salary amount.
    - `salaryTimeUnit`: Salary time unit (e.g., "uur", "maand").
  - `date`: Posting date in readable format.
  - `summary`: Short summary/excerpt of the job description.
  - `appetizer`: Additional teaser text.
  - `detailUrl`: Relative URL to job detail page.
  - `sollicitatieUrl`: Application URL, if applicable.
  - `student`: Boolean indicating if it's a student position.
  - `logoUrl`: Company logo URL.
  - `companyLogoId`: Company logo ID.
  - `saved`: Boolean indicating if the job is saved (user-specific).
  - `showOnline`: Boolean indicating online visibility.
  - `vacancyNumber`: Vacancy number.
  - `canonicalUrl`: Canonical URL.
  - `vacancyUnitNr`: Vacancy unit number.
  - `vacancyUnitCode`: Vacancy unit code.
  - `videoUrl`: Video URL, if available.
  - `videoTitle`: Video title, if available.
  - `youtubeId`: YouTube video ID, if available.
  - `workLocation`: Work location details.
  - `contractType`: Array of contract type objects with value and description.
  - `industries`: Array of industry categories.
  - `validThroughDate`: Validity end date.
  - `experienceRequirements`: Experience requirements.
  - `recommendedVacancy`: Boolean indicating if it's a recommended vacancy.
  - `permanentEmployment`: Boolean indicating permanent employment.
  - `workFromHome`: Boolean indicating work-from-home option.
  - `salesforceFormId`: Salesforce form ID, if applicable.
  - `salesforceKillerQuestion`: Salesforce killer question, if applicable.
  - `legacyModel`: Boolean indicating legacy data model.
  - `recruiter`: Recruiter information.
  - `company`: Client company name.
  - `companyId`: Company ID.
  - `globalClientId`: Global client ID.
  - `educationLevel`: Education level details.
  - `functionDetails`: Function/role details.

### Explore More Scrapers

If you found this Randstad.nl Job Scraper useful, be sure to check out our other powerful scrapers and actors at [memo23's Apify profile](https://apify.com/memo23). We offer a wide range of tools to enhance your web scraping and automation needs across various platforms and use cases.

### Support

- For issues or feature requests, please use the [Issues](https://console.apify.com/actors/N8nzMzfQq5b1Nu0At/issues) section of this actor.
- If you need customization or have questions, feel free to contact the author:
  - Author's website: <https://muhamed-didovic.github.io/>
  - Email: <muhamed.didovic@gmail.com>

### Additional Services

- Request customization or whole dataset: <muhamed.didovic@gmail.com>
- If you need anything else scraped, or this actor customized, email: <muhamed.didovic@gmail.com>
- For API services of this scraper (no Apify fee, just usage fee for the API), contact: <muhamed.didovic@gmail.com>
- Email: muhamed.didovic@gmail.com

# Actor input Schema

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

URLs to start with.

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

Maximum number of listings/items that will be scraped.

## `enrichEmails` (type: `boolean`):

If enabled, tries to find a contact email for each hiring company by discovering its website (Clearbit) and reading its contact/about pages. Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort, billed per contact email found; only charged when an email is returned, never for misses.

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

Maximum number of pages that can be processed at the same time.

## `minConcurrency` (type: `integer`):

Minimum number of pages that will be processed at the same time.

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

Number of times the crawler will retry a failed request before giving up.

## `proxy` (type: `object`):

Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.randstad.nl/vacatures?afstand=20&zoekterm=development&locatie="
  ],
  "maxItems": 20,
  "enrichEmails": false,
  "maxConcurrency": 50,
  "minConcurrency": 1,
  "maxRequestRetries": 100,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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 = {
    "startUrls": [
        "https://www.randstad.nl/vacatures?afstand=20&zoekterm=development&locatie="
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/randstad-nl-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 = {
    "startUrls": ["https://www.randstad.nl/vacatures?afstand=20&zoekterm=development&locatie="],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/randstad-nl-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 '{
  "startUrls": [
    "https://www.randstad.nl/vacatures?afstand=20&zoekterm=development&locatie="
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call memo23/randstad-nl-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Randstad.nl Jobs [Only $1] Scraper",
        "description": "Extract job data from Randstad.nl including job titles, salaries, locations, contact details, company info, work hours, contract types, education requirements, and full descriptions. Get structured data with metadata, benefits, and application details for market research and recruitment.",
        "version": "0.0",
        "x-build-id": "Y2CGdyGeXUoSoGTTy"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~randstad-nl-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-randstad-nl-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/memo23~randstad-nl-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-randstad-nl-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/memo23~randstad-nl-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-randstad-nl-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": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "URLs to start with.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max number of listings/items per crawl/scrape",
                        "type": "integer",
                        "description": "Maximum number of listings/items that will be scraped.",
                        "default": 20
                    },
                    "enrichEmails": {
                        "title": "Enrich with employer contact emails (experimental, billed per email)",
                        "type": "boolean",
                        "description": "If enabled, tries to find a contact email for each hiring company by discovering its website (Clearbit) and reading its contact/about pages. Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort, billed per contact email found; only charged when an email is returned, never for misses.",
                        "default": false
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "type": "integer",
                        "description": "Maximum number of pages that can be processed at the same time.",
                        "default": 50
                    },
                    "minConcurrency": {
                        "title": "Min Concurrency",
                        "type": "integer",
                        "description": "Minimum number of pages that will be processed at the same time.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max Request Retries",
                        "type": "integer",
                        "description": "Number of times the crawler will retry a failed request before giving up.",
                        "default": 100
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
