# Qatar Monaqasat Awards — Tender Winners, Bids & Prices (`dottti/monaqasat-awards`) Actor

Who bid, what each bidder offered, who won and for how much, on Qatar government tenders from Monaqasat (Ministry of Finance). Arabic and English names, commercial registration numbers, competitor tracking.

- **URL**: https://apify.com/dottti/monaqasat-awards.md
- **Developed by:** [Dottti](https://apify.com/dottti) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $21.00 / 1,000 award results

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

## Qatar Monaqasat Awards — Tender Winners, Bids & Prices

See who bid on Qatar government tenders, what each company offered, who won and the final award value. The data comes from [Monaqasat](https://monaqasat.mof.gov.qa), the tenders portal of the Qatar Ministry of Finance. You get it back as JSON, CSV or Excel, with Arabic and English names side by side.

### Who uses this

- **Bid teams** price their next offer against what competitors bid on similar tenders.
- **Sales teams** see which companies win in their sector and which entities buy what.
- **Analysts** track award values by entity and over time.
- **Competitor tracking:** enter a company name or registration number and get every tender where that company bid or won.

### What you get

One row per tender. This is a real row from a run on 20 October 2026 (the bidder list is shortened to three of six):

```json
{
  "tenderId": 659044,
  "tenderNumber": "2790/2026",
  "entityTenderNumber": "LTC-2449/2026",
  "title": "إعارة لمدة ثلاث سنوات للاستعانة بمصادر خارجية للقوى العاملة في العلاقات العامة - LTC-2449/2026 - إدارة اللوازم",
  "titleEn": "Three-Years Secondment of Professional Staff for Public Relations - LTC-2449/2026- Materials department",
  "entity": "المؤسسة العامة القطرية للكهرباء والماء",
  "entityEn": "Qatar General Electicity & Water Corporation",
  "type": "مناقصة عامة",
  "typeEn": "Public Tender",
  "status": "awarded",
  "publishDate": "2026-06-02",
  "closingDate": "2026-07-26",
  "technicalOpenDate": "2026-09-14",
  "financialOpenDate": "2026-10-20",
  "awardDate": "2026-10-20",
  "datesOriginal": { "publishDate": "02/06/2026", "awardDate": "20/10/2026", "...": "..." },
  "bondQar": 250000,
  "documentsValueQar": 2500,
  "awardValueQar": 6140664,
  "bidderCount": 6,
  "pricedBidderCount": 2,
  "winnerCount": 1,
  "lowestBidQar": 6140664,
  "lowestBidderName": "فيستاس جلوبل",
  "lowestBidderNameEn": "VISTAS GLOBAL",
  "lowestBidderExcluded": false,
  "totalAwardQar": 6140664,
  "winnerIsLowestBidder": true,
  "winnerHasLowestFinancialResult": true,
  "currency": "QAR",
  "winners": [
    {
      "companyName": "فيستاس جلوبل",
      "companyNameEn": "VISTAS GLOBAL",
      "crNumber": "95999 | 61876",
      "registrationNumbers": ["95999", "61876"],
      "awardQar": 6140664,
      "financialResultQar": 2014751.71,
      "approvedItems": null
    }
  ],
  "bidders": [
    {
      "companyName": "ستراتيجيك جيرز للاستشارات الادارية",
      "companyNameEn": "Strategic Gears Management Consulting",
      "crNumber": "263931 | 199697",
      "bidQar": 14408460,
      "localValueRatioPct": 4.73,
      "financialResultQar": null,
      "financialResultNote": "تجاوز الشرط الحدي للمناقصة",
      "notes": "مستبعد",
      "excluded": true,
      "listedIn": "financially_opened_companies"
    },
    {
      "companyName": "فيستاس جلوبل",
      "companyNameEn": "VISTAS GLOBAL",
      "crNumber": "95999 | 61876",
      "bidQar": 6140664,
      "localValueRatioPct": 67.19,
      "financialResultQar": 2014751.71,
      "excluded": false,
      "listedIn": "financially_opened_companies"
    },
    {
      "companyName": "سانتا في اسوشيتس انترناشونال ذ.م.م",
      "companyNameEn": "Santa Fe Associates International LLC",
      "crNumber": "00446 | QFC/00446",
      "bidQar": null,
      "listedIn": "technically_opened_companies"
    }
  ],
  "url": "https://monaqasat.mof.gov.qa/TendersOnlineServices/TenderDetails/659044",
  "reportUrl": "https://monaqasat.mof.gov.qa/TendersOnlineServices/TenderCompaniesDetails/659044"
}
```

How to read the fields:

- `bidders` lists every company in the tender report. Companies with a published price have `listedIn: "financially_opened_companies"`. Companies that passed only the technical opening have `listedIn: "technically_opened_companies"` and `bidQar: null`.
- `winners` lists the awarded companies with the approved value (`awardQar`). Some tenders are split between several winners by item.
- `financialResultQar` is the bid price after the local value (ICV) credit. Qatar ranks bids on this figure. The portal states the formula as price × (1 − ICV%).
- `winnerIsLowestBidder` compares raw bid prices. `winnerHasLowestFinancialResult` compares financial results among bidders the committee did not exclude. In the 50 newest awards on 20 October 2026, the lowest raw bid lost in 4 tenders.
- `excluded` is `true` when the notes column says مستبعد (Excluded). `financialResultNote` keeps the committee's reason when Monaqasat prints text in place of a number, for example تجاوز الشرط الحدي للمناقصة (exceeded the tender's maximum threshold).
- `crNumber` is the commercial registration cell exactly as the Arabic page prints it. Many companies show two numbers there, and the page does not say what the second one is. `registrationNumbers` holds them as a list.
- Dates come as ISO (`2026-10-20`) and as published (`datesOriginal`, day/month/year).
- All amounts are Qatari riyals (QAR). Fields Monaqasat leaves empty come back as `null`. Direct agreements, for example, often have no publish date.
- `title`, `entity` and `type` come from the Arabic site. `titleEn`, `entityEn`, `typeEn` and `companyNameEn` come from the English site, copied as published. A few tenders carry a placeholder such as `.` or `0` as the English title.
- A report section the Actor does not recognise is kept under `otherSections`.

### Which tenders (the `view` input)

| View | What Monaqasat publishes | Count on 20 Oct 2026 |
|---|---|---|
| `awarded` (default) | Winners, award value, every financially opened bid with price, ICV and financial result | 24,472 |
| `financiallyOpened` | Bidder names and registration numbers. Winner not announced yet | 420 |
| `technicallyOpened` | Bidder names and registration numbers | 1,188 |
| `open` | Tenders accepting bids: title, entity, dates, bond and document fee | about 195 |

Bid prices appear only once a tender is awarded. On 20 October 2026 we checked the 20 newest financially opened tenders and none showed bid prices on the public page.

### How to use it

1. Pick a **view**. Leave it on `awarded` for winners and prices.
2. Optional: add **keywords** (Arabic or English) and an **entity** filter. Arabic spelling variants match each other, for example أ/إ/ا, ة/ه and ى/ي.
3. Optional: enter a **company name or registration number** to track a competitor.
4. Set **Maximum results** as your cost cap and run.

The newest tenders come first. A run of 20 awarded tenders with English names takes about 1.5 minutes.

#### Example: IT awards from Hamad Medical Corporation

```json
{
  "view": "awarded",
  "entityContains": "مؤسسة حمد الطبية",
  "keywords": ["نظام", "software", "license"],
  "maxItems": 200
}
```

#### Example: every tender a competitor bid on

```json
{
  "view": "awarded",
  "companyContains": "KPMG",
  "maxItems": 500,
  "maxTendersChecked": 5000
}
```

In a test run on 20 October 2026, this filter found KPMG LLC (`00051 | QFC/00051`) bidding on 2 of the 40 newest awarded tenders, with bids of QAR 4,450,055.12 and QAR 9,600,000. Neither bid won.

A company filter needs one report lookup per tender, so it runs at about 4 seconds per tender checked. `maxTendersChecked` caps that. Turn off **Add English names** to halve the time if you search by registration number or Arabic name.

#### Monthly report

Save your filters as a task and add a monthly schedule. Set `maxItems` to cover one month of awards for your filters. The list is newest first, so each run starts with the latest awards.

### Pricing

- **Award result:** $0.03 per awarded tender delivered with its winners and bid prices ($30 per 1,000). Applies to the `awarded` view.
- **Tender:** $0.005 per tender delivered from the `financiallyOpened`, `technicallyOpened` or `open` views ($5 per 1,000). Opened views list bidder names; prices appear only after award.
- **Tender checked:** $0.0003 per tender report looked up ($0.30 per 1,000). This covers lookups that a company filter rejects or that name no companies.
- **Open tender:** $0.005 per tender delivered in the `open` view, charged under the event `tender` ($5 per 1,000). The open view reads list pages only, so it has no "tender checked" fee.

Rows whose report names no companies are free when you turn on "Also list tenders whose report names no companies".

A typical run of 200 awarded tenders with no company filter checks 200 tenders and costs about $6.06. `maxItems` and `maxTendersChecked` cap the cost of any run.

### How it works and limits

- Data comes from Monaqasat's public pages. No login is needed.
- The Actor waits at least 0.5 seconds before every request (0.8 seconds by default) and retries with backoff on errors. With English names on, each tender takes two report requests.
- Monaqasat shows 20 tenders per list page. The Actor stops at the published record count.
- Filters on keyword and entity run on the list pages before any report lookup. The company filter runs after the lookup.
- The awarded list goes back to 2018. Older reports may show fewer details.
- Monaqasat's server sends an incomplete TLS certificate chain. The Actor ships the missing DigiCert intermediate certificate and keeps full certificate checking on.

### Related

- [Etimad Award Results](https://apify.com/dottti/etimad-awards): the same data for Saudi government tenders.

### Development

```bash
npm install
npm test          # parser tests on real saved Monaqasat pages
npm start         # local run, reads storage/key_value_stores/default/INPUT.json
```

# Actor input Schema

## `view` (type: `string`):

awarded: tenders with a published award (winner, award value, and every bid price when Monaqasat publishes them). financiallyOpened: financial envelopes opened, winner not announced; Monaqasat lists the bidders here but did not show bid prices on any of the 20 newest tenders we checked on 20 October 2026. technicallyOpened: technical envelopes opened; bidder names and registration numbers only. open: tenders still accepting bids (no bidders yet).

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

Words to match in the tender title (Arabic and English), tender number and entity name. Arabic is matched after normalisation, so alef/hamza, ة/ه and ى/ي spelling variants all match. English matching ignores case. Leave empty for every tender.

## `matchMode` (type: `string`):

any: keep a tender when at least one keyword matches. all: keep it only when every keyword matches.

## `entityContains` (type: `string`):

Keep only tenders whose ministry or entity name (Arabic or English) contains this text. Examples: مؤسسة حمد الطبية or Public Works Authority. Use the name as Monaqasat writes it.

## `companyContains` (type: `string`):

Keep only tenders where a bidder or winner name (Arabic or English) or registration number contains this text. Example: KPMG, or QFC/00051. Each tender needs a report lookup before this filter can be applied, so a narrow filter checks many tenders. Ignored in the open view.

## `includeEnglish` (type: `boolean`):

Also read the English version of each page, for titleEn, entityEn and companyNameEn. Doubles the number of requests, so runs take about twice as long. No extra charge.

## `includeWithoutCompanies` (type: `boolean`):

Some reports name no companies (seen on single-envelope tenders in the financially opened list). These rows are free.

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

Hard cap on delivered results. You are charged per result, so this is also your cost cap.

## `maxTendersChecked` (type: `integer`):

Each tender needs its own report lookup (about one or two seconds each). Each check costs $0.0003. This caps run time and cost when few tenders match a company filter. Not used in the open view.

## `requestDelayMs` (type: `integer`):

Pause before every request to the Ministry of Finance site. Minimum 500.

## `maxRetries` (type: `integer`):

Retries with exponential backoff on network errors, HTTP 429 and 5xx.

## Actor input object example

```json
{
  "view": "awarded",
  "keywords": [],
  "matchMode": "any",
  "includeEnglish": true,
  "includeWithoutCompanies": false,
  "maxItems": 15,
  "maxTendersChecked": 2000,
  "requestDelayMs": 800,
  "maxRetries": 5
}
```

# Actor output Schema

## `tenders` (type: `string`):

Tender details, every bidder with registration number and bid price where published, the winner(s) with the award value in QAR, the lowest bid, and whether the lowest bidder won.

# 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 = {
    "view": "awarded",
    "keywords": [],
    "maxItems": 15
};

// Run the Actor and wait for it to finish
const run = await client.actor("dottti/monaqasat-awards").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 = {
    "view": "awarded",
    "keywords": [],
    "maxItems": 15,
}

# Run the Actor and wait for it to finish
run = client.actor("dottti/monaqasat-awards").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 '{
  "view": "awarded",
  "keywords": [],
  "maxItems": 15
}' |
apify call dottti/monaqasat-awards --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dottti/monaqasat-awards"
        }
    }
}
```

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/dabyqqhUB5b9dhJIe/builds/lczLE6vjlSsWtrWRr/openapi.json
