# US State Bids & Solicitations (NC, SC, LA, FL) (`modoai/nc-evp-bids`) Actor

Public bids from North Carolina eVP, South Carolina SCBO, Louisiana LaPAC and Florida MyFloridaMarketPlace in one clean format, with a 'new only' mode for daily alerts. No personal data.

- **URL**: https://apify.com/modoai/nc-evp-bids.md
- **Developed by:** [Modo AI](https://apify.com/modoai) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 solicitations

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 Bids & Solicitations (NC, SC, LA, FL)

Get the public bids and solicitations of **four US state procurement portals** in one clean, consistent format:

| State | Portal | Open bids (Oct 2026) | Buyers covered |
|---|---|---|---|
| **North Carolina** | eVP (evp.nc.gov) | ~290 | state agencies, schools, universities, community colleges, cities and counties |
| **South Carolina** | SCBO (scbo.sc.gov) | ~480 | state agencies and local governments, in 15 categories (construction, IT, professional services…) |
| **Louisiana** | LaPAC | ~260 | state departments, universities and local entities |
| **Florida** | MyFloridaMarketPlace | ~165 | state agencies and water management districts |

Turn on **Only new solicitations**, schedule it daily, and you get a feed of what was posted since the last run, across all the states you pick. You pay only for new bids.

### What you get

Every record has the same fields, whatever the state:

| Field | Example |
|---|---|
| `state` | `NC` |
| `solicitationNumber` | `46-DNCR-27-2180` |
| `title` | Fire Alarm Testing and Inspection for the NC Zoo Project |
| `agency` | DEPARTMENT OF NATURAL AND CULTURAL RESOURCES |
| `status` | Open |
| `postedAt` | `2026-10-16T19:21:47.000Z` |
| `bidOpeningAt` / `bidOpeningLocal` | due or opening date, as an ISO instant and in the state's local time |
| `url` | the official solicitation page or document |

Some fields depend on the state:

- **South Carolina** adds `category`, `description` and `detailsUrl`.
- **Louisiana** adds `documents`, the names and links of the attachments.
- With **Include details**, North Carolina adds the solicitation type, commodity code, mandatory conference and special instructions.
- With **Include details**, Florida adds the description, UNSPSC `commodityCodes` and document names.

### Who uses it

- **Contractors and suppliers** who sell to public buyers in the Southeast and want one daily list of new opportunities in their trade. Search for example "paving", "roofing", "janitorial" or "IT services".
- **Bid-alert services and consultants** feeding their own notifications or CRM.
- **Market researchers** tracking public demand by state, agency and category.

### How to use it

1. Choose the **states**. The default is North Carolina only, which is the fastest.
2. Optionally set a **keyword**, a **posted since** date and **Maximum results**.
3. For a daily alert, enable **Only new solicitations** and add a schedule (Apify Console → Schedules). The first run returns the latest bids and records the current lists. Each later run returns only what was posted since.
4. Export as JSON, CSV or Excel, or connect to Google Sheets, Slack, Zapier or Make.

**Timing:** South Carolina asks crawlers to wait 10 seconds between pages, and this Actor respects it, so including SC adds about 3 minutes to a run. The other states take seconds.

### Reliability

- Reads each portal the way a browser does, one page at a time with a pause between requests. No proxies, no logins, no workarounds. Pages that a portal asks crawlers to avoid are never read.
- **Quality checks on every run, per state:** if a portal changes its layout or returns incomplete records, the run fails with a clear message that names the state, instead of giving you wrong data.

### Privacy

The output holds solicitation data only:

- buyer names, phone numbers and emails are never collected (SC "Direct Inquiries To / Buyer Phone / Buyer Email", FL response contact, NC solicitation owner);
- emails and phone numbers written inside descriptions are replaced with `[removed]`;
- documents are linked, never read.

### FAQ

**Is this data public?** Yes. Every portal publishes these solicitations for anyone to read without an account.

**Can you add another state?** States are added only when their portal can be read cleanly, without logins or workarounds, and its rules allow it. Suggestions are welcome on the Issues tab.

**Something broke or a field is missing?** Open an issue on the Actor's Issues tab. Fixes are usually shipped within a few days.

*This Actor is independent and not affiliated with any of the states it covers.*

# Actor input Schema

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

Which state portals to read. South Carolina asks crawlers to wait 10 seconds between pages, so it adds about 3 minutes to a run.

## `statuses` (type: `array`):

Which solicitations to return. Leave only Open for live bids. South Carolina, Louisiana and Florida publish open bids only.

## `departmentTypes` (type: `array`):

Limit North Carolina to some types of public buyer. Empty = all. Ignored for the other states.

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

Search the portal by keyword (e.g. 'paving', 'roofing'). Use \* as a wildcard for partial words.

## `postedSince` (type: `string`):

Only solicitations posted on or after this date (YYYY-MM-DD).

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

Stop after this many solicitations.

## `includeDetails` (type: `boolean`):

Adds extra fields where the portal has them: North Carolina type, commodity code, mandatory conference, special instructions; Florida description, UNSPSC commodity codes and document names. Slower: one extra page per solicitation. South Carolina and Louisiana already include everything.

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

Return only solicitations posted after the newest one your previous run saw. The first run returns the latest ones (up to 'Maximum results'); after that, each run returns only what was posted since. Ideal for a daily schedule: you pay only for what is new.

## Actor input object example

```json
{
  "states": [
    "NC"
  ],
  "statuses": [
    "open"
  ],
  "departmentTypes": [],
  "maxItems": 50,
  "includeDetails": false,
  "onlyNew": false
}
```

# Actor output Schema

## `solicitations` (type: `string`):

One record per solicitation from the chosen states: state, number, title, agency, status, posted date, due/opening date, link (plus details, commodity codes and documents where available).

# 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 = {
    "states": [
        "NC"
    ],
    "statuses": [
        "open"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("modoai/nc-evp-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 = {
    "states": ["NC"],
    "statuses": ["open"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("modoai/nc-evp-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 '{
  "states": [
    "NC"
  ],
  "statuses": [
    "open"
  ],
  "maxItems": 50
}' |
apify call modoai/nc-evp-bids --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,modoai/nc-evp-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/ng7hPNlh4AsT3lqYM/builds/dbRfD75HvxSOL4RiM/openapi.json
