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).0is honored. Acceptsvalue_min/value_maxas aliases.ends_after_months/ends_within_months: the recompete window floor and ceiling, in months from today (default 0 and 18). Setends_after_months=6to skip contracts too close to influence.date_anchor:current_end(next decision point, default) orpotential_end(guaranteed final end, all options used).options_exhausted_only:truenarrows 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 includesources_sought,rfi,presolicitation,special_notice,industry_day,solicitation,justification.incumbent_excluded:truenarrows to recompetes whose incumbent is currently on the SAM exclusions list (can't legally win the recompete);falseto 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 returns402.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 adatarow above (incumbent, timing includingoption_runway_daysandmonths_until_end, contestability, value,de_obligated/mod_churn/incumbent_excluded, vehicle fields, and the incumbent's namedsubcontractors).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 emptyreasonsmeans 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 carriessame_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 (
naicsoragencyrequired), or a market too broad to evaluate in time (addnaics). - 402: the Recompete Watchlist requires Pro.
- 429: rate limit exceeded.