# Government RFP & Tender Monitor (`technicaldost/gov-rfp-tender-monitor`) Actor

Monitor public government procurement portals for new RFPs, tenders, and bids. Structured JSON output with tender title, authority, closing date, value, and document links.

- **URL**: https://apify.com/technicaldost/gov-rfp-tender-monitor.md
- **Developed by:** [Technical Dost Solutions](https://apify.com/technicaldost) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 tender 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/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

## Government RFP & Tender Monitor

### What this Actor does

Monitor public government procurement, tender, and RFP listing pages and extract new tenders as clean, structured JSON.

It processes user-provided public URLs (such as national procurement portals, state e-tender pages, or public agency notice boards), prioritizes JSON-LD/schema.org structured data, and can optionally use a conservative fallback that reads visible public tender links and table rows. It normalizes useful fields, applies an optional keyword filter, deduplicates rows by tender URL, and saves structured records to the Apify dataset.

### Why this Actor is useful

Suppliers, bid teams, and analysts pay for this kind of extraction because it replaces manual portal checking, creates repeatable daily or weekly monitoring, feeds spreadsheets, CRMs, and bid pipelines, and turns scattered public procurement pages into a clean, API-ready dataset.

### Who this is for

- Government suppliers and contractors
- Bid and proposal (RFP) teams
- Procurement and tender consultants
- Construction, IT, and services vendors
- Market intelligence and GovTech analysts
- Trade associations and chambers of commerce
- Researchers tracking public spending

### Common use cases

- Track new tenders across multiple government portals
- Filter opportunities by keyword (e.g. "construction", "IT services")
- Feed a bid pipeline or CRM with fresh RFP leads
- Monitor a specific issuing authority or region
- Build recurring public-procurement intelligence datasets

### Input

| Field | Type | Description |
| --- | --- | --- |
| `startUrls` | array (required) | Public tender/RFP/procurement listing pages to extract from. Use only pages you may access without login or bypassing access controls. |
| `keywords` | array of strings | Optional keywords. Only tenders whose title or surrounding text contains at least one keyword (case-insensitive) are kept. Empty = no filter. |
| `maxItems` | integer | Maximum rows to save. Default 50, min 1, max 10000. |
| `maxConcurrency` | integer | Pages processed in parallel. Default 3, min 1, max 20. |
| `extractionMode` | string | `structuredDataOnly` or `structuredDataWithFallback` (default). The fallback safely reads visible public tender listings. |
| `requestTimeoutSecs` | integer | Maximum time per page. Default 30, min 5, max 180. |
| `proxyConfiguration` | object | Optional Apify proxy configuration where permitted by your source review. |

### Output

| Field | Description |
| --- | --- |
| `tenderTitle` | Title of the tender, RFP, or bid notice. |
| `tenderId` | Tender / NIT / reference number when present. |
| `issuingAuthority` | Department or agency issuing the tender. |
| `category` | Tender category or type when available. |
| `location` | Region, state, or location of the work. |
| `publishedDate` | Date the tender was published or issued. |
| `closingDate` | Bid closing / last submission date. |
| `estimatedValue` | Estimated contract value when published. |
| `currency` | Currency of the estimated value (e.g. INR, USD, EUR). |
| `tenderUrl` | Public URL of the tender detail page. |
| `documentUrl` | Public link to the tender document/notice when available. |
| `sourceUrl` | URL where the data was extracted. |
| `detectedAt` | Timestamp when this Actor extracted the row. |
| `extractionMethod` | `structured_data` for schema data, or `fallback_public_tender_listing` for visible public listings. |
| `confidenceScore` | Heuristic confidence based on structured data availability and completeness. |
| `missingFields` | Required fields that were not available from the source page. |

### Sample input

```json
{
  "startUrls": [
    {
      "url": "https://example.gov/tenders"
    }
  ],
  "keywords": ["construction", "IT services"],
  "maxItems": 25,
  "maxConcurrency": 3,
  "extractionMode": "structuredDataWithFallback",
  "requestTimeoutSecs": 30
}
````

### Sample output

```json
{
  "tenderTitle": "Supply and Installation of Office IT Equipment",
  "tenderId": "GOV/2026/IT/00471",
  "issuingAuthority": "Department of Public Works",
  "category": "IT services",
  "location": "New Delhi, India",
  "publishedDate": "2026-06-15",
  "closingDate": "2026-07-10",
  "estimatedValue": 4500000,
  "currency": "INR",
  "tenderUrl": "https://example.gov/tenders/GOV-2026-IT-00471",
  "documentUrl": "https://example.gov/tenders/GOV-2026-IT-00471/notice.pdf",
  "sourceUrl": "https://example.gov/tenders",
  "detectedAt": "2026-06-27T00:00:00.000Z",
  "extractionMethod": "structured_data",
  "confidenceScore": 0.95,
  "missingFields": []
}
```

### Pricing

This Actor uses a pay-per-event model: **$0.005 per tender result** saved to the dataset. You pay only for the structured tender rows you receive, which makes recurring monitoring predictable and low-cost.

### How to use

Run this Actor on Apify with public tender portal URLs, export the dataset as JSON, CSV, or Excel, or pull it through the Apify API. Connect the output to Google Sheets, Make, Zapier, a webhook, your CRM, or an internal bid dashboard. For monitoring, save the input as an Apify task and schedule recurring runs to catch new tenders.

### Best practices

- Start with a small set of reviewed public procurement URLs.
- Prefer portals that expose schema.org / JSON-LD structured data.
- Use `keywords` to focus on the sectors or services you bid on.
- Use `structuredDataOnly` for highest precision; use `structuredDataWithFallback` for portals that only show visible tender tables.
- Keep `maxConcurrency` low for smaller portals.
- Review each source website's rules before scheduling recurring runs.

### Compliance and responsible use

This Actor is for public data only. It must not be used to bypass logins, paywalls, CAPTCHAs, or security systems, to collect private or sensitive personal data, or to support spam or abuse. Government procurement information processed here should be publicly published tender notices. You are responsible for following applicable laws and each source website's rules.

### Limitations

- Output quality depends on the public structured data available on the source pages.
- Fallback extraction is intentionally conservative and only looks for visible public tender/RFP/bid link and table patterns. It does not claim universal portal support.
- Dates and amounts are extracted as published; formats vary by country and portal and are not reformatted or converted.
- Some fields may be empty when the source does not publish them; these appear in `missingFields`.
- The Actor does not claim support for any specific third-party procurement platform.
- Website markup and access policies can change.

### Troubleshooting

- Empty output usually means the page has no public structured tender data and no visible tender-link patterns.
- Invalid URL errors mean one or more input URLs are malformed.
- Slow runs can usually be improved by lowering `maxConcurrency`.
- Missing fields are source-data limitations, not inferred values.

### Changelog

- v0.1.0: Initial release with structured-data-first extraction, conservative public tender-listing fallback, keyword filtering, and confidence scoring.

# Actor input Schema

## `startUrls` (type: `array`):

Public government procurement, tender, or RFP listing pages to extract from. Use only URLs you are allowed to access without login, paywall bypass, CAPTCHA bypass, or security circumvention.

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

Optional list of keywords. Only tenders whose title or surrounding text contains at least one keyword (case-insensitive) are kept. Leave empty to keep all tenders.

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

Maximum number of normalized tender rows to save. The Actor stops pushing new rows when this limit is reached.

## `maxConcurrency` (type: `integer`):

How many pages to process at once. Lower this for small portals or cautious monitoring.

## `extractionMode` (type: `string`):

Use structured data only, or allow a conservative fallback for visible public tender links and table rows on procurement pages.

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

Maximum time to spend processing a single page before it is treated as failed.

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

Optional Apify proxy configuration. Use only where permitted by the source website and your compliance process.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://example.gov/tenders"
    }
  ],
  "keywords": [],
  "maxItems": 50,
  "maxConcurrency": 3,
  "extractionMode": "structuredDataWithFallback",
  "requestTimeoutSecs": 30
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://example.gov/tenders"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("technicaldost/gov-rfp-tender-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 = { "startUrls": [{ "url": "https://example.gov/tenders" }] }

# Run the Actor and wait for it to finish
run = client.actor("technicaldost/gov-rfp-tender-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 '{
  "startUrls": [
    {
      "url": "https://example.gov/tenders"
    }
  ]
}' |
apify call technicaldost/gov-rfp-tender-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=technicaldost/gov-rfp-tender-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Government RFP & Tender Monitor",
        "description": "Monitor public government procurement portals for new RFPs, tenders, and bids. Structured JSON output with tender title, authority, closing date, value, and document links.",
        "version": "0.1",
        "x-build-id": "urtSFlThDPtIzwh0d"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/technicaldost~gov-rfp-tender-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-technicaldost-gov-rfp-tender-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/technicaldost~gov-rfp-tender-monitor/runs": {
            "post": {
                "operationId": "runs-sync-technicaldost-gov-rfp-tender-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/technicaldost~gov-rfp-tender-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-technicaldost-gov-rfp-tender-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",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Public tender page URLs",
                        "type": "array",
                        "description": "Public government procurement, tender, or RFP listing pages to extract from. Use only URLs you are allowed to access without login, paywall bypass, CAPTCHA bypass, or security circumvention.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "keywords": {
                        "title": "Keyword filter",
                        "type": "array",
                        "description": "Optional list of keywords. Only tenders whose title or surrounding text contains at least one keyword (case-insensitive) are kept. Leave empty to keep all tenders.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Maximum results",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of normalized tender rows to save. The Actor stops pushing new rows when this limit is reached.",
                        "default": 50
                    },
                    "maxConcurrency": {
                        "title": "Maximum concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "How many pages to process at once. Lower this for small portals or cautious monitoring.",
                        "default": 3
                    },
                    "extractionMode": {
                        "title": "Extraction mode",
                        "enum": [
                            "structuredDataOnly",
                            "structuredDataWithFallback"
                        ],
                        "type": "string",
                        "description": "Use structured data only, or allow a conservative fallback for visible public tender links and table rows on procurement pages.",
                        "default": "structuredDataWithFallback"
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout seconds",
                        "minimum": 5,
                        "maximum": 180,
                        "type": "integer",
                        "description": "Maximum time to spend processing a single page before it is treated as failed.",
                        "default": 30
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional Apify proxy configuration. Use only where permitted by the source website and your compliance process."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
