# BidNet Direct Scraper - US Government Bids (`s-r/bidnet-direct-bids`) Actor

Collect public BidNet Direct government bids with keyword, state, category and publication filters. Export unique notices with listing dates and optional public AI overviews and precise deadlines.

- **URL**: https://apify.com/s-r/bidnet-direct-bids.md
- **Developed by:** [SR](https://apify.com/s-r) (community)
- **Categories:** Business, Automation
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 tender notices

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

## BidNet Direct Scraper

BidNet Direct Scraper collects public US government bid notices for sales teams, contractors and procurement researchers. Search open or closed opportunities by keyword, state, category and publication window, then export structured records for qualification and monitoring.

Use it to build a daily opportunity feed, find projects in a particular service area, or track upcoming closing dates. Each record keeps the source notice ID and a public BidNet URL so your team can review the original opportunity. The actor collects publicly visible information. Buyer names, solicitation numbers, full descriptions, contacts and documents that require registration are returned as null or are unavailable; they are never inferred from a title.

### BidNet Direct Scraper input

No input field is required. The default search returns up to 100 of the newest open bids. Set `max_items` to control the maximum number of unique notices across the complete run. Use `include_details` when your workflow needs public AI overviews or exact closing timestamps.

`keywords` accepts a list of phrases. Multiple phrases are combined using BidNet's OR search. A phrase containing spaces remains a phrase, and the combined search text cannot exceed 200 characters. The aliases `keyword` and `query` accept comma-separated text. Provide one keyword field per run.

`states` accepts state names, USPS abbreviations or BidNet location identifiers. Multiple locations are combined with OR. Territories such as Puerto Rico and Guam are supported. `locations` is an alias for this field. `categories` accepts the public NAICS sector names or corresponding BidNet identifiers, including Construction, Manufacturing and Information. Filters apply on the source website; a keyword can match information beyond the visible notice title.

`agency_type` selects all agencies, member agencies, state and local agencies, or federal agencies. `status` selects open or closed notices. Awarded notices are not a supported list. `published_within` selects any publication date, the past 24 hours, or the past week. `published_after` accepts an inclusive calendar date in YYYY-MM-DD format and requires publication date descending order.

Sorting supports publication date, closing date, title and state in either direction. For saved searches, `start_urls` accepts direct public BidNet listing URLs, including state and purchasing group listings. Direct URLs replace search filters and cannot be combined with them. `startUrls` and `maxItems` are supported aliases. A continuation cursor is handled automatically during an Apify run.

The checked examples in this product come from actual BidNet responses. One source URL used during validation was:

```json
{"start_urls":["https://www.bidnetdirect.com/public/solicitations/open"],"max_items":100}
```

### Output and available fields

The dataset contains one row per unique tender notice. Core fields include `notice_id`, `title`, `url`, `country`, `status`, `stage`, `portal`, `source`, `fetched_at` and a consecutive `position`. A keyword search also records the query that was sent. IDs remain text, preserving leading zeroes.

Location fields include the displayed state name and its USPS code. Territories retain their own country code. A location of Not Stated keeps a null state code. `agency_type`, `time_remaining` and `purchasing_group` describe the public listing where available; some state and group listings do not display all these fields.

Listing dates appear as `publication_date` and `closing_date`, using YYYY-MM-DD. They contain only what the listing provides. The `published_at` and `deadline` fields contain exact timestamps with the source time zone offset only when a detail page supplies them. They remain null when no precise time is available. The actor does not manufacture midnight timestamps from calendar dates.

With `include_details`, the actor opens each delivered notice and adds a public `ai_overview`, exact dates and time zone abbreviations when present. The overview is generated by the source and is kept separate from the unavailable full description. `details_fetched` indicates that the detail page was successfully retrieved and parsed, even if the page has no AI overview. Some notices never provide one.

### Example output

One real record from a run with `include_details` enabled (the exact deadline comes from the notice's public detail page):

```json
{
  "source": "bidnet-direct-bids",
  "fetched_at": "2026-11-01T21:52:47.378Z",
  "notice_id": "0000441676",
  "listing_id": "9912376401",
  "url": "https://www.bidnetdirect.com/north-carolina/solicitations/open-bids/Evaluation-and-Space-Planning-for-Durham-County-s-Library-Facilities/0000441676",
  "title": "Evaluation and Space Planning for Durham County's Library Facilities",
  "state": "North Carolina",
  "state_code": "NC",
  "country": "US",
  "publication_date": "2026-11-01",
  "closing_date": "2026-11-30",
  "published_at": null,
  "deadline": "2026-11-30T14:00:00-05:00",
  "published_time_zone": null,
  "deadline_time_zone": "EST",
  "buyer": null,
  "buyer_name": null,
  "reference_number": null,
  "description": null,
  "time_remaining": null,
  "agency_type": "Member Agency Bids",
  "purchasing_group": null,
  "ai_overview": null,
  "details_fetched": true,
  "portal": "bidnet",
  "status": "open",
  "stage": "tender",
  "position": 1
}
```

Without `include_details`, the same record has `deadline`, `deadline_time_zone` and `ai_overview` set to null and `details_fetched` set to false. Only `closing_date` carries the calendar date from the listing.

### Use cases for a BidNet Direct Scraper

- **Daily bid feed for sales teams.** Schedule a run with `published_within` set to the past 24 hours and push new notices to your CRM or a Slack channel.
- **Territory monitoring.** Track one or more states, or a single NAICS sector such as Construction, and see which notices close in the next weeks.
- **Market sizing for B2G vendors.** Count open notices per state, agency type and category to decide where to focus a bid team.
- **Lead research for consultants.** Use the public notice URL and the source's AI overview to qualify an opportunity before anyone logs in to BidNet.

### How this BidNet Direct Scraper compares

Other BidNet scrapers exist on the Apify Store. This one is built around what the public site actually shows:

- **Honest fields.** Buyer name and solicitation number are only visible to registered BidNet members, so they are returned as null instead of being guessed from titles.
- **Paid details only on success.** The detail event is charged only when the detail page was retrieved and parsed.
- **Unique notices.** Rows are de-duplicated on the notice ID, including across the source's 10,000-result cap per search.
- **Direct listing URLs.** Saved state and purchasing-group searches can be supplied as `start_urls`.
- **Free plan.** Free accounts can test the output with up to ten notices per run.

### Pricing and delivered results

The actor uses separate result and detail events. A tender event counts each delivered notice once. A tender detail event counts a delivered notice only when its detail page was successfully retrieved and parsed. Failed detail requests do not incur a detail event. There is no run-start event in this product's charge configuration, and a search returning no results has no result or detail charges. See the actor's Pricing tab for the active event prices.

Accounts on the free Apify plan receive at most ten notices per run. Detail enrichment remains available within that delivery limit. This is a volume limit, not a promise that billed dataset rows are free. Choose a smaller `max_items` when testing a saved search, and enable details only when your downstream workflow uses them.

### Pagination, limits and incomplete results

BidNet shows 25 rows per listing page and exposes at most 10,000 results for a single search. A reported total can be larger than the accessible result set. The actor records this limitation in warnings. Split large collections by state or agency type to cover more of the source without repeating the final page.

Long runs continue through successive requests automatically. Source IDs prevent the same notice being delivered twice. If a detail page is unavailable, the listing record is retained, its detail flag remains false, and a warning explains the missing enrichment. The run output also includes result totals, counters and an incomplete-results flag. Review these before treating a collection as exhaustive. New publications can change page order while a run is in progress.

### FAQ

#### Does this provide buyer names and solicitation numbers?

Those fields are locked for anonymous visitors and remain null. The actor does not log in to vendor accounts or derive buyer identities from notice titles or purchasing group names. Follow the public notice URL to review registration requirements on BidNet.

#### Why is an exact deadline missing when a closing date is present?

The listing provides a calendar date. An exact deadline requires a detail page with a time and recognized time zone. Enable details to collect available precise timestamps. A missing source time remains null, while the original calendar date stays available separately.

#### Can I export all US government bids in one search?

A single BidNet search is limited to 10,000 accessible records, even if its reported total is higher. Use multiple state searches and monitor the warnings. Public BidNet coverage is not a guarantee of every procurement opportunity published by every US agency.

#### What happens when my search returns nothing?

The actor records a not-found outcome and delivers no dataset rows. No tender or detail events are charged. Broaden the keywords or remove a restrictive location, category or publication filter before trying again.

# Actor input Schema

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

Phrases combined with OR in one BidNet search; at most 200 characters combined.

## `keyword` (type: `string`):

Alias for keywords; split comma-separated phrases.

## `query` (type: `string`):

Alias for keyword; use only one keyword field.

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

State names, USPS codes or BidNet location IDs, combined with OR.

## `locations` (type: `array`):

Alias for states.

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

NAICS sector names or BidNet category IDs, combined with OR.

## `agency_type` (type: `string`):

Type of public agency.

## `status` (type: `string`):

Open or closed bids; awarded is not a supported list.

## `published_within` (type: `string`):

Publication window offered by BidNet.

## `published_after` (type: `string`):

Inclusive publication date, YYYY-MM-DD; requires published_desc sorting.

## `sort` (type: `string`):

BidNet result order; defaults to publication date descending.

## `start_urls` (type: `array`):

Direct HTTPS BidNet listing URLs; cannot be combined with filters.

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

Alias for start_urls; strings or objects containing url.

## `include_details` (type: `boolean`):

Fetch publicly available exact timestamps and AI overviews. Locked fields remain null.

## `max_items` (type: `integer`):

Maximum unique bids across all pages and listing URLs; defaults to 100. If both volume fields are supplied, the smaller limit applies.

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

Alias for max_items. If both volume fields are supplied, the smaller limit applies.

## `cursor` (type: `string`):

Opaque continuation token. Resubmit the original input with this token.

## Actor input object example

```json
{
  "max_items": 2
}
```

# Actor output Schema

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

Public government bid notices with location, listing dates and optional public details.

## `output` (type: `string`):

OUTPUT record with the run's counts and status flags.

## `errors` (type: `string`):

Failures with a code and a redacted message. Absent when the run had none.

# 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 = {
    "max_items": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("s-r/bidnet-direct-bids").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 = { "max_items": 2 }

# Run the Actor and wait for it to finish
run = client.actor("s-r/bidnet-direct-bids").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 '{
  "max_items": 2
}' |
apify call s-r/bidnet-direct-bids --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,s-r/bidnet-direct-bids"
        }
    }
}
```

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/Jh7r8RSCyaJEXxbLv/builds/7agJd6N0dcfTuKSr7/openapi.json
