# Louisiana LaPAC Bid Monitor (`slate_spool/lapac-bid-monitor`) Actor

Monitor Louisiana public bid & procurement (LaPAC) solicitations. Structured JSON with canonical per-bid detail URLs, keyword/department/category filters, attachments, and status.

- **URL**: https://apify.com/slate\_spool/lapac-bid-monitor.md
- **Developed by:** [Wes Shields](https://apify.com/slate_spool) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Louisiana Government Bid & RFP Scraper (LaPAC)

Find open Louisiana public bid and RFP opportunities from LaPAC without manually checking department, category, search, and bid detail pages.

This Actor fetches public Louisiana Procurement and Contract Network (LaPAC) opportunity pages under `https://wwwcfprd.doa.louisiana.gov/osp/lapac/` and returns structured JSON records for matching bid opportunities. It is designed for vendors, capture teams, procurement analysts, and data teams that need a repeatable feed of Louisiana government solicitations.

Correctness note: this Actor has been validated against a labeled sample from LaPAC. Independent verification against a separate answer key is in progress. Confirm source records before operational use.

### What It Extracts

Each output item represents one LaPAC bid record when available from the source page:

- `bidNumber`
- `title`
- `agency`
- `departmentId`
- `category`
- `issueDate`
- `openDate`
- `lastChangeDate`
- `status`
- `mandatorySiteVisit`
- `attachments`
- `addenda`
- `detailUrl`
- `scrapedAt`

### Common Uses

- Monitor Louisiana public bids and RFPs by department.
- Search current opportunities by keyword.
- Pull open solicitations by UNSPSC category segment.
- Feed bid records into alerts, spreadsheets, CRMs, enrichment workflows, or downstream procurement analysis.
- Track addenda and attachment links exposed on LaPAC listing pages.

### Input Options

- `keywords`: words or phrases to search in open solicitations.
- `keywordMode`: require all keywords or any keyword.
- `departmentIds`: LaPAC department IDs, such as `185` for St. Tammany Parish Government.
- `categoryIds`: UNSPSC segment/category IDs, such as `72000000`.
- `dateFrom` and `dateTo`: optional `MM/DD/YYYY` date range filters.
- `compareDateTo`: date field to compare, including open, cancel, issue, or last-change date.
- `maxItems`: maximum number of records to emit.
- `onlyNewSince`: ISO timestamp filter for incremental monitoring.
- `includeAttachments`: include or suppress attachment URLs.
- `includeClosedStatus`: compute closed/open status from open date versus scrape time.
- `maxFetches` and `minDelayMs`: request ceilings and polite pacing controls.

### Output Example

```json
{
  "source": "LaPAC",
  "bidNumber": "923456-26-36-2",
  "title": "Grapple Truck",
  "agency": "Non State - St. Tammany Parish Government",
  "departmentId": "185",
  "category": null,
  "issueDate": "2026-07-22",
  "openDate": "2026-08-05T14:00:00-05:00",
  "lastChangeDate": "2026-07-22",
  "status": "open",
  "mandatorySiteVisit": false,
  "attachments": [],
  "detailUrl": "https://wwwcfprd.doa.louisiana.gov/osp/lapac/dspBid.cfm?search=department&term=185#923456-26-36-2",
  "scrapedAt": "2026-07-25T19:40:21.513Z"
}
```

### Reliability Controls

- Uses public LaPAC endpoints only: `deptbids.cfm`, `catbids.cfm`, `srchopen.cfm`, and `dspBid.cfm`.
- Applies a configurable maximum item count.
- Applies a configurable maximum fetch count.
- Enforces a minimum request delay to avoid aggressive polling.
- Deduplicates records by bid number within a run.
- Emits run metrics for parsed, skipped, and emitted records.
- Returns an explicit warning when no records match after the fetch and parse path completes.

### FAQ

#### Is this an official Louisiana or LaPAC tool?

No. It is an independent scraper for public LaPAC pages.

#### Does it require a LaPAC login?

No. It only uses public LaPAC pages.

#### Does it download bid attachments?

It extracts attachment links when they are present and `includeAttachments` is enabled. It does not download attachment files by default.

#### Can I monitor only one agency or department?

Yes. Provide one or more LaPAC `departmentIds`.

#### Can I search by service category?

Yes. Provide one or more LaPAC/UNSPSC category segment IDs in `categoryIds`.

#### Can I run it on a schedule?

Yes. The Actor is suitable for scheduled monitoring. Use `onlyNewSince` or downstream deduplication if you only want newly changed opportunities.

#### What does `status` mean?

When `includeClosedStatus` is enabled, status is computed by comparing the open date to the scrape time. Otherwise, records from LaPAC open-list pages are reported as open.

#### Is the extracted data complete and correct?

No. The Actor has been validated against a labeled sample, and independent verification is still in progress.

#### What happens if LaPAC changes its page format?

The parser is built to fail loudly when expected bid tables disappear instead of silently emitting malformed records.

#### What should I verify before relying on a bid?

Confirm dates, requirements, attachments, addenda, and submission instructions on the linked LaPAC detail/source page before acting.

# Actor input Schema

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

Words or phrases to search in open solicitations.

## `keywordMode` (type: `string`):

Require all keywords or any keyword.

## `departmentIds` (type: `array`):

LaPAC department IDs, e.g. 185 for St. Tammany Parish Government.

## `categoryIds` (type: `array`):

UNSPSC segment/category IDs, e.g. 72000000.

## `dateFrom` (type: `string`):

Start date in MM/DD/YYYY. Leave empty for no lower bound.

## `dateTo` (type: `string`):

End date in MM/DD/YYYY. Leave empty for no upper bound.

## `compareDateTo` (type: `string`):

Which date field the date range compares against.

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

Hard cap on bid records emitted.

## `onlyNewSince` (type: `string`):

ISO timestamp. Filters records whose lastChangeDate/issueDate is not newer.

## `includeAttachments` (type: `boolean`):

Include attachment/document links in each bid record.

## `includeClosedStatus` (type: `boolean`):

When true, status is computed from bid open date versus scrape time; otherwise LaPAC open-list rows are reported as open.

## `maxFetches` (type: `integer`):

Hard ceiling on HTTP page fetches.

## `minDelayMs` (type: `integer`):

Polite delay between LaPAC page fetches. Values under 1000 are raised to 1000.

## Actor input object example

```json
{
  "keywords": [],
  "keywordMode": "all",
  "departmentIds": [
    "185"
  ],
  "categoryIds": [],
  "dateFrom": "",
  "dateTo": "",
  "compareDateTo": "openDate",
  "maxItems": 10,
  "onlyNewSince": "",
  "includeAttachments": true,
  "includeClosedStatus": true,
  "maxFetches": 20,
  "minDelayMs": 1200
}
```

# 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("slate_spool/lapac-bid-monitor").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("slate_spool/lapac-bid-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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 slate_spool/lapac-bid-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=slate_spool/lapac-bid-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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