# Qatar Tender Alerts: Monaqasat Government Contracts (`automatic/qatar-tenders-scraper`) Actor

Find Qatari government contracts to bid on. Get Monaqasat tender numbers, Arabic and English titles, buyers, publication and closing dates, bonds, fees and detail links. Filter for your bid team or track public awards and winning suppliers.

- **URL**: https://apify.com/automatic/qatar-tenders-scraper.md
- **Developed by:** [Philip Kirkbride](https://apify.com/automatic) (community)
- **Categories:** Lead generation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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 Tender Alerts: Monaqasat Government Contracts

Find Qatari government contracts for your bid team on Monaqasat, the Ministry of Finance procurement portal. Get one row per tender with its number, Arabic and English titles as published, issuing entity, sector, procurement type, publication and closing dates, bid bond, document fee and public detail link. Track awarded tenders to see the winning suppliers and published award amounts.

Use scheduled runs to feed tender alerts, spreadsheets or your bid pipeline. Filter by your buyer, sector or an Arabic or English keyword, and deduplicate recurring results with `recordKey`.

### Quick Start

Get five current opportunities:

```json
{"maxItems": 5}
```

Monitor recently published maintenance opportunities:

```json
{
  "keyword": "صيانة",
  "status": "open",
  "publishedWithinDays": 2,
  "maxItems": 100
}
```

Get recent award notices:

```json
{"status": "awarded", "awardedFrom": "2026-11-01", "maxItems": 20}
```

### Input

| Field | Type | Default | Purpose |
|---|---|---|---|
| `keyword` | string | empty | Case-insensitive title text, or a full Ministry tender number such as `5672/2026`. Use the keyword's language; entity references available only on details are not searched. |
| `entity` | string | empty | Issuing entity name fragment in Arabic or English, e.g. `Hamad` or `مناطق`. |
| `category` | string | empty | Requested sector or tender type fragment in Arabic or English, e.g. `Contractors`, `Suppliers`, `مناقصة عامة`. |
| `status` | string | `open` | `open` opportunities or `awarded` notices. |
| `publishedWithinDays` | integer | none | Publication window in Qatar time, including today. Open tenders only. |
| `publishedFrom`, `publishedTo` | string | empty | Inclusive publication date window, `YYYY-MM-DD`. Open tenders only. |
| `closingFrom`, `closingTo` | string | empty | Inclusive closing date window, `YYYY-MM-DD`. |
| `awardedFrom`, `awardedTo` | string | empty | Inclusive award date window, `YYYY-MM-DD`. Awarded tenders only; defaults to the last 7 days, with a maximum 31-day window. |
| `maxItems` | integer | `100` | Maximum matching tenders, from 1 to 500, in the portal's listing order. |

Filters combine. Arabic keywords use the Arabic opportunity list; English keywords use the English list. Entity and category fragments use published names. An ambiguous entity/category fragment in a different language from the keyword must be narrowed or written in the keyword’s language. Use `publishedWithinDays` or `publishedFrom`, not both. Text fields accept up to 200 characters. Exact publication times are not supplied, so there is no saved “since last run” cursor.

### What it returns

Every tender has all these fields; missing values are `null`:

- Identity: `recordKey`, `tenderId`, `tenderNumber`, `referenceNumber`.
- Opportunity: `titleArabic`, `titleEnglish`, `entity`, `entityEnglish`, `category`, `categoryEnglish`, `tenderType`, `tenderTypeEnglish`, `descriptionArabic`, `status`.
- Dates: `publishedAt`, `closingDate`, `closingAt`, `timeZone`, `awardedAt`.
- Amounts: `bidBond`, `documentFee`, `estimatedValue`, `currency`, `awardedValue`, `awardedSuppliers`.
- Links and provenance: `documentUrl`, `detailUrl`, `awardReportUrl`, `detailsError`, `source`, `sourceQuery`, `scrapedAt`.

`recordKey` uses the portal's tender ID and stays the same when an opportunity becomes awarded. `tenderNumber` is the Ministry's number; `referenceNumber` is the issuing entity's own number. Arabic and English titles are supplied as published, without translation. A missing English title, including the portal's literal `0` placeholder, is `null`.

Publication and closing dates are ISO dates (`YYYY-MM-DD`). `closingAt` is an ISO timestamp with `+03:00` only if a closing time is explicitly published; it is otherwise `null`. `timeZone` is `Asia/Qatar`. Date-only deadlines do not establish an exact closing time. `scrapedAt` is UTC.

Amounts are in Qatari riyals (`QAR`); a published zero remains zero. No estimated contract value was available on the inspected notices. Award mode adds the published total and a list of `{supplier, awardValue}` objects. The award amount is distinct from the adjusted financial evaluation score. Award lists give `awardedAt`; their original publication date is `null`.

### Output example

```json
{
  "recordKey": "monaqasat.mof.gov.qa:tender:661927",
  "tenderId": "661927",
  "tenderNumber": "5672/2026",
  "referenceNumber": "TC-18-2026",
  "titleArabic": "تعيين استشاري لتقديم الخدماتالاستشارية المالية",
  "titleEnglish": "Appointment of Consultant for Financial Advisory Services",
  "entity": "مناطق",
  "entityEnglish": "Manateq",
  "category": "موردين / مقدمى خدمات",
  "categoryEnglish": "Suppliers / Service Providers",
  "tenderType": "مناقصة عامة",
  "tenderTypeEnglish": "Public Tender",
  "publishedAt": "2026-11-08",
  "closingDate": "2026-12-08",
  "closingAt": null,
  "timeZone": "Asia/Qatar",
  "bidBond": 10000.0,
  "documentFee": 1000.0,
  "estimatedValue": null,
  "currency": "QAR",
  "status": "open",
  "awardedAt": null,
  "awardedSuppliers": null,
  "awardedValue": null,
  "descriptionArabic": "تدعو شركة مناطق – شركة المناطق الاقتصادية، الشركات الاستشارية المالية المؤهلة إلى تقديم عروضها لتوفير الخدمات الاستشارية المالية بموجب اتفاقية إطارية، وذلك حسب الطلب.",
  "documentUrl": "https://monaqasat.mof.gov.qa/Main/GetTenderDetailsFile/661927?type=2",
  "detailUrl": "https://monaqasat.mof.gov.qa/TendersOnlineServices/TenderDetails/661927",
  "awardReportUrl": null,
  "detailsError": null,
  "source": "monaqasat.mof.gov.qa",
  "sourceQuery": "entity=Manateq status=open",
  "scrapedAt": "2026-11-08T23:45:00+00:00"
}
```

### Limits and caveats

- Coverage is Monaqasat only. Separate Ashghal, QatarEnergy and Kahramaa listings are outside this Actor. Those buyers may also have notices on Monaqasat.
- `status` follows the portal's list. Closing dates can be extended; the latest detail date takes precedence. The portal can reorder same-day notices, so overlapping runs and deduplication help reduce missed alerts.
- `documentUrl` points to a public summary when one is advertised. Purchasing bid documents, registration and bid submission remain with the issuing authority.
- A failed detail or award report leaves `detailsError` on the tender and unavailable fields as `null`. A changed page or mismatched tender identity fails the run. A text filter that cannot be verified because details are unavailable also fails the run.
- Awarded searches default to the last seven Qatar calendar days, including today. Set `awardedFrom` and `awardedTo` for another window of at most 31 days, inclusive. If only `awardedTo` is set, the preceding seven-day window is used; if only `awardedFrom` is set, the end is today. Historical exports must be split into separate windows. The run stops at the lower award-date boundary; an unexpected award-date order fails the run.
- Text filters are checked against the chosen opportunity list before details are read. Keywords cover titles or a complete Ministry tender number, not entity references available only on detail pages.

### FAQ

**How do I get new tenders every day?** Schedule `publishedWithinDays: 2` with your filters, then deduplicate on `recordKey`. The overlap helps around midnight and delayed publication. This is a date window, not a guarantee of exactly-once alerts. Reaching `maxItems` can leave additional matching tenders unreturned; increase it or split your filters.

**Can I search in English?** Yes. Both published titles and buyer names are searched. Some buyers publish more complete Arabic text, so Arabic keywords can find additional opportunities.

**What happens when nothing matches?** A verified empty source search or a completed scan with no matching tenders returns an empty dataset. Source failures and missing tender structures fail the run.

**What do the counts mean?** The delivered count is the prefix accepted after each successful dataset write. If a spending limit truncates delivery, the Actor stops and reports that accepted count. A failed write fails the run.

### Price

Each delivered tender row is one result, plus a small run-start charge. The run-start event is charged per GB of memory; the default 512 MB run is one start event. A run with no delivered results can still incur the start charge. Platform usage is included in the result price.

### Support

Contact us through the Actor page with the input and the tender link when reporting a problem.

# Actor input Schema

## `keyword` (type: `string`):

Title text in Arabic or English, or a full Ministry tender number such as 5672/2026. Uses the keyword language. Entity references available only on details are not searched.

## `entity` (type: `string`):

Arabic or English buyer name fragment, e.g. Hamad or مناطق.

## `category` (type: `string`):

Arabic or English sector/type fragment, e.g. Contractors, Suppliers, or مناقصة عامة.

## `status` (type: `string`):

Open opportunities by default; awarded notices add public winning suppliers and amounts where available.

## `publishedFrom` (type: `string`):

Publication date on or after YYYY-MM-DD, inclusive. Use only with open status.

## `publishedTo` (type: `string`):

Publication date on or before YYYY-MM-DD, inclusive. Use only with open status.

## `closingFrom` (type: `string`):

Closing date on or after YYYY-MM-DD, inclusive. Uses the latest public closing date.

## `closingTo` (type: `string`):

Closing date on or before YYYY-MM-DD, inclusive. Uses the latest public closing date.

## `awardedFrom` (type: `string`):

Award date on or after YYYY-MM-DD, inclusive. Use only with awarded status. Defaults to the last seven Qatar calendar days, including today; maximum window 31 days inclusive.

## `awardedTo` (type: `string`):

Award date on or before YYYY-MM-DD, inclusive. Use only with awarded status. Defaults to the last seven Qatar calendar days, including today; maximum window 31 days inclusive.

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

Optional rolling publication window in Qatar time, today included. Open status only. Combine scheduled runs with recordKey deduplication; not a saved last-run cursor.

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

Return at most this many matching tenders in source listing order. Up to 500 per run.

## Actor input object example

```json
{
  "keyword": "",
  "entity": "",
  "category": "",
  "status": "open",
  "publishedFrom": "",
  "publishedTo": "",
  "closingFrom": "",
  "closingTo": "",
  "awardedFrom": "",
  "awardedTo": "",
  "maxItems": 5
}
```

# Actor output Schema

## `results` (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 = {
    "keyword": "",
    "entity": "",
    "category": "",
    "status": "open",
    "publishedFrom": "",
    "publishedTo": "",
    "closingFrom": "",
    "closingTo": "",
    "awardedFrom": "",
    "awardedTo": "",
    "maxItems": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("automatic/qatar-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 = {
    "keyword": "",
    "entity": "",
    "category": "",
    "status": "open",
    "publishedFrom": "",
    "publishedTo": "",
    "closingFrom": "",
    "closingTo": "",
    "awardedFrom": "",
    "awardedTo": "",
    "maxItems": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("automatic/qatar-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 '{
  "keyword": "",
  "entity": "",
  "category": "",
  "status": "open",
  "publishedFrom": "",
  "publishedTo": "",
  "closingFrom": "",
  "closingTo": "",
  "awardedFrom": "",
  "awardedTo": "",
  "maxItems": 5
}' |
apify call automatic/qatar-tenders-scraper --silent --output-dataset

```

## MCP server setup

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