# Wuzzuf Jobs Scraper (`parsebird/wuzzuf-jobs-scraper`) Actor

Scrape job listings from Wuzzuf: titles, companies, salaries, locations, job types, career levels, skills, and full descriptions.

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

## Pricing

from $0.89 / 1,000 job scrapeds

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

### Wuzzuf Jobs Scraper

Wuzzuf Jobs Scraper extracts structured job listing data from [Wuzzuf](https://wuzzuf.net), the leading job board for Egypt, Saudi Arabia, the UAE, and the wider Gulf and MENA region.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search by keyword and filter by location, category, career level, job type, and posting date — get clean, structured job data with full descriptions, salaries, and skills, 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: Actor ID `parsebird/wuzzuf-jobs-scraper` on Apify — call it with the Apify API or `ApifyClient` (e.g. Python: `ApifyClient(token).actor("parsebird/wuzzuf-jobs-scraper").call(run_input={"keyword": "engineer", "results_wanted": 20})`) — key inputs are `keyword` (string, job title/skill to search), `startUrl` (string, a Wuzzuf search URL to use instead of keyword), `location`/`category`/`careerLevel`/`jobType` (string text filters), `maxJobAge` (enum: "7 days" | "30 days" | "90 days" | "all", default "all"), `results_wanted` (integer, default 20), `max_pages` (integer, default 10), and `proxyConfiguration` (object) — output items include `title`, `company`, `company_logo`, `location`, `salary`, `job_type`, `job_category`, `career_level`, `date_posted`, `skills`, `description_html`, `description_text`, `url`, and `scraped_at` — full API spec at `https://apify.com/parsebird/wuzzuf-jobs-scraper/api` and an API token from the Apify Console under Settings → Integrations.

### What does Wuzzuf Jobs Scraper do?

Wuzzuf Jobs Scraper is a **Wuzzuf API alternative** that turns any Wuzzuf job search into a structured dataset. Point it at a keyword, a saved Wuzzuf search URL, or a combination of filters, and it collects job title, company, salary, job type, career level, skills, and the full job description for every matching listing — no manual copy-pasting required.

- 🔍 Search by keyword, or pass a Wuzzuf search URL directly as a starting point
- 🗺️ Filter results by location, job category, career level, job type (including remote/hybrid), and how recently the job was posted
- 📝 Full job descriptions in both HTML and plain text, plus extracted skills/keywords
- 🏢 Company name and logo pulled from each listing, when the employer isn't anonymous
- ⚙️ Runs on the Apify platform: schedule recurring scrapes, trigger runs via API or webhook, and export results as JSON, CSV, Excel, HTML, or XML
- 🆓 New Apify accounts get free platform credits, enough to try this Actor at no cost

### What data can you extract from Wuzzuf?

| Field | Description |
|-------|-------------|
| `title` | Job title |
| `company` | Company name (null if the employer is anonymous) |
| `company_logo` | Company logo URL |
| `location` | Job location, e.g. "Maadi, Cairo, Egypt" |
| `salary` | Salary text, or "Confidential" / "Not disclosed" if hidden |
| `job_type` | Job type, e.g. "Full Time", "Full Time, Remote" |
| `job_category` | Job category/role tags |
| `career_level` | Career level, e.g. "Experienced" |
| `date_posted` | Posting date as shown on Wuzzuf |
| `skills` | Extracted skills and keywords |
| `description_html` | Full job description (HTML) |
| `description_text` | Full job description (plain text) |
| `url` | Public Wuzzuf job URL |
| `scraped_at` | ISO timestamp of when the item was collected |

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| keyword | string | No | "" | Keyword to search for (e.g. "engineer") |
| startUrl | string | No | — | A Wuzzuf search URL (if provided, it's used as the starting point instead of keyword) |
| location | string | No | "" | Filter by location text (e.g. "Cairo") |
| category | string | No | "" | Filter by category text (e.g. "IT") |
| careerLevel | string | No | "" | Filter by career level text (e.g. "Experienced") |
| jobType | string | No | "" | Filter by job type text (e.g. "Full Time", "Remote") |
| maxJobAge | string | No | "all" | Only include jobs within a time window: "7 days", "30 days", "90 days", "all" |
| results\_wanted | integer | No | 20 | Maximum number of job items to collect |
| max\_pages | integer | No | 10 | Maximum pages to process |
| proxyConfiguration | object | No | — | Proxy settings (recommended for stability at scale) |

### Output example

```json
{
  "title": "Engineer",
  "company": "Roasty",
  "company_logo": "https://wuzzuf.net/MAAMOUN-GROUP-Egypt-44745-1741777901.jpeg",
  "location": "Qalyub, Qalubia, Egypt",
  "salary": "Confidential",
  "job_type": "Full Time",
  "job_category": ["Engineering - Mechanical/Electrical"],
  "career_level": "Experienced",
  "date_posted": "09/10/2025 15:18:30",
  "skills": ["Electrical Engineering", "Mechanical Engineering"],
  "description_html": "<p>...</p>",
  "description_text": "...",
  "url": "https://wuzzuf.net/jobs/p/o6tiukbaxxwz-engineer-roasty-qalubia-egypt",
  "scraped_at": "2026-02-18T06:07:02.248Z"
}
```

### How to scrape Wuzzuf jobs

1. Open **Wuzzuf Jobs Scraper** on the Apify Store and click **Try for free**.
2. Enter a `keyword` (e.g. "engineer"), or paste a Wuzzuf search URL into `startUrl`.
3. Optionally set `location`, `category`, `careerLevel`, `jobType`, and `maxJobAge` to narrow the results.
4. Set `results_wanted` and `max_pages` to control how much data you collect.
5. Click **Start** and download your results as JSON, CSV, or Excel once the run finishes — or pull them via the API.

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("parsebird/wuzzuf-jobs-scraper").call(run_input={
    "keyword": "engineer",
    "location": "Cairo",
    "results_wanted": 50,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["company"], item["url"])
```

#### JavaScript

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('parsebird/wuzzuf-jobs-scraper').call({
    keyword: 'engineer',
    location: 'Cairo',
    results_wanted: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Use cases

- **Job market research** — track how many roles a keyword or category has open on Wuzzuf over time.
- **Recruitment and talent sourcing** — build a feed of open roles matching a client's requirements.
- **Salary benchmarking** — collect visible salary ranges across a role or industry.
- **Competitive intelligence** — monitor which companies are actively hiring, and for what roles.
- **Job aggregation** — feed a job board, newsletter, or Slack/Telegram bot with fresh Wuzzuf listings.

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

Wuzzuf Jobs Scraper uses **pay-per-event (PPE)** pricing — you're charged per job scraped, not for platform compute time.

| Event | Price per event | Price per 1,000 |
|-------|-----------------|------------------|
| Job scraped | $0.00099 (free plan) / $0.00089 (Bronze, Silver, Gold) | **$0.99** (free plan) / **$0.89** (Bronze, Silver, Gold) |

Scraping 1,000 job listings costs under a dollar. New Apify accounts include free platform credits, so you can test this Actor at no cost before committing to a larger run.

### Is it legal to scrape Wuzzuf?

Scraping publicly available data, like job listings on Wuzzuf, is generally considered legal, as established in cases such as *hiQ Labs v. LinkedIn*. This Actor only collects data that is already visible to any visitor on public Wuzzuf search results and job pages. You are responsible for how you use the scraped data — avoid collecting or storing personal data, and respect the target website's terms of service. Read more in [Apify's guide on the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Other job scrapers by ParseBird

- [JobsDB Job Scraper](https://apify.com/parsebird/jobsdb-job-scraper)
- [Workable Job Scraper](https://apify.com/parsebird/workable-job-scraper)
- [Hiring.cafe Jobs Scraper](https://apify.com/parsebird/hiring-cafe-scraper)
- [eFinancialCareers Jobs Scraper](https://apify.com/parsebird/efinancialcareers-jobs-scraper)
- [JustJoin.it Jobs Scraper](https://apify.com/parsebird/justjoin-jobs-scraper)
- [Workopolis Job Scraper](https://apify.com/parsebird/workopolis-job-scraper)

### FAQ

**Do I need a Wuzzuf account or API key?**
No. Wuzzuf Jobs Scraper works against publicly available Wuzzuf search results — no login or API key for Wuzzuf itself is required.

**Can I search without a keyword?**
Yes. Leave `keyword` empty (with or without other filters) to browse all currently listed jobs.

**Why do `location`, `category`, `careerLevel`, and `jobType` use free text instead of dropdowns?**
They're matched as whole-word, case-insensitive filters against each job's actual data, so you can type natural values like "Cairo", "IT", or "Remote" without needing to know Wuzzuf's internal category codes.

**Can I use a specific Wuzzuf search URL instead of the filters?**
Yes — copy any search URL from wuzzuf.net (including its own filters) into the `startUrl` field and it will be used as the starting point.

**Can I schedule this to run automatically?**
Yes. Use [Apify's Scheduler](https://docs.apify.com/platform/schedules) to run this Actor daily, weekly, or at any interval, and pair it with [Apify integrations](https://apify.com/integrations) (Zapier, Make, Slack, Google Sheets, and more) to route new results wherever you need them.

**What formats can I export results in?**
JSON, CSV, Excel, HTML, or XML — from the Apify Console, via the API, or through an integration.

**I found a bug or the site layout changed. What do I do?**
Please open an issue on the Actor's **Issues** tab in Apify Console. We actively maintain this Actor and respond to reports.

# Actor input Schema

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

Job title, skill, or company keyword to search for, e.g. "engineer".

## `startUrl` (type: `string`):

A Wuzzuf search URL (e.g. copied from your browser's address bar after searching and filtering on wuzzuf.net) to use as the starting point instead of the keyword above.

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

Only keep jobs whose location matches this word, e.g. "Cairo". Case-insensitive.

## `category` (type: `string`):

Only keep jobs whose job category matches this word, e.g. "IT".

## `careerLevel` (type: `string`):

Only keep jobs whose career level matches this word, e.g. "Experienced".

## `jobType` (type: `string`):

Only keep jobs whose job type matches this, e.g. "Full Time" or "Remote".

## `maxJobAge` (type: `string`):

Only include jobs posted within this time window.

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

Maximum number of job listings to save.

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

Maximum number of Wuzzuf search result pages to scan (about 15 jobs per page). Increase this if you use narrow filters and need more matches.

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

Apify Proxy settings. Recommended for larger or repeated runs to keep the scrape stable.

## Actor input object example

```json
{
  "keyword": "engineer",
  "startUrl": "",
  "location": "",
  "category": "",
  "careerLevel": "",
  "jobType": "",
  "maxJobAge": "all",
  "results_wanted": 20,
  "max_pages": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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": "engineer",
    "maxJobAge": "all",
    "results_wanted": 20,
    "max_pages": 10,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/wuzzuf-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": "engineer",
    "maxJobAge": "all",
    "results_wanted": 20,
    "max_pages": 10,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/wuzzuf-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": "engineer",
  "maxJobAge": "all",
  "results_wanted": 20,
  "max_pages": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call parsebird/wuzzuf-jobs-scraper --silent --output-dataset

```

## MCP server setup

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