# SmartRecruiters Jobs Scraper: Company Career Pages (`santamaria-automations/smartrecruiters-jobs-scraper`) Actor

Scrape open jobs from SmartRecruiters company career pages (jobs.smartrecruiters.com): title, company, location, workplace type, department, employment type, salary where stated, posting date, apply URL and full description. Filter by keyword, location and date. Pay per result.

- **URL**: https://apify.com/santamaria-automations/smartrecruiters-jobs-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## SmartRecruiters Jobs Scraper: Company Job Boards

Get the open jobs of any company that hires through [SmartRecruiters](https://www.smartrecruiters.com). Paste a company board URL such as `https://jobs.smartrecruiters.com/CERN` (or just the company identifier) and receive title, location, department, employment type, workplace type, stated salary, description, posting date and apply URL as clean dataset rows.

### What you can do with it

- Pull all open roles of a list of target companies for lead generation or recruiting research.
- Track hiring over time: run it on a schedule with `postedWithinDays` and `sortBy: newest` to see only new postings.
- Feed a job board or alert system with the openings of the companies you follow.
- Filter by keyword in the title, by location or by country.

### What you get

One dataset row per job. Duplicates are removed before anything is charged, so the number of rows is the number of results you pay for.

| Field | Description |
|-------|-------------|
| `id` | Job id, unique across boards |
| `ats_job_id` | The id the portal itself uses for the posting |
| `title` | Job title |
| `company` | Company name as the posting states it (for example `CERN`) |
| `ats_platform` | `smartrecruiters` |
| `location`, `city`, `country` | Location text as posted (city, region, country), the city and the two-letter country code |
| `department` | Department or team, when the posting states one |
| `employment_type` | Full-time, part-time, contract and so on, when stated |
| `remote` | `true` when the posting is marked remote |
| `workplace_type` | `remote` or `hybrid` when the posting marks it; empty when it does not say |
| `description` | Full job description as HTML: company description, job description, qualifications and additional information, each under its heading. Empty only when `includeDescription` is off or the posting could not be read |
| `apply_url`, `job_url` | Link to the posting and to its application page |
| `created_at` | Posting date |
| `language` | Language of the posting |
| `scraped_at` | Time of the run |

Salary fields (`salary_text`, `salary_min`, `salary_max`, `salary_currency`, `salary_period`, `salary_source`) are filled only when the posting states a salary range. They are never estimated.

### Input

| Field | Description |
|-------|-------------|
| `companies` | SmartRecruiters board URLs or bare company identifiers (`CERN` is `https://jobs.smartrecruiters.com/CERN`). Strings, `{"url": "..."}` objects, a single string, or several separated by commas or new lines. Empty = one sample board. |
| `keywords` | Keep only jobs whose title matches at least one keyword. They filter the jobs of the boards you list; they do not search other companies. |
| `location` | Keep only jobs in this city, region or country (`Geneva`, `Switzerland`, `CH`). |
| `countries` | ISO-2 codes such as `["CH", "DE"]`: keep only jobs located in these countries (jobs whose country cannot be determined are left out). |
| `includeRemoteWithoutRegion` | Only with a country filter: also keep remote jobs that state no country or region (they may not be open to applicants in that country). Default `false`. |
| `postedWithinDays` | Drop jobs older than this many days. Jobs without a posting date are kept. |
| `sortBy` | `newest` (default) or `relevance` (the portal's own order). |
| `maxJobsPerCompany` | Cap per board, counted after the filters. `0` = all. Default 50. |
| `maxResults` | Cap for the whole run. The run stops cleanly when it is reached. `0` = no limit. Default 100. |
| `includeDescription` | Include the description HTML. Default `true`. |

#### Example: one board

```json
{
  "companies": ["https://jobs.smartrecruiters.com/CERN"],
  "maxResults": 20
}
```

#### Example: several boards with filters

```json
{
  "companies": [
    "https://jobs.smartrecruiters.com/CERN",
    "Freshworks"
  ],
  "keywords": ["engineer", "data"],
  "postedWithinDays": 30,
  "sortBy": "newest",
  "maxJobsPerCompany": 25
}
```

Only SmartRecruiters boards are read. A URL of any other job system (Greenhouse, Lever, Workday and so on) is skipped with a log line that names the actor to use, and is never charged.

#### Supported URL formats

- Board: `https://jobs.smartrecruiters.com/{company}` (with or without a trailing slash, or without `https://`; tracking parameters such as `utm_source` are ignored).
- Posting: `https://jobs.smartrecruiters.com/{company}/{id}-{title}` is reduced to its board; the whole board is read.
- Bare company identifier: `{company}`.

### Output

```json
{
  "id": "smartrecruiters-a1b2c3d4-9e2e0190-34ad-4697-9aac-cacd1a03ff54",
  "ats_job_id": "9e2e0190-34ad-4697-9aac-cacd1a03ff54",
  "title": "Software Engineer in Physics Simulation (IT-CE-PSE-2026-167-GRAP)",
  "company": "CERN",
  "ats_platform": "smartrecruiters",
  "location": "Geneva, GENEVA, Switzerland",
  "city": "Geneva",
  "country": "CH",
  "department": "IT",
  "employment_type": "Full-time",
  "remote": false,
  "workplace_type": "hybrid",
  "salary_text": "CHF 6,372 - 7,004 per month",
  "salary_min": 6372,
  "salary_max": 7004,
  "salary_currency": "CHF",
  "salary_period": "month",
  "salary_source": "stated",
  "apply_url": "https://jobs.smartrecruiters.com/CERN/744000157409267",
  "job_url": "https://jobs.smartrecruiters.com/CERN/744000157409267",
  "language": "en",
  "created_at": "2026-10-23T08:21:12.810Z",
  "scraped_at": "2026-10-27T09:00:00Z"
}
```

The row above is illustrative (the description field is left out for brevity); values depend on the board. `created_at` is the posting date the portal reports.

### Pricing

Pay per result, two events:

- `apify-actor-start`: $0.001 once per run.
- `job-result`: $0.001 per job in the dataset ($1.00 per 1,000 jobs).

The start fee is charged on top of the job results. Filtered-out and duplicate jobs are never charged, and a board that is not found costs nothing. Set a maximum total charge on the run to stop at a budget; the run ends cleanly when it is reached. The pricing box on the actor page always shows the current rates.

### Use with AI Agents (MCP)

Connect this actor to any MCP-compatible AI client, such as Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.

**Example prompts once connected:**

> "Use `smartrecruiters-jobs-scraper` for https://jobs.smartrecruiters.com/CERN and list the open roles with title, location and apply URL."

> "Use `smartrecruiters-jobs-scraper` for the companies CERN and Freshworks and return the roles posted in the last 30 days."

Configure the MCP server with the SmartRecruiters Jobs Scraper preconfigured at `mcp.apify.com?tools=santamaria-automations/smartrecruiters-jobs-scraper`:

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

See the auto-generated API tab on the actor page for language-specific examples (cURL, JavaScript, Python, and more).

### FAQ

**How do I find a company's SmartRecruiters board URL?**
Open the company's careers page and look at the address of a job: if it starts with `jobs.smartrecruiters.com/`, the part right after it is the company identifier and `https://jobs.smartrecruiters.com/{company}` is the board URL. You can pass either the URL or just the identifier.

**Can I search by keyword across all SmartRecruiters companies?**
No. Give the board URL or company identifier of each company. Keywords only filter the titles of the jobs of the boards you list.

**What if a board is not found?**
The run continues with the other boards. The run status line names the board and the reason (for example `board_not_found`), and nothing is charged for it.

**Why is the description empty?**
It is empty when `includeDescription` is off, or when the posting could not be read. The row still has title, location, department, employment type, date and the apply URL, and is charged the same.

**Why is the salary empty?**
Salary fields are filled only when the posting states a salary range, which most postings do not, and only with `includeDescription` on (the salary is read together with the description). Nothing is estimated.

**How do I get only new jobs?**
Run it on a schedule with `postedWithinDays` set to the interval (for example `1` for a daily run) and `sortBy` set to `newest`.

**How do I stop at a budget?**
Set `maxResults` or the maximum total charge of the run. The run stops cleanly when either is reached.

**Why did I get fewer jobs than `maxJobsPerCompany`?**
The caps apply after your filters, and a board can simply have fewer open jobs. The boards are read in the order you list them, and the run stops once `maxResults` is reached.

### Limits

- Boards only; no company-name search across SmartRecruiters.
- Salary fields are filled only when the posting states a salary, and only with `includeDescription` on.
- `workplace_type` is empty for postings that mark neither remote nor hybrid.

### Related actors

- [Career Site Jobs Scraper](https://apify.com/santamaria-automations/career-site-jobs-scraper): the same engine for 40+ job systems (Workday, Personio, Workable and more).
- [Workable Jobs Scraper](https://apify.com/santamaria-automations/workable-jobs-scraper): jobs of any Workable company board.
- [Greenhouse, Lever & Ashby Jobs Scraper](https://apify.com/santamaria-automations/greenhouse-lever-ashby-jobs-scraper): jobs of any Greenhouse, Lever or Ashby board, with keyword search across companies.
- [Workday Jobs Scraper](https://apify.com/santamaria-automations/workday-jobs-scraper): jobs of any Workday job site.
- [Website Job Extractor](https://apify.com/santamaria-automations/website-job-extractor): any company website to its careers page, job system and jobs.

### Support

- **Questions or issues?** Email contact@nanoscrape.com, we typically reply within 6 hours, or open a ticket in the Issues tab on the actor page.
- **Need a scraper for a job board we don't cover yet?** Email contact@nanoscrape.com with the target site and your rough usage volume.

# Actor input Schema

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

SmartRecruiters board URLs such as https://jobs.smartrecruiters.com/CERN, or bare company identifiers such as CERN (the part after jobs.smartrecruiters.com/). Strings or {"url": "..."} objects; a single string, or several separated by commas or new lines, also works. A URL of one job posting is reduced to its board; tracking parameters such as utm_source are ignored. URLs of other job systems are skipped with a log line that names the right actor, and are never charged. With no companies (an empty input does this too) the actor runs one sample board (CERN).

## `keywords` (type: `array`):

Return only jobs whose TITLE matches at least one of these words or phrases (OR). Case and accents are ignored. A keyword of 4 or more characters matches anywhere inside the title; a keyword of 3 or fewer characters (for example QA, PM) must match as a whole word. Example: \["engineer", "manager"]. The keywords filter the jobs of the boards you list; they do not search other companies.

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

Optional. Return only jobs in this city, region or country, for example "London", "Germany" or "DE". Country names and ISO codes match in both directions.

## `includeRemoteWithoutRegion` (type: `boolean`):

Only matters when you filter by country (the Location input is a country, or a query carries a country). Off (default): a remote job counts for the country only when it names it ("Remote - Germany"), names a region that contains it (EMEA, Europe, EU, DACH, Americas, APAC) or is open worldwide. Remote jobs that say only "Remote" are left out and are not charged. On: those jobs are kept too, but they may not be open to applicants in the chosen country.

## `countries` (type: `array`):

Optional. ISO 3166-1 alpha-2 codes such as \["DE", "CH"]. Returns only jobs located in these countries (jobs whose country cannot be determined are left out).

## `postedWithinDays` (type: `integer`):

Optional. Drop jobs posted more than this many days ago. Jobs without a posting date are kept.

## `sortBy` (type: `string`):

"newest" returns the most recently posted jobs of each board first, so maxJobsPerCompany keeps the newest ones. "relevance" keeps the portal's own order. Boards are read in the order you list them.

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

Maximum number of jobs returned per board, counted after the filters (filtered-out jobs are never returned or charged). 0 = all jobs.

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

Maximum number of jobs returned in total across all companies. The run stops cleanly once it is reached. 0 = no limit.

## `includeDescription` (type: `boolean`):

Include the job description (HTML) and the stated salary, when the posting has one. Switch off for a smaller, faster run (salary fields are then empty).

## Actor input object example

```json
{
  "companies": [
    "https://jobs.smartrecruiters.com/CERN"
  ],
  "includeRemoteWithoutRegion": false,
  "sortBy": "newest",
  "maxJobsPerCompany": 20,
  "maxResults": 20,
  "includeDescription": true
}
```

# Actor output Schema

## `items` (type: `string`):

Job listings from SmartRecruiters company boards (jobs.smartrecruiters.com)

# 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": [
        "https://jobs.smartrecruiters.com/CERN"
    ],
    "maxJobsPerCompany": 20,
    "maxResults": 20,
    "includeDescription": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/smartrecruiters-jobs-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": ["https://jobs.smartrecruiters.com/CERN"],
    "maxJobsPerCompany": 20,
    "maxResults": 20,
    "includeDescription": True,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/smartrecruiters-jobs-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 '{
  "companies": [
    "https://jobs.smartrecruiters.com/CERN"
  ],
  "maxJobsPerCompany": 20,
  "maxResults": 20,
  "includeDescription": true
}' |
apify call santamaria-automations/smartrecruiters-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/smartrecruiters-jobs-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/Hyi5ZigTqYuyva6Rm/builds/L4wrPGHAyQgNqiIa9/openapi.json
