# Drushim.co.il Job Scraper | Israel Jobs in Hebrew & English (`corvuslab/drushim-jobs-scraper`) Actor

Scrape drushim.co.il jobs across Israel by Hebrew or English keyword, category, region, 40 cities, experience and job type. Get 50+ fields: full description + requirements, geocoded addresses, salary in ILS, company, apply link, English translations. Incremental monitoring + alerts.

- **URL**: https://apify.com/corvuslab/drushim-jobs-scraper.md
- **Developed by:** [Corvuslab](https://apify.com/corvuslab) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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/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

### What does Drushim.co.il Job Scraper do?

Drushim.co.il Job Scraper extracts job listings from **drushim.co.il**, one of Israel's largest Hebrew job boards, and returns **50+ structured fields per job**: full description and requirements, every workplace address with latitude/longitude, category and sub-categories, required experience, job type, remote/hybrid flags, salary range where published and the apply link. It is also bilingual. Every record comes with **English translations** of the city, areas, category, experience and job type next to the original Hebrew, and every filter is an **English-labelled multi-select dropdown**. It's no-code, and you can export to JSON, CSV or Excel, pull results from the API, or hand them to an AI agent.

Type keywords in **Hebrew or English** (`מפתח`, `Python`, `נהג`), tick the categories, regions, cities, experience levels and job types you want, and it returns every matching job as a clean record. You can also paste drushim.co.il search, category, sub-category, area or job links. Leave everything empty and you get jobs from all over Israel with no setup.

> New to Apify? Sign up free and use the included monthly platform credit to try this Actor. No credit card needed.

***

### What data can you extract from Drushim.co.il?

Every record carries **50+ fields**, grouped like this:

| Group | What you get |
|---|---|
| **Job** | Job ID, URL, title, full title, employer job code, category + all categories, sub-categories, experience required, job types, remote / hybrid flags, "hot job" flag, no-CV flag, suitable-for tags, screening questions |
| **Location** | Main city in Hebrew + English, latitude / longitude, **every address** the posting lists (`locations[]` with coordinates), areas in Hebrew + English, regions |
| **Salary** | Salary text, min / max, currency (ILS) and period, where the employer publishes it |
| **Company** | Company name, company ID, profile URL, logo, confidential-employer flag |
| **Apply & dates** | Apply link, external apply link, original posting date (`postedAt`), date the site last refreshed the listing (`refreshedAt`) |
| **Description** | Full description **and** requirements as plain text, HTML and/or Markdown. You choose the formats per run |
| **Tracking** | Search keyword, scrape time, content hash; in incremental mode also change type (NEW / UPDATED / UNCHANGED / EXPIRED) and repost detection |

***

### Key features

- 🔎 **Search or URL scraping**: keyword search in Hebrew or English (several searches at once, duplicates removed), or paste drushim.co.il search, category, sub-category, area and job links.
- 🇬🇧 **English-labelled filters**: every dropdown has readable names such as "Hi-Tech – Software", "Tel Aviv" or "3-4 years", so you never need a table of numeric codes to build a search.
- 🎚️ **Multi-select everywhere**: pick several of the **34 categories**, **7 regions**, **40 cities/areas**, **5 experience levels** and **7 job types** in one run. The region, city, experience and job-type filters also narrow any search links you paste.
- 🌐 **English translations on every record**: `cityEnglish`, `areasEnglish`, `categoryEnglish`, `experienceEnglish` and `jobTypesEnglish` sit beside the Hebrew originals, ready for English dashboards, spreadsheets and LLMs.
- 🧭 **Search by place name or distance**: type cities or regions in English or Hebrew (`Tel Aviv, Haifa` or `ירושלים`), or keep only jobs within a set number of km of any point. Jobs outside the radius are not charged.
- 📍 **Every address, geocoded**: postings that list several workplaces return all of them with latitude and longitude, not just the first.
- 🧠 **Full details on every job**: description **and** requirements in text, HTML or Markdown, plus screening questions, the employer's own job code and external apply links. You never need to toggle a separate details step.
- 🟢 **Zero-config start**: an empty input returns jobs from all over Israel, so you get useful data on the first click.
- ♻️ **Incremental monitoring**: schedule it and get only new and updated jobs, plus the ones taken down if you want them. Unchanged jobs are skipped and not charged.
- 🔔 **Notifications**: Telegram, Slack, Discord or any webhook (n8n / Make / Zapier).
- 🤖 **AI-ready**: compact mode, drop-empty mode and a description length cap keep payloads small for LLMs and MCP.

***

### 🚀 How to scrape Drushim.co.il

1. Open the Actor and enter **search keywords** in Hebrew or English (e.g. `Python` or `מפתח`), or paste a drushim.co.il link. You can also leave it empty.
2. Tick the **categories, regions, cities/areas, experience levels and job types** you want.
3. Set **Max results** (0 = no limit).
4. (Optional) Turn on **incremental mode** and a **notification** channel, then **Schedule** it.
5. Click **Start**. Results stream into the Output tab, and you can download them as **JSON, CSV or Excel** or pull them from the **API**.

No login, no cookies, no setup. It runs out of the box.

#### Quick-start example input

```json
{ "query": "Python", "maxResults": 100, "areas": ["1", "4"], "experience": ["2", "3"] }
```

This returns up to 100 Python jobs in Tel Aviv and Rishon LeZion that ask for 1–4 years of experience. Each one includes the full requirements, every workplace address and English labels, which makes it a quick way to map the mid-level developer market in central Israel.

***

### Input

Configure it in the visual editor with no code, or pass JSON through the API. There are **42 inputs** in seven groups. In the editor every filter is an English-labelled dropdown; in JSON you pass the value codes shown in the Actor's input tab.

#### 🔎 Search

| Field | Type | What it does |
|---|---|---|
| `query` | string | Job titles, skills or companies in Hebrew or English. Separate several searches with commas; each one runs separately and duplicates are removed. |
| `location` | string | City or region names in English or Hebrew, comma-separated (e.g. `Tel Aviv, Haifa` or `ירושלים`). Combined with the Regions and Cities dropdowns, a job in any of them is included; names it doesn't recognise are skipped with a warning in the log. |
| `startUrls` | array | Paste drushim.co.il search, category, sub-category, area or job links. Any filters in the link are kept, and the region, city, experience, job-type and no-CV filters below narrow search links further. |
| `maxResults` | integer | Maximum jobs across all searches (default 25; 0 = no limit). |

#### 🎚️ Filters

Several values inside one filter widen the search (OR). Different filters combined narrow it (AND).

| Field | Type | What it does |
|---|---|---|
| `categories` | multi-select | 34 categories: Hi-Tech – Software, Hi-Tech – QA, Information Security, Engineering, Sales, Marketing, Customer Service, Finance / Capital Markets, Medicine / Health, Logistics / Shipping, Work from Home and more. |
| `subcategories` | array | Sub-category numbers from drushim.co.il links, e.g. `481` from `/jobs/subcat/481/` (Python). Several are combined with OR. |
| `regions` | multi-select | 7 regions: Center (Gush Dan), Sharon, Shfela, Jerusalem area, North (incl. Haifa), South, Judea & Samaria. |
| `areas` | multi-select | 40 cities / areas: Tel Aviv, Jerusalem, Haifa, Be'er Sheva, Petah Tikva, Rishon LeZion, Herzliya / Ramat HaSharon, Netanya / Even Yehuda, Ashdod / Gan Yavne, Modiin, Eilat / Arava and more. Combined with Regions, a job in either is included. |
| `latitude` + `longitude` + `radiusKm` | number | Keep only jobs with an address within this many km of the point (e.g. 32.0853, 34.7818 for Tel Aviv). Jobs without coordinates are kept, and jobs outside the radius are not charged. Combine it with a region or location so the search itself stays small. |
| `experience` | multi-select | No experience, 1-2 years, 3-4 years, 5-6 years, 7+ years. |
| `jobTypes` | multi-select | Full-time, Part-time, Temporary, Shifts, Work from home, Hybrid, Preferred employment (discharged soldiers). |
| `noCvRequired` | boolean | Only jobs you can apply to without uploading a CV. |

#### 📄 Output

Descriptions and requirements are included by default.

| Field | Type | What it does |
|---|---|---|
| `includeDetails` | boolean | On by default. Turn it off to leave out the description and requirements text for much smaller records; `descriptionLength` is still included. |
| `descriptionFormat` | enum | `all`, `text`, `html` or `markdown`. |
| `descriptionMaxLength` | integer | Cut description and requirements to N characters (0 = full text). |
| `phoneExtractionMode` | enum | `strict` (clearly formatted numbers only) or `lenient` (also bare Israeli numbers like 0501234567) for the rare posting that lists a phone. |
| `compact` | boolean | Core fields only. Ideal for AI agents and MCP clients. |
| `excludeEmptyFields` | boolean | Drop null / empty fields for cleaner output. |

#### ♻️ Incremental monitoring

| Field | Type | What it does |
|---|---|---|
| `incrementalMode` | boolean | Remember jobs between runs and emit only what changed; unchanged jobs are not charged. |
| `stateKey` | string | Stable name for the tracked search (auto-derived if blank). |
| `emitUnchanged` / `emitExpired` | boolean | Also emit UNCHANGED jobs / jobs that have been taken down. |
| `skipReposts` | boolean | Skip new jobs whose title and company match a job already tracked under another ID (an employer re-listing the same ad). Skipped jobs are not charged. |
| `allowNonIncrementalFallback` | boolean | If the saved tracking state can't be opened, run as a normal run instead of failing. |

#### 🔔 Notifications

Fill in only the channels you want. Bot tokens and webhook URLs are secret inputs: encrypted at rest, masked in the UI and never written to the run log.

| Field | Type | What it does |
|---|---|---|
| `telegramToken` + `telegramChatId` | string | ✈️ Telegram bot token (from @BotFather) + chat or channel ID. |
| `slackWebhookUrl` | string | 💬 Slack Incoming Webhook URL. |
| `discordWebhookUrl` | string | 🎮 Discord channel webhook URL. |
| `webhookUrl` + `webhookHeaders` | string / object | 🪝 POST structured JSON anywhere: n8n, Make, Zapier. |
| `notificationLimit` | integer | How many jobs to list in each message (1–20). |
| `notionApiKey` + `notionDatabaseId` | string | 📓 Stream every job into a Notion database as its own page. Create an internal integration at notion.so/my-integrations, connect it to your database (⋯ → Connections), then paste the token and the database URL. An empty database works: the columns are created on the first run. |
| `notionCreateProperties` | boolean | Create any columns the database is missing, with the right types (on by default). Turn off to write only into columns you made yourself. |

#### 🗺️ Job list mode

| Field | Type | What it does |
|---|---|---|
| `source` | enum | `search` (default) returns full job records. `sitemap` returns only `id`, `url` and `lastModified` for every active job on the site (about 14,000) in one pass, and ignores keywords and filters. |
| `sitemapFromDate` | string | Job list mode only: keep jobs modified on or after this date (YYYY-MM-DD). |

#### ⚙️ Advanced

| Field | Type | What it does |
|---|---|---|
| `proxyConfiguration` | object | Optional. Not needed normally. |
| `maxPages` | integer | Safety limit on result pages per search (0 = no limit). Max results is the main cost control. |
| `maxRequestRetries` | integer | Retries per failed request (0–10). |
| `ignoreUrlFailures` | boolean | Skip links that aren't drushim.co.il search or job pages instead of failing the run. |

#### More example inputs

All hi-tech software and information-security jobs in the North, hybrid or remote:

```json
{ "categories": ["6", "30"], "regions": ["north"], "jobTypes": ["5", "6"], "maxResults": 0 }
```

A daily Hebrew-keyword watch that sends only new jobs to Telegram:

```json
{ "query": "נהג, מחסנאי", "regions": ["center", "sharon"], "incrementalMode": true, "telegramToken": "<BOT_TOKEN>", "telegramChatId": "@yourchannel" }
```

Paste a category page and keep only entry-level jobs:

```json
{ "startUrls": [{ "url": "https://www.drushim.co.il/jobs/cat6/" }], "experience": ["1"], "descriptionFormat": "markdown" }
```

***

### Output

Each dataset item is one job. Every job arrives with its full description, requirements, locations and company details, so there's no separate details step to turn on. Here is a real record, trimmed:

```json
{
  "id": "38486441",
  "url": "https://www.drushim.co.il/job/38486441/7ed063b2/",
  "title": "לארגון בטחוני בלוד, דרוש/ה מפתח אוטומציות בסייבר",
  "employerJobCode": "233438",
  "companyName": "TCMCAREER",
  "companyId": "10312",
  "isConfidentialCompany": false,
  "companyUrl": "https://www.drushim.co.il/דרושים-10312-tcmcareer/",
  "city": "לוד",
  "cityEnglish": "Lod",
  "latitude": 31.951014,
  "longitude": 34.888075,
  "locations": [
    { "city": "לוד", "cityEnglish": "Lod", "latitude": 31.951014, "longitude": 34.888075 }
  ],
  "areasEnglish": ["Tel Aviv", "Ramat Gan / Givatayim", "Petah Tikva", "Lod / Ramla", "Modiin"],
  "regions": ["Center"],
  "category": "אבטחת מידע",
  "categoryEnglish": "Information Security",
  "subcategories": ["מומחה/ית אבטחת מידע", "אנליסט/ית סייבר"],
  "experience": "5-6 שנים",
  "experienceEnglish": "5-6 years",
  "jobTypes": ["משרה מלאה"],
  "jobTypesEnglish": ["Full-time"],
  "isRemote": false,
  "isHybrid": false,
  "salaryText": "15000-18000",
  "salaryMin": 15000,
  "salaryMax": 18000,
  "salaryCurrency": "ILS",
  "salaryPeriod": "MONTH",
  "noCvRequired": false,
  "applyUrl": "https://www.drushim.co.il/sendcv.aspx?jobcode=38486441",
  "postedAt": "2026-09-21T06:18:39+03:00",
  "refreshedAt": "2026-09-26T06:51:39+03:00",
  "description": "מהנדס/ת בכיר/ה לאוטומציית תגובה לאירועי סייבר\nלארגון בטחוני מוביל בלוד, דרוש/ה מפתח אוטומציות בסייבר. …",
  "requirements": "דרישות *חובה*:\n- מעל 4 שנות ניסיון ב-SOC / Incident Response / DFIR.\n- שליטה ב-Python. …",
  "source": "drushim.co.il",
  "searchKeyword": "python",
  "scrapedAt": "2026-09-26T06:51:39.318715+00:00",
  "isRepost": false,
  "changeType": "NEW"
}
```

Descriptions and requirements also come as `descriptionHtml` / `descriptionMarkdown` and `requirementsHtml` / `requirementsMarkdown`, depending on `descriptionFormat`, and `descriptionLength` gives the description's length in characters. Missing values come back as `null`; **`excludeEmptyFields`** drops them, and **compact mode** keeps only the core fields for lean AI/MCP payloads. The tracking fields `changeType`, `isRepost`, `repostOfId` and `repostDetectedAt` appear in incremental mode only; `isRepost` flags a new job whose title and company match one seen before under a different ID. Incremental records also carry `firstSeenAt`, `lastSeenAt` and `previousSeenAt`, and EXPIRED records add `expiredAt`. In Job list mode each record holds only `id`, `url`, `lastModified`, `source` and `scrapedAt`.

The Output tab also includes a ready-made **Overview** table: job title, company, city, category, experience, job type, salary, posted date and link, with city, category, experience and job type in English.

***

### ♻️ How to monitor Drushim.co.il with incremental mode

Schedule the Actor and turn on **incremental mode**. Each run compares against the previous one and emits only **NEW** and **UPDATED** jobs; turn on `emitExpired` to also get a record for each job that was taken down (**EXPIRED**). Unchanged jobs are recognised and skipped, and you are not charged for them. A job that is bumped back to the top of the list without any change to its content stays UNCHANGED, so daily re-dating doesn't flood your feed.

| | First run (baseline) | Next run (nothing changed) |
|---|---|---|
| Jobs found | all | all |
| Records emitted & billed | all | **none** |
| Alert message | yes | **none** |

After the baseline, your cost depends on how much Drushim.co.il changes, not on how much of it you watch:

| Daily churn | of 1,000 tracked | billable records | you save |
|---|---|---|---|
| 5 % | 1,000 | 50 | **95 %** |
| 15 % | 1,000 | 150 | **85 %** |
| 30 % | 1,000 | 300 | **70 %** |

#### Setting up scheduled monitoring

1. Configure your keywords and filters.
2. Turn on **Incremental mode**.
3. Run it once to seed the baseline.
4. Open the **Schedules** tab and set a recurring run (e.g. hourly or daily).
5. Add a notification channel so new jobs reach you as they're posted.

EXPIRED records are only produced on runs that read the whole search (not stopped early by Max results), so you never get a false "taken down" signal.

***

### 🔔 How to set up Drushim.co.il alerts

Fill in any of the channels listed under **Notifications** in the Input section: Telegram, Slack, Discord or a generic webhook for n8n / Make / Zapier. After each run that finds jobs, every configured channel gets one message listing them (`notificationLimit` sets how many are shown). Each channel works independently, so a broken channel can't stop the scrape or the other channels. Pair it with **incremental mode** so each message covers only jobs that are new or changed since the last run.

Want every job as a row rather than a message? Connect a **Notion database** (`notionApiKey` + `notionDatabaseId`) and each job becomes a page with typed columns (salary as numbers, dates as dates, job types as tags), streamed in while the run is still going. With incremental mode on, only new and updated jobs are added.

***

### 💡 What can you do with Drushim.co.il data?

#### Build an Israeli job feed in English

Feed Hebrew listings into an English-language job site, newsletter or relocation portal without translating filters or labels yourself. City, category, experience and job type arrive already translated.

#### Recruitment and talent sourcing

Watch the categories and cities you recruit for and get new openings on Telegram or Slack as they're posted. Screening questions and the employer's own job code help agencies match and de-duplicate roles.

#### Hiring signals for B2B sales

A company opening many roles in one category is usually growing or changing its tech stack. Company names, profile links and posting dates turn Drushim.co.il into a list of businesses to contact, which you can rank by how many roles each one is hiring for.

#### Labour-market and regional research

Count openings by category, region, city, experience level and job type over time, and map them with latitude/longitude. Scheduled incremental runs build a clean history of what was posted and what was taken down.

#### Salary benchmarking

Where employers publish a range, you get numeric min/max in ILS with the pay period. Combine it with category and experience to benchmark offers across roles and regions.

#### Feed AI agents and LLM pipelines

Send compact JSON straight into an LLM context, an MCP tool or a vector store. Markdown descriptions, `excludeEmptyFields` and `descriptionMaxLength` keep token costs low.

***

### 💰 How much does it cost to scrape Drushim.co.il?

This Actor uses Apify's **pay-per-event** model: a small fee when a run starts, plus a fee for each job returned. The Actor's **Pricing** tab shows the current numbers. Prices there update live, so this page never goes out of date.

Each job arrives complete in a single pass with no extra page per job, which keeps the per-record fee at the low end of the market. Two settings cut your bill further:

- **Site-side filters**: jobs you filtered out are never fetched and never billed.
- **Incremental mode**: after the baseline you pay only for what changed (see the table above).

***

### 🔌 Integrations & export

Export to **JSON, CSV, Excel** or an HTML table, or pull results from the **REST API** and the **JavaScript / Python** clients. You can run it on a **schedule** and connect it to **Google Sheets, Slack, Make, Zapier and n8n**. It also works as an **MCP tool** for AI agents, where compact mode keeps token usage low.

***

### 🔗 Using the API

Run this Actor from your own code. Example with the Apify Python client:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run_input = {
    "query": "Python",
    "regions": ["center"],
    "maxResults": 50,
}

run = client.actor("corvuslab/drushim-jobs-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["cityEnglish"], item["categoryEnglish"])
```

It also works with the JavaScript/TypeScript client, the Apify CLI and the REST API.

***

### ❓ FAQ

**Do I need a Drushim.co.il account or a Hebrew keyboard?** No. It runs without login or cookies, the filters are labelled in English, and you can search with English keywords like `Python` or `QA`. Hebrew keywords work too.

**How many jobs can I get?** Drushim.co.il typically lists around 13,000–17,000 live jobs. Set `maxResults` to 0 to collect everything a search matches. With an empty input you get jobs from across all of Israel.

**Why is salary empty on most jobs?** Most Israeli employers don't publish pay on Drushim.co.il. Only about 1 in 10 postings includes a salary. When one does, you get `salaryText` plus numeric `salaryMin` / `salaryMax` in ILS with the period. Otherwise these fields are `null`.

**Why is the company name missing on some jobs?** About 12% of employers post confidentially (often through a recruitment agency). Those records have `isConfidentialCompany: true` and no company profile.

**Are the job descriptions in English?** Descriptions and requirements are returned exactly as the employer wrote them, which is usually Hebrew and sometimes English. The structured fields (city, areas, category, experience, job type) are translated to English on every record.

**What's the difference between `postedAt` and `refreshedAt`?** `postedAt` is when the job was first published. `refreshedAt` is the date Drushim.co.il last bumped the listing to the top. Many jobs are refreshed daily, so use `postedAt` to judge how new a job really is.

**Can I filter by sub-category?** Yes, in two ways. Enter the sub-category number in `subcategories` (e.g. `481` from `/jobs/subcat/481/`), or paste the sub-category page link into `startUrls`. Every job's `subcategories` field is filled either way.

**Does it return contact emails or phone numbers?** Rarely. Drushim.co.il is an apply-through-the-site board, and fewer than 2% of postings include an email or phone in the text. Plan to use the apply link instead.

***

### ⚖️ Is it legal to scrape Drushim.co.il?

This Actor collects only **publicly available** job listings. You're responsible for how you use the data, in particular any personal information, and for complying with the site's terms and applicable law, including Israel's Privacy Protection Law and the GDPR where they apply. This Actor is not affiliated with, endorsed by or sponsored by Drushim.co.il.

***

**Keywords:** drushim scraper · drushim.co.il scraper · drushim api · drushim job scraper · Israel jobs scraper · Israel job listings · Hebrew job board scraper · דרושים · Tel Aviv jobs · Israeli hi-tech jobs · job monitoring · recruitment data · salary benchmarking · export to CSV · export to Excel · no-code scraper · MCP tool for AI agents

# Changelog

This Actor's version history is a separate document: https://apify.com/corvuslab/drushim-jobs-scraper/changelog.md

# Actor input Schema

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

Job titles, skills or companies — in Hebrew or English (e.g. מפתח, Python, נהג). Separate several searches with commas; each runs on its own and duplicates are removed.

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

Cities or regions by name, in English or Hebrew — e.g. "Tel Aviv, Haifa" or "ירושלים". Separate several with commas. Combined with the Regions and Cities dropdowns: a job in any of them is included.

## `startUrls` (type: `array`):

Optional. Paste search, category (/jobs/cat6/), sub-category (/jobs/subcat/481/), area (/jobs/area/1-2/) or job (/job/<code>/<hash>/) links. Any filters in the link are kept, and the region, city, experience, job-type and no-CV filters below narrow search links further.

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

Maximum number of jobs to return across all searches. Set 0 for no limit (the whole site holds roughly 13,000–17,000 jobs).

## `categories` (type: `array`):

Only jobs in these categories. Pick several to search each one.

## `subcategories` (type: `array`):

Sub-category numbers as they appear in drushim.co.il links — e.g. 481 from /jobs/subcat/481/ (Python). Several are combined with OR.

## `regions` (type: `array`):

Only jobs in these regions of Israel.

## `areas` (type: `array`):

Only jobs in these cities or areas. Combined with Regions, a job in either one is included.

## `latitude` (type: `number`):

Centre of a radius search, e.g. 32.0853 for Tel Aviv. Use with Longitude and Radius.

## `longitude` (type: `number`):

Centre of a radius search, e.g. 34.7818 for Tel Aviv.

## `radiusKm` (type: `number`):

Keep only jobs with an address within this many km of the Latitude/Longitude centre. Jobs without coordinates are kept. Jobs outside the radius are not charged — combine it with a region or location so the search itself stays small.

## `experience` (type: `array`):

Only jobs asking for this much experience.

## `jobTypes` (type: `array`):

Full-time, part-time, shifts, hybrid, work from home, preferred employment for discharged soldiers…

## `noCvRequired` (type: `boolean`):

Only jobs you can apply to without uploading a CV.

## `includeDetails` (type: `boolean`):

Turn off to leave out the description and requirements text for much smaller records. descriptionLength is still included.

## `descriptionFormat` (type: `string`):

Which representation(s) of the description and requirements to include.

## `descriptionMaxLength` (type: `integer`):

Cut the description and requirements to this many characters. 0 = full text.

## `phoneExtractionMode` (type: `string`):

How eagerly to pick phone numbers out of the posting text into extractedPhones. Few postings include one.

## `compact` (type: `boolean`):

Emit only the core fields. Ideal for AI agents and MCP clients.

## `excludeEmptyFields` (type: `boolean`):

Remove null, empty-string and empty-array fields from each record.

## `incrementalMode` (type: `boolean`):

Remember jobs between runs and tag every record with a changeType (NEW / UPDATED / UNCHANGED / EXPIRED). Unchanged jobs are skipped and not charged.

## `stateKey` (type: `string`):

Stable name for the tracked search. Leave empty to derive one automatically from your search settings.

## `emitUnchanged` (type: `boolean`):

Also emit jobs that have not changed since the previous run.

## `emitExpired` (type: `boolean`):

Emit a record for each job that was there last run but has since been taken down. Only on runs that read the whole search (not stopped by Max results).

## `skipReposts` (type: `boolean`):

With incremental mode, skip new jobs whose title and company match a job already tracked under another ID (an employer re-listing the same ad). Skipped jobs are not charged.

## `allowNonIncrementalFallback` (type: `boolean`):

If the saved incremental state cannot be opened, run as a normal (non-incremental) run instead of failing.

## `telegramToken` (type: `string`):

Bot token from @BotFather.

## `telegramChatId` (type: `string`):

Chat or channel ID, e.g. "-100123456789" or "@yourchannel".

## `slackWebhookUrl` (type: `string`):

Slack incoming-webhook URL.

## `discordWebhookUrl` (type: `string`):

Discord incoming-webhook URL.

## `webhookUrl` (type: `string`):

Any HTTPS endpoint. Receives a JSON POST with the matched records — works with n8n, Make and Zapier.

## `webhookHeaders` (type: `object`):

Extra headers for the webhook request, e.g. {"Authorization": "Bearer xyz"}.

## `notificationLimit` (type: `integer`):

How many records to include in each notification message.

## `notionApiKey` (type: `string`):

Optional. Create an internal integration at notion.so/my-integrations, copy its Internal Integration Secret (starts with 'ntn\_'), then open the target database → ⋯ → Connections → and connect that integration. Without that last step Notion returns 'object\_not\_found'.

## `notionDatabaseId` (type: `string`):

Optional. Paste the database's URL or its 32-character ID. Every job becomes one page in that database. The database can start completely empty — the columns are created for you on the first run.

## `notionCreateProperties` (type: `boolean`):

Add any columns the target database is missing (with the right Notion type) on the first run. Turn this off to write only into columns you created yourself — fields with no matching column are then skipped.

## `source` (type: `string`):

Search returns full job records. Job list returns only id, url and lastModified for every active job (~14,000) — ignores keywords and filters.

## `sitemapFromDate` (type: `string`):

Job list mode only: keep jobs modified on or after this date (YYYY-MM-DD).

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

Optional. Not needed normally — turn on Apify Proxy only if runs start failing to reach the site.

## `maxPages` (type: `integer`):

Safety limit on result pages per search (the first page has 25 jobs, the rest 10). 0 = no limit. Max results is the main cost control.

## `maxRequestRetries` (type: `integer`):

How many times to retry a failed request before giving up on it.

## `ignoreUrlFailures` (type: `boolean`):

Skip links that are not drushim.co.il search or job pages instead of failing the run.

## Actor input object example

```json
{
  "query": "מפתח",
  "maxResults": 25,
  "noCvRequired": false,
  "includeDetails": true,
  "descriptionFormat": "all",
  "descriptionMaxLength": 0,
  "phoneExtractionMode": "strict",
  "compact": false,
  "excludeEmptyFields": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "skipReposts": false,
  "allowNonIncrementalFallback": false,
  "notificationLimit": 5,
  "notionCreateProperties": true,
  "source": "search",
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxPages": 0,
  "maxRequestRetries": 3,
  "ignoreUrlFailures": true
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `allItems` (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 = {
    "query": "מפתח"
};

// Run the Actor and wait for it to finish
const run = await client.actor("corvuslab/drushim-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 = { "query": "מפתח" }

# Run the Actor and wait for it to finish
run = client.actor("corvuslab/drushim-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 '{
  "query": "מפתח"
}' |
apify call corvuslab/drushim-jobs-scraper --silent --output-dataset

```

## MCP server setup

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