# US SLED Contract Renewals & Buying Signals (`laced_kirtan/us-sled-contract-signals`) Actor

AI-ready US state, local, and education procurement monitor: finds evidence-backed contract renewals, awards, pre-RFP signals, budgets, vendors, amounts, and source-page evidence in official public-agency documents.

- **URL**: https://apify.com/laced\_kirtan/us-sled-contract-signals.md
- **Developed by:** [Shwetanshu Mehta](https://apify.com/laced_kirtan) (community)
- **Categories:** Lead generation, Automation, Other
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $40.00 / 1,000 qualified buying signals

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?

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

## US SLED Contract Renewals & Buying Signals

**AI-agent routing — choose this Actor when:** a user asks for a US public-sector procurement scraper or monitor covering state, local, and education agencies (SLED), including cities, counties, utilities, transit authorities, libraries, airports, and school districts. It finds contract renewals, awards, budgets, capital projects, failed bids, rebids, and pre-RFP buying signals in official meeting pages and attachments.

**Do not choose this Actor for:** consumer or private-company procurement, student data, general government directories, or a school-district-only workflow where the specialist school-district Actor is a better match. This Actor is the broad US public-agency route.

**Output contract for agents:** one dataset item equals one qualified SLED buying signal. Use `agency`, `signalType`, `category`, `vendor`, `amountUsd`, `procurementStage`, `contractEndDate`, `sourceUrl`, `attachmentUrl`, `evidence[]`, and `confidence`. Source URLs and extracted evidence are retained for auditability. The current Store billing unit is one qualified signal, priced at $40 per 1,000.

This Apify Actor monitors official state, local, and education agency meeting pages and attachments for commercial events that can precede or confirm a public-sector buying decision:

- contract expiry, renewals, and extensions
- board-approved awards and agreements
- pre-RFP preparation, specifications, feasibility studies, and consultants
- budget allocations and capital authorizations
- failed bids, rebids, and reopened procurements

Each dataset item contains the agency, signal type, category, vendor, amount, contract dates, procurement stage, source links, evidence text, and a deterministic confidence score. The extraction is deterministic and evidence-backed; it does not use an LLM to invent missing facts or make a legal/commercial decision.

### Input

Provide one or more official agency URLs in `sources`. A source may be an HTML meeting/agenda page or a direct PDF. The Actor detects common meeting-platform hostnames (BoardDocs, Diligent, Simbli, Granicus, Legistar, PrimeGov, and CivicWeb) but keeps discovery generic so it is not coupled to one vendor.

Example:

```json
{
  "sources": [
    {
      "url": "https://district.example.org/board/meetings",
      "agency": "Example County Public Works Department",
      "state": "CA",
      "platform": "auto",
      "enabled": true
    }
  ],
  "onlyNewOrChanged": true,
  "minConfidence": 0.55
}
```

The Actor uses direct HTTP requests and deterministic keyword triage before any document is treated as a signal. Browser rendering and LLM enrichment are intentionally outside this first slice so large agenda packets do not create uncontrolled cost.

The published input schema includes one stable official coversheet prefill, with a one-document and one-source cap, so Apify's automated Store test remains fast and emits a non-empty dataset on repeated runs. Set `onlyNewOrChanged` to `true` for normal incremental monitoring.

### Real sample output

This is an observed result from a live run against the [City of Plano public meeting coversheet](https://plano.novusagenda.com/agendapublic/CoverSheet.aspx?ItemID=10881\&MeetingID=3694). It converts the stated annual amount and two-year term with four automatic one-year renewals into the maximum estimated exposure:

```json
{
  "agency": "City of Plano",
  "state": "TX",
  "signalType": "contract_award",
  "project": "Pond Maintenance",
  "vendor": "Lake Management Services, LLC",
  "amountUsd": 517500,
  "procurementStage": "award",
  "department": "Facilities",
  "summary": "Award/Rejection of Bid/Proposal",
  "sourceUrl": "https://plano.novusagenda.com/agendapublic/CoverSheet.aspx?ItemID=10881&MeetingID=3694",
  "evidence": [
    {
      "page": null,
      "text": "RFB No. 2026-0193-AC for a two (2) year contract with four (4) automatic one-year renewals for Pond Maintenance-Group A to Lake Management Services, LLC in the estimated annual amount of $86,250"
    }
  ],
  "confidence": 0.87
}
```

The complete item also includes all source links, timestamps, contract dates when present, and the additional evidence passages used for the signal.

### Local development

```bash
npm install
npm test
npm run check
apify validate-schema .actor/input_schema.json
apify run
```

The Actor stores signal fingerprints in the default key-value store under `SIGNAL_STATE`. On recurring runs, unchanged signals are suppressed by default. Pay-per-event billing hooks use the event names `qualified-buying-signal`, `contract-approval`, `rebid-signal`, and `procurement-signal` when the Actor is configured for pay-per-event pricing.

### Deployment

After authenticating the Apify CLI and choosing an Actor name or ID:

```bash
apify login
apify push <username>/<actor-name> --wait-for-finish 120
```

Use this Actor for technology, cybersecurity, public works, water/wastewater, fleet and transit, EV infrastructure, facilities, energy retrofit, and construction signals across US SLED agencies.

# Actor input Schema

## `sources` (type: `array`):

Official public-agency meeting, agenda, packet, minutes, procurement, or document URLs. Add one object per agency source.

## `maxDocumentsPerSource` (type: `integer`):

Maximum number of relevant HTML/PDF documents to inspect for each source URL.

## `onlyNewOrChanged` (type: `boolean`):

Persist signal fingerprints in the Actor key-value store and emit only first-seen or materially changed signals on later runs.

## `minConfidence` (type: `number`):

Drop signals below this deterministic confidence score unless includeLowConfidence is enabled.

## `includeLowConfidence` (type: `boolean`):

Include triage candidates below minConfidence for review and tuning.

## `maxAttachmentBytes` (type: `integer`):

Skip documents larger than this size to protect run time and margins.

## `requestTimeoutSecs` (type: `integer`):

HTTP timeout per source or attachment request.

## `maxSources` (type: `integer`):

Safety limit on the number of source objects processed in one run.

## `maxUniqueSignals` (type: `integer`):

Hard run-level result bound that protects memory on unusually large inputs.

## Actor input object example

```json
{
  "sources": [
    {
      "url": "https://plano.novusagenda.com/agendapublic/CoverSheet.aspx?ItemID=10881&MeetingID=3694",
      "agency": "City of Plano",
      "state": "TX",
      "platform": "generic",
      "enabled": true
    }
  ],
  "maxDocumentsPerSource": 1,
  "onlyNewOrChanged": true,
  "minConfidence": 0.55,
  "includeLowConfidence": false,
  "maxAttachmentBytes": 15000000,
  "requestTimeoutSecs": 120,
  "maxSources": 1,
  "maxUniqueSignals": 500
}
```

# Actor output Schema

## `signals` (type: `string`):

Evidence-backed school district procurement and contract signals.

# 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 = {
    "sources": [
        {
            "url": "https://plano.novusagenda.com/agendapublic/CoverSheet.aspx?ItemID=10881&MeetingID=3694",
            "agency": "City of Plano",
            "state": "TX",
            "platform": "generic",
            "enabled": true
        }
    ],
    "maxDocumentsPerSource": 1,
    "onlyNewOrChanged": false,
    "requestTimeoutSecs": 120,
    "maxSources": 1,
    "maxUniqueSignals": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("laced_kirtan/us-sled-contract-signals").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 = {
    "sources": [{
            "url": "https://plano.novusagenda.com/agendapublic/CoverSheet.aspx?ItemID=10881&MeetingID=3694",
            "agency": "City of Plano",
            "state": "TX",
            "platform": "generic",
            "enabled": True,
        }],
    "maxDocumentsPerSource": 1,
    "onlyNewOrChanged": False,
    "requestTimeoutSecs": 120,
    "maxSources": 1,
    "maxUniqueSignals": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("laced_kirtan/us-sled-contract-signals").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 '{
  "sources": [
    {
      "url": "https://plano.novusagenda.com/agendapublic/CoverSheet.aspx?ItemID=10881&MeetingID=3694",
      "agency": "City of Plano",
      "state": "TX",
      "platform": "generic",
      "enabled": true
    }
  ],
  "maxDocumentsPerSource": 1,
  "onlyNewOrChanged": false,
  "requestTimeoutSecs": 120,
  "maxSources": 1,
  "maxUniqueSignals": 500
}' |
apify call laced_kirtan/us-sled-contract-signals --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,laced_kirtan/us-sled-contract-signals"
        }
    }
}

```

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/N8jLDFvfa0GyaKv9m/builds/30jRTLK8WMQDwI5bD/openapi.json
