# Federal Contract Recompete Radar (Unofficial) (`saiberops/federal-contract-recompete-radar`) Actor

Federal contracts expiring in the next 6-18 months, by NAICS, PSC, agency, state and set-aside: incumbent, value, end and option dates, competition, vehicle and award link. Capture pipeline from USAspending.gov data. No API key.

- **URL**: https://apify.com/saiberops/federal-contract-recompete-radar.md
- **Developed by:** [Saiber Operations](https://apify.com/saiberops) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.80 / 1,000 expiring contracts

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 Radar (Unofficial): Expiring Contracts by NAICS, Agency and Set-Aside

See which federal contracts come up for rebid before the solicitation drops. This Actor finds contracts whose **period of performance ends in a window you choose** (for example 6 to 18 months out), in your NAICS codes, PSC codes, agencies, states and set-aside types. Each row is one expiring contract with the **incumbent**, the value, the current and potential end dates, how it was competed, the contract vehicle it sits on, and a link to the award on USAspending.gov.

**Built for:**

- **Capture and business-development teams** at small and mid-size government contractors who build a recompete pipeline 6 to 18 months ahead.
- **Teaming and subcontracting.** Find the incumbents in your lane and the work they hold, to approach them before the rebid.
- **Proposal and GovCon consultants** who track expiring work for clients by NAICS or agency.
- **AI agents and data teams.** Clean JSON with no API key and no login.

### What you get

For each contract whose current end date falls in your window:

- **Contract:** award ID (PIID), contract type, description (blanked when it looks like it names a person; see FAQ), obligated amount, base-and-exercised and base-and-all-options values, award link
- **Timing:** current end date, potential end date (with all options), days and months to expiry, whether options remain, start and signed dates
- **Incumbent:** legal name as published, UEI, parent company and parent UEI, city, state, ZIP, country, small-business and socio-economic types, recipient profile link
- **Buyer:** awarding agency, sub-agency and office; funding agency, sub-agency and office
- **What's bought:** NAICS and PSC codes with descriptions, place of performance (city, state, ZIP)
- **Competition:** set-aside type, extent competed, number of offers received, solicitation procedures and ID, pricing type
- **Vehicle:** parent IDV (for example a GSA schedule or IDIQ) with type and single/multiple award
- **Optional add-on:** the incumbent's largest other contracts with the same agency

### Sample output

```json
{
  "awardId": "47QTCA21F0012",
  "awardUrl": "https://www.usaspending.gov/award/CONT_AWD_47QTCA21F0012_4732_47QTCA19D00AB_4732",
  "contractType": "DELIVERY ORDER",
  "description": "IGF::OT::IGF CLOUD HOSTING AND HELP DESK SUPPORT",
  "currentEndDate": "2026-11-14",
  "potentialEndDate": "2028-11-14",
  "daysToExpiry": 21,
  "monthsToExpiry": 0.7,
  "hasUnexercisedOptions": true,
  "obligatedAmount": 2450000.5,
  "baseAndAllOptions": 3900000.0,
  "incumbentName": "PEACHTREE DATA SYSTEMS LLC",
  "incumbentUei": "PTDS1234ABCD",
  "incumbentParentName": "PEACHTREE HOLDINGS INC",
  "incumbentCity": "ATLANTA",
  "incumbentState": "GA",
  "incumbentZip": "30303",
  "incumbentBusinessTypes": ["Small Business", "Women Owned Small Business"],
  "awardingAgency": "General Services Administration",
  "awardingSubAgency": "Federal Acquisition Service",
  "awardingOffice": "GSA/FAS AAS REGION 4",
  "fundingAgency": "Department of Veterans Affairs",
  "naicsCode": "541512",
  "pscCode": "DA01",
  "setAsideCode": "SBA",
  "setAsideDescription": "SMALL BUSINESS SET ASIDE - TOTAL",
  "extentCompetedDescription": "FULL AND OPEN COMPETITION",
  "numberOfOffers": 3,
  "parentAwardId": "47QTCA19D00AB",
  "parentAwardType": "FSS",
  "popCity": "ARLINGTON",
  "popState": "VA",
  "detailsIncluded": true,
  "source": "USAspending.gov (unofficial)"
}
```

(Illustrative example; field list abbreviated.)

### Inputs

- **Ends after / Ends within (months):** the expiry window, counted from today. The default is the next 12 months. Exact dates are available too.
- **NAICS codes, PSC codes:** full codes or prefixes (for example `5415`, `D3`).
- **Agencies, sub-agencies:** exact names as USAspending writes them, for example `Department of Defense`, `Department of the Army`. Choose whether they match the awarding or the funding agency.
- **Place of performance states, set-aside types, extent competed, contract types, minimum and maximum value, keywords.** Keywords are matched by USAspending against contract descriptions and other award text, including recipient names.
- **Only contracts with no options left:** keeps contracts whose potential end date is also inside the window, so the work must be recompeted rather than extended.
- **Add competition and vehicle details** (on by default): one extra lookup per contract, no extra charge.
- **Only contracts not returned before:** for a weekly schedule; each run lists only contracts newly entering your window, plus contracts returned before whose end date has since changed (for example, extended by a modification). Use **Cursor name** to keep separate lists for separate searches.

**Quick start:** keep the prefilled IT services NAICS codes (541512, 541519) and the $250k minimum, or put in your own, then click **Start**. Results appear in the **Expiring contracts**, **Competition and vehicle** and **Incumbents** tabs, soonest expiry first.

### Pricing

Pay per event: you pay only for contracts returned.

| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| Expiring contract returned | $0.007 | $0.006 | $0.0054 | $0.0048 |
| Incumbent award listed (only with the add-on) | $0.0024 | $0.002 | $0.0018 | $0.0016 |

That's $4.80–$7.00 per 1,000 expiring contracts, plus Apify's standard Actor start fee. Contracts removed by your filters, contracts dropped because the recipient name looks like a person's, contracts already returned (with "only contracts not returned before") and runs that fail are **not charged**. The competition-and-vehicle lookup is free. Set **Max cost per run** to cap spending; the Actor stops cleanly at the cap.

### Integrations and API

Schedule it weekly in Apify and send new expiring contracts to Google Sheets, Slack, a CRM, Make, Zapier or n8n through Apify's integrations, or call it from the Apify API. AI agents can use it through Apify's MCP server.

### Limits

- **End dates can be stale.** USAspending shows the end date as of the latest contract modification. A contract can be extended or ended early before the change is reported, so treat the date as a signal and confirm with the agency.
- **Defense data lags.** Department of Defense contract actions appear on USAspending about 90 days after they happen.
- **Indefinite-delivery vehicles (IDVs)** have an ordering period, not a period of performance, and are not included; their task and delivery orders are.
- Agency names must match USAspending's spelling exactly; a misspelled name returns no contracts or an error.
- A run reads at most **Max pages to scan** pages of 100 contracts. Narrow the filters if the status message says it stopped at the page limit.

### FAQ

**Is this the same as a new-awards feed?** No. This Actor looks forward: contracts ending soon, and who holds them now. For recently won awards, use a new-awards feed instead.

**Why do some rows have no set-aside or number of offers?** Some contracts don't report them, and the lookup can fail for a few awards. `detailsIncluded` shows whether the details were found.

**What does `hasUnexercisedOptions` mean?** The potential end date (with all options) is later than the current end date, so the agency can extend the contract instead of recompeting it.

**Are people's names included?** The Actor is built to leave them out. It never outputs executive or officer names and pay, street addresses, phone numbers or email addresses. Contracts whose recipient name looks like a person's name (no business word such as LLC, Inc, Corp, Co or Services) are dropped and not charged; the run summary says how many. Descriptions that look like they name a person (case captions such as "v." or "in re", honorifics such as Mr. or Dr., personal-services, staff, tuition, witness or fellowship awards) are blanked, and `descriptionSuppressed` is `true` on those rows. Incumbent names are otherwise the legal entity names as published, so a company name can contain a founder's name.

**How fresh is the data?** USAspending updates contract data daily from the Federal Procurement Data System.

### Data source and responsible use

Data comes from the USAspending.gov public API (version 2), which needs no key. It is U.S. government data and in the public domain. The Actor identifies itself with a company name and contact email, keeps to a few requests per second, and stops if the API signals throttling. Output is limited to business-entity and contract facts: recipients that look like individuals are dropped, descriptions that look like they name a person are blanked, no contact details, and recipient addresses at city, state, ZIP and country level only. This is an **unofficial** tool, **not affiliated with** or endorsed by USAspending.gov, the U.S. Department of the Treasury or any federal agency. Award data is reported by agencies and can contain errors.

### Support

Found a bug or need a field? Open an issue on this Actor's **Issues** tab and we'll respond there.

*Maintained by Saiber Operations LLC.*

# Changelog

This Actor's version history is a separate document: https://apify.com/saiberops/federal-contract-recompete-radar/changelog.md

# Actor input Schema

## `endsAfterMonths` (type: `integer`):

Start of the expiry window. 0 = from today. Set 6 to skip contracts ending in the next 6 months (too late to shape the recompete).

## `endsWithinMonths` (type: `integer`):

End of the expiry window. 12 = contracts whose current period of performance ends in the next 12 months; 18 is common for capture planning.

## `endDateFrom` (type: `string`):

Optional, YYYY-MM-DD. Overrides 'Ends after' with a fixed date, for example the start of a fiscal year.

## `endDateTo` (type: `string`):

Optional, YYYY-MM-DD. Overrides 'Ends within' with a fixed date.

## `naicsCodes` (type: `array`):

2- to 6-digit NAICS codes or prefixes, for example 541512 (computer systems design) or 5415. Leave empty for all industries.

## `pscCodes` (type: `array`):

4-character PSC codes such as DA01 or R425 (matched by USAspending), or shorter prefixes such as D3 or R4 (matched by the Actor, slower). Leave empty for all.

## `agencies` (type: `array`):

Exact top-tier agency names as USAspending writes them, for example Department of Defense, Department of Veterans Affairs, General Services Administration. Leave empty for all.

## `subAgencies` (type: `array`):

Exact sub-tier names, for example Department of the Army, Defense Information Systems Agency, Veterans Health Administration.

## `agencyRole` (type: `string`):

Match the agency that awarded the contract (usual) or the agency that pays for it.

## `placeOfPerformanceStates` (type: `array`):

Two-letter codes where the work is performed, for example VA, MD, DC, TX. Leave empty for all.

## `setAsideTypes` (type: `array`):

Keep contracts awarded under these set-asides, for example small business (SBA), 8(a), HUBZone, SDVOSB, WOSB. Leave empty for all.

## `extentCompeted` (type: `array`):

Keep contracts with these competition codes, for example C (not competed) to find sole-source work.

## `contractTypes` (type: `array`):

Award types to include. Indefinite-delivery vehicles (IDVs) have an ordering period instead of an end date and are not included.

## `minAmount` (type: `integer`):

Skip contracts with less than this obligated to date. Leave empty for no minimum.

## `maxAmount` (type: `integer`):

Skip contracts above this value, for example to focus on work a small business can win. Leave empty for no maximum.

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

Words searched by USAspending across award descriptions and other award text, including recipient names, for example cloud, help desk. At least 3 characters each.

## `requireNoRemainingOptions` (type: `boolean`):

Keep only contracts whose potential end date (with all options) is also inside the window: the work must be recompeted, not just extended.

## `includeContractDetails` (type: `boolean`):

Looks up each contract's set-aside, extent competed, number of offers, parent vehicle, potential end date, offices and incumbent business types (one extra request per row, no extra charge).

## `includeIncumbentHistory` (type: `boolean`):

For each expiring contract, lists the incumbent's largest other contracts with the same awarding agency. Charged per listed award (see Pricing).

## `historyPerContract` (type: `integer`):

How many of the incumbent's other contracts to list per row when the add-on is on.

## `onlyNewSinceLastRun` (type: `boolean`):

For a scheduled radar: skip contracts this cursor already returned, so each run lists only contracts newly entering your window. A returned contract whose end date later changes (for example, an extension) is listed again.

## `cursorName` (type: `string`):

Keeps a separate 'not returned before' list per name, so different saved searches don't share one. Letters, numbers and dashes.

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

The run stops after returning this many contracts. Each returned contract is one charged event.

## `maxPagesToScan` (type: `integer`):

Upper limit on 100-row result pages read from USAspending per run. Contracts filtered out by the Actor (PSC prefixes, options) are free but use pages.

## Actor input object example

```json
{
  "endsAfterMonths": 0,
  "endsWithinMonths": 12,
  "naicsCodes": [
    "541512",
    "541519"
  ],
  "pscCodes": [],
  "agencies": [],
  "subAgencies": [],
  "agencyRole": "awarding",
  "placeOfPerformanceStates": [],
  "setAsideTypes": [],
  "extentCompeted": [],
  "contractTypes": [
    "A",
    "B",
    "C",
    "D"
  ],
  "minAmount": 250000,
  "keywords": [],
  "requireNoRemainingOptions": false,
  "includeContractDetails": true,
  "includeIncumbentHistory": false,
  "historyPerContract": 5,
  "onlyNewSinceLastRun": false,
  "cursorName": "",
  "maxItems": 50,
  "maxPagesToScan": 20
}
```

# Actor output Schema

## `results` (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 = {
    "naicsCodes": [
        "541512",
        "541519"
    ],
    "pscCodes": [],
    "agencies": [],
    "subAgencies": [],
    "placeOfPerformanceStates": [],
    "minAmount": 250000,
    "keywords": [],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("saiberops/federal-contract-recompete-radar").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 = {
    "naicsCodes": [
        "541512",
        "541519",
    ],
    "pscCodes": [],
    "agencies": [],
    "subAgencies": [],
    "placeOfPerformanceStates": [],
    "minAmount": 250000,
    "keywords": [],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("saiberops/federal-contract-recompete-radar").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 '{
  "naicsCodes": [
    "541512",
    "541519"
  ],
  "pscCodes": [],
  "agencies": [],
  "subAgencies": [],
  "placeOfPerformanceStates": [],
  "minAmount": 250000,
  "keywords": [],
  "maxItems": 50
}' |
apify call saiberops/federal-contract-recompete-radar --silent --output-dataset

```

## MCP server setup

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

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/zyYIrFHaJNydaHBFB/builds/m1F703VuJym2EnDBy/openapi.json
