# Recruitee Scraper \[$0.85/1K💰] | Job Boards (`ahmed_jasarevic/recruitee-scraper`) Actor

Scrape Recruitee careers sites and discover hiring companies. Export job titles, locations, departments, employment types, salaries, descriptions, apply links and posting dates. $0.85 per 1,000 jobs.

- **URL**: https://apify.com/ahmed_jasarevic/recruitee-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Recruitee Scraper – Job Board Data & Hiring Signals

Scrape public **Recruitee-powered careers sites** from company subdomains, custom career domains or individual job URLs. Get job titles, company names, locations, departments, employment types, salary ranges, descriptions, requirements, apply links and posting dates. **$0.85 per 1,000 jobs.**

### Job Data For Recruiting And Talent Intelligence

Recruitee powers careers sites for thousands of growing companies. This Actor turns those public openings into one structured dataset for recruiters, staffing agencies, talent-intelligence teams, job aggregators, B2B sales teams targeting actively hiring companies and HR-tech vendors.

- **Recruiter lead generation** — find companies hiring by role, department and country.
- **Hiring-signal research** — compare open-job volume across companies.
- **Job aggregation** — add Recruitee openings to an existing job dataset.
- **Talent intelligence** — track roles, locations and salary ranges over time.
- **B2B targeting** — identify companies expanding specific teams.

### How It Works

