# Government Contract Award Monitor | Award & Competitor Watch (`taroyamada/government-contract-award-monitor`) Actor

Monitor public-sector contract award notices for new wins, notable awardees, incumbent recompetes, and competitor signals — one digest row per configured feed without brittle broad crawling.

- **URL**: https://apify.com/taroyamada/government-contract-award-monitor.md
- **Developed by:** [太郎 山田](https://apify.com/taroyamada) (community)
- **Categories:** Business, News, Automation
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Government Contract Award Monitor | Award & Competitor Watch

Monitor public-sector contract award notices for new wins, notable awardees, incumbent recompetes, and competitor signals — one digest row per configured feed without brittle broad crawling.

### Store Quickstart

What first success looks like:

### Key Features

- 🏛️ **Government-sourced** — Pulls directly from official agency feeds — no third-party aggregators
- ⏱️ **Timely digests** — Daily/weekly rollups of new filings, rulings, or actions
- 🔍 **Keyword watchlists** — Flag items matching your compliance/legal watch terms
- 📊 **Structured metadata** — Agency, date, docket, document type, link — all dataset-ready
- 📡 **Webhook alerts** — Push to legal/compliance teams the moment new items match watchlist

### Use Cases

| Who | Why |
|-----|-----|
| Developers | Automate recurring data fetches without building custom scrapers |
| Data teams | Pipe structured output into analytics warehouses |
| Ops teams | Monitor changes via webhook alerts |
| Product managers | Track competitor/market signals without engineering time |

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| feeds | array | **required** | One entry per watch target. Each feed produces one digest row in the output. At minimum, set id, name, and source. Add k |
| watchTerms | string | — | Company names, incumbents, or competitor terms to flag in award notices. Any award matching a watch term receives a watc |
| lookbackDays | integer | `14` | Fetch award notices published within this many days. Keep it short (7–30) for recurring runs to stay fast; widen it for  |
| maxAwardsPerFeed | integer | `50` | Upper bound on awards fetched per feed per run. Increase for discovery runs; keep lower for recurring digest runs. |
| minValue | number | `0` | Skip awards below this value. Applied globally unless overridden per feed. Set 0 to include all. |
| delivery | string | `"dataset"` | dataset stores results in the Apify dataset. webhook posts the digest JSON to webhookUrl. |
| webhookUrl | string | — | POST target for award digest payload. Leave empty for dataset delivery. |
| datasetMode | string | `"all"` | all emits every feed digest row. action_needed emits only feeds that have new awards or watch-term hits. new_only emits  |

#### Input Example

```json
{
  "lookbackDays": 14,
  "maxAwardsPerFeed": 50,
  "minValue": 0,
  "delivery": "dataset",
  "datasetMode": "all",
  "snapshotKey": "contract-award-monitor-state",
  "samApiUrl": "https://api.sam.gov/opportunities/v2/search",
  "tedApiUrl": "https://api.ted.europa.eu/v3/notices/search",
  "usaSpendingApiUrl": "https://api.usaspending.gov/api/v2/search/spending_by_award/",
  "requestTimeoutSeconds": 30,
  "notifyOnNoNew": true,
  "dryRun": false
}
````

### Output

| Field | Type | Description |
|-------|------|-------------|
| `meta` | object |  |
| `errors` | array |  |
| `digests` | array |  |
| `digests[].feedId` | string |  |
| `digests[].feedName` | string |  |
| `digests[].source` | string |  |
| `digests[].checkedAt` | timestamp |  |
| `digests[].status` | string |  |
| `digests[].newAwardCount` | number |  |
| `digests[].totalAwardCount` | number |  |
| `digests[].totalValue` | number |  |
| `digests[].currency` | string |  |
| `digests[].changedSinceLastRun` | boolean |  |
| `digests[].actionNeeded` | boolean |  |
| `digests[].recommendedAction` | string |  |
| `digests[].topAwardees` | array |  |
| `digests[].watchTermHits` | array |  |
| `digests[].signalTags` | array |  |
| `digests[].awards` | array |  |
| `digests[].error` | null |  |

#### Output Example

```json
{
  "meta": {
    "generatedAt": "2026-04-15T09:00:00.000Z",
    "now": "2026-04-15T09:00:00.000Z",
    "lookbackDays": 14,
    "feedCount": 2,
    "totalAwards": 6,
    "newAwards": 4,
    "watchTermHitCount": 2,
    "actionNeededCount": 1,
    "sourceCounts": {
      "ted_awards": 1,
      "usaspending": 1
    },
    "snapshot": {
      "key": "contract-award-monitor-sample",
      "loadedFrom": "local",
      "savedTo": "local"
    },
    "warnings": [],
    "executiveSummary": {
      "overallStatus": "action_needed",
      "brief": "1 feed(s) have competitor/incumbent watch-term hits requiring review.",
      "topAwardees": [
        {
          "name": "Accenture Federal Services",
          "awardCount": 2,
          "totalValue": 8500000,
          "isWatchTermHit": true
        },
        {
          "name": "Devoteam",
          "awardCount": 2,
          "totalValue": 3200000,
          "isWatchTermHit": false
        },
        {
          "name": "Leidos",
          "awardCount": 1,
          "totalValue": 12000000,
```

### API Usage

Run this actor programmatically using the Apify API. Replace `YOUR_API_TOKEN` with your token from [Apify Console → Settings → Integrations](https://console.apify.com/account/integrations).

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/taroyamada~government-contract-award-monitor/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "lookbackDays": 14, "maxAwardsPerFeed": 50, "minValue": 0, "delivery": "dataset", "datasetMode": "all", "snapshotKey": "contract-award-monitor-state", "samApiUrl": "https://api.sam.gov/opportunities/v2/search", "tedApiUrl": "https://api.ted.europa.eu/v3/notices/search", "usaSpendingApiUrl": "https://api.usaspending.gov/api/v2/search/spending_by_award/", "requestTimeoutSeconds": 30, "notifyOnNoNew": true, "dryRun": false }'
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("taroyamada/government-contract-award-monitor").call(run_input={
  "lookbackDays": 14,
  "maxAwardsPerFeed": 50,
  "minValue": 0,
  "delivery": "dataset",
  "datasetMode": "all",
  "snapshotKey": "contract-award-monitor-state",
  "samApiUrl": "https://api.sam.gov/opportunities/v2/search",
  "tedApiUrl": "https://api.ted.europa.eu/v3/notices/search",
  "usaSpendingApiUrl": "https://api.usaspending.gov/api/v2/search/spending_by_award/",
  "requestTimeoutSeconds": 30,
  "notifyOnNoNew": true,
  "dryRun": false
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

#### JavaScript / Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('taroyamada/government-contract-award-monitor').call({
  "lookbackDays": 14,
  "maxAwardsPerFeed": 50,
  "minValue": 0,
  "delivery": "dataset",
  "datasetMode": "all",
  "snapshotKey": "contract-award-monitor-state",
  "samApiUrl": "https://api.sam.gov/opportunities/v2/search",
  "tedApiUrl": "https://api.ted.europa.eu/v3/notices/search",
  "usaSpendingApiUrl": "https://api.usaspending.gov/api/v2/search/spending_by_award/",
  "requestTimeoutSeconds": 30,
  "notifyOnNoNew": true,
  "dryRun": false
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Tips & Limitations

- Run daily for active watchlists; weekly for passive monitoring.
- Webhook delivery works well for compliance team Slack channels — include docket URL for 1-click access.
- Use `watchKeywords` generously — false positives are cheap to triage, false negatives miss filings.
- Pair with `regulatory-change-monitor` for cross-agency coverage.
- Archive Dataset rows weekly for long-term compliance evidence retention.

### FAQ

**How far back does history go?**

This actor monitors forward-only — new items since first run. For historical data, use the agency's own search tool.

**What timezones are used?**

All timestamps are UTC. Use your downstream pipeline to convert to agency-local time if needed.

**Does it translate non-English content?**

No — original language is preserved. Use downstream translation services if needed.

**Is the data official?**

Yes — sourced directly from official government websites and feeds. Not a third-party aggregator.

**Can I use this for legal research?**

For alerting and monitoring, yes. For litigation research, cross-verify with primary sources (agency websites) — this actor is a monitoring tool, not a legal database.

### Related Actors

Government & Regulatory cluster — explore related Apify tools:

- [EPA Enforcement Digest | ECHO Compliance Risk Monitor](https://apify.com/taroyamada/epa-enforcement-digest) — Monitor EPA ECHO all-media facility search, corporate compliance screener, and enforcement case feeds with one summary-first digest row per watched company, facility, or case feed.
- [FDA Warning Letters Digest | Summary-First Feed](https://apify.com/taroyamada/fda-warning-letter-digest) — Monitor public FDA warning letters with one summary-first digest row per configured feed.
- [Federal Register Digest | Agency Rule & Notice Monitor](https://apify.com/taroyamada/federal-register-digest) — Monitor Federal Register documents — rules, proposed rules, and notices — per configured agency feed.
- [Grants.gov Funding Digest | Opportunity Watch & Signal Digest](https://apify.com/taroyamada/grants-gov-funding-digest) — Monitor Grants.
- [NHTSA Vehicle Recall Digest | Recalls + Complaints Watch](https://apify.com/taroyamada/nhtsa-vehicle-recall-digest) — Monitor official NHTSA vehicle recall and complaint endpoints for watched model-family, VIN, and manufacturer feeds.
- [Product Safety Recall Digest | CPSC + openFDA Alerts](https://apify.com/taroyamada/product-safety-recall-digest) — Monitor CPSC saferproducts.
- [Regulatory Change Monitor API](https://apify.com/taroyamada/regulatory-change-monitor) — Monitor official regulator update feeds, government bulletin pages, and public compliance notices with one action-oriented digest row per monitored source.
- [OFAC Sanctions Change Digest | SDN List Monitor](https://apify.com/taroyamada/sanctions-change-digest) — Monitor the OFAC SDN (Specially Designated Nationals) sanctions list for additions and removals.
- [Tariff Trade Change Digest | Federal Register + HTS Monitor](https://apify.com/taroyamada/tariff-trade-change-digest) — Monitor U.
- [Treasury Fiscal Data Digest | Debt, Rates & Budget Monitor](https://apify.com/taroyamada/treasury-fiscal-data-digest) — Monitor the U.
- [USPTO Patent Monitor API | JSON + Webhook](https://apify.com/taroyamada/uspto-patent-scraper) — Search and monitor US patent filings with multi-source fallback.
- [Campaign Finance & Lobbying Digest | FEC + LDA Watch](https://apify.com/taroyamada/campaign-finance-lobbying-digest) — Monitor official FEC OpenFEC committee reports and LDA.

### Cost

**Pay Per Event**:

- `actor-start`: $0.01 (flat fee per run)
- `dataset-item`: $0.003 per output item

**Example**: 1,000 items = $0.01 + (1,000 × $0.003) = **$3.01**

No subscription required — you only pay for what you use.

# Actor input Schema

## `feeds` (type: `array`):

One entry per watch target. Each feed produces one digest row in the output. At minimum, set id, name, and source. Add keywords, cpvCodes, naicsCodes, or agencyName to narrow the award stream.

## `watchTerms` (type: `string`):

Company names, incumbents, or competitor terms to flag in award notices. Any award matching a watch term receives a watch\_term\_hit signal tag and appears in the digest's competitorSignals section.

## `lookbackDays` (type: `integer`):

Fetch award notices published within this many days. Keep it short (7–30) for recurring runs to stay fast; widen it for initial discovery.

## `maxAwardsPerFeed` (type: `integer`):

Upper bound on awards fetched per feed per run. Increase for discovery runs; keep lower for recurring digest runs.

## `minValue` (type: `number`):

Skip awards below this value. Applied globally unless overridden per feed. Set 0 to include all.

## `delivery` (type: `string`):

dataset stores results in the Apify dataset. webhook posts the digest JSON to webhookUrl.

## `webhookUrl` (type: `string`):

POST target for award digest payload. Leave empty for dataset delivery.

## `datasetMode` (type: `string`):

all emits every feed digest row. action\_needed emits only feeds that have new awards or watch-term hits. new\_only emits only feeds with awards not seen in the previous run.

## `snapshotKey` (type: `string`):

Stable key used to persist seen award IDs across recurring runs so new\_only and action\_needed modes stay comparable. Use the same key across scheduled runs.

## `samApiKey` (type: `string`):

SAM.gov API key from Account Details on sam.gov. Required for sam\_awards source feeds. If missing, sam\_awards feeds are skipped with a warning.

## `samApiUrl` (type: `string`):

SAM.gov opportunities search endpoint used for award-type records.

## `tedApiUrl` (type: `string`):

TED notices search endpoint. No API key required.

## `usaSpendingApiUrl` (type: `string`):

USASpending.gov awards search endpoint. No API key required.

## `requestTimeoutSeconds` (type: `integer`):

Timeout for each API request.

## `notifyOnNoNew` (type: `boolean`):

When true, every feed always produces a digest row even if no new awards were found. When false, feeds with no new awards are omitted from the output.

## `dryRun` (type: `boolean`):

Validate and fetch without persisting state or posting webhooks. Safe for testing input shapes.

## `nowIso` (type: `string`):

Set to a fixed ISO timestamp to make runs deterministic against fixture data.

## `tedFixturePath` (type: `string`):

Local JSON fixture for offline TED award tests.

## `samFixturePath` (type: `string`):

Local JSON fixture for offline SAM award tests.

## `usaSpendingFixturePath` (type: `string`):

Local JSON fixture for offline USASpending tests.

## Actor input object example

```json
{
  "lookbackDays": 14,
  "maxAwardsPerFeed": 50,
  "minValue": 0,
  "delivery": "dataset",
  "datasetMode": "all",
  "snapshotKey": "contract-award-monitor-state",
  "samApiUrl": "https://api.sam.gov/opportunities/v2/search",
  "tedApiUrl": "https://api.ted.europa.eu/v3/notices/search",
  "usaSpendingApiUrl": "https://api.usaspending.gov/api/v2/search/spending_by_award/",
  "requestTimeoutSeconds": 30,
  "notifyOnNoNew": true,
  "dryRun": false
}
```

# 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("taroyamada/government-contract-award-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("taroyamada/government-contract-award-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 taroyamada/government-contract-award-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Government Contract Award Monitor | Award & Competitor Watch",
        "description": "Monitor public-sector contract award notices for new wins, notable awardees, incumbent recompetes, and competitor signals — one digest row per configured feed without brittle broad crawling.",
        "version": "0.1",
        "x-build-id": "aPsb4ZjjcbgO8cjsB"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/taroyamada~government-contract-award-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-taroyamada-government-contract-award-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/taroyamada~government-contract-award-monitor/runs": {
            "post": {
                "operationId": "runs-sync-taroyamada-government-contract-award-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/taroyamada~government-contract-award-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-taroyamada-government-contract-award-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "feeds"
                ],
                "properties": {
                    "feeds": {
                        "title": "Award feeds to monitor (required)",
                        "type": "array",
                        "description": "One entry per watch target. Each feed produces one digest row in the output. At minimum, set id, name, and source. Add keywords, cpvCodes, naicsCodes, or agencyName to narrow the award stream.",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "title": "Feed ID",
                                    "description": "Stable identifier used in snapshots and output rows.",
                                    "type": "string"
                                },
                                "name": {
                                    "title": "Feed name",
                                    "description": "Human-readable label for this feed in the digest output.",
                                    "type": "string"
                                },
                                "source": {
                                    "title": "Feed source",
                                    "description": "Award source to query for this feed.",
                                    "type": "string",
                                    "enum": [
                                        "ted_awards",
                                        "sam_awards",
                                        "usaspending"
                                    ]
                                },
                                "keywords": {
                                    "title": "Keywords",
                                    "description": "Comma-separated title or description terms used to narrow award notices.",
                                    "type": "string"
                                },
                                "cpvCodes": {
                                    "title": "CPV codes",
                                    "description": "Comma-separated CPV codes for TED award filtering.",
                                    "type": "string"
                                },
                                "naicsCodes": {
                                    "title": "NAICS codes",
                                    "description": "Comma-separated NAICS codes for US award filtering.",
                                    "type": "string"
                                },
                                "agencyName": {
                                    "title": "Agency name",
                                    "description": "Agency or buyer name filter for feed-specific targeting.",
                                    "type": "string"
                                },
                                "buyerCountry": {
                                    "title": "Buyer country",
                                    "description": "Two-letter buyer country filter for TED award feeds.",
                                    "type": "string"
                                },
                                "minValue": {
                                    "title": "Minimum award value",
                                    "description": "Feed-specific minimum award value override.",
                                    "type": "number"
                                }
                            }
                        }
                    },
                    "watchTerms": {
                        "title": "Watch terms — awardee / competitor / incumbent names (comma-separated)",
                        "type": "string",
                        "description": "Company names, incumbents, or competitor terms to flag in award notices. Any award matching a watch term receives a watch_term_hit signal tag and appears in the digest's competitorSignals section."
                    },
                    "lookbackDays": {
                        "title": "Award lookback window (days)",
                        "minimum": 1,
                        "maximum": 365,
                        "type": "integer",
                        "description": "Fetch award notices published within this many days. Keep it short (7–30) for recurring runs to stay fast; widen it for initial discovery.",
                        "default": 14
                    },
                    "maxAwardsPerFeed": {
                        "title": "Max awards per feed",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Upper bound on awards fetched per feed per run. Increase for discovery runs; keep lower for recurring digest runs.",
                        "default": 50
                    },
                    "minValue": {
                        "title": "Global minimum award value (currency units)",
                        "minimum": 0,
                        "type": "number",
                        "description": "Skip awards below this value. Applied globally unless overridden per feed. Set 0 to include all.",
                        "default": 0
                    },
                    "delivery": {
                        "title": "Delivery mode",
                        "enum": [
                            "dataset",
                            "webhook"
                        ],
                        "type": "string",
                        "description": "dataset stores results in the Apify dataset. webhook posts the digest JSON to webhookUrl.",
                        "default": "dataset"
                    },
                    "webhookUrl": {
                        "title": "Webhook URL (required when delivery=webhook)",
                        "type": "string",
                        "description": "POST target for award digest payload. Leave empty for dataset delivery."
                    },
                    "datasetMode": {
                        "title": "Dataset output mode",
                        "enum": [
                            "all",
                            "action_needed",
                            "new_only"
                        ],
                        "type": "string",
                        "description": "all emits every feed digest row. action_needed emits only feeds that have new awards or watch-term hits. new_only emits only feeds with awards not seen in the previous run.",
                        "default": "all"
                    },
                    "snapshotKey": {
                        "title": "Snapshot key for recurring state",
                        "type": "string",
                        "description": "Stable key used to persist seen award IDs across recurring runs so new_only and action_needed modes stay comparable. Use the same key across scheduled runs.",
                        "default": "contract-award-monitor-state"
                    },
                    "samApiKey": {
                        "title": "SAM.gov API key (required for sam_awards feeds)",
                        "type": "string",
                        "description": "SAM.gov API key from Account Details on sam.gov. Required for sam_awards source feeds. If missing, sam_awards feeds are skipped with a warning."
                    },
                    "samApiUrl": {
                        "title": "SAM.gov opportunities API URL",
                        "type": "string",
                        "description": "SAM.gov opportunities search endpoint used for award-type records.",
                        "default": "https://api.sam.gov/opportunities/v2/search"
                    },
                    "tedApiUrl": {
                        "title": "TED API URL (ted_awards feeds)",
                        "type": "string",
                        "description": "TED notices search endpoint. No API key required.",
                        "default": "https://api.ted.europa.eu/v3/notices/search"
                    },
                    "usaSpendingApiUrl": {
                        "title": "USASpending.gov API URL (usaspending feeds)",
                        "type": "string",
                        "description": "USASpending.gov awards search endpoint. No API key required.",
                        "default": "https://api.usaspending.gov/api/v2/search/spending_by_award/"
                    },
                    "requestTimeoutSeconds": {
                        "title": "HTTP request timeout (seconds)",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Timeout for each API request.",
                        "default": 30
                    },
                    "notifyOnNoNew": {
                        "title": "Emit digest even when no new awards found",
                        "type": "boolean",
                        "description": "When true, every feed always produces a digest row even if no new awards were found. When false, feeds with no new awards are omitted from the output.",
                        "default": true
                    },
                    "dryRun": {
                        "title": "Dry run (skip snapshot writes and webhook delivery)",
                        "type": "boolean",
                        "description": "Validate and fetch without persisting state or posting webhooks. Safe for testing input shapes.",
                        "default": false
                    },
                    "nowIso": {
                        "title": "Override current time (ISO string, for testing)",
                        "type": "string",
                        "description": "Set to a fixed ISO timestamp to make runs deterministic against fixture data."
                    },
                    "tedFixturePath": {
                        "title": "TED fixture file path (testing)",
                        "type": "string",
                        "description": "Local JSON fixture for offline TED award tests."
                    },
                    "samFixturePath": {
                        "title": "SAM fixture file path (testing)",
                        "type": "string",
                        "description": "Local JSON fixture for offline SAM award tests."
                    },
                    "usaSpendingFixturePath": {
                        "title": "USASpending fixture file path (testing)",
                        "type": "string",
                        "description": "Local JSON fixture for offline USASpending tests."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
