# Rekrute Jobs Scraper (`parsebird/rekrute-jobs-scraper`) Actor

Scrape job listings from Rekrute.com, Morocco's largest job board: titles, companies, locations, contract types, and full descriptions by keyword and location.

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

## Pricing

from $0.70 / 1,000 jobs

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

### Rekrute Jobs Scraper

Extract job listings from [Rekrute.com](https://www.rekrute.com/), Morocco's largest job board, by keyword and location.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search any job title, skill, or city across Morocco and get clean, structured job data — full descriptions, companies, contract types, and posting dates — ready for analysis or integration.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
parsebird/rekrute-jobs-scraper on Apify. Call: ApifyClient("TOKEN").actor("parsebird/rekrute-jobs-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items for results. Key inputs: keyword (string, search term, e.g. "Developer" or "Accountant", default "software engineer"), location (string, city or region, e.g. "Casablanca" or "Rabat", default "Casablanca"), results_wanted (integer, max jobs to collect, default 20), max_pages (integer, max search-results pages to process, default 5), proxyConfiguration (object, Apify Proxy settings, default {"useApifyProxy": true}). Output fields per job: jobId, title, company, location, datePosted, descriptionText, employmentType, url, scrapedAt. Full actor spec: fetch via GET https://api.apify.com/v2/acts/parsebird~rekrute-jobs-scraper (Bearer TOKEN). Get token: https://console.apify.com/account/integrations
```

### What does Rekrute Jobs Scraper do?

**Rekrute Jobs Scraper** collects structured job offer data from [Rekrute.com](https://www.rekrute.com/), Morocco's leading recruitment platform. Search by job title, skill, or keyword, combine it with a city or region, and get every matching listing back as clean, structured data.

Use it as a **Rekrute API alternative** to pull Moroccan job market data into JSON, CSV, or Excel without writing a scraper yourself. No coding required — set your keyword and location and click Start. Or call it through the [Apify API](https://docs.apify.com/api/v2) to automate recurring job data collection.

- 🔍 **Keyword and location search** — combine any job title or skill with a Moroccan city or region
- 📄 **Full job descriptions** — the complete listing text, not just the search-results snippet
- 💼 **Contract type** — permanent (CDI), fixed-term (CDD), internship, and other contract types as published by the employer
- 🏢 **Company details** — employer name for every listing
- 📅 **Posting dates** — when each offer was published
- 🔄 **Scheduling and monitoring** — run daily or weekly with [Apify scheduling](https://docs.apify.com/platform/schedules) to track new postings
- 🔗 **API access and integrations** — connect to Google Sheets, Zapier, Make, webhooks, or any workflow via the Apify API

### What data can you extract from Rekrute?

| Field | Description |
|-------|-------------|
| `jobId` | Unique Rekrute offer identifier |
| `title` | Job position title |
| `company` | Name of the hiring organization |
| `location` | Job location (city) |
| `datePosted` | When the job was published |
| `descriptionText` | Full job description as plain text |
| `employmentType` | Contract type (permanent, fixed-term, internship, etc.) |
| `url` | Direct link to the listing |

### How to scrape Rekrute

1. Open the [Rekrute Jobs Scraper](https://apify.com/parsebird/rekrute-jobs-scraper) page on Apify Store and click **Try for free**
2. Enter a **Keyword** (job title or skill) and a **Location** (Moroccan city or region)
3. Set **Results wanted** and **Max pages** to control run size and cost
4. Apify Proxy is enabled by default for reliable scraping
5. Click **Start** and wait for the run to finish
6. Download your data in **JSON, CSV, Excel**, or connect via the **Apify API**

#### Python API example

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("parsebird/rekrute-jobs-scraper").call(run_input={
    "keyword": "Data Analyst",
    "location": "Rabat",
    "results_wanted": 50,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['title']} — {item['company']} — {item.get('location')}")
```

#### JavaScript API example

```javascript
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: "YOUR_API_TOKEN" });

const run = await client.actor("parsebird/rekrute-jobs-scraper").call({
    keyword: "Data Analyst",
    location: "Rabat",
    results_wanted: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.log(`${item.title} — ${item.company} — ${item.location ?? "N/A"}`);
});
```

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `keyword` | string | No | `"software engineer"` | Search keyword, such as Developer or Accountant |
| `location` | string | No | `"Casablanca"` | City or region filter |
| `results_wanted` | integer | No | `20` | Maximum number of jobs to collect |
| `max_pages` | integer | No | `5` | Maximum search-results pages to process |
| `proxyConfiguration` | object | No | `{ "useApifyProxy": true }` | Proxy settings for reliable scraping |

### Output example

```json
{
  "url": "https://www.rekrute.com/en/offre-emploi-developpeur-servicenow-recrutement-alten-maroc-rabat-184706.html",
  "jobId": "184706",
  "title": "Développeur ServiceNow",
  "company": "ALTEN Maroc",
  "datePosted": "2026-07-17T11:45:12",
  "descriptionText": "Dans le cadre de ce rôle, vos principales missions seront les suivantes...",
  "employmentType": "Permanent contract",
  "location": "Rabat",
  "scrapedAt": "2026-08-20T13:19:13.000Z"
}
```

Download results in JSON, HTML, CSV, or Excel.

### Use cases

- 📊 **Job market analysis** — track contract types and hiring activity across Moroccan cities
- 🧭 **Recruitment sourcing** — monitor new postings for specific keywords as they go live
- 🏢 **Employer benchmarking** — see which companies are hiring, for which roles, and where
- 🔄 **Recurring monitoring** — schedule daily or weekly runs to catch new postings
- 🔗 **Data pipeline integration** — feed job data into a warehouse, spreadsheet, or BI dashboard via the Apify API

### How it works

1. Builds a Rekrute search from your `keyword` and `location`
2. Requests each search-results page, reading the job offers embedded in the server-rendered listing
3. Stops once `results_wanted` unique offers are collected, `max_pages` is reached, or a page returns no offers
4. Fetches each offer's own detail page and reads its structured job data for the full description, company, contract type, and posting date
5. Pushes each job offer to the Apify dataset, deduplicated by offer ID

### How much does it cost to scrape Rekrute?

| Event | Price per event | Price per 1,000 |
|-------|----------------|-----------------|
| `job-scraped` (Free plan) | $0.0008 | **$0.80** |
| `job-scraped` (Bronze/Silver/Gold plans) | $0.0007 | **$0.70** |

One event is charged each time a job offer is successfully scraped and saved to the dataset — you only pay for offers actually returned. Apify offers a **free trial** with platform credits, enough to scrape thousands of job offers at no cost.

### FAQ

**How does the `location` filter work?**
It's combined with your `keyword` as a single search phrase (the same way Rekrute's own search box works — its placeholder text literally reads "Job title, City, Sector..."), so results are jobs matching both your keyword and your location.

**What language are the results in?**
Job titles and descriptions are shown in whatever language the employer originally posted them in — most commonly French, since Rekrute is a Moroccan job board. UI labels use the English site (`/en/`), but listing content itself is not translated.

**Does this scraper fetch full job descriptions?**
Yes. Each offer's own detail page is fetched to retrieve the complete description, not just the summary shown on the search-results page.

**Do I need Apify Proxy?**
It's on by default for reliability. You can turn it off in `proxyConfiguration` for small runs, but larger or more frequent runs benefit from keeping it enabled.

**Can I schedule recurring runs?**
Yes. Use [Apify scheduling](https://docs.apify.com/platform/schedules) to run daily or weekly and catch new postings automatically.

**Can I access the data via API?**
Yes. Every run produces a dataset accessible via the [Apify API](https://docs.apify.com/api/v2), usable from Python, JavaScript, Google Sheets, Zapier, Make, or any HTTP-capable tool.

### Is it legal to scrape Rekrute?

This Actor extracts publicly available data from Rekrute.com. Scraping public data is generally considered legal based on recent court rulings, including the US Ninth Circuit's decision in *hiQ Labs v. LinkedIn*. However, users are responsible for ensuring their use of scraped data complies with applicable laws, Rekrute's Terms of Service, and data protection regulations. Do not use extracted personal data for unsolicited contact or purposes incompatible with the original collection context. For more information, read Apify's blog post on [web scraping legality](https://blog.apify.com/is-web-scraping-legal/).

### Other job scrapers on Apify

Browse all ParseBird actors, including other job board scrapers, on the [Apify Store](https://apify.com/parsebird).

# Actor input Schema

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

Search keyword, such as Developer, Accountant, or Marketing.

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

City or region filter, such as Casablanca, Rabat, or Tanger.

## `results_wanted` (type: `integer`):

Maximum number of jobs to collect.

## `max_pages` (type: `integer`):

Maximum number of search-results pages to process.

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

Proxy settings for reliable scraping.

## Actor input object example

```json
{
  "keyword": "software engineer",
  "location": "Casablanca",
  "results_wanted": 20,
  "max_pages": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "keyword": "software engineer",
    "location": "Casablanca",
    "results_wanted": 20,
    "max_pages": 5,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/rekrute-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 = {
    "keyword": "software engineer",
    "location": "Casablanca",
    "results_wanted": 20,
    "max_pages": 5,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/rekrute-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 '{
  "keyword": "software engineer",
  "location": "Casablanca",
  "results_wanted": 20,
  "max_pages": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call parsebird/rekrute-jobs-scraper --silent --output-dataset

```

## MCP server setup

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