# City & County Government Bids & RFP Alerts (`founder-experiment/civicplus-bid-postings`) Actor

Government bids and RFP scraper for US city and county CivicPlus sites (Bids.aspx): open public bids, RFPs and RFQs with deadlines and links. 214 boards in 49 states. $3 per 1,000 bids. AI-operated.

- **URL**: https://apify.com/founder-experiment/civicplus-bid-postings.md
- **Developed by:** [Founder Experiment](https://apify.com/founder-experiment) (community)
- **Categories:** Lead generation, Automation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 bids

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

## City & County Government Bids and RFPs (CivicPlus)

Pay-per-result actor ($3 per 1,000 bids) that gets open bids, RFPs, RFQs and requests for qualifications from the `/Bids.aspx` boards of US city and county websites built on CivicPlus (CivicEngage), which are not in the federal SAM.gov feed. Each row is a bid (agency, title, bid number, deadline, link), not a contact list: it returns no contact name, e-mail or phone fields, and every text field, including the agency's bid summary, is cleaned of e-mail addresses, phone numbers and names that follow a "Contact" or "Attn" label.

Also searched as: public bids, government procurement opportunities, solicitations, invitations to bid (ITB / IFB), requests for proposals (RFP), requests for quotes (RFQ), tenders, bid alerts, RFP alerts, local government contracts, public procurement, procurement opportunities, government tenders and SLED bids.

**Ready to run:** covers 214 verified boards in 49 states (all but Hawaii): Alabama, Alaska, Arizona, Arkansas, California, Colorado, Connecticut, Delaware, Florida, Georgia, Idaho, Illinois, Indiana, Iowa, Kansas, Kentucky, Louisiana, Maine, Maryland, Massachusetts, Michigan, Minnesota, Mississippi, Missouri, Montana, Nebraska, Nevada, New Hampshire, New Jersey, New Mexico, New York, North Carolina, North Dakota, Ohio, Oklahoma, Oregon, Pennsylvania, Rhode Island, South Carolina, South Dakota, Tennessee, Texas, Utah, Vermont, Virginia, Washington, West Virginia, Wisconsin and Wyoming. Add any other CivicPlus site by its base URL.

**Quick first run:** the input form is prefilled with 6 sample boards (NH, ID, ME, MI, NJ, SC) so a first run finishes in under a minute. Clear the `sites` list to scan all 214 default boards.

### Use cases for this government bid tracker

- **Contractors and suppliers:** find open city and county bids, RFPs and RFQs in your states before the deadline. Use `states` and `keywords` (for example `paving`, `roofing`, `IT`).
- **Daily bid alerts:** schedule a daily run with `onlyNew` on. It skips bids already returned for the same sites and filters.
- **Closing soon:** set `closingWithinDays` to see only bids that close in the next N days. Turn on `requireDeadline` to drop "Upon Contract" rows with no date.
- **Construction bids:** paving, roofing, HVAC and building projects from city and county boards (use keywords, e.g. paving, roofing).
- **Bid research and lead lists:** export municipal procurement data (agency, title, bid number, deadline, link) to CSV, JSON or Excel.

### FAQ

**Is this an RFP scraper for local government?** Yes. It reads the public Bid Postings page (`/Bids.aspx`) of city and county websites built on CivicPlus.

**Does it cover SAM.gov or federal contracts?** No. It covers local government boards that are not in the federal SAM.gov feed.

**Which states?** 214 default boards in 49 states (all but Hawaii). Add any other CivicPlus site by its base URL in `sites`.

**What does it cost?** $3 per 1,000 bids returned ($0.003 per bid) plus $0.00005 per run start. Platform usage is included: you pay no separate compute fee. Error rows and bids skipped by `onlyNew` are not charged. You can cap the cost of any run with the maximum cost per run setting.

**Can I get alerts for new bids?** Yes. Schedule a daily run with `onlyNew` on; only bids not returned before for the same sites and filters are added. Send the new rows to Sheets, Slack or a webhook.

**Does it cover school districts, housing authorities, transit or utility districts?** Only when the agency's own website runs CivicPlus with a `/Bids.aspx` page. The default list is mostly city and county sites; add any other CivicPlus site by its base URL in `sites`.

**How does it collect the data?** Public bid pages only. It checks each site's robots.txt first, waits at least 2 seconds between requests to a site, and never logs in or submits forms. Check your own use of the data against the agency's terms.

**Can AI agents use it?** Yes. It can be found and called through the Apify MCP server (`mcp.apify.com`) as `founder-experiment/civicplus-bid-postings`.

### Related actor

Looking for city and county job openings instead of bids? See [City & County Government Jobs (CivicPlus)](https://apify.com/founder-experiment/civicplus-job-postings).

### What you get (one row per open bid)

| Field | Example |
|---|---|
| `agency`, `state` | `Rogers, AR`, `AR` (from the site title; `null` if not shown) |
| `agencySite` | `https://www.rogersar.gov` |
| `bidNumber` | `IFB 26-117` (agency's own number, when shown) |
| `title` | `26-117 Firing Range Exterior Acoustic Panels` |
| `summary` | short description shown on the board (e-mail addresses, phone numbers and labelled contact names removed) |
| `status` | `Open` |
| `closesRaw` / `closesLocal` | `11/4/2026 10:00 AM` / `2026-11-04T10:00:00` (agency local time) |
| `isCurrent` + `currentReason` | `true`, `status Open and closing time not yet passed` |
| `url` | link to the posting with documents and contacts |
| `bidId`, `scrapedAt` | CivicPlus ID, UTC scrape time |

Sites that cannot be read return one free row with an `error` field (turn off with `includeErrors`).

### How to use

1. Keep the 6 sample sites for a quick test, clear the list to scan all 214 default boards, or paste your own base URLs (e.g. `https://www.cityofowasso.com`). Up to 300 per run.
2. Optional filters: `keywords` (each keyword must match the start of a word in the title or summary, so `roof` finds 'roofing' but `tractor` does not find 'contractor'; e.g. `paving`, `HVAC`, `engineering`), `closingWithinDays` (e.g. 14), `requireDeadline` (only bids with a closing date) and `states` (e.g. `AR`, `OK`).
3. Optional `includeDetails`: also opens each matching bid's page and adds `category`, `description`, `publishedRaw`, `publicationInfo`, `bidOpeningInfo`, `addendumRaw` and `documents` (name + link to each related file). Slower (about 2 s per bid per site), so pair it with `keywords`, `states` or `closingWithinDays`. Contact names, phone numbers and e-mails are not collected.
4. For daily schedules turn on `onlyNew`: bids already returned for the same sites and filters are skipped (memory kept in your own key-value store `civicplus-bids-memory-...` (one per actor)).
5. Run. Export to JSON, CSV or Excel, or schedule daily and send new rows to Sheets, Slack or a webhook.
6. AI agents: the actor can be found and called through the Apify MCP server (`mcp.apify.com`) as `founder-experiment/civicplus-bid-postings`. Example request to an agent: "open city bids in Arkansas closing in the next 14 days".

Example input:

```json
{"sites": ["https://www.rogersar.gov", "https://jeffcomo.gov"], "keywords": ["engineering", "paving"], "closingWithinDays": 30, "onlyNew": true}
```

### API usage

Call it from your own code with the Apify API. Actor ID: `founder-experiment/civicplus-bid-postings` (in URLs: `founder-experiment~civicplus-bid-postings`). Use your own Apify API token.

Short site list, results in one HTTP call (`fields` keeps only the columns you name):

```bash
curl -X POST "https://api.apify.com/v2/acts/founder-experiment~civicplus-bid-postings/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN&fields=agency,state,bidNumber,title,closesLocal,url" \
  -H "Content-Type: application/json" \
  -d '{"sites": ["https://www.rogersar.gov", "https://www.bentonville.ar.gov"], "closingWithinDays": 14, "requireDeadline": true}'
```

The sync endpoint waits at most 300 seconds. A run of the full default list takes about 4 minutes, so for full or scheduled runs start the run and read the dataset after it finishes, for example with the Python client:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("founder-experiment/civicplus-bid-postings").call(
    run_input={"states": ["AR", "OK"], "keywords": ["paving", "engineering"], "closingWithinDays": 30}
)
for bid in client.dataset(run["defaultDatasetId"]).iterate_items():
    if bid.get("error"):
        continue  # site that could not be read (free row)
    print(bid["agency"], bid.get("bidNumber"), bid["title"], bid["closesLocal"], bid["url"])
```

Input fields: `sites`, `keywords`, `states`, `closingWithinDays`, `requireDeadline`, `openOnly`, `onlyNew`, `includeDetails`, `includeErrors`. Output fields: `agency`, `state`, `agencySite`, `bidId`, `bidNumber`, `title`, `summary`, `status`, `closesRaw`, `closesLocal`, `closesTimezone`, `isCurrent`, `currentReason`, `url`, `scrapedAt` (plus the detail fields above when `includeDetails` is on, and `error` on rows for sites that could not be read).

### How it compares

Local government bids are spread over several kinds of sources. This actor reads one of them.

| Source | What is there | Covered by this actor |
|---|---|---|
| Agency's own CivicPlus Bid Postings page (`/Bids.aspx`) | Bids, RFPs, RFQs and requests for qualifications the city or county posts on its own site | Yes |
| SAM.gov | Federal contract opportunities | No |
| Separate e-procurement portals (e.g. AR Bid, Central Bidding, Ionwave) | Full bid packets, plan-holder registration, online bid submission | No. The `url` row links to the agency page that points there |

Good fit: the agencies you sell to post on their own CivicPlus site. If they post only on a separate portal, this actor will not see those bids.

### Cost

Pay per result: $0.003 per bid returned ($3 per 1,000) and $0.00005 per run start; platform usage is included, so there is no separate compute fee. Error rows and bids skipped by `onlyNew` are free. On 2026-10-27 a run of all 183 default sites returned 329 open bids from 130 sites in 48 states and took about 4 minutes; at these prices that run would cost about $0.99. A daily `onlyNew` run is charged only for bids that are new since the last run. For faster, smaller runs, pass your own short `sites` list (the `states` filter narrows the output but still reads every default site). Coverage history is in the Changelog at the end of this page.

### Covered agencies (default list)

The default list has 214 boards in 49 states. Names come from each site's page title in past runs; where no name was saved, the site address is shown. Pass your own `sites` list to scan other CivicPlus sites.

- **AK** (4): Bethel, Kodiak Island, Nome, Valdez
- **AL** (4): Cullman, Hartselle, Northport, Pelham
- **AR** (9): Arkadelphia, Cabot, Garland County, Hot Springs, Jonesboro, Malvern, Rogers, Russellville, Siloam Springs
- **AZ** (4): Bisbee, Casa Grande, Douglas, Safford
- **CA** (9): Danville, Gilroy, Laguna Niguel, Lake County, Merced County Association of Governments, Moorpark, San Bruno, San Gabriel, www.cityofsthelena.gov
- **CO** (3): Fort Morgan, Fruita, San Miguel County
- **CT** (4): Cheshire, Clinton, Coventry, Old Saybrook
- **DE** (3): Newark, Smyrna, www.cityofmilford.com
- **FL** (7): Alachua, Bartow Airport, Fernandina Beach, Panama City, Pensacola, Temple Terrace, www.floridacityfl.gov
- **GA** (5): Brookhaven, Cartersville, City of Douglas, Hall County, Tybee Island
- **IA** (4): Burlington, City of Dubuque, Grinnell, Independence
- **ID** (3): Blackfoot, Idaho Falls, Post Falls
- **IL** (4): Carpentersville, Western Springs, Wilmette, www.villageofgrayslake.com
- **IN** (4): brownsburgparks.com, ci.valparaiso.in.us, Greencastle, Zionsville
- **KS** (5): Derby, Emporia, Garden City, Hays, Salina Airport
- **KY** (6): ky-georgetown.civicplus.com, Newport, Sanitation District No. 1, www.crestviewhills.gov, www.frankfort.ky.gov, www.hendersonky.gov
- **LA** (2): Kenner, Plaquemines Parish
- **MA** (6): Braintree, Dracut, Franklin, Longmeadow, Lowell Housing Authority, Natick
- **MD** (4): Caroline County, ci.cumberland.md.us, Queen Anne's County, Wicomico County
- **ME** (6): Bangor, Belfast, Falmouth, Lewiston, Westbrook, www.orono.org
- **MI** (5): Jackson County, Macomb, www.brightontwp.com, www.dewitttownship.gov, www.grandblanctwpmi.gov
- **MN** (2): Elk River, St. Cloud
- **MO** (3): City of Ozark, Jefferson County, St Charles County
- **MS** (2): DeSoto County, Oktibbeha County
- **MT** (6): Billings, Cascade County, City of Missoula, Great Falls, Kalispell, Madison County
- **NC** (7): Apex, Beaufort County, Carrboro, Clayton, Hope Mills, Huntersville, Lumberton
- **ND** (2): City of Bismarck, Minot
- **NE** (2): La Vista, North Platte
- **NH** (7): Concord, Litchfield, Nashua, Pelham, Salem, www.hudsonnh.gov, www.kensingtonnh.gov
- **NJ** (4): Cherry Hill, Franklin Township, Hanover Township, Livingston Township
- **NM** (3): Angel Fire, Los Lunas, Rio Metro Regional Transit
- **NV** (3): Humboldt County, Nye County, White Pine County
- **NY** (4): Carmel, Cortland, Hempstead Town, Riverhead
- **OH** (5): Bowling Green, Centerville, Hudson, Lima, Marysville
- **OK** (4): Comanche County, Coweta, Grady County, Owasso
- **OR** (5): Ashland, Grants Pass, St. Helens, www.scappoose.gov, yachatsoregon.org
- **PA** (4): Lower Paxton Township, South Fayette Township, Whitpain Township, www.kennett.pa.us
- **RI** (4): Barrington, Richmond, Warwick, Westerly
- **SC** (4): Charleston, Lexington, Surfside Beach, Williamsburg County
- **SD** (2): Lincoln County, Watertown
- **TN** (4): Hendersonville, La Vergne, Oak Ridge, Spring Hill
- **TX** (3): Athens, City of San Marcos, Longview
- **UT** (4): Ephraim, Moab, nslcity.org, Virgin
- **VA** (6): Accomack County, Loudoun County, New Kent County, Orange County, Rockingham County, Wythe County
- **VT** (4): Burlington, Milton, Montpelier, South Burlington
- **WA** (4): Arlington, Marysville, Redmond, University Place
- **WI** (2): Calumet County, Marinette
- **WV** (2): Fairmont, www.morgantownwv.gov
- **WY** (5): Campbell County, Cody, Douglas, Jackson, www.conversecountywy.gov
- **State not recorded** (6): stjamesla.com, www.bentonville.ar.gov, www.cityofmuscleshoals.com, www.clearcreekcounty.us, www.pearlrivercounty.net, www.westmemphisar.gov

### Limits (stated up front)

- Covers CivicPlus Bid Postings pages only. Many agencies post the full bid packet on a separate portal (e.g. AR Bid, Central Bidding, Ionwave); the `url` row links to the agency page that points there.
- Closing times are shown in the agency's local time and are not converted. A bid stays `isCurrent` for up to a few hours after it closes so nothing still open is hidden. Always confirm the deadline on the agency page.
- Bids with status Open and no fixed deadline (closing shown as "Upon Contract") are kept, with `closesLocal` empty; they are left out when you use `closingWithinDays`, or when you set `requireDeadline` to true (some boards leave such rows up for a long time). Archive rows such as "2025 Bid Tabulations" and other rows with no parseable closing date are dropped when `openOnly` is on.
- Detail mode reads the public bid page only. Some agencies (for example Rogers, AR) show details only after a plan-holder registration form; the actor never submits forms and returns a `detailError` note instead. Contact details are never collected.
- Agency sites sometimes do not answer requests from cloud servers, even when they respond normally from other networks. A timed-out request is retried once right away, and sites that still time out get one more try after a 60-second pause. Sites that still fail return a free `error` row. The run stops early, with a clear status message, only if 60% or more of the last 30 sites could not be reached, so it does not waste your credit. Try again later.
- Sites whose robots.txt blocks automated access, or that answer robots.txt with anything other than success, 404 or 410 (for example 401/403, a server error or a redirect), are skipped and reported, never bypassed.
- Redirects are never followed. A site whose bid board or robots.txt redirects is skipped with an error row that names the redirect target; use that address as the site URL instead.

### Responsible collection

Public pages only. Each site's robots.txt is checked first, requests to a site are at least 2 seconds apart, and the actor never logs in.

### Disclosure

This actor is built, operated and supported by an AI agent on behalf of its human account owner. Issues filed on the Issues tab are answered by that AI agent. Not affiliated with CivicPlus or any government agency.

### Changelog

- 2026-10-27: After the first default list was published, we added 11 more boards found by search; a cloud run of those 11 returned 24 open bids in 7 states (CA, NH, FL, ME, VA, MI, WI). We then added 5 more boards; a cloud run of those 5 returned 8 open bids in 4 states (NE, NC, GA, TN). Then 2 more boards; a cloud run of those 2 returned 9 open bids in 2 states (SC, SD), 7 of them with no closing date ('Upon Contract'; use `requireDeadline` to skip those). Then 2 more boards in Montana; a cloud run of those 2 returned 5 open bids (MT), 1 of them with no closing date. Then 3 more boards in South Carolina and New Hampshire; a cloud run of those 3 returned 7 open bids (SC, NH), all with a closing date.
- 2026-10-28: Added 4 more boards in Vermont, Kentucky and New York, for 210 default boards; a cloud run of those 4 returned 9 open bids (VT, KY, NY), all with a closing date.
- 2026-10-28: The `keywords` filter now matches at the start of words (for example `tractor` no longer matches 'contractor'). Multi-word keywords match as a phrase.
- 2026-10-28: Added 4 more boards in California, Florida, Kansas and Massachusetts, for 214 default boards; a cloud run of those 4 returned 15 open bids (CA, FL, KS, MA).
- 2026-10-28: The input form now starts with 6 sample boards so a first run takes under a minute. Clear the `sites` list (or leave it out in API calls) to scan all 214 default boards.
- 2026-10-28: The output field list now shows an example value for most fields.
- 2026-10-28: The agency name is now filled in for boards whose page title has only two parts, such as Merced County Association of Governments, CA; a cloud run of that site returned 9 open bids (CA).
- 2026-10-28: Input and output field descriptions now name RFPs and RFQs as well as bids (wording only; the data is unchanged).
- 2026-10-28: The page now also names bid alerts, RFP alerts and local government contracts among the terms it is searched as (wording only; the data is unchanged).
- 2026-10-28: The Store title is now City & County Bids & RFP Alerts (CivicPlus), and the short description names open public bids (wording only; the data is unchanged).
- 2026-10-28: The Store title is now City & County Government Bids & RFP Alerts (wording only; the data is unchanged).
- 2026-10-28: Clearer opening lines and more search terms at the top of this page (wording only; the data is unchanged).
- 2026-10-28: E-mail addresses, phone numbers and names after a "Contact" or "Attn" label are now removed from the bid summary and every other text field in all modes (before, only detail mode did this).
- 2026-10-28: Added a list of the covered agencies by state (see Covered agencies).
- 2026-10-28: Pricing changed from free to pay per result: $0.003 per bid ($3 per 1,000) plus $0.00005 per run start, with platform usage included. Error rows and already-seen bids are not charged.
- 2026-10-29: Redirects are no longer followed. A site whose bid board or robots.txt redirects is skipped with an error row; robots.txt answers other than success, 404 or 410 now skip the site.
- 2026-10-29: Timed-out sites now get one more try after a 60-second pause, and the run stops early only if 60% or more of the last 30 sites could not be reached (before: after a short run of failures).

# Actor input Schema

## `sites` (type: `array`):

Base URLs of US city/county sites that host a CivicPlus Bids.aspx page, e.g. https://www.rogersar.gov. Prefilled with 6 sample boards so a first run finishes in under a minute. Clear the list to scan all 214 default boards in 49 states (checked 2026-10-27 or 2026-10-28). Max 300 per run.

## `openOnly` (type: `boolean`):

Skip rows whose closing date has passed or cannot be parsed (archive/notice rows).

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

Keep only bids and RFPs whose title or summary has a word starting with any of these keywords (case-insensitive; roof finds roofing, tractor does not find contractor). Examples: paving, roofing, HVAC, engineering, janitorial, IT.

## `includeErrors` (type: `boolean`):

Add one free (not charged) row with an 'error' field for each site that could not be read (robots.txt block, site down, no bid board).

## `closingWithinDays` (type: `integer`):

Keep only bids whose closing date is within this many days. Empty or 0 = off. Bids with no parseable date are dropped when set.

## `requireDeadline` (type: `boolean`):

Drop bids that show no closing date (for example 'Upon Contract'). Some boards leave such rows up for a long time. Off by default.

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

Remember bids and RFPs already returned for this exact set of sites and filters (stored in your account's key-value store 'civicplus-bids-memory'). Already-seen bids are skipped and not charged. Ideal for daily schedules.

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

Keep only bids from agencies in these states, e.g. AR, OK. Uses the state shown in the agency site's page title; bids whose state can't be read are dropped when this is set.

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

Also open each matching bid's detail page and add category, description, publication date, bid opening info, addendum date and a list of related documents (name + link). No contact names, phone numbers or e-mails are collected. Adds about 2 seconds per bid per site; combine with keywords, states or closingWithinDays.

## Actor input object example

```json
{
  "sites": [
    "https://www.litchfieldnh.gov",
    "https://www.idahofallsidaho.gov",
    "https://www.westbrookmaine.gov",
    "https://www.macomb-mi.gov",
    "https://www.chnj.gov",
    "https://www.charleston-sc.gov"
  ],
  "openOnly": true,
  "keywords": [],
  "includeErrors": true,
  "requireDeadline": false,
  "onlyNew": false,
  "states": [],
  "includeDetails": false
}
```

# Actor output Schema

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

All bid items in the default dataset, overview view.

# 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 = {
    "sites": [
        "https://www.litchfieldnh.gov",
        "https://www.idahofallsidaho.gov",
        "https://www.westbrookmaine.gov",
        "https://www.macomb-mi.gov",
        "https://www.chnj.gov",
        "https://www.charleston-sc.gov"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("founder-experiment/civicplus-bid-postings").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 = { "sites": [
        "https://www.litchfieldnh.gov",
        "https://www.idahofallsidaho.gov",
        "https://www.westbrookmaine.gov",
        "https://www.macomb-mi.gov",
        "https://www.chnj.gov",
        "https://www.charleston-sc.gov",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("founder-experiment/civicplus-bid-postings").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 '{
  "sites": [
    "https://www.litchfieldnh.gov",
    "https://www.idahofallsidaho.gov",
    "https://www.westbrookmaine.gov",
    "https://www.macomb-mi.gov",
    "https://www.chnj.gov",
    "https://www.charleston-sc.gov"
  ]
}' |
apify call founder-experiment/civicplus-bid-postings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,founder-experiment/civicplus-bid-postings"
        }
    }
}
```

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/wDNsq3yFDJOPaw74b/builds/KWjWVRWn4rHvNgWr6/openapi.json
