# Federal Contract Recompete Watch (`critd/recompete-watch`) Actor

Review watched federal contracts against dated SAM.gov notices. See recorded dates, source links and gaps that help you decide what to check next.

- **URL**: https://apify.com/critd/recompete-watch.md
- **Developed by:** [Critical Distinction](https://apify.com/critd) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 contract review completeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Federal Contract Recompete Watch

**Keep your next contract move in sight.**

Bring the contracts you care about. Get a focused review of recorded dates and
related SAM notice evidence, with source links that make the next step clearer.
Spend your attention on what needs a closer look, not another pile of records.

Reviews use dated official data. A related notice is a research lead, not a
guarantee that a contract is open for competition.

[Try the demo](#demo) · [Review your contracts](#start-here) · [Pricing](#pricing) · [Help](#help)

### What you get

**A readable contract review, a CSV working list, and the evidence behind it.**
See relevant recorded dates, supported notice relationships and missing
information together. Each snapshot review shows the source edition and
coverage, so you know what was checked.

### Demo

Leave **Demo / award\_only** selected to explore three fictional contracts.
Start the run, then open **REPORT.html** from Output. The sample shows near,
later and missing completion dates without making source requests.

The demo has no custom review charge. Apify's automatic **$0.00005 per start**
still applies; check the displayed maximum cost before starting.

### Start here

1. Select **Review**, then **award\_and\_snapshot** for the dated SAM notice review.
2. Paste your watched contracts into **Contract CSV**, using the template below.
3. In **Dated snapshot scope**, choose the start/end posting dates. Leave the
   revision as **current**, then run and open **REPORT.html**.

```csv
customerId,awardUrl
example-official-award,https://www.usaspending.gov/award/CONT_AWD_H907_9700_SPE2DX16D1500_9700
```

This historical award illustrates the format; it is not a current opportunity
recommendation. Replace it with your contracts. Use the complete USAspending
award link, including its parent-award identity. Leave API-only notice controls
empty when using snapshot coverage.

Download **REVIEW.csv** for your working list. Output also links the structured
results. The Dataset is a convenience view, not the only result location.

### Pricing

**Base price: $0.01 per completed contract review.** Platform usage is included,
with Apify's automatic **$0.00005 per start** in addition. No Dataset-row surcharge.

| Apify plan | Price per completed review |
| --- | ---: |
| Free | $0.0100 |
| Bronze | $0.0090 |
| Silver | $0.0085 |
| Gold / Platinum / Diamond | $0.0080 |

A contract is charged once when its selected required coverage is complete,
not once per notice or passage. Duplicate inputs do not multiply the charge.
Results are saved before the custom charge; your run spending limit is respected.
Check [current pricing](https://apify.com/critd/recompete-watch/pricing) before
starting. An unknown charge outcome is not automatically retried.

### Know what was reviewed

SAM publishes active-notice extracts daily. We publish dated updates for this
Actor; they are not real-time. Check the report's source date and follow the
original notice for current deadlines or amendments.

The review covers the selected posting window and available source edition,
not a complete historical archive. Missing descriptions or unassigned notices
in that window prevent completed-review billing. A notice absent from a later
active file is not automatically a cancellation.

### Help

Ask about your watchlist or a result in the
[Issues tab](https://apify.com/critd/recompete-watch/issues). For a run problem,
include its run ID and what you expected. Use fictional examples in public
support rather than private watchlists, credentials or access links.

A stopped run may already have saved results or a charge. Inspect that run's
Output and charge information before starting another.

### Advanced reference

#### Input parameters

Provide up to 100 references through `contractsCsv` or advanced `contracts`,
not both. `lookAheadDays` defaults to 180. Current and potential completion
dates remain separate. `maxRequests` defaults to 60 and is capped at 100 across
sources. The API-mode simple date controls use two pages of ten notices and up
to twenty descriptions per organization; limits can leave incomplete coverage.
Advanced `noticeSearch` replaces the simple API date controls.

#### Dated snapshot coverage

Use `coverage: "award_and_snapshot"` and `snapshot.postedFrom`/`postedTo` as
inclusive YYYY-MM-DD dates within the supported window (at most 365 days).
Omit `revision` or use `current` to resolve the published edition once at run
start. A publication during your run does not change that selection.

The report records the exact revision. Advanced jobs may request a retained
64-character revision; retired revisions fail without silently advancing or
charging a completed review. Current/rollback revisions are retained, not every
old revision indefinitely. Operator-provided source access is used; no schedule
is created. Source publication, acquisition and coverage gaps remain explicit.

Authenticated SAM description retrieval remains a separate unqualified API-mode
capability. It is not needed for the accepted snapshot path. Award-only output
is a more limited research aid; demo uses fictional award-only evidence.

#### Output format and repeated reviews

`REPORT.html` is the review and `REVIEW.csv` the working queue. `OUTPUT` links
canonical JSON and files. Partial coverage is explicit. A failed Dataset append
does not remove the saved report.

Monitor uses a named history store and `state.scopeId`; `state.storeId` and an
optional `baselineSnapshotId` select retained comparisons. `CHANGES.json`/CSV
separates source, decision, clock and input changes. History is accepted for
90 days; missing or ambiguous history is disclosed. For hosted Monitor select
`historyStoreId`; any supplied `state.storeId` must match. This is not a schedule.

#### Evidence and privacy

An explicit reference names a contract within the same agency scope. It does
not establish an open solicitation. Preliminary, cancelled, inactive and
past-deadline notices keep their context. Dates alone do not prove a recompete,
termination or exercised option. There is no attachment or contact harvesting.
Requests are bounded without retries/redirects; source failures stay visible.

#### Permissions

Use permitted business data and suitable storage/sharing settings. Limited
permissions apply; selected history stores need the stated read/write access.
Keep credentials, unrelated personal identifiers and payment data out of input.
Only selected evidence is retained, not raw upstream error bodies or unselected
fields. The charge event remains `contract-review-completed`.

See the bundled changelog for implementation history.

# Changelog

This Actor's version history is a separate document: https://apify.com/critd/recompete-watch/changelog.md

# Actor input Schema

## `mode` (type: `string`):

Use Demo for fictional examples, or select review/monitor for your supplied input. qualify\_sam is an owner-only deployment diagnostic; customer runs cannot use it.

## `coverage` (type: `string`):

Select award\_and\_snapshot to compare watched contracts with our latest published official SAM snapshot. The report shows the source date, inspected coverage and any gaps. Updates are operator-published, not real-time. Snapshot mode requires operator-provisioned private source access. Authenticated SAM API mode remains separate. Demo uses award\_only.

## `contracts` (type: `array`):

Contracts supplied for this review.

## `contractsCsv` (type: `string`):

Contracts csv supplied for this review.

## `lookAheadDays` (type: `integer`):

Look ahead days supplied for this review.

## `maxRequests` (type: `integer`):

Max requests supplied for this review.

## `state` (type: `object`):

Monitor scope and optional exact baseline. Select the history store in historyStoreId for hosted runs.

## `noticeSearch` (type: `object`):

Notice search supplied for this review.

## `noticePostedFrom` (type: `string`):

YYYY-MM-DD. Defaults to seven days before the end date.

## `noticePostedTo` (type: `string`):

YYYY-MM-DD. Defaults to today. Choose award\_and\_notices; leave advanced noticeSearch empty.

## `historyStoreId` (type: `string`):

For monitor runs, select the history key-value store here and set state.scopeId. If state.storeId is also supplied, it must match.

## `samQualification` (type: `object`):

For the authorized owner in qualify\_sam mode only: a public notice ID, SAM organization code and exact posting date. Uses at most three requests for lookup, description and refresh; does not repeat or claim pagination qualification. Never supply a key or URL.

## `snapshot` (type: `object`):

Posting dates select the snapshot scope. Omit revision (or use current) to resolve our latest published revision once per run. Exact retained revisions are optional for reproducibility; retired revisions fail without silently advancing. Source dates and gaps appear with results.

## Actor input object example

```json
{
  "mode": "demo",
  "coverage": "award_only",
  "lookAheadDays": 180,
  "maxRequests": 60
}
```

# Actor output Schema

## `report` (type: `string`):

No description

## `review` (type: `string`):

No description

## `output` (type: `string`):

No description

# 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("critd/recompete-watch").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("critd/recompete-watch").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 '{}' |
apify call critd/recompete-watch --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,critd/recompete-watch"
        }
    }
}
```

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/nUJPRSACe94gTwroB/builds/iVwhYYgySJLogOQM6/openapi.json
