# GCC Tenders & Construction Scraper (`complex_intricate_networks/gcc-tender-scraper`) Actor

Scrape government procurement tenders, infrastructure projects, and active bidding opportunities across UAE, Saudi Arabia, Qatar, and the GCC region. Export organized project leads, issuing authorities, and deadlines in clean JSON or CSV.

- **URL**: https://apify.com/complex_intricate_networks/gcc-tender-scraper.md
- **Developed by:** [CIN](https://apify.com/complex_intricate_networks) (community)
- **Categories:** Lead generation, News, Automation
- **Stats:** 39 total users, 4 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 results

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

Aggregate real-time public and private infrastructure tenders, RFPs, and procurement notices across the GCC region (**Saudi Arabia, UAE, Qatar, Oman, Kuwait, and Bahrain**).

GulfPulse eliminates manual hunting across 20+ fragmented government and private procurement portals, delivering structured **B2B sales leads**, **contractor opportunities**, and **project intelligence** directly into CSV, JSON, or automated CRM pipelines.

***

### 🚀 How to Scrape GCC Tenders in 5 Steps

1. **Create** a free [Apify account](https://console.apify.com/sign-up).
2. **Open** [GulfPulse: GCC Tender Intelligence](https://apify.com/complex_intricate_networks/gulfpulse-gcc-tender-scraper) in the Apify Console.
3. **Configure your Input:** Enter target sector keywords (*Infrastructure, Lighting, Roads, Stadium, Sustainability*) and set max page depth.
4. **Click "Start"** and wait a few seconds while the engine aggregates real-time tender listings.
5. **Download your leads** in JSON, CSV, Excel, or query them via API or MCP Server.

***

### 🌟 Key Features & Platform Advantages

- **Multi-Country Aggregation:** Scrapes government procurement feeds and private project portals across all 6 GCC states (Saudi Arabia, UAE, Qatar, Oman, Kuwait, Bahrain).
- **Geo-Targeted Anti-Blocking:** Automatically leverages Apify Proxy with Residential Middle East IPs to bypass regional 403 blocks and 590 timeout defenses.
- **Rich Tender Metadata:** Extracts tender title, sector matches, estimated project budget/cost, closing deadline, country, and city location.
- **Lightweight & Fast:** High-efficiency Cheerio engine processes dozens of tender listings in seconds with minimal compute unit overhead.
- **CRM & AI Ready:** Structured exports for immediate integration into Salesforce, HubSpot, or LLM-driven lead scoring agents.

***

### 💼 Business Use Cases & Recipes

#### 🏗️ Contractor & Supplier Bidding Pipeline

- **Goal:** Identify newly published infrastructure and engineering tenders in Saudi Arabia (Vision 2030) and UAE.
- **Recipe:** Set this Actor to run **Daily** with `searchTerms: ["Infrastructure", "KSA Vision 2030", "Roads"]`. Route dataset outputs via Webhooks to Slack or Microsoft Teams for immediate bidding team alerts.

#### 📊 Market Intelligence & Competitor Tracking

- **Goal:** Monitor procurement budgets, sector activity, and regional tenders across Qatar, Oman, and Kuwait.
- **Recipe:** Schedule weekly runs to map regional procurement trends. Feed outputs into BI dashboards (PowerBI, Tableau, Google Looker) for strategic planning.

***

### 💰 Pricing & Plan Capacity

This Actor operates on a transparent **Pay Per Event (PPE)** pricing model. You are only charged for successfully returned tender records ($10.00 / 1,000 results).

| Plan Tier | Cost / 1,000 Results | Estimated Monthly Capacity |
| :--- | :--- | :--- |
| **Free Plan** | $10.00 | ~500 tenders / month |
| **Starter Plan** | $9.00 *(10% disc.)* | ~5,500 tenders / month |
| **Scale Plan** | $8.00 *(20% disc.)* | ~62,500 tenders / month |

***

### ⬇️ Input Configuration

Configure inputs via the Console UI or pass a JSON payload:

#### Input JSON Example

```json
{
  "searchTerms": ["Infrastructure", "KSA Vision 2030", "Lighting", "Roads"],
  "maxPages": 100
}
```

#### Input Parameters

- **Search Keywords (`searchTerms`):** Array of target industry terms or sectors to search for (e.g., `Infrastructure`, `Lighting`, `Roads`, `Stadium`, `Sustainability`).
- **Max Pages (`maxPages`):** Maximum number of pages to scrape to strictly control proxy usage and run budget.

***

### ⬆️ Output Data Schema

Scraped results are pushed directly to your Dataset in JSON, CSV, or Excel format.

#### Sample Output Object (JSON)

```json
{
  "title": "Construction of Primary Substation 132/11kV at NEOM Industrial Zone",
  "url": "[https://www.saudigulfprojects.com/tenders/ksa-mep-2026-8841](https://www.saudigulfprojects.com/tenders/ksa-mep-2026-8841)",
  "sectorsFound": ["Infrastructure", "Lighting"],
  "projectCost": "SAR 15,000,000",
  "deadline": "30/09/2026",
  "country": "Saudi Arabia",
  "city": "NEOM",
  "scrapedAt": "2026-08-14T02:00:00.000Z"
}
```

#### Diagnostic Error Output Schema

```json
{
  "url": "[https://capt.gov.kw/tenders/1042](https://capt.gov.kw/tenders/1042)",
  "country": "Kuwait",
  "error": "Request blocked - received 403 status code.",
  "errorCode": "GEO_BLOCKED_403",
  "scrapedAt": "2026-08-14T02:00:00.000Z"
}
```

***

### 🤖 MCP Server & AI Agent Integration

Integrate this Actor into AI agents (Claude Desktop, Cursor, LibreChat) via the **Apify MCP Server**:

1. Connect to Apify's MCP server endpoint (`https://mcp.apify.com`).
2. Call `complex_intricate_networks/gulfpulse-gcc-tender-scraper` in prompts to query live GCC tenders inside your AI workflows.

***

### 💻 Programmatic API Access (SDKs)

#### Python Client (`apify-client`)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("complex_intricate_networks/gulfpulse-gcc-tender-scraper").call(
    run_input={
        "searchTerms": ["Infrastructure", "Lighting"],
        "maxPages": 50
    }
)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"[{item.get('country')}] {item.get('title')} - Budget: {item.get('projectCost')} - Deadline: {item.get('deadline')}")
```

#### JavaScript Client (`apify-client`)

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('complex_intricate_networks/gulfpulse-gcc-tender-scraper').call({
    searchTerms: ['Infrastructure', 'Lighting'],
    maxPages: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.log(`[${item.country}]${item.title} - Budget: ${item.projectCost} - Deadline:${item.deadline}`);
});
```

***

### 🔄 Expand Your Intelligence Pipeline

Chain GulfPulse with our complementary business tools:

- **[Company Signal - AI Company Research](https://apify.com/complex_intricate_networks/company-research-ai)**: Research issuing authorities and awarded prime contractors.
- **[Startup Fundraising Scraper](https://apify.com/complex_intricate_networks/fundraising-and-startup-funding-scraper)**: Track VC & private capital inflows into MENA tech.

***

### ❓ FAQ

**Why are residential proxies required for certain GCC portals?**\
Government websites in Kuwait, Oman, and Bahrain use anti-bot systems that block standard datacenter IPs outside the GCC region. Enabling Residential Proxies solves this issue.

**Does this scraper extract private sector RFPs?**\
Yes. GulfPulse aggregates official government procurement portals alongside major private project intelligence aggregators in KSA, UAE, Qatar, Oman, Kuwait, and Bahrain.

**How can I integrate GulfPulse with CRMs and webhooks?**\
You can trigger webhooks upon run completion to push new tender leads directly to Zapier, Make, Slack, or your CRM API (Salesforce, HubSpot).

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords or sector filters (e.g., Infrastructure, Solar, Lighting, Water, Construction, MEP).

## `maxPages` (type: `integer`):

Maximum pages the crawler will process to control compute and proxy budget.

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

Residential proxies are required to bypass regional government firewalls in Oman, Kuwait, and Bahrain.

## Actor input object example

```json
{
  "searchTerms": [
    "Infrastructure",
    "Construction",
    "Water",
    "Solar",
    "Lighting"
  ],
  "maxPages": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "searchTerms": [
        "Infrastructure",
        "Construction",
        "Water",
        "Solar",
        "Lighting"
    ],
    "maxPages": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("complex_intricate_networks/gcc-tender-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 = {
    "searchTerms": [
        "Infrastructure",
        "Construction",
        "Water",
        "Solar",
        "Lighting",
    ],
    "maxPages": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("complex_intricate_networks/gcc-tender-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 '{
  "searchTerms": [
    "Infrastructure",
    "Construction",
    "Water",
    "Solar",
    "Lighting"
  ],
  "maxPages": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call complex_intricate_networks/gcc-tender-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,complex_intricate_networks/gcc-tender-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/pS4RzzyWhDv8Ug0e5/builds/wvcM8IAqhDpi3FWVJ/openapi.json
