# GCC Public Tenders Monitor (`madwezza/gcc-public-tenders-monitor`) Actor

Monitor public GCC government tender opportunities, starting with Dubai eSupply public opportunities, and export normalized procurement records.

- **URL**: https://apify.com/madwezza/gcc-public-tenders-monitor.md
- **Developed by:** [Omar Elwaziry](https://apify.com/madwezza) (community)
- **Categories:** Automation, E-commerce, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $40.00 / 1,000 record scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## GCC Public Tenders Monitor

Monitor public GCC government procurement opportunities and export normalized tender records for bid tracking, sales intelligence, market research, and alerting workflows.

### What this Actor does

GCC Public Tenders Monitor collects public tender opportunities from supported GCC procurement portals and converts them into structured dataset records.

Current coverage starts with **Dubai eSupply**, the official supply portal of Dubai Government, using its public Current Opportunities page.

### Who it is for

- Companies tracking public procurement opportunities in the GCC
- Sales and business development teams monitoring government tenders
- Procurement consultants and bid teams
- Market researchers analyzing public-sector demand
- Developers building tender alerts, dashboards, or procurement data pipelines

### Sources

| Source key | Source | Coverage |
|---|---|---|
| `dubaiEsupply` | Dubai eSupply public opportunities | Current public opportunities visible without login. |

### Data extracted

Each opportunity record can include:

- Buyer organization
- Project title
- Opportunity ID
- Response currency
- Supply category
- Publication date and time
- Closing date and time
- Official detail URL when available
- Source URL
- Keyword matches
- Country and emirate
- Scrape timestamp
- Compliance notice

Optional detail enrichment can open public opportunity detail pages and attach a compact text summary for a capped number of records.

### Example input

```json
{
  "sources": ["dubaiEsupply"],
  "keywords": ["firewall", "maintenance", "training"],
  "buyers": ["Dubai Municipality"],
  "categories": [],
  "maxItemsPerSource": 50,
  "includeDetails": false,
  "maxDetailItems": 10,
  "politeDelayMs": 800,
  "requestTimeoutSecs": 60
}
````

### Input options

| Field | Type | Description |
|---|---:|---|
| `sources` | array | Public tender sources to collect. Currently supports `dubaiEsupply`. |
| `keywords` | array | Optional words or phrases to match in project titles, buyer names, categories, or IDs. Leave empty for all visible records. |
| `buyers` | array | Optional buyer organization filters. Matching is case-insensitive and partial. |
| `categories` | array | Optional supply category filters. Matching is case-insensitive and partial. |
| `maxItemsPerSource` | integer | Maximum number of records to emit from each source. |
| `includeDetails` | boolean | Opens public detail pages for a capped number of records and stores a compact text summary. |
| `maxDetailItems` | integer | Maximum records to enrich when detail enrichment is enabled. |
| `politeDelayMs` | integer | Delay between page interactions. Useful for respectful collection. |
| `requestTimeoutSecs` | integer | Timeout for page loads and table waits. |

### Example output

```json
{
  "id": "dubaiEsupply-242474",
  "source_key": "dubaiEsupply",
  "source": "Dubai eSupply public opportunities",
  "country": "United Arab Emirates",
  "emirate": "Dubai",
  "portal": "eSupply - The official supply portal of Dubai Government",
  "opportunity_id": "242474",
  "opportunity_group_id": "01040",
  "response_currency": "AED",
  "buyer_organization": "Dubai Municipality",
  "project_title": "12615517 / OSP",
  "publication_date": "03/07/2026 13:00",
  "publication_datetime_iso": "2026-07-03T13:00:00+04:00",
  "supply_category": "Other",
  "closing_date": "06/07/2026 00:00",
  "closing_datetime_iso": "2026-07-06T00:00:00+04:00",
  "status": "Current / published",
  "keyword_matches": ["OSP"],
  "detail_url": "https://esupply.dubai.gov.ae/esop/toolkit/opportunity/current/242474/detail.si",
  "url": "https://esupply.dubai.gov.ae/esop/toolkit/opportunity/current/242474/detail.si",
  "source_url": "https://esupply.dubai.gov.ae/esop/toolkit/opportunity/current/list.si?...",
  "detail_fetched": false,
  "detail_text": null,
  "scraped_at": "2026-01-01T00:00:00.000Z",
  "compliance_notice": "Verify all tender details, deadlines, documents, eligibility requirements, and submission instructions on the official source before bidding."
}
```

### Common use cases

- Track current Dubai Government public procurement opportunities
- Monitor tenders matching specific products, services, or keywords
- Watch buyer organizations such as municipalities, authorities, and departments
- Export procurement records to spreadsheets, CRMs, or BI tools
- Build internal bid-alert workflows
- Analyze public-sector demand by buyer or supply category

### Tips for best results

- Start with `includeDetails` disabled for faster list monitoring.
- Use keyword and buyer filters for focused alerts.
- Increase `politeDelayMs` for larger runs.
- Keep `maxItemsPerSource` close to your operational need to reduce runtime.
- Open the official source URL before making bidding, legal, or commercial decisions.

### Limitations

This Actor collects selected public pages visible without login. It does not access supplier accounts, submit forms, bypass CAPTCHA, bypass access controls, scrape paywalled content, or provide legal or bid-qualification advice.

The Actor is not affiliated with any GCC government entity. Output completeness depends on what each public source exposes at run time. Users should verify deadlines, documents, eligibility requirements, and submission instructions on the official source before acting.

### Changelog

- `0.1` Added Dubai eSupply public opportunities collection with filters, normalized output, and optional public detail text enrichment.

# Actor input Schema

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

Public GCC tender sources to collect. Currently supports dubaiEsupply.

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

Optional words or phrases to match in project titles, buyer names, categories, or IDs. Empty means all records.

## `buyers` (type: `array`):

Optional buyer organization names or fragments to match. Empty means all buyers.

## `categories` (type: `array`):

Optional supply category filters, e.g. Other, IT, Construction, Services. Matching is case-insensitive and partial.

## `maxItemsPerSource` (type: `integer`):

Maximum records to emit from each source.

## `includeDetails` (type: `boolean`):

If enabled, opens public detail pages for a capped number of records and stores a compact text summary. Disabled by default for faster runs.

## `maxDetailItems` (type: `integer`):

Maximum records to enrich with public detail-page text when detail enrichment is enabled.

## `politeDelayMs` (type: `integer`):

Delay between page interactions. Keep this non-zero for respectful collection.

## `requestTimeoutSecs` (type: `integer`):

Timeout for page loads and table waits.

## `userAgent` (type: `string`):

Browser User-Agent for public-page collection. Some procurement portals require a normal browser User-Agent to render the public table.

## Actor input object example

```json
{
  "sources": [
    "dubaiEsupply"
  ],
  "keywords": [],
  "buyers": [],
  "categories": [],
  "maxItemsPerSource": 50,
  "includeDetails": false,
  "maxDetailItems": 10,
  "politeDelayMs": 800,
  "requestTimeoutSecs": 60,
  "userAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36"
}
```

# Actor output Schema

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

Default dataset containing normalized public tender opportunities.

## `runStats` (type: `string`):

Summary of parsed, emitted, failed, and detail-enriched source counts.

# 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 = {
    "sources": [
        "dubaiEsupply"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("madwezza/gcc-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 = { "sources": ["dubaiEsupply"] }

# Run the Actor and wait for it to finish
run = client.actor("madwezza/gcc-public-tenders-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sources": [
    "dubaiEsupply"
  ]
}' |
apify call madwezza/gcc-public-tenders-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=madwezza/gcc-public-tenders-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "GCC Public Tenders Monitor",
        "description": "Monitor public GCC government tender opportunities, starting with Dubai eSupply public opportunities, and export normalized procurement records.",
        "version": "0.1",
        "x-build-id": "DumFCmgjLoVcuacgj"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/madwezza~gcc-public-tenders-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-madwezza-gcc-public-tenders-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/madwezza~gcc-public-tenders-monitor/runs": {
            "post": {
                "operationId": "runs-sync-madwezza-gcc-public-tenders-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/madwezza~gcc-public-tenders-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-madwezza-gcc-public-tenders-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "sources": {
                        "title": "Sources",
                        "type": "array",
                        "description": "Public GCC tender sources to collect. Currently supports dubaiEsupply.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "dubaiEsupply"
                        ]
                    },
                    "keywords": {
                        "title": "Keyword filters",
                        "type": "array",
                        "description": "Optional words or phrases to match in project titles, buyer names, categories, or IDs. Empty means all records.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "buyers": {
                        "title": "Buyer filters",
                        "type": "array",
                        "description": "Optional buyer organization names or fragments to match. Empty means all buyers.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "categories": {
                        "title": "Category filters",
                        "type": "array",
                        "description": "Optional supply category filters, e.g. Other, IT, Construction, Services. Matching is case-insensitive and partial.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "maxItemsPerSource": {
                        "title": "Max items per source",
                        "minimum": 1,
                        "maximum": 300,
                        "type": "integer",
                        "description": "Maximum records to emit from each source.",
                        "default": 50
                    },
                    "includeDetails": {
                        "title": "Include public detail text",
                        "type": "boolean",
                        "description": "If enabled, opens public detail pages for a capped number of records and stores a compact text summary. Disabled by default for faster runs.",
                        "default": false
                    },
                    "maxDetailItems": {
                        "title": "Max detail records",
                        "minimum": 0,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum records to enrich with public detail-page text when detail enrichment is enabled.",
                        "default": 10
                    },
                    "politeDelayMs": {
                        "title": "Polite delay in milliseconds",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Delay between page interactions. Keep this non-zero for respectful collection.",
                        "default": 800
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout seconds",
                        "minimum": 10,
                        "maximum": 180,
                        "type": "integer",
                        "description": "Timeout for page loads and table waits.",
                        "default": 60
                    },
                    "userAgent": {
                        "title": "User-Agent",
                        "type": "string",
                        "description": "Browser User-Agent for public-page collection. Some procurement portals require a normal browser User-Agent to render the public table.",
                        "default": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
