# Municipal RFP / Bid Opportunity Monitor (`nintendo424/municipal-rfp-bid-monitor`) Actor

Extract structured public bid, RFP, RFQ, and procurement opportunities from city/county procurement pages.

- **URL**: https://apify.com/nintendo424/municipal-rfp-bid-monitor.md
- **Developed by:** [Blake Panter](https://apify.com/nintendo424) (community)
- **Categories:** Business, Lead generation, Automation
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

## Municipal RFP / Bid Opportunity Monitor

Extract structured public bid, RFP, RFQ, tender, and procurement opportunities from city, county, and municipal procurement pages.

Use this Actor to turn public government purchasing pages into clean records you can export, monitor, enrich, or route into public-sector sales, construction estimating, vendor research, and business-development workflows.

### What it does

- Fetches one or more public procurement URLs.
- Detects bid/RFP/RFQ-style opportunity rows and listing items.
- Extracts key fields such as agency, title, bid number, due date, category, source URL, and document links.
- Produces stable `dedupeKey` values for scheduled monitoring and change detection.
- Skips failed or non-HTML pages instead of aborting the whole run.
- Charges only when a structured opportunity row is pushed in pay-per-event mode.

### Common use cases

- Find municipal bid opportunities for contractors and vendors.
- Monitor city/county purchasing pages for new RFPs and bid deadline changes.
- Build procurement intelligence dashboards.
- Feed public-sector sales and business-development workflows.
- Track due dates and source documents from many local agencies.
- Create alerts for new construction, professional services, IT, equipment, and public works solicitations.

### Input

```json
{
  "startUrls": [
    { "url": "https://www.dallasga.gov/rfps" },
    { "url": "https://www.kennesaw-ga.gov/city-clerk/bids-and-rfps/" }
  ],
  "maxPages": 25,
  "includePdfLinks": true,
  "requestTimeoutSecs": 30
}
````

#### Input fields

| Field | Type | Description |
|---|---|---|
| `startUrls` | array | Public city/county procurement, bids, RFP, RFQ, or purchasing pages to scan. |
| `maxPages` | integer | Hard cap for pages fetched in one run. |
| `includePdfLinks` | boolean | Include public PDF, Word, Excel, ZIP, and bid-detail links found near each opportunity. |
| `requestTimeoutSecs` | integer | Maximum time to wait for each page before skipping it. |

### Output

Each dataset item represents one detected public procurement opportunity.

```json
{
  "agency": "Dallas, GA",
  "title": "Bid-2026-04: Shiloh Church Water Line Improvements & Sewer Service Connect",
  "bidNumber": "2026-04",
  "dueDate": "07/15/2026",
  "category": "construction",
  "summary": "Bid-2026-04: Shiloh Church Water Line Improvements...",
  "documents": [
    "https://www.dallasga.gov/publicworks/page/bid-2026-04-shiloh-church-water-line-improvements-sewer-service-connect"
  ],
  "sourceUrl": "https://www.dallasga.gov/rfps",
  "detectedAt": "2026-07-06T12:42:57.000Z",
  "dedupeKey": "dallas-ga|2026-04|07-15-2026"
}
```

#### Output fields

| Field | Description |
|---|---|
| `agency` | Agency/site name inferred from page metadata or URL. |
| `title` | Opportunity title. |
| `bidNumber` | Detected bid/RFP/RFQ/project number, when available. |
| `dueDate` | Detected due/closing/deadline date, when available. |
| `category` | Lightweight inferred category such as `construction`, `technology`, `equipment`, or `professional-services`. |
| `summary` | Short source text snippet around the opportunity. |
| `documents` | Related detail, PDF, Word, Excel, ZIP, or bid-detail links. |
| `sourceUrl` | Page where the opportunity was found. |
| `detectedAt` | Timestamp for this extraction run. |
| `dedupeKey` | Stable key for deduping recurring runs. |

### Recent validation examples

Validated against public municipal procurement pages including:

- Dallas, GA Bids/RFPs: extracted active water/sewer and culvert replacement bid opportunities.
- Rockdale County, GA current bids/RFP/RFQ page: extracted current public bid signals while filtering navigation menu false positives.
- Kennesaw, GA and Fayetteville, GA procurement pages: fetched as public source pages for real-world coverage testing.

Some government sites block automated requests with `403`; those URLs are skipped and logged instead of failing the whole run.

### Monetization

This Actor is configured for pay-per-event monetization:

- Primary event: `opportunity-extracted`
- Scheduled price: `$0.025` per extracted public procurement opportunity
- Minimum max charge: `$0.50`
- Default memory: `128 MB`
- Permission level: limited permissions

### Notes and limitations

- This Actor is intended for **public procurement pages only**.
- It does not log in to vendor portals or bypass access controls.
- Government sites vary widely; always verify final bid details at the official source URL.
- The Actor is not an official procurement record system.
- For best results, provide listing pages that contain visible bid/RFP rows, due dates, bid numbers, or document links.

# Actor input Schema

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

Public city/county procurement, bids, RFP, RFQ, or purchasing pages to scan.

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

Hard cap for pages fetched in one run.

## `includePdfLinks` (type: `boolean`):

When enabled, include public PDF, Word, Excel, ZIP, and bid-detail links found near each opportunity.

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

Maximum time to wait for each public procurement page before skipping it.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://example.gov/bids"
    }
  ],
  "maxPages": 25,
  "includePdfLinks": true,
  "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/bids"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nintendo424/municipal-rfp-bid-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/bids" }] }

# Run the Actor and wait for it to finish
run = client.actor("nintendo424/municipal-rfp-bid-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/bids"
    }
  ]
}' |
apify call nintendo424/municipal-rfp-bid-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Municipal RFP / Bid Opportunity Monitor",
        "description": "Extract structured public bid, RFP, RFQ, and procurement opportunities from city/county procurement pages.",
        "version": "0.1",
        "x-build-id": "nVw7w7fdpaffEnDBE"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/nintendo424~municipal-rfp-bid-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-nintendo424-municipal-rfp-bid-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/nintendo424~municipal-rfp-bid-monitor/runs": {
            "post": {
                "operationId": "runs-sync-nintendo424-municipal-rfp-bid-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/nintendo424~municipal-rfp-bid-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-nintendo424-municipal-rfp-bid-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 procurement pages",
                        "type": "array",
                        "description": "Public city/county procurement, bids, RFP, RFQ, or purchasing pages to scan.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxPages": {
                        "title": "Maximum pages",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Hard cap for pages fetched in one run.",
                        "default": 25
                    },
                    "includePdfLinks": {
                        "title": "Include PDF/document links",
                        "type": "boolean",
                        "description": "When enabled, include public PDF, Word, Excel, ZIP, and bid-detail links found near each opportunity.",
                        "default": true
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout seconds",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Maximum time to wait for each public procurement page before skipping it.",
                        "default": 30
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
