# Federal Contract Bid Finder (`vex_workflow/federal-bid-finder`) Actor

Find open US federal contract opportunities from the official public daily data extract. Filter by keyword, NAICS, PSC, set-aside, state, agency and deadline. Only-new mode for daily alerts. No scraping, no login.

- **URL**: https://apify.com/vex_workflow/federal-bid-finder.md
- **Developed by:** [Ian McCann](https://apify.com/vex_workflow) (community)
- **Categories:** Business, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Federal Contract Bid Finder

Find open US federal contract opportunities in seconds. This Actor reads the official public Contract Opportunities data extract that the U.S. General Services Administration publishes every day, filters it to what you care about, and returns a clean table of bids you can act on.

No web scraping. No login. No API key. It uses only the public bulk data file that the government publishes for this purpose.

### What can it do?

- Search notice titles (and optionally the full notice text) for your keywords
- Filter by NAICS code, PSC code, set-aside (SBA, 8(a), HUBZone, SDVOSB, WOSB and more), state, agency and notice type
- Skip notices that are past their deadline or due too soon
- Collapse amendments so you see one row per solicitation
- **Only new since last run**: schedule it daily and get just the fresh bids

### Who is it for?

- Small businesses and contractors looking for bids in their NAICS codes
- Bid and proposal teams who want a daily feed in a spreadsheet, chat channel or CRM
- Consultants who track set-aside opportunities for clients

### How much does it cost?

You pay per opportunity returned, plus a small start fee per run that covers downloading the full daily file. See the Pricing tab for current prices. A typical daily alert that returns 20 new bids costs about 4 cents.

### Input example

```json
{
  "keywords": ["janitorial", "custodial"],
  "naicsCodes": ["5617"],
  "setAsides": ["SBA"],
  "states": ["TX", "OK"],
  "postedWithinDays": 7,
  "onlyNew": true
}
```

### Output example

```json
{
  "noticeId": "74fe89becec040aeb393c5ef76fdfa90",
  "title": "Janitorial Services, DeQueen Project Office",
  "solicitationNumber": "W9127S26QA001",
  "noticeType": "Solicitation",
  "department": "DEPT OF DEFENSE",
  "subTier": "DEPT OF THE ARMY",
  "office": "W076 ENDIST LITTLE ROCK",
  "postedDate": "2026-10-23 16:24:39",
  "responseDeadline": "2026-11-03T14:00:00-05:00",
  "daysToDeadline": 8,
  "naicsCode": "561720",
  "pscCode": "S201",
  "setAsideCode": "SBA",
  "setAside": "Total Small Business Set-Aside (FAR 19.5)",
  "placeOfPerformanceCity": "De Queen",
  "placeOfPerformanceState": "AR",
  "placeOfPerformanceCountry": "USA",
  "matchedKeywords": ["janitorial"],
  "noticeUrl": "(link to the official notice page)"
}
```

(Values above are illustrative.) Download results as JSON, CSV, Excel or send them anywhere with Apify integrations, schedules and webhooks.

### Tips

- Use NAICS prefixes: `5415` matches every 5415xx code.
- Title-only keyword search is precise. Turn on **Search the full notice text** to find more, but expect some loose matches from standard contract clauses.
- For a daily alert, set **Only new since last run** and add a Schedule in Apify.

### Privacy and data notes

- Contact names, emails, phone numbers, street addresses, awardee details and the long free-text description are intentionally **not** returned. Follow the notice link for full details.
- The data is U.S. government information. This Actor is independent and is not affiliated with or endorsed by GSA or any government agency.
- Notices are as fresh as the latest daily extract. Always confirm deadlines on the official notice page before you bid.

### FAQ

**Is this legal?** The data comes from the public extract the government provides for automated access. The site terms say automated access should use its APIs and extracts rather than scraping, which is exactly what this Actor does.

**Why not every field?** We leave out personal contact details on purpose.

**Something broke?** Open an issue on the Issues tab and include your input.

# Actor input Schema

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

Match any of these words or phrases (case-insensitive). Leave empty to match everything that passes the other filters.

## `searchInDescription` (type: `boolean`):

Also match keywords against the full notice description, not just the title. Finds more, but boilerplate clauses can cause loose matches. The description itself is not returned.

## `naicsCodes` (type: `array`):

NAICS codes or prefixes, for example 541512 or 5415.

## `pscPrefixes` (type: `array`):

Product Service Codes or prefixes, for example D3 or S201.

## `setAsides` (type: `array`):

Set-aside codes such as SBA, 8A, HZC, SDVOSBC, WOSB, EDWOSB. Leave empty for all.

## `noticeTypes` (type: `array`):

Notice types to include. Leave empty for all types.

## `states` (type: `array`):

Two-letter state codes for place of performance or office location, for example VA, TX.

## `agencyContains` (type: `string`):

Only notices whose department, sub-tier or office contains this text, for example ARMY or VETERANS.

## `postedWithinDays` (type: `integer`):

Only notices posted in the last N days. Use 0 for any date.

## `minDaysToDeadline` (type: `integer`):

Skip notices due sooner than this. Use 0 to keep all.

## `onlyNew` (type: `boolean`):

Return only notices this filter set has not returned before. Ideal for a daily schedule.

## `sortBy` (type: `string`):

Order of results.

## `includePastDeadline` (type: `boolean`):

Keep notices whose response deadline has already passed.

## `latestVersionOnly` (type: `boolean`):

When a notice has several postings or amendments with the same solicitation number, return only the newest one.

## `maxResults` (type: `integer`):

Stop after this many matching notices.

## Actor input object example

```json
{
  "keywords": [
    "cybersecurity",
    "janitorial"
  ],
  "searchInDescription": false,
  "noticeTypes": [
    "Solicitation",
    "Combined Synopsis/Solicitation",
    "Presolicitation",
    "Sources Sought"
  ],
  "postedWithinDays": 7,
  "minDaysToDeadline": 0,
  "onlyNew": false,
  "sortBy": "newest",
  "includePastDeadline": false,
  "latestVersionOnly": true,
  "maxResults": 500
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open US federal contract opportunities that match your filters, one row per notice.

## `summary` (type: `string`):

Run summary with notices scanned, matched and returned, plus the filters used.

# 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 = {
    "keywords": [
        "cybersecurity",
        "janitorial"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vex_workflow/federal-bid-finder").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 = { "keywords": [
        "cybersecurity",
        "janitorial",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("vex_workflow/federal-bid-finder").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "keywords": [
    "cybersecurity",
    "janitorial"
  ]
}' |
apify call vex_workflow/federal-bid-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vex_workflow/federal-bid-finder"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/fPjr1LUgi2W6qrhu5/builds/hMJtCNgFg4fsjZKNs/openapi.json