![How the Recruitee Scraper works: company careers sites and auto-discovery to structured job records with salaries and apply links.](https://api.apify.com/v2/key-value-stores/oeuA0kLOyhbRM4fzt/records/how-it-works-recruitee-scraper.webp)

Provide one or more Recruitee careers sites, or let the Actor find companies with open boards. It collects the public openings, applies your filters and writes one row per published job. Optional company details add the logo, site title, description and language.

- One row per published job.
- Company names, careers URLs and custom career domains.
- Optional auto-discovery by country and open-job count.
- Department, tag and title filters.
- Free users get a 20-job preview.

### Find Companies Hiring On Recruitee

Use company subdomains, full careers URLs or individual job links:

- **Company names** — `vandebron`, `bunq`, `acme`.
- **Careers URLs** — `https://acme.recruitee.com` or a custom domain such as `https://careers.example.com`.
- **Job URLs** — a single public job page when you only need one opening.
- **Auto-discovery** — find companies with open boards, filtered by country and hiring volume.
- **Role filters** — narrow by department, tag or words in the job title.

### Salary, Location And Company Fields

Each row can include the job ID, title, slug, company name and tenant, careers-site URL, career domain, company logo, department, category, employment type, experience level, education level, work location, city, region, country, postal code, remote/hybrid/on-site flags, salary range, salary text, hours, posting and update dates, apply URL, description, requirements, highlights, tags and language.

Salary fields are populated only when the employer publishes a range. Many companies leave salary blank on their careers site.

### Input – Configure A Recruitee Run

| Field | Type | Default | Notes |
|---|---|---|---|
| `careersSites` | array | — | Company names, careers URLs, custom domains or individual job URLs |
| `companyDiscovery` | boolean | `false` | Add companies with open boards from the public directory |
| `discoveryMinOpenJobs` | integer | `10` | Only discover companies with at least this many open jobs |
| `discoveryMaxCompanies` | integer | `25` | Maximum discovered companies per run |
| `discoveryCountries` | array | — | Limit discovery to ISO country codes such as `NL` or `DE` |
| `departmentFilter` | string | — | Case-insensitive department filter |
| `tagFilter` | string | — | Case-insensitive tag filter |
| `query` | string | — | Case-insensitive title search |
| `maxJobsPerSite` | integer | `500` | Maximum jobs saved per careers site |
| `maxJobsTotal` | integer | `1000` | Maximum jobs saved across the run |
| `includeDescriptionHtml` | boolean | `true` | Include full description, requirements and highlights |
| `includeTranslations` | boolean | `false` | Include per-language translations |
| `includeSiteMetadata` | boolean | `true` | Add company logo, title, description and language |
| `proxy` | object | Off | Optional connection settings for large batches |

### Output – Job Posting Fields

- **Identity** — `recordType`, `id`, `guid`, `title`, `slug`
- **Company** — `companyName`, `companyTenant`, `careersSiteUrl`, `careersDomain`, `companyLogoUrl`
- **Role** — `department`, `categoryCode`, `employmentType`, `experienceLevel`, `educationLevel`, `tags`
- **Location** — `location`, `city`, `stateName`, `country`, `countryCode`, `postalCode`, `locations`
- **Work model** — `remote`, `hybrid`, `onSite`, `minHoursPerWeek`, `maxHoursPerWeek`
- **Pay** — `salary`, `salaryText`
- **Dates** — `publishedAt`, `createdAt`, `updatedAt`, `closeAt`
- **Application** — `jobUrl`, `applyUrl`
- **Content** — `descriptionHtml`, `requirementsHtml`, `highlightHtml`, `language`, `availableLanguages`
- **Provenance** — `source`, `scrapedAt`

### Example Input – Engineering Jobs At Two Companies

```json
{
  "careersSites": ["vandebron", "https://careers.bunq.com"],
  "departmentFilter": "engineering",
  "maxJobsPerSite": 200,
  "maxJobsTotal": 500,
  "includeDescriptionHtml": true,
  "includeSiteMetadata": true
}
```

### Example Output – Recruitee Job Posting

```json
{
  "recordType": "job",
  "id": 2773494,
  "title": "Marketing Project Manager",
  "companyName": "Vandebron",
  "careersSiteUrl": "https://vandebron.recruitee.com",
  "department": "Marketing",
  "employmentType": "Full-time (fixed term)",
  "experienceLevel": "Experienced",
  "location": "Amsterdam, Noord-Holland, Nederland",
  "city": "Amsterdam",
  "country": "Nederland",
  "countryCode": "NL",
  "remote": false,
  "hybrid": true,
  "salary": {
    "min": 5000,
    "max": 5800,
    "currency": "EUR",
    "period": "month",
    "formatted": "EUR 5000 - 5800 / month"
  },
  "salaryText": "EUR 5000 - 5800 / month",
  "publishedAt": "2026-10-06T14:54:28.000Z",
  "jobUrl": "https://werkenbij.vandebron.nl/o/marketing-project-manager",
  "applyUrl": "https://werkenbij.vandebron.nl/o/marketing-project-manager/c/new",
  "descriptionHtml": "Public job description.",
  "language": "nl",
  "source": "recruitee",
  "scrapedAt": "2026-11-02T08:30:00.000Z"
}
```

### Export Job Data And Schedule Alerts

Download JSON, CSV, Excel or HTML from Apify Console, or use the Apify API. Send new jobs to Google Sheets, Airtable, Make, Zapier, n8n or a webhook. Schedule daily runs to track new openings, hiring volume and salary changes.

### Related Actors

- [Karriere.at Scraper](https://apify.com/ahmed_jasarevic/karriere-at-scraper) — add Austrian job postings
- [Job Bank Canada Scraper](https://apify.com/ahmed_jasarevic/jobbank-gc-scraper) — add official Canadian jobs
- [Indeed Job Scraper](https://apify.com/ahmed_jasarevic/indeed-job-scraper) — add broader job-board coverage
- [Jobs Teamtailor Scraper](https://apify.com/ahmed_jasarevic/jobs-teamtailor-scraper) — add another ATS job source

### FAQ

#### Which companies can I scrape?

Any company that publishes a public Recruitee careers site, including companies on a custom career domain.

#### Do I need a Recruitee account?

No. The Actor reads public job postings without login.

#### Why do I only get a few jobs?

Because that company has only a few published openings. Add more companies or enable auto-discovery to find larger boards.

#### Are salaries always available?

No. Salary fields appear only when the employer publishes a range. When salary is missing, `salary` and `salaryText` are `null`.

#### What does auto-discovery do?

It finds companies with open Recruitee boards, filtered by country and minimum open-job count. You can still supply your own companies at the same time.

#### Can I scrape a custom career domain?

Yes. Use the full careers URL, for example `https://careers.example.com`.

#### How many jobs can one run return?

`maxJobsPerSite` defaults to 500 and `maxJobsTotal` to 1,000. Free users get a 20-job preview.

#### How much does it cost?

FREE and BRONZE users pay **$0.00085 per job** ($0.85 per 1,000). SILVER and GOLD+ pay **$0.0008** ($0.80 per 1,000), plus a small Actor Start event.

### For AI Agents & LLM Apps

Returns one row per public Recruitee job with company, location, contract, salary and application fields.

Minimal working input:

```json
{ "careersSites": ["vandebron"], "maxJobsTotal": 20, "includeDescriptionHtml": true }
```

Output fields: `recordType, id, guid, title, slug, companyName, companyTenant, careersSiteUrl, careersDomain, companyLogoUrl, department, categoryCode, employmentType, employmentTypeCode, experienceLevel, experienceCode, educationLevel, educationCode, location, city, stateName, stateCode, country, countryCode, postalCode, locations, remote, hybrid, onSite, salary, salaryText, minHours, maxHours, minHoursPerWeek, maxHoursPerWeek, publishedAt, createdAt, updatedAt, closeAt, jobUrl, applyUrl, descriptionHtml, requirementsHtml, highlightHtml, tags, language, availableLanguages, company, source, scrapedAt`.

Behaviors an agent should know:

- `salary` is `null` when the employer does not publish pay.
- `jobUrl` and `applyUrl` use the company’s custom domain when one exists.
- `company.totalOpenJobs` is the board’s open-job count at scrape time.
- `includeDescriptionHtml: false` returns a lighter dataset.
- Free users get a 20-job preview.

Billing: **$0.00085 per job** on FREE/BRONZE ($0.85 per 1,000), $0.0008 on SILVER and GOLD+ ($0.80 per 1,000), plus a small Actor Start event.

### Legal & Compliance Disclaimer

This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by Recruitee or the companies whose careers sites it reads.

It collects publicly available job postings. Job details, salaries and application links are published by employers and may change. Users are responsible for complying with Recruitee’s and each employer’s terms, privacy law and applicable employment rules. Nothing here is legal, HR or salary advice.

### SEO Keywords

recruitee scraper, recruitee jobs, recruitee job board, careers site scraper, job postings, hiring companies, recruiter leads, talent intelligence, job market data, ats jobs, job api, job board data, company hiring signals, remote jobs, salary data, hr tech, job aggregation, careers data

# Actor input Schema

## `careersSites` (type: `array`):

Recruitee company subdomains (e.g. "vandebron"), careers-site URLs (https://acme.recruitee.com or a custom career domain such as https://werkenbij.example.com) or individual job URLs containing /o/{slug} or /j/{slug}. When a site URL is given, all published jobs on that site are scraped; when a job URL is given, only that job is returned. Leave empty to auto-discover companies from the public Recruitee index.

## `companyDiscovery` (type: `boolean`):

Scrape companies with open Recruitee job boards from the public deriverge.com Recruitee index (CC BY 4.0), in addition to the careers sites above. Discovery also runs automatically when no careers sites are provided. The boards with the most open jobs are scraped first.

## `discoveryMinOpenJobs` (type: `integer`):

Only discover companies that had at least this many open jobs in the public index.

## `discoveryMaxCompanies` (type: `integer`):

Maximum number of discovered companies to scrape per run, starting with the boards that have the most open jobs.

## `discoveryCountries` (type: `array`):

Optional ISO country codes used to limit discovered companies (e.g. \["NL", "DE"]). Leave empty to include every country.

## `departmentFilter` (type: `string`):

Optional case-insensitive substring filter on the job department (e.g. "Engineering"). Matches client-side, so it works for every tenant.

## `tagFilter` (type: `string`):

Optional case-insensitive substring filter on job tags (e.g. "remote").

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

Optional case-insensitive substring filter on the job title.

## `maxJobsPerSite` (type: `integer`):

Maximum number of job postings to save per careers site.

## `maxJobsTotal` (type: `integer`):

Hard cap on the total number of job postings saved by this run.

## `includeDescriptionHtml` (type: `boolean`):

Include the full description, requirements and highlight HTML for every job.

## `includeTranslations` (type: `boolean`):

Include the full per-language translation objects (title, description, requirements, highlight). This can make results noticeably larger.

## `includeSiteMetadata` (type: `boolean`):

Fetch the careers-site homepage once per company to enrich jobs with the company logo, site title, meta description and HTML language.

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

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "careersSites": [
    "bunq",
    "channable",
    "vandebron",
    "tether",
    "decircletalentpartner"
  ],
  "companyDiscovery": false,
  "discoveryMinOpenJobs": 10,
  "discoveryMaxCompanies": 25,
  "discoveryCountries": [],
  "departmentFilter": "",
  "tagFilter": "",
  "query": "",
  "maxJobsPerSite": 500,
  "maxJobsTotal": 1000,
  "includeDescriptionHtml": true,
  "includeTranslations": false,
  "includeSiteMetadata": true,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "careersSites": [
        "bunq",
        "channable",
        "vandebron",
        "tether",
        "decircletalentpartner"
    ],
    "discoveryCountries": [],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/recruitee-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 = {
    "careersSites": [
        "bunq",
        "channable",
        "vandebron",
        "tether",
        "decircletalentpartner",
    ],
    "discoveryCountries": [],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/recruitee-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 '{
  "careersSites": [
    "bunq",
    "channable",
    "vandebron",
    "tether",
    "decircletalentpartner"
  ],
  "discoveryCountries": [],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/recruitee-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/recruitee-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/oRkJ6uftuto1azuQy/builds/yoLrFaOrnzqTdPUPV/openapi.json
