# US State Open Bids: NC, Missouri & Washington (`prixodik/us-state-open-bids`) Actor

Collect complete public open-bid lists from North Carolina, Missouri and Washington, filter opportunities and track semantic changes.

- **URL**: https://apify.com/prixodik/us-state-open-bids.md
- **Developed by:** [Milchenko Oleksii](https://apify.com/prixodik) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 delivered procurement opportunities

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

## US State Open Bids: NC, Missouri & Washington

Collect and normalize the public open-procurement lists of North Carolina eVP, MissouriBUYS / MOVERS and Washington WEBS. Filter by topic or agency and receive new, changed or no-longer-listed opportunities in repeat runs. All pages of selected lists are traversed before delivery; the Actor fails explicitly when pagination, access or the source contract changes.

### Quick start

Run the default input for a current snapshot of all three states. Select fewer states or provide `keywords` to reduce paid output. Keywords use case-insensitive OR matches in title, description and solicitation number. `agencyKeywords` independently filters the agency name; both filters must match when both are supplied. Washington does not publish a separate agency field, so an agency filter excludes its records. Set `includeBuyerContact` to `true` to add the structured buyer name and email where a state list publishes them; it is `false` by default. There is no invented classification or AI enrichment.

For recurring use, choose `mode: "changes"` and provide a persistent `stateStoreId`. The first run establishes a baseline and delivers selected current bids. Later runs deliver only semantic changes. Keep filters and contact settings consistent, and serialize runs sharing a store. A separate baseline is maintained for each combination of states, keywords, agency filters and contact settings.

### Source coverage

| State | Public source | Available metadata and limitations |
|---|---|---|
| NC | [North Carolina eVP](https://evp.nc.gov/solicitations/) | Solicitation number, description, public title, agency, posting time and **bid-opening time**. The public grid does not establish a separate submission deadline. |
| MO | [MissouriBUYS / MOVERS](https://ewqg.fa.us8.oraclecloud.com/fscmUI/redwood/negotiation-abstracts/view/abstractlisting?prcBuId=300000005255687) | Solicitation number, title, agency, type, published/open/close times and publicly listed buyer contact when requested. Links point to the official listing; use the exact solicitation number to locate the opportunity. |
| WA | [Washington WEBS bid calendar](https://pr-webs-vendor.des.wa.gov/BidCalendar.aspx) | Title, reference where available, description, closing **date**, amendment date and public contact name. No separate agency, publication timestamp or closing time is inferred. |

No account, CAPTCHA bypass, proxy, attachments, or account-only bid detail extraction is used. A source link can lead to a portal requiring registration for additional documents; the Actor supplies public-list metadata only. The Missouri public API contains a versioned route: a provider deployment can require adapter maintenance. Sources remain responsible for updates, accuracy and reuse conditions. No unrestricted open-data licence is claimed. Respect applicable source terms; do not redistribute separately protected bid attachments.

### Results

One dataset item is one delivered opportunity or change event. `recordId` prefixes a stable source identifier with `NC`, `MO` or `WA`; different states' procurement numbers are never conflated. Missing values remain `null`.

`publishedAt`, `bidOpeningAt`, `openForBiddingAt` and `closingAt` are separate timestamp fields. Missouri's `OpenDate` is the start of accepting bids, recorded as `openForBiddingAt`; it is not North Carolina's bid-opening event. `closingDate` and `amendedDate` preserve date-only information where the portal gives no time. Do not substitute a bid-opening time for a submission deadline or infer a midnight closing timestamp. `sourceTimezone` explains local date interpretation; UTC timestamps retain the source's offset semantics. Public amendment text and attachment counts are retained where Missouri exposes them; attachments themselves are not downloaded.

`changeType` is `snapshot`, `new`, `changed` or `not_in_open_list`. A snapshot is a current record, not a claim that its content changed. The last event is issued only after a complete fresh traversal of selected states and means that the bid is absent from the current public open list. It is **not** proof of cancellation, award or closure. Previous content is retained for that event. Display-only countdowns and observation timestamps do not trigger changes. Structured buyer contacts default to `null`; descriptions can still contain publicly supplied contact information.

Download `SUMMARY` for source counts, filtering and delivery completeness. `maxItems` caps output, not page coverage. Spend limits are applied before dataset delivery. Only delivered events advance the baseline; undelivered events remain pending for a future changes run. A truncated delivery is explicitly marked. Source failure produces no new dataset batch and no baseline advance. Do not interpret a zero-result filtered snapshot as proof that a state has no procurement activity.

The Actor journals delivery and checks dataset read-back before baseline updates. Resuming a fully delivered run avoids another dataset push. Changed, concurrent or uncertain storage stops rather than guessing whether a paid delivery occurred. Serialize runs and inspect an incomplete run before starting another one with the same state.

### Pricing

**$0.005 to start with the default 256 MB of memory, plus $0.01 per delivered record** ($1 per 100 records), including platform usage. Apify charges the start event per GB of allocated memory, with a minimum of one event; choosing more than 1 GB increases the start fee. A current snapshot delivers and charges its selected bids each time. Changes mode charges only delivered new, changed or no-longer-listed events, plus the start fee. Empty and failed runs may still incur the start fee. No external subscription or AI cost is required. Subsequent storage and external API reads follow Apify platform rules.

This is a bounded metadata feed, not a procurement eligibility decision, legal assessment or a guarantee that a bid remains open when you submit. Check the official opportunity and its documents before acting. Contact support with the run ID and a nonconfidential example.

# Actor input Schema

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

Supported public lists only. All pages of selected states are read before any delivery.

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

Case-insensitive OR matches in title, description or solicitation number. Empty selects all.

## `agencyKeywords` (type: `array`):

Case-insensitive OR matches in agency names. Washington does not expose an agency field, so such filters exclude its records.

## `mode` (type: `string`):

Snapshot delivers current selected bids; changes delivers only new, changed or no-longer-listed bids.

## `stateStoreId` (type: `string`):

Required for changes. Reuse a persistent store for the same filters; serialize runs.

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

Limits paid output, not source page coverage. Undelivered events are not committed; repeat changes runs to continue.

## `includeBuyerContact` (type: `boolean`):

Include structured buyer name and email where the public list exposes them. Descriptions may contain contacts regardless of this option.

## Actor input object example

```json
{
  "states": [
    "NC",
    "MO",
    "WA"
  ],
  "keywords": [],
  "agencyKeywords": [],
  "mode": "snapshot",
  "stateStoreId": "",
  "maxItems": 1000,
  "includeBuyerContact": false
}
```

# Actor output Schema

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

No description

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

No description

# 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("prixodik/us-state-open-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("prixodik/us-state-open-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 '{}' |
apify call prixodik/us-state-open-bids --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,prixodik/us-state-open-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/BvHBlfm5noRSbNO7E/builds/icYiLia6bRr509j42/openapi.json
