# Gulf Tenders Radar: Oman, UAE, Jordan & Lebanon (`maliksaid/gulf-tenders-radar`) Actor

Government tenders from Oman, the UAE, Jordan and Lebanon in one GCC and Middle East feed. Covers the Oman Tender Board, UAE federal, Jordan JONEPS and Lebanon PPA. Arabic and English titles, deadlines, days left and English sectors. Oman bid results list each bidder. Monitor mode sends new tenders.

- **URL**: https://apify.com/maliksaid/gulf-tenders-radar.md
- **Developed by:** [Malik Said](https://apify.com/maliksaid) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 tenders

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

## Gulf Tenders Radar: Oman, UAE, Jordan & Lebanon

Gulf Tenders Radar collects open government tenders from Oman, the UAE, Jordan and Lebanon. It reads the Oman Tender Board, UAE federal tenders from the Ministry of Finance, Jordan's JONEPS portal and Lebanon's Public Procurement Authority. It returns every tender in one format. Titles come in Arabic and English where the portal provides them.

It covers two GCC states, Oman and the UAE, plus Jordan and Lebanon. Use it as one Middle East tender feed for bid managers, contractors and AI agents.

Every tender also gets an English **sector**, a **procurement type** and the **days left** until the deadline. Filter by sector, or ask for tenders closing within the next N days.

Schedule it daily with monitor mode on. Each run then returns only tenders you have not seen before.

It can also return **Oman bid-opening results**: who bid on a tender and at what price. Use them to study competitors and price your next bid.

مناقصات حكومية من سلطنة عُمان والإمارات والأردن ولبنان في ملف واحد، بعناوين عربية وإنجليزية ومواعيد الإغلاق وعدد الأيام المتبقية وروابط البوابات الرسمية. يدعم البحث بكلمات عربية، والتصفية حسب القطاع، ونتائج فتح العروض في عُمان.

### Government tender portals covered

| Country | Portal | Open tenders (20 October 2026) | Titles |
|---|---|---|---|
| Oman | Tender Board e-Tendering | about 900 | Arabic and English |
| Jordan | JONEPS | about 300 | Mostly Arabic |
| UAE | Ministry of Finance, federal tenders | about 70 | Arabic or English, as published |
| Lebanon | Public Procurement Authority (PPA) | about 170 (21 October 2026) | Mostly Arabic, as published |

Counts change every day.

### Tender data you get

Each tender has these fields:

| Field | Meaning |
|---|---|
| `country` | OM, JO, AE or LB |
| `referenceNumber` | Reference number as printed on the portal |
| `titleAr`, `titleEn` | Arabic and English titles |
| `agency` | Government entity that issued the tender |
| `category` | Procurement category |
| `tenderType` | Open, International, SME and similar |
| `eligibility` | Who may bid, such as local vendors or contractor grades |
| `publishedAt` | Publish date |
| `documentSalesEndAt` | Last day to buy tender documents (Oman) |
| `closingAt` | Bid submission deadline |
| `documentFee` | Price of tender documents, when the portal lists one |
| `currency` | OMR, JOD, AED or LBP |
| `detailUrl` | Link to the tender on the official portal |
| `stage` | `open` (accepting bids) or `bids-opened` (Oman bid results) |
| `openedAt` | When the bids were opened (bid results only) |
| `bids` | Every bidder: rank, company, offer type, quoted value and status (bid results only) |
| `procurementType` | Goods, Works, Services or Consulting |
| `sector` | English sector, such as `IT and Telecom` or `Construction and Works` |
| `daysUntilClose` | Days left until `closingAt`, in the country's local time. 0 means it closes today |
| `bidderCount` | Number of offers in the bid-opening report (bid results only) |
| `lowestBid` | Lowest total quoted value, in `currency` (bid results only) |
| `lowestBidder` | Company that quoted the lowest bid (bid results only) |

Sample record:

```json
{
  "id": "oman-tender-board:100025",
  "country": "OM",
  "referenceNumber": "44/2026/SSGO/SSM-19",
  "titleAr": "رفع كفاءة الانظمة واجهزة الحاسب الالي لمحافظة جنوب الشرقية",
  "titleEn": "Enhancing the efficiency of systems and computer equipment for South Ash Sharqiyah Governorate",
  "agency": "South Sharqiyah Governor Office",
  "category": "Information Technology Services",
  "tenderType": "Open",
  "eligibility": "Local; Grades: Excellent,First,Second,Third,Fourth",
  "documentSalesEndAt": "2026-11-12",
  "closingAt": "2026-11-28",
  "documentFee": 25,
  "currency": "OMR"
}
```

A Lebanon record with the derived fields:

```json
{
  "id": "lebanon-ppa:13203",
  "country": "LB",
  "referenceNumber": "100",
  "titleAr": "أشغال تزفيت طرقات ضمن النطاق البلدي",
  "agency": "Municipality of Ain Saade",
  "tenderType": "Open",
  "publishedAt": "2026-10-21",
  "closingAt": "2026-11-18T09:33:00+02:00",
  "currency": "LBP",
  "detailUrl": "https://www.ppa.gov.lb/en/tenders/details/13203",
  "procurementType": "Works",
  "sector": "Construction and Works",
  "daysUntilClose": 28
}
```

Some fields stay empty for some countries. Oman's list shows no publish date. Jordan's, the UAE's and Lebanon's lists show no fee. The Actor never guesses a missing portal value.

### Sectors and deadlines

The portals use different categories, many only in Arabic. The Actor adds three fields so you can compare tenders across countries:

- `procurementType` comes from the portal category when there is one. Otherwise it comes from title words such as "supply", "توريد" or "أشغال". It stays empty when the title gives no clue.
- `sector` is one of 15 English sectors. The Actor matches Arabic and English title words, then the portal category. It is a best guess from the title. Tenders with no matching word get `Other`.
- `daysUntilClose` counts calendar days in the issuing country's time zone.

Use the **Sectors** filter to keep only some sectors. Use **Closing within N days** for a closing-soon list. Example: `{"sectors": ["IT and Telecom"], "closingWithinDays": 7}` returns IT tenders that close this week.

### Oman bid-opening results

Turn on **Include Oman bid results** to also get Oman tenders whose bids were opened in the last N days (default 7). Each record lists every bidder from the official opening report:

```json
{
  "stage": "bids-opened",
  "referenceNumber": "4065/2026/MOH/DGHSNBP-213",
  "openedAt": "2026-10-20T09:54:00+04:00",
  "currency": "OMR",
  "bids": [
    { "rank": "1-[1]", "company": "MIA FOR INTEGRATED PROJECTS", "offerType": "Main", "totalQuotedValue": 932.326, "status": "Financial Bid Opened" },
    { "rank": "2-[1]", "company": "ELITE DIGITAL CO", "offerType": "Main", "totalQuotedValue": 1045.065, "status": "Financial Bid Opened" }
  ]
}
```

- The portal opens about 50 tenders a day. Seven days is roughly 350 reports and takes about 15 minutes.
- Bid results respect your keywords, monitor mode and maximum tenders.
- A tender whose report lists no bids costs only the tender event.

### How to monitor new tenders

1. Pick the countries.
2. Add keywords if you want only some tenders. Use Arabic, English or both. Example: `software`, `برمجيات`, `information technology`.
3. Turn on **Monitor mode** and schedule the Actor daily. Each run returns only new tenders.
4. Connect the output to Google Sheets, Slack, email or your CRM through Apify integrations.

#### Keyword matching

- English keywords match whole words. "IT" matches "IT helpdesk" and skips "facilities".
- Arabic keywords match anywhere inside a word. "حاسوب" also matches "الحاسوب".
- Short Arabic keywords can match inside unrelated words. "حاسب" also matches "المحاسبة" (accounting). Use longer keywords to avoid this.

#### Monitor mode

Monitor mode remembers which tenders it returned before. Use a different **Monitor name** (`monitorName`) for each watch list. Example: one name for IT tenders and another for construction tenders.

### Input

| Option | Default | Meaning |
|---|---|---|
| Countries | All | OM, JO, AE, LB |
| Keywords | None | Keep only matching tenders |
| Sectors | All | Keep only tenders in these English sectors |
| Issuing agencies | All | Keep only tenders from agencies whose name has one of these words, Arabic or English |
| Only open tenders | On | Skip tenders whose deadline has passed |
| Closing within N days | 0 (off) | Keep only tenders that close within N days |
| Published within N days | 0 (off) | Keep only tenders published in the last N days. Oman lists no publish date, so Oman tenders are kept |
| Monitor mode | Off | Return only tenders not returned before |
| Monitor name | `default` | Name of the monitor memory. The old field name `stateKey` still works |
| Maximum tenders | 100 | Stop after this many tenders, shared between countries (see below). Set 0 for no limit |
| Maximum list pages per country | 0 (all) | For quick tests |
| Include Oman bid results | Off | Add recently opened Oman tenders with their bidders |
| Bid results from the last N days | 7 | How far back to read bid results |

#### How the tender limit is shared

When you pick several countries, **Maximum tenders** is shared between them. Each country first gets an equal part. With the default of 100 and four countries, each gets 25. If a country has fewer matching tenders than its part, the unused slots go to the other countries. Oman bid results count as one more part. A run with one country uses the whole limit for that country. Set the limit to 0 to get every tender.

### Pricing

You pay for each tender saved to your dataset. A tender saved with an Oman bid report costs one extra bid-report event. Tenders skipped by your filters cost nothing.

| Event | Free plan | GOLD plan and higher |
|---|---|---|
| Run start | $0.012 | $0.012 |
| Tender | $0.005 ($5.00 per 1,000) | $0.004 ($4.00 per 1,000) |
| Oman bid report | $0.02 ($20.00 per 1,000) | $0.02 ($20.00 per 1,000) |

| Tenders in one run | Free plan | GOLD plan and higher |
|---|---|---|
| 100 | $0.512 | $0.412 |
| 1,000 | $5.012 | $4.012 |

Costs include the run start fee.
The SILVER plan pays a price between the two columns.

### Data sources and use

- All data comes from public pages that need no login.
- The Actor sends a small number of slow requests to each portal.
- It collects tender facts and links only. It does not download tender documents or collect personal contact details.
- Always check the official portal before you bid. Portals can change deadlines and terms.

### Run time

A full run of all four countries takes about 6 minutes.

### FAQ

#### Which countries does it cover?

Oman, UAE federal, Jordan and Lebanon tenders. Emirate-level portals, such as Abu Dhabi and Dubai, are outside the current scope. Saudi Arabia, Qatar, Kuwait and Bahrain are outside the current scope too. Their portals either block automated access or require written permission to republish their data.

#### Can I search in Arabic?

Yes. Add Arabic keywords such as `برمجيات` or `صيانة`. You can mix Arabic and English keywords in one run.

#### Can an AI agent use it?

Yes. Agents can find and run it through the Apify MCP server or the Apify API. The input has plain field names, and the output uses one schema for all countries.

#### How do I get alerts for new tenders?

Turn on monitor mode and schedule a daily run. Then connect the dataset to email, Slack or Google Sheets through Apify integrations.

#### Is the data official?

The data comes from the public pages of each government portal. Each tender links back to its portal. Check the portal before you bid.

### Support

Report a problem in the Issues tab. Include the run link.

# Actor input Schema

## `sources` (type: `array`):

Tender portals to collect from. Leave empty to collect from all of them.

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

Keep only tenders whose title, agency, category or reference contains at least one keyword. English keywords match whole words, so "IT" does not match "facilities". Arabic keywords match anywhere in a word and ignore diacritics and alef, ta marbuta and ya variants. Leave empty to keep every tender. Example: software, برمجيات, information technology.

## `sectors` (type: `array`):

Keep only tenders in these English sectors. The Actor sets the sector from the tender title and the portal category, in Arabic and English. Leave empty to keep every sector.

## `agencies` (type: `array`):

Keep only tenders whose issuing agency contains one of these words, in Arabic or English. Example: Ministry of Health, وزارة الصحة. Leave empty to keep every agency.

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

Skip tenders whose closing date has passed. The Oman portal also lists old tenders, back to 2016. Turn this off to receive them too.

## `closingWithinDays` (type: `integer`):

Keep only open tenders whose deadline is within this many days, counted in the local time of each country. Use 7 for a closing-soon list. 0 turns the filter off. Tenders without a deadline are skipped when the filter is on.

## `publishedWithinDays` (type: `integer`):

Keep only tenders published in the last N days, counted in the local time of each country. 0 turns the filter off. Tenders without a publish date are kept: Oman's portal does not list one.

## `monitorMode` (type: `boolean`):

Return only tenders that earlier monitor-mode runs with the same monitor name did not return. Schedule the Actor daily with this on to get a feed of new tenders.

## `monitorName` (type: `string`):

Name of the memory that monitor mode uses. Use a different name for each separate watch list. Inputs that still send the old field `stateKey` keep working.

## `includeOmanBidResults` (type: `boolean`):

Also return Oman tenders whose bids were opened recently, with every bidder's company name, offer type, quoted value in OMR and status. Each tender with a bid report costs one extra bid-report event. Works on its own or with the open-tender countries above.

## `bidResultsDays` (type: `integer`):

How far back to read Oman bid-opening results. The portal opens about 50 tenders a day, so 7 days is roughly 350 reports and about 15 minutes.

## `maxItems` (type: `integer`):

Stop after saving this many tenders. The default of 100 keeps test runs short and cheap. With several countries, the limit is shared: each country gets an equal part first, and any part a country does not use goes to the others. Oman bid results count as one more part. Set 0 for no limit, for example on a scheduled monitor-mode run. In monitor mode, tenders left over by the limit come in the next run.

## `maxPagesPerSource` (type: `integer`):

Limit how many list pages are read from each portal. 0 means all pages. Oman shows 50 tenders per page, Jordan 20 and the UAE 10.

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

Optional. The portals currently work without a proxy.

## Actor input object example

```json
{
  "sources": [
    "OM",
    "JO",
    "AE",
    "LB"
  ],
  "keywords": [],
  "sectors": [],
  "agencies": [],
  "onlyOpen": true,
  "closingWithinDays": 0,
  "publishedWithinDays": 0,
  "monitorMode": false,
  "monitorName": "default",
  "includeOmanBidResults": false,
  "bidResultsDays": 7,
  "maxItems": 100,
  "maxPagesPerSource": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `tenders` (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 = {
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("maliksaid/gulf-tenders-radar").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 = { "maxItems": 100 }

# Run the Actor and wait for it to finish
run = client.actor("maliksaid/gulf-tenders-radar").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 '{
  "maxItems": 100
}' |
apify call maliksaid/gulf-tenders-radar --silent --output-dataset

```

## MCP server setup

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

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/QgPrvBgLTacVqk0SG/builds/TfJ2Q3SMgtcfphZDV/openapi.json
