Skip to content

Recompete Watchlist

The Recompete Watchlist: federal contracts in a market entering their recompete window, each row carrying the bid/no-bid facts (incumbent, value, end dates and option runway, contestability, incumbent-stress signals, named subcontractors) plus a market-level feed of live sources-sought and pre-solicitation notices with the contracting officer's contact. Composed from prime_awards (FPDS) + exclusions + subawards + opportunities. Factual only; no win score. Full guide: /recompete-watchlist.

Parameters

A market filter (naics or agency) is required. Unknown parameters return 400.

  • naics: exactly 6 digits.
  • agency: awarding agency name substring, case-insensitive.
  • set_aside: set-aside type substring (e.g. veteran, 8(a), women).
  • state: 2-letter place-of-performance state code.
  • amount_min / amount_max: bounds on current contract value (USD). 0 is honored. Accepts value_min / value_max as aliases.
  • ends_after_months / ends_within_months: the recompete window floor and ceiling, in months from today (default 0 and 18). Set ends_after_months=6 to skip contracts too close to influence.
  • date_anchor: current_end (next decision point, default) or potential_end (guaranteed final end, all options used).
  • options_exhausted_only: true narrows to the high-confidence must-recompete subset; options_window_days (default 90) sets the threshold.
  • early_signal_days / early_signal_types: lookback in days (default 180) and notice types for the early-signal feed. Type aliases include sources_sought, rfi, presolicitation, special_notice, industry_day, solicitation, justification.
  • incumbent_excluded: true narrows to recompetes whose incumbent is currently on the SAM exclusions list (can't legally win the recompete); false to recompetes whose incumbent is clean. Omit for both.
  • sort_by: ends_soonest (default), value, mod_churn, de_obligated.
  • limit: Results per page. Default 100, maximum 1,000. Over the maximum returns 402. offset: pagination offset.

Each contract appears once, as of its latest transaction (latest action date, then the latest modification when several transactions share that date), so paging through with offset returns every match exactly once, and pagination.total is the full match count on every page, including a page past the last one.

Response

Standard list envelope plus a top-level early_signals block. Each row in data carries incumbent / incumbent_uei, agency / sub_agency / agency_code / sub_agency_code / awarding_office (published names plus their stable CGAC-family codes), naics / psc / set_aside, the timing fields (current_end_date, potential_end_date, option_runway_days, months_until_end), current_value, the contestability pair extent_competed + offers_last_cycle (which is null when no competition was recorded, never coerced), the incumbent-stress signals de_obligated / mod_churn / incumbent_excluded, the vehicle fields is_task_order / parent_award_id_piid, and subcontractors (the incumbent's named subs from FFATA, often empty). early_signals lists live sources-sought and pre-solicitation notices in the market, each with the CO name, email, and response deadline. _sources is ["usaspending_fpds", "sam_exclusions", "usaspending_ffata", "sam_opportunities"].

{
  "agency": "Department of Veterans Affairs",
  "sub_agency": "Department of Veterans Affairs",
  "agency_code": "036",
  "sub_agency_code": "3600",
  "awarding_office": "TECHNOLOGY ACQUISITION CENTER NJ (36C10B)",
  "incumbent_excluded": false
}

Single recompete detail: GET /api/v1/recompetes/{piid}

Fetch one recompeting contract by its PIID for a flat object with two blocks:

  • recompete: the full row shape of a data row above (incumbent, timing including option_runway_days and months_until_end, contestability, value, de_obligated / mod_churn / incumbent_excluded, vehicle fields, and the incumbent's named subcontractors).
  • vulnerability: an incumbent-vulnerability block, { "count": N, "reasons": [...] }, composed from the incumbent's SBA-registered certifications and FPDS obligation history. Each reason is a fact carrying its own evidence text, never a score; an empty reasons means no signal fired, not "safe". Reason codes:
  • cert_lapse: the incumbent's SBA-registered certification for this contract's set-aside program expires before the contract's current end date, so they may be ineligible to recompete under the same set-aside. Fires only when a matching, dated certification exists (absence is not treated as a signal).
  • lone_holder: the incumbent holds only a small number of distinct federal prime contracts on record (thin past performance).
  • single_agency: the incumbent's federal obligations concentrate in a single top-level department; the reason text states whether that department is the one running this recompete (entrenchment) or a different one (thin roots with the actual buyer), and the reason carries same_department_as_recompete (bool).

_sources is ["usaspending_fpds", "sba_dsbs", "sam_exclusions"]. An unknown PIID returns 404; the endpoint is Pro (402 otherwise). It is an ID lookup, so it is never windowed.

Example

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://govconapi.com/api/v1/recompetes?naics=541512&agency=veterans&set_aside=veteran&ends_after_months=6&ends_within_months=18&amount_max=25000000&sort_by=ends_soonest"

# one recompeting contract + the incumbent-vulnerability block
curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://govconapi.com/api/v1/recompetes/{piid}"

Errors

  • 400: no market filter (naics or agency required), or a market too broad to evaluate in time (add naics).
  • 402: the Recompete Watchlist requires Pro.
  • 429: rate limit exceeded.

A REST API and MCP server for U.S. federal procurement data.

Get a free key, emailed instantly, or follow the quickstart.

Found something wrong, missing or confusing on this page?

Press Ctrl + Enter to send a note. Highlight text first and it travels with your note.