# MENA Tenders Scraper: Egypt, Iraq, Jordan, Morocco Bids (`alfhar/mena-tenders-scraper`) Actor

Find open tenders, expressions of interest and contract awards in Egypt, Iraq, Jordan, Morocco, Tunisia, Lebanon, Yemen and the West Bank from the World Bank open procurement API, with deadlines and buyer details.

- **URL**: https://apify.com/alfhar/mena-tenders-scraper.md
- **Developed by:** [Alfhar Development](https://apify.com/alfhar) (community)
- **Categories:** Business, Lead generation
- **Stats:** 1 total users, 1 monthly users, 75.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

## MENA Tenders Scraper: open bids and consulting calls in Egypt, Iraq, Jordan, Morocco, Tunisia, Lebanon and more

Find **open tenders, invitations for bids, requests for expressions of interest and contract awards** financed by the World Bank in the **Middle East and North Africa**. The Actor reads the World Bank's official open procurement API and returns one clean row per notice with the **deadline, days left, buyer, project, procurement type and a link to the notice**.

Use it to build a tender alert for contractors, suppliers and consultants, to see which ministries buy what, or to track competitors' contract awards.

### What you get

- **12 MENA countries:** Egypt, Morocco, Jordan, Iraq, Tunisia, Lebanon, West Bank and Gaza, Yemen, Djibouti, Syria, Iran and Algeria. (The Gulf states do not borrow from the World Bank, so they have no notices.)
- **Notice types:** Invitation for Bids, Request for Expression of Interest, Contract Award, General Procurement Notice, Invitation for Prequalification.
- **Procurement type:** goods, works, consulting services or non-consulting services.
- **Keyword search** inside the notices (solar, software, road, hospital, consultant, water...), Arabic, English and French notices.
- **Open tenders only** mode with `daysLeft` until the deadline.
- **Optional full notice text**, so you can read scope and eligibility without opening the page.
- **No personal contact fields.** The contact person's name, e-mail and phone from the source record are not returned; you get the buying organisation and a link to the official notice. The optional notice text is the official public notice, which may name the procuring officer; e-mail addresses are removed from it.

### Input

| Field | Meaning | Example |
|---|---|---|
| `countries` | One or more MENA countries | `["Egypt", "Jordan"]` |
| `noticeTypes` | Notice types (empty = all) | `["Invitation for Bids"]` |
| `procurementGroups` | Goods, Works, Consulting services, Non-consulting services | `["Works"]` |
| `keywords` | Search words, each searched separately | `["solar", "software"]` |
| `onlyOpen` | Only notices whose deadline has not passed | `true` |
| `postedWithinDays` | Only notices published in the last N days | `30` |
| `includeNoticeText` | Add the plain-text notice body | `false` |
| `maxNotices` | Stop after this many notices | `100` |

Example input:

```json
{
  "countries": ["Egypt", "Jordan", "Iraq", "Morocco"],
  "noticeTypes": ["Invitation for Bids", "Request for Expression of Interest"],
  "procurementGroups": ["Works", "Consulting services"],
  "onlyOpen": true,
  "maxNotices": 200
}
```

### Output

Example rows (real output, trimmed):

| Tender | Country | Notice type | Type | Deadline | Buyer |
|---|---|---|---|---|---|
| Supply, Installation, Testing, Configuration, and Integration ... | Jordan | Invitation for Bids | Goods | 2026-10-27 | The Ministry of Planning & International Cooperation |
| Consultancy Services for Dam Safety Archiving, Information ... | Jordan | Request for Expression of Interest | Consulting services | 2026-10-19 | Jordan Valley Authority |
| Système d'information territorial | Morocco | Invitation for Bids | Non-consulting services | 2026-11-12 | CRI Oriental - Centre régional d'investissement |

Full JSON item:

```json
{
  "noticeId": "OP00470245",
  "noticeType": "Invitation for Bids",
  "noticeDate": "2026-09-22",
  "country": "Jordan",
  "title": "Supply, Installation, Testing, Configuration, and Integration ...",
  "bidReference": "JO-NAF-572025-GO-RFB",
  "procurementGroup": "Goods",
  "procurementMethod": "Request for Bids",
  "submissionDeadline": "2026-10-27",
  "submissionTime": "11:00",
  "isOpen": true,
  "daysLeft": 20,
  "projectId": "P173974",
  "projectName": "Jordan Emergency Cash Transfer COVID-19 Response Project",
  "projectUrl": "https://projects.worldbank.org/en/projects-operations/project-detail/P173974",
  "buyerOrganization": "The Ministry of Planning & International Cooperation",
  "buyerCountry": "Jordan",
  "language": "English",
  "source": "World Bank procurement notices",
  "noticeUrl": "https://projects.worldbank.org/en/projects-operations/procurement-detail/OP00470245",
  "scrapedAt": "2026-10-07T16:08:48Z"
}
```

### How to use

1. Choose countries and, if you like, keywords and `onlyOpen`.
2. Run, then export JSON, CSV or Excel, or call the Actor from the API.
3. Schedule it daily and send new rows to Slack, e-mail, Google Sheets, Make or n8n for a tender alert.

### Use cases

- Tender alerts for construction, IT, supply and consulting firms working in MENA.
- Market research: which buyers and projects spend in a country, and through which procurement methods.
- Competitor monitoring through contract award notices.
- Reports on development-financed procurement in the region.

### Limitations

- Only procurement financed by the World Bank is covered. National tender portals (Egypt, Saudi Arabia, the UAE) are not included.
- Dates and fields are as published by the World Bank. A few old notices have no dates.
- Data source: World Bank procurement notices API. World Bank data is provided under its [Terms of Use for Datasets](https://www.worldbank.org/en/about/legal/terms-of-use-for-datasets) (generally CC BY 4.0); credit "The World Bank" when you republish it. This Actor is not affiliated with or endorsed by the World Bank.
- Notice text can be in Arabic, English or French, depending on the borrower.

### Data source and licence

World Bank Group procurement notices, published through the World Bank's open data API. Please credit "The World Bank" when you republish results, and check the World Bank's terms for datasets before commercial redistribution.

### Pricing

Pay per event: a small fee when a run starts plus a fee for every notice returned. Set a maximum cost per run and the Actor stops at your limit. See the pricing panel on this page for the current rates.

### Support

Need another country or an additional source? Use the **Issues** tab of this Actor.

# Actor input Schema

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

Borrowing countries of the World Bank in the Middle East and North Africa.

## `noticeTypes` (type: `array`):

Leave empty for all types. Invitation for Bids and Request for Expression of Interest are the open opportunities.

## `procurementGroups` (type: `array`):

Goods, works or services. Leave empty for all.

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

Search words in the notice text, for example solar, software, road, hospital, consultant. Each word is searched separately.

## `onlyOpen` (type: `boolean`):

Keep only notices whose submission deadline has not passed yet.

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

Keep only notices published in the last N days. 0 means no limit.

## `includeNoticeText` (type: `boolean`):

Adds the plain-text body of the notice (scope, eligibility, how to bid).

## `maxNotices` (type: `integer`):

Stop after this many notices.

## Actor input object example

```json
{
  "countries": [
    "Egypt",
    "Jordan",
    "Iraq",
    "Morocco"
  ],
  "noticeTypes": [
    "Invitation for Bids",
    "Request for Expression of Interest"
  ],
  "onlyOpen": false,
  "postedWithinDays": 0,
  "includeNoticeText": false,
  "maxNotices": 100
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped items in the default dataset.

# 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 = {
    "countries": [
        "Egypt",
        "Jordan",
        "Iraq",
        "Morocco"
    ],
    "noticeTypes": [
        "Invitation for Bids",
        "Request for Expression of Interest"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("alfhar/mena-tenders-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 = {
    "countries": [
        "Egypt",
        "Jordan",
        "Iraq",
        "Morocco",
    ],
    "noticeTypes": [
        "Invitation for Bids",
        "Request for Expression of Interest",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("alfhar/mena-tenders-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 '{
  "countries": [
    "Egypt",
    "Jordan",
    "Iraq",
    "Morocco"
  ],
  "noticeTypes": [
    "Invitation for Bids",
    "Request for Expression of Interest"
  ]
}' |
apify call alfhar/mena-tenders-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,alfhar/mena-tenders-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/yxLcHf3DtZzoST50Z/builds/TNH2Cjz1GkeCIdOHF/openapi.json
