# Government Bid Opportunity Scraper (`careybrown/rfp-signal-scout`) Actor

Scrape official public procurement feeds for normalized government bid and contract opportunity signals.

- **URL**: https://apify.com/careybrown/rfp-signal-scout.md
- **Developed by:** [Carey Brown](https://apify.com/careybrown) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

$20.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/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 Bid Opportunity Scraper

Government Bid Opportunity Scraper turns official public procurement feeds into normalized, scored government bid and contract opportunity signals.

It reads structured government open-data sources, normalizes source-specific rows into one schema, applies deterministic scoring, and returns opportunities with deadline urgency, vendor-fit tags, buyer-fit triage fields, contact fields when source-provided, source health, and a run summary.

The Actor uses public structured sources only. It does not submit bids, guarantee eligibility, verify award likelihood, enrich contacts, send outreach, or replace procurement/legal review.

### Why Use It

Procurement portals are valuable but slow to monitor manually. Government Bid Opportunity Scraper is built for vendors, consultants, agencies, and revenue teams that want a repeatable watchlist of fresh public opportunities without scraping portal pages by hand.

Each result is designed to answer practical first-pass questions:

- What is the opportunity?
- Which public source did it come from?
- Which agency posted it?
- When was it posted?
- When is it due?
- What category or procurement type does it appear to fit?
- Is there a source-provided contact?
- How urgent or complete is the record?

### What It Does

- Fetches current public solicitations and open bid opportunities from selected official sources.
- Filters out opportunities with already-passed due dates.
- Normalizes agency, title, category, procurement type, status, posted date, due date, contact, and opportunity URL fields.
- Tags likely vendor-fit categories such as construction, IT, professional services, transportation, facilities, supplies, and staffing.
- Scores records by deadline fit, freshness, category fit, completeness, and source confidence.
- Adds optional deterministic buyer-fit triage by buyer profile, preferred tags, and deadline preference.
- Returns ranked opportunity signals with score reasons and risk flags.
- Produces a run summary with per-source health and aggregate counts.

### Supported Sources

| source id | source | type |
|---|---|---|
| `nyc_current_solicitations` | NYC Current Solicitations | city procurement |
| `la_ramp_open_bids` | LA RAMP Open Bid Opportunities | regional procurement |

### Output Fields

Each dataset item can include:

- `opportunityId`
- `sourceId`, `sourceName`, `sourceType`, `jurisdiction`
- `sourceRecordId`
- `agencyName`
- `title`
- `category`
- `procurementType`
- `status`
- `postedDate`
- `dueDate`
- `daysUntilDue`
- `contactName`, `contactEmail`, `contactPhone`
- `opportunityUrl`
- `description`
- `vendorFitTags`
- `scoreReasons`
- `riskFlags`
- `deadlineScore`, `freshnessScore`, `categoryFitScore`, `completenessScore`, `sourceConfidenceScore`
- `opportunityScore`
- `buyerProfile`
- `buyerFitScore`
- `buyerFitBand`
- `buyerFitReasons`
- `deadlineFitBand`
- `qualificationWarnings`

A `RUN_SUMMARY` key-value-store record is also created with selected sources, record counts, source health, category/agency/deadline bands, average score, buyer-fit aggregate fields, qualification warnings, and top vendor-fit tags.

### Example Use Cases

- Monitor fresh city and regional procurement opportunities.
- Find open bids by category, agency, or keyword.
- Build a daily or weekly RFP watchlist around supported public feeds.
- Surface deadlines and contact fields from structured official sources.
- Compare open opportunities across supported jurisdictions.
- Feed a downstream procurement research, CRM, or alerting workflow.

### Input Fields

| field | type | default | description |
|---|---|---|---|
| `sources` | string array | all supported sources | Official public procurement sources to query. |
| `postedDaysBack` | integer | 30 | Return opportunities posted within this many days where supported. |
| `dueDaysAhead` | integer | 120 | Return opportunities due within this many days where supported. |
| `keywords` | string array | none | Optional title/description keywords applied after fetch. |
| `categories` | string array | none | Optional category/type filters applied after fetch. |
| `agencies` | string array | none | Optional agency/department filters applied after fetch. |
| `maxResultsPerSource` | integer | 100 | Maximum source rows to fetch per selected source. |
| `minOpportunityScore` | number | none | Optional minimum deterministic opportunity score. |
| `buyerProfile` | string | `general_vendor` | Optional buyer type for deterministic first-pass fit scoring. |
| `preferredVendorFitTags` | string array | none | Optional vendor-fit tags to favor in buyer-fit scoring. |
| `deadlinePreference` | string | `standard` | Optional deadline preference: `urgent`, `standard`, or `long_horizon`. |
| `minimumBuyerFitScore` | number | none | Optional minimum buyer-fit score applied after buyer-fit scoring. |
| `includeRawRecord` | boolean | false | Include the original source row on each normalized record. |

### Example Input

```json
{
  "sources": ["nyc_current_solicitations", "la_ramp_open_bids"],
  "postedDaysBack": 30,
  "dueDaysAhead": 120,
  "maxResultsPerSource": 25,
  "buyerProfile": "general_vendor",
  "deadlinePreference": "standard",
  "includeRawRecord": false
}
````

### Pricing Hypothesis

This Actor should be priced higher than generic civic data because each result has explicit procurement timing and budget intent.

Launch recommendation after private validation and a larger local quality review: `$0.02/result`.

Conservative fallback: `$0.01/result` if lower-friction first adoption is preferred.

### What It Does Not Do

- It does not submit bids.
- It does not guarantee vendor eligibility.
- It does not predict award likelihood.
- It does not enrich decision makers or private contacts.
- It does not send outreach.
- It does not sync CRMs.
- It does not cover all procurement portals.
- It does not provide legal, compliance, or procurement advice.

Government Bid Opportunity Scraper provides public procurement opportunity signals, not qualified bid recommendations.

### Claim Boundary

This is an official-source opportunity signal product. `buyerFitScore` is deterministic first-pass triage based on visible public-source fields, not eligibility, compliance, award likelihood, or advice. Buyers still need to verify eligibility, portal requirements, bid documents, addenda, deadlines, and procurement rules directly with the source agency or portal.

# Actor input Schema

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

Official public procurement sources to query.

## `postedDaysBack` (type: `integer`):

Return opportunities posted within this many days where the source supports posted-date filtering.

## `dueDaysAhead` (type: `integer`):

Return opportunities due within this many days where the source supports due-date filtering.

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

Optional title/description keywords. Matching is applied after source fetch.

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

Optional category/type filters. Matching is applied after source fetch.

## `agencies` (type: `array`):

Optional agency/department filters. Matching is applied after source fetch.

## `maxResultsPerSource` (type: `integer`):

Maximum source rows to fetch per selected source.

## `minOpportunityScore` (type: `number`):

Optional minimum deterministic opportunity score.

## `buyerProfile` (type: `string`):

Optional buyer type used for deterministic first-pass fit scoring.

## `preferredVendorFitTags` (type: `array`):

Optional vendor-fit tags to favor in buyer-fit scoring.

## `deadlinePreference` (type: `string`):

Optional deadline preference for buyer-fit scoring.

## `minimumBuyerFitScore` (type: `number`):

Optional minimum deterministic buyer-fit score applied after scoring.

## `includeRawRecord` (type: `boolean`):

Include the original source row on each normalized record.

## Actor input object example

```json
{
  "sources": [
    "nyc_current_solicitations",
    "la_ramp_open_bids"
  ],
  "postedDaysBack": 30,
  "dueDaysAhead": 120,
  "maxResultsPerSource": 100,
  "buyerProfile": "general_vendor",
  "deadlinePreference": "standard",
  "includeRawRecord": false
}
```

# Actor output Schema

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

Normalized government bid and procurement opportunity records written to the default dataset.

## `runSummary` (type: `string`):

Source health, record counts, selected filters, and aggregate run details.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("careybrown/rfp-signal-scout").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("careybrown/rfp-signal-scout").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 '{}' |
apify call careybrown/rfp-signal-scout --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Government Bid Opportunity Scraper",
        "description": "Scrape official public procurement feeds for normalized government bid and contract opportunity signals.",
        "version": "0.1",
        "x-build-id": "4BEltdBMRzno1z2zn"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/careybrown~rfp-signal-scout/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-careybrown-rfp-signal-scout",
                "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/careybrown~rfp-signal-scout/runs": {
            "post": {
                "operationId": "runs-sync-careybrown-rfp-signal-scout",
                "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/careybrown~rfp-signal-scout/run-sync": {
            "post": {
                "operationId": "run-sync-careybrown-rfp-signal-scout",
                "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": "Official public procurement sources to query.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "nyc_current_solicitations",
                                "la_ramp_open_bids"
                            ]
                        },
                        "default": [
                            "nyc_current_solicitations",
                            "la_ramp_open_bids"
                        ]
                    },
                    "postedDaysBack": {
                        "title": "Posted Days Back",
                        "minimum": 1,
                        "maximum": 365,
                        "type": "integer",
                        "description": "Return opportunities posted within this many days where the source supports posted-date filtering.",
                        "default": 30
                    },
                    "dueDaysAhead": {
                        "title": "Due Days Ahead",
                        "minimum": 1,
                        "maximum": 365,
                        "type": "integer",
                        "description": "Return opportunities due within this many days where the source supports due-date filtering.",
                        "default": 120
                    },
                    "keywords": {
                        "title": "Keywords",
                        "type": "array",
                        "description": "Optional title/description keywords. Matching is applied after source fetch.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "categories": {
                        "title": "Categories",
                        "type": "array",
                        "description": "Optional category/type filters. Matching is applied after source fetch.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "agencies": {
                        "title": "Agencies",
                        "type": "array",
                        "description": "Optional agency/department filters. Matching is applied after source fetch.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResultsPerSource": {
                        "title": "Maximum Results Per Source",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum source rows to fetch per selected source.",
                        "default": 100
                    },
                    "minOpportunityScore": {
                        "title": "Minimum Opportunity Score",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "number",
                        "description": "Optional minimum deterministic opportunity score."
                    },
                    "buyerProfile": {
                        "title": "Buyer Profile",
                        "enum": [
                            "general_vendor",
                            "it_software_vendor",
                            "construction_vendor",
                            "professional_services_vendor",
                            "facilities_vendor",
                            "supplies_equipment_vendor"
                        ],
                        "type": "string",
                        "description": "Optional buyer type used for deterministic first-pass fit scoring.",
                        "default": "general_vendor"
                    },
                    "preferredVendorFitTags": {
                        "title": "Preferred Vendor Fit Tags",
                        "type": "array",
                        "description": "Optional vendor-fit tags to favor in buyer-fit scoring.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "deadlinePreference": {
                        "title": "Deadline Preference",
                        "enum": [
                            "urgent",
                            "standard",
                            "long_horizon"
                        ],
                        "type": "string",
                        "description": "Optional deadline preference for buyer-fit scoring.",
                        "default": "standard"
                    },
                    "minimumBuyerFitScore": {
                        "title": "Minimum Buyer Fit Score",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "number",
                        "description": "Optional minimum deterministic buyer-fit score applied after scoring."
                    },
                    "includeRawRecord": {
                        "title": "Include Raw Record",
                        "type": "boolean",
                        "description": "Include the original source row on each normalized record.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
