# Public Tenders & RFPs Scraper (`black_eitan/public-tenders-monitor`) Actor

Automatically scrapes public tenders & RFPs, closing dates, and attached documents, with one-click Excel export. שואב אוטומטית מכרזים פומביים, תאריכי סגירה וקבצים מצורפים, ומייצא אותם לאקסל בלחיצת כפתור.

- **URL**: https://apify.com/black_eitan/public-tenders-monitor.md
- **Developed by:** [Eitan shachor](https://apify.com/black_eitan) (community)
- **Categories:** Lead generation, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.25 / actor start

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

## Public Tenders & RFPs Scraper

**Automatically scrape public tenders, RFPs, closing dates, and attached documents — and export everything to Excel in one click.**

***

### Why Use Public Tenders & RFPs Scraper?

Winning government and public-sector contracts starts with discovering opportunities on time. Manually checking procurement portals every day, clicking into dozens of tender pages, and downloading scattered PDF attachments wastes hours of valuable bid-preparation time.

**Public Tenders & RFPs Scraper** automates your entire tender discovery workflow:

- **Zero-Config Instant Start**: Pre-configured out of the box with the **Israeli Government Procurement Administration (`mr.gov.il`)** public search portal — just click **Start** to extract live active tenders immediately.
- **Multi-Portal Support**: Add any government, municipal, public utility, or corporate procurement URLs (`startUrls`) to monitor all your tender sources in a single run.
- **Deep Document & Attachment Extraction**: Automatically visits internal tender detail pages to extract direct download links for all attached specifications, agreements, bills of quantities, and forms (`PDF`, `DOCX`, `XLSX`, `ZIP`).
- **Smart Keyword Tagging & Filtering**: Automatically flags or filters tenders matching your target keywords (including morphological prefix awareness for Hebrew terms like `"פיתוח"`, `"שירותים"`, `"ייעוץ"` as well as English keywords).
- **One-Click Excel Export**: Generates a clean, structured Apify Dataset ready for instant export to **Excel (`.xlsx`)**, **CSV**, or **JSON**, plus a dedicated `TENDERS_EXCEL_HEBREW.csv` file encoded with `UTF-8 BOM` so Hebrew and multilingual text opens cleanly in Microsoft Excel without garbled characters.
- **Incremental Monitoring ("Only New Tenders")**: Optionally remembers previously seen tenders across runs so you only receive newly published opportunities.

***

### Who Is This Actor For?

- **Contractors & Infrastructure Providers**: Track construction, engineering, maintenance, facilities management, and supply tenders the moment they go live.
- **B2B Service Providers & Consultancies**: Discover RFPs for management consulting, financial advisory, training, staffing, logistics, and operational services.
- **IT Vendors, Software Houses & System Integrators**: Monitor government and enterprise RFPs/RFIs for software development, cloud migration, cybersecurity, AI, and digital transformation.
- **Bid Managers & Business Development Teams**: Replace manual portal browsing with automated daily or weekly Excel reports delivered straight to your team, CRM, or automation workflows (Make, Zapier, n8n, Google Sheets).

***

### What Data Does It Extract?

For every tender or RFP discovered, the Actor extracts and normalizes the following fields:

| Field | Type | Description |
| :--- | :--- | :--- |
| `tenderId` | `String` | Official tender number and procedure/reference ID (e.g., `4000612578 (הליך 6/2025)`). |
| `title` | `String` | Full title and subject of the tender or RFP. |
| `publisher` | `String` | Issuing government ministry, municipality, or public organization. |
| `closingDate` / `submissionDate` | `String` | Official closing date and time for submitting bids (`DD/MM/YYYY HH:MM`). |
| `submissionDateIso` | `String` | Standardized ISO date (`YYYY-MM-DD`) for easy sorting and calendar integration. |
| `directUrl` / `tenderUrl` | `String` | Direct URL to the official tender page. |
| `attachments` / `documentLinks` | `Array<Object>` | Structured list of attachments (`{ name, url, type }`) including `PDF`, `DOCX`, `XLSX`, and `ZIP` files. |
| `documentLinksText` | `String` | Formatted list of direct download URLs for attached tender documents (optimized for a single Excel cell). |
| `documentCount` | `Integer` | Total number of attached documents discovered on the tender page. |
| `matchedKeywordsText` | `String` | Comma-separated list of your target keywords found in the tender. |
| `matchedKeywords` | `Array<String>` | Array of matched keywords. |
| `publishedDate` | `String` | Publication or last-updated date of the tender. |
| `sourceUrl` | `String` | The listing portal URL from which the tender was scraped. |
| `scrapedAt` | `String` | ISO timestamp of when the record was extracted. |

***

### How to Use Public Tenders & RFPs Scraper

#### 1. Quick Start (1-Click Run)

1. Open **Public Tenders & RFPs Scraper** in the Apify Console.
2. Click **Start** — no manual setup required. By default, the Actor scans active tenders on the Israeli Government Procurement Administration (`https://mr.gov.il/ilgStoreFront/he/search`), follows each tender's detail page, extracts all closing dates and attached files, and populates the output Dataset.
3. Once the run finishes, click **Export** to download your results as **Excel (`.xlsx`)**, **CSV**, or **JSON**.

#### 2. Customizing Your Input

You can tailor the scraper to your exact business needs using the Input configuration:

- **`startUrls`**: Keep the default `mr.gov.il` portal or add custom URLs of public tender boards, municipal procurement pages, or RFP listings.
- **`keywords`**: Define the keywords relevant to your business (e.g., `["פיתוח", "שירותים", "ייעוץ", "IT", "software"]`).
- **`filterByKeywords`**:
  - `false` *(Default)*: Saves **all** scraped tenders and tags matching keywords in the `matchedKeywordsText` column.
  - `true`: Saves **only** tenders that match at least one of your keywords (and performs targeted keyword searches on `mr.gov.il`).
- **`followDetailPages`** *(Default: `true`)*: Visits each tender's dedicated page to extract full submission deadlines and direct attachment download links.
- **`onlyNewTenders`** *(Default: `false`)*: When enabled, stores seen tender IDs in the Actor's Key-Value Store (`SEEN_TENDERS_STATE`) and outputs only newly discovered tenders on subsequent runs.
- **`maxItemsPerSite`** *(Default: `50`)*: Maximum number of tenders to process per source URL.

***

### Input Example

```json
{
  "startUrls": [
    {
      "url": "https://mr.gov.il/ilgStoreFront/he/search"
    }
  ],
  "keywords": [
    "פיתוח",
    "שירותים",
    "ייעוץ"
  ],
  "filterByKeywords": false,
  "followDetailPages": true,
  "onlyNewTenders": false,
  "maxItemsPerSite": 50
}
```

***

### Output Example

```json
{
  "tenderId": "4000612578 (הליך 6/2025)",
  "title": "מכרז לשירותי ליווי ומימוש תהליכי טרנספורמציה דיגיטלית עבור מערך הדיגיטל הלאומי",
  "publisher": "מערך הדיגיטל הלאומי",
  "closingDate": "19/10/2026 14:59",
  "submissionDate": "19/10/2026 14:59",
  "submissionDateIso": "2026-10-19",
  "directUrl": "https://mr.gov.il/ilgstorefront/he/p/4000612578",
  "tenderUrl": "https://mr.gov.il/ilgstorefront/he/p/4000612578",
  "attachments": [
    {
      "name": "מסמכי המכרז",
      "url": "https://mr.gov.il/ilgstorefront/he/p/attachment/...",
      "type": "ATTACHMENT"
    }
  ],
  "documentLinks": [
    {
      "name": "מסמכי המכרז",
      "url": "https://mr.gov.il/ilgstorefront/he/p/attachment/...",
      "type": "ATTACHMENT"
    }
  ],
  "documentLinksText": "מסמכי המכרז: https://mr.gov.il/ilgstorefront/he/p/attachment/...",
  "documentCount": 8,
  "matchedKeywordsText": "שירותים, ייעוץ",
  "matchedKeywords": [
    "שירותים",
    "ייעוץ"
  ],
  "publishedDate": "19/10/2026",
  "sourceUrl": "https://mr.gov.il/ilgStoreFront/he/search",
  "scrapedAt": "2026-10-19T16:02:28.009Z"
}
```

***

### Exporting to Excel (One-Click Download)

You have two ways to open your scraped tenders in Microsoft Excel:

1. **Apify Dataset Export**: On the run results page, click **Export** -> select **Excel (`.xlsx`)** or **CSV** -> click **Download**.
2. **Pre-Formatted Hebrew Excel CSV**: Open the run's **Storage -> Key-Value Store** and download **`TENDERS_EXCEL_HEBREW.csv`**, which includes a `UTF-8 BOM` header specifically designed to display Hebrew and English columns cleanly when double-clicked in Microsoft Excel.

# Actor input Schema

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

רשימת עמודי מכרזים פומביים שהבוט יסרוק. ברירת המחדל היא עמוד החיפוש הפומבי של מינהל הרכש הממשלתי (mr.gov.il).

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

מילות מפתח לחיפוש בכותרת או בתיאור המכרז (למשל: פיתוח, שירותים, ייעוץ). הבוט מזהה גם הטיות בעברית (כגון לפיתוח, ושירותים).

## `filterByKeywords` (type: `boolean`):

אם מסומן, רק מכרזים שמכילים לפחות מילת מפתח אחת יישמרו ב-Dataset. אם לא מסומן (ברירת מחדל), כל המכרזים מהעמוד יישמרו ב-Dataset ויצוין אילו מילות מפתח נמצאו בהם.

## `followDetailPages` (type: `boolean`):

אם מסומן, הבוט ייכנס גם לעמוד הפנימי של כל מכרז כדי לאתר קישורים ישירים לקובצי PDF/Word/Excel ותאריכי הגשה מלאים.

## `onlyNewTenders` (type: `boolean`):

שומר היסטוריית מכרזים ב-Key-Value Store ומחזיר רק מכרזים שלא הופיעו בסריקות קודמות.

## `maxItemsPerSite` (type: `integer`):

הגבלת כמות המכרזים המקסימלית לחילוץ מכל כתובת אתר.

## `customSelectors` (type: `object`):

הגדרת CSS Selectors ספציפיים עבור אתרים עם מבנה ייחודי (itemSelector, titleSelector, dateSelector, linkSelector, docSelector).

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

שימוש בפרוקסי של Apify לעקיפת חסימות באתרים ממשלתיים ומוניציפליים.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://mr.gov.il/ilgStoreFront/he/search"
    }
  ],
  "keywords": [
    "פיתוח",
    "שירותים",
    "ייעוץ"
  ],
  "filterByKeywords": false,
  "followDetailPages": true,
  "onlyNewTenders": false,
  "maxItemsPerSite": 50,
  "customSelectors": {},
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `tendersDataset` (type: `string`):

Structured table of extracted tenders (tenderId, title, publisher, closingDate, directUrl, attachments) ready for one-click Excel/CSV/JSON export.

## `excelCsvFile` (type: `string`):

Direct link to download TENDERS_EXCEL_HEBREW.csv formatted with UTF-8 BOM for opening directly in Microsoft Excel.

## `runSummary` (type: `string`):

JSON summary of total tenders scanned and saved during the run.

# 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 = {
    "startUrls": [
        {
            "url": "https://mr.gov.il/ilgStoreFront/he/search"
        }
    ],
    "keywords": [
        "פיתוח",
        "שירותים",
        "ייעוץ"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("black_eitan/public-tenders-monitor").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 = {
    "startUrls": [{ "url": "https://mr.gov.il/ilgStoreFront/he/search" }],
    "keywords": [
        "פיתוח",
        "שירותים",
        "ייעוץ",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("black_eitan/public-tenders-monitor").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 '{
  "startUrls": [
    {
      "url": "https://mr.gov.il/ilgStoreFront/he/search"
    }
  ],
  "keywords": [
    "פיתוח",
    "שירותים",
    "ייעוץ"
  ]
}' |
apify call black_eitan/public-tenders-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,black_eitan/public-tenders-monitor"
        }
    }
}
```

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/6ecyo1tm9jfQLEs3Y/builds/0uKyxo5p4tcDe2DQj/openapi.json
