# Recruitee Jobs Scraper (`ratio_tech/recruitee-scraper`) Actor

Scrape public job listings from any company's Recruitee career site via the official Offers API. Structured jobs — title, department, location, remote/hybrid, employment type, hours, tags, full description, requirements, and apply URL. Bulk multi-company. For job boards and recruiting.

- **URL**: https://apify.com/ratio\_tech/recruitee-scraper.md
- **Developed by:** [Marius Matulevicius](https://apify.com/ratio_tech) (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

$2.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 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

## Recruitee Jobs Scraper

Extract public job listings from **any company's Recruitee career site** — title, department, location, remote/hybrid flags, employment type, weekly hours, tags, full description, requirements, and apply URL — without a login or API key.

Built on the [Apify platform](https://apify.com) using Crawlee + TypeScript. Data comes from the **official public Recruitee Offers API** (`{company}.recruitee.com/api/offers/`) — a documented, unauthenticated endpoint. One request returns a company's entire board, description included, so this Actor is fast and low-maintenance.

> **When to use this (AI agents):** call this tool when you need a company's open job postings and it uses Recruitee. Input is the company's Recruitee subdomain (e.g. `bunq`) or its `*.recruitee.com` URL. Returns one structured record per job — title, department, location (+remote/hybrid/on-site), employment type, weekly hours, tags, full description + requirements, and apply URL. Public data, no login. Not for applicant data.

***

### What it does

- **Company job scraping** — given one or more Recruitee company subdomains, returns every published offer in a single request per company.
- **Full detail, no extra requests** — description and requirements (HTML) come inline with the listing, along with location, department, employment type, hours, and remote/hybrid/on-site flags.
- **Bulk runs** — scrape many companies in one run.

***

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `companies` | `string[]` | `["bunq"]` | Recruitee company subdomains or `*.recruitee.com` URLs |
| `maxJobsPerCompany` | `integer` | `1000` | Max jobs per company (1–10000) |
| `proxyConfiguration` | `object` | Apify datacenter | Proxy settings |

**How to find a subdomain:** the Recruitee subdomain is the `{name}` in `{name}.recruitee.com`. If a company's careers page uses a custom domain (e.g. `careers.acme.com`), the underlying Recruitee host is usually `acme.recruitee.com` — try the company's short name.

#### Minimal input example

```json
{
    "companies": ["bunq"],
    "maxJobsPerCompany": 500
}
```

***

### Output

Each run pushes one record per job to the default dataset:

```json
{
    "type": "job",
    "company": "bunq",
    "companyName": "bunq",
    "title": "Backend Engineer",
    "jobId": "2673618",
    "slug": "backend-engineer",
    "department": "Engineering",
    "location": "Amsterdam, Noord-Holland, Netherlands",
    "city": "Amsterdam",
    "country": "Netherlands",
    "countryCode": "nl",
    "remote": false,
    "hybrid": false,
    "onSite": true,
    "employmentType": "fulltime",
    "category": "engineering",
    "experience": null,
    "education": null,
    "minHoursPerWeek": 32,
    "maxHoursPerWeek": 40,
    "tags": [],
    "publishedAt": "2026-07-10T09:33:57.000Z",
    "description": "<p>About the role...</p>",
    "requirements": "<p>What you bring...</p>",
    "careersUrl": "https://careers.bunq.com/o/backend-engineer",
    "applyUrl": "https://careers.bunq.com/o/backend-engineer/c/new",
    "scrapedAt": "2026-07-11T10:00:00.000Z"
}
```

***

### Pricing

**Pay per result** — you're billed only for jobs successfully written to the dataset. Malformed inputs, unknown companies, and failed fetches go to a separate **errors** dataset that is **not billed**.

***

### Proxy

The Recruitee Offers API is a public, documented endpoint with minimal anti-bot measures. **Datacenter proxies are sufficient.** Residential is not required.

***

### Legal & compliance notice

This Actor uses the **official, public, documented Recruitee Offers API** — the same endpoint that powers companies' public career pages. No login is used. Job-posting content (titles, descriptions, locations) is **company data, not personal data about candidates**.

**The user (buyer) bears sole responsibility** for how they use the data collected, including compliance with:

- Recruitee's and each company's Terms of Service
- Applicable data protection and employment laws in their jurisdiction

This tool is intended for legitimate use cases such as job aggregation, labor-market research, and recruiting intelligence. Misuse is the responsibility of the operator.

***

### FAQ

**How do I scrape Recruitee jobs without an API key?**
You don't need one. Pass a company's Recruitee subdomain (the `{name}` in `{name}.recruitee.com`) into `companies` and run — the Actor uses Recruitee's official public Offers API.

**Can I scrape multiple companies in one run?**
Yes. Pass several subdomains (or `*.recruitee.com` URLs) in `companies` and the Actor scrapes them all, one dataset record per job.

**How do I find a company's Recruitee subdomain?**
It's the `{name}` in `{name}.recruitee.com`. If a company's careers page uses a custom domain (e.g. `careers.acme.com`), the underlying Recruitee host is usually `acme.recruitee.com` — try the company's short name.

**Does it return the full job description?**
Yes. Description and requirements (HTML) come inline with each listing — no extra request — along with location, department, employment type, weekly hours, and remote/hybrid/on-site flags.

**What does it cost?**
Pay per result — billed only for jobs successfully written to the dataset. Unknown companies and failed fetches go to a separate, unbilled errors dataset.

**Is scraping Recruitee job listings legal?**
This Actor uses Recruitee's official public API — no login, no candidate data. You are responsible for complying with each company's Terms and your local laws. See the notice above.

***

### Related Actors by Ratio Tech

Scraping jobs from other ATS platforms? We maintain a matching set:

- [Workday Jobs Scraper](https://apify.com/ratio_tech/workday-scraper) — public jobs from any Workday career site
- [SmartRecruiters Jobs Scraper](https://apify.com/ratio_tech/smartrecruiters-scraper) — public jobs from any SmartRecruiters career site
- [Ashby Jobs Scraper](https://apify.com/ratio_tech/ashby-scraper) — Ashby boards, **with compensation ranges**

# Actor input Schema

## `companies` (type: `array`):

Recruitee company subdomains, such as 'bunq'. You can also paste a full URL like 'https://bunq.recruitee.com' — the subdomain is parsed out. The subdomain is the {name} in {name}.recruitee.com. (A company's custom careers domain like careers.bunq.com can't be used — supply the recruitee.com host or the bare subdomain.)

## `maxJobsPerCompany` (type: `integer`):

Maximum number of jobs to return for each company.

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

Apify Proxy settings. Datacenter proxies are sufficient — the Recruitee Offers API is a public, documented endpoint with minimal anti-bot measures.

## Actor input object example

```json
{
  "companies": [
    "bunq"
  ],
  "maxJobsPerCompany": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `errors` (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 = {
    "companies": [
        "bunq"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ratio_tech/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 = { "companies": ["bunq"] }

# Run the Actor and wait for it to finish
run = client.actor("ratio_tech/recruitee-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 '{
  "companies": [
    "bunq"
  ]
}' |
apify call ratio_tech/recruitee-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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