Federal Opportunity Feed avatar

Federal Opportunity Feed

Pricing

from $1.40 / 1,000 opportunity records

Go to Apify Store
Federal Opportunity Feed

Federal Opportunity Feed

Federal contract and grant opportunities from SAM.gov and Grants.gov in one feed — duplicates removed, agency names cleaned up, who won similar work before, and what changed since you last checked. No SAM.gov key.

Pricing

from $1.40 / 1,000 opportunity records

Rating

0.0

(0)

Developer

Public Records

Public Records

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

9 hours ago

Last modified

Share

What does GovCon Opportunity Feed do?

GovCon Opportunity Feed returns every US federal contract and grant opportunity matching your NAICS codes, agencies, keywords, set-asides, and states — across SAM.gov and Grants.gov — as one deduplicated, agency-normalized schema. In enrich mode it adds who won similar work (USASpending, last 36 months, matched by UEI). In monitor mode it returns only what changed since your last run: new, updated, deadline moved, awarded, cancelled.

Built for capture managers, GovCon BD teams, proposal shops, GovCon SaaS builders, and AI agents that triage opportunities.

This product uses the Grants.gov API but is not endorsed or certified by the U.S. Department of Health and Human Services. Not affiliated with GSA, SAM.gov, Grants.gov, or the U.S. Department of the Treasury.

Why this Actor?

  • 🔗 Two sources, one schema — SAM.gov contracts and Grants.gov grants in the same fields, with a canonical agency table across SAM, Grants.gov, and USASpending codes
  • 🧬 Lineage-resolved — presolicitation → solicitation → award collapse to one opportunityKey; no duplicates across stages
  • 🔔 Monitor mode — deltas only (new, updated, deadline_moved, awarded, cancelled, removed), so a daily schedule costs cents
  • 🏆 Category leaders — top recipients by agency × NAICS from USASpending, matched by UEI, with award counts and obligations
  • 🧾 Provenance on every rowsourceUrl, retrievedAt, sourceVersion, recordHash
  • 📡 Official CSV + APIs only — daily SAM Data Services extract by default; no HTML scraping, no login-gated data, no personal data
  • 💵 Error and status rows are never charged

Modes

ModeReturnsCharged per
snapshotall matching opportunitiesopportunity
monitoronly changes since your last run with the same filtersdelta (+ opportunity for new)
enrichsnapshot + category leaders (agency×NAICS peers) per opportunityopportunity + category-leader

No SAM.gov key required (default)

Contracts come from GSA’s public daily Data Services CSV (samBulk=true by default) — no API key, no daily request quota. Grants.gov and USASpending also need no key. Monitor deltas are CSV-diff against a saved KV snapshot (hashes / deadlines / notice types), not the Search API.

Optional free SAM public API key (samApiKey) + samEnrichLimit adds attachment URLs and fuller descriptions only. Sign in at sam.gov → Account Details → Request API Key. Stored encrypted; never logged.

Default mode = monitor (delta)

Default mode is monitor (change deltas since last run with the same filters). Quiet days are near-$0 for the buyer (actor-start only; delta PPE only when something changes). Full snapshot is opt-in and can approach ~$10 at default caps — do not use snapshot as the scheduled default.

Input

FieldDefaultDescription
modemonitormonitor (default) / snapshot / enrich
sources["sam","grants"]
samApiKeyoptional; attachments + full descriptions only
samBulktruedaily CSV path (recommended)
samEnrichLimit5max optional SAM API enrich calls/run
naics[]6-digit or prefix
agencies[]names or codes (DoD, DHS, EPA…)
keywords[]
setAside[]SB, 8A, HUBZone, SDVOSB, WOSB, NONE
states[]place of performance
noticeTypesallpresolicitation, sources_sought, solicitation, combined_synopsis, award_notice, special_notice, grant_forecast, grant_posted
postedWithinDays14Declared product window (14 days).
deadlineAftertodayexcludes expired
includeDescriptionsfalse
includeContactsfalseofficial contacts only
enrichTopN5
maxItems10000Default = 10,000 most recently posted of the 14d window. Raise to get the rest (schema max 50000; PPE for what you take). Cap after sort postedDate desc → Sol#.

Example: daily monitor for DoD/DHS IT work

{ "mode": "monitor", "naics": ["5415"], "agencies": ["DoD", "DHS"], "setAside": ["SB", "SDVOSB"], "samBulk": true, "samEnrichLimit": 0 }

Sample output (opportunity)

{
"recordType": "opportunity",
"opportunityKey": "sam:sol:W912DQ26R0012",
"sources": ["sam"],
"kind": "contract",
"noticeType": "solicitation",
"title": "IT Support Services",
"agency": { "canonicalName": "Department of Defense", "canonicalCode": "097", "subAgency": "Department of the Army", "raw": "DEPT OF DEFENSE" },
"naics": ["541512"],
"setAside": "SB",
"placeOfPerformance": { "state": "TX", "country": "USA" },
"postedAt": "2026-09-01T00:00:00.000Z",
"deadlineAt": "2026-10-01T00:00:00.000Z",
"url": "https://sam.gov/opp/…/view",
"retrievedAt": "2026-09-16T12:00:00.000Z",
"recordHash": "…"
}

Pricing

EventPrice
Actor start~$0.00005
Opportunity record$0.002
Delta record (monitor)$0.02
Category-leader record (enrich; PPE event id incumbent-record)$0.01
Status / error rowsfree

Snapshot of 200 opportunities ≈ $0.40 · daily monitor with ~15 changes ≈ $0.30/day · enrich 50 opportunities × 5 category leaders ≈ $2.60.

Snapshot completeness (option D)

Declared default window is postedWithinDays=14. Snapshot/monitor materialize the full filter-matched CSV set, then sort by postedAt desc → Sol# (normalized) and apply maxItems.

Default return: the 10,000 most recently posted opportunities in that 14-day window (Active + filters).

postedAt / window semantics (0.1.21+): clusters resolve on the full daily CSV (Active or Inactive matching filters). Per opportunity: postedAt = MIN PostedDate over all notices in the file-level cluster; lastActivityAt = MAX; samNoticeIds = union. Active applies only in the keep rule: keep opportunities with any Active=Yes notice and lastActivityAt within postedWithinDays (default 14). postedAt moves only when SAM removes that earliest notice from the file — not when it ages out of the 14d window or flips Inactive. Snapshot sort stays postedAt desc. Hashed fields come from the stage winner (highest STAGE_ORDER; same-stage → newer updatedAt/postedAt; equal → NoticeId ascending) — Active/window-independent. postedAt drift alone does not emit updatedrecordHash excludes postedAt/lastActivityAt. Every run reports CAP_COVERAGE.covered/total.

Raising maxItems (schema max 50000) returns the rest of the matched window (you pay PPE for what you take). A cap always drops the oldest rows — deterministic covered set, not CSV physical order. When afterFilters > maxItems, full-set dedup/delta claims are not PASS.

Limitations

  • SAM.gov results depend on your key's daily quota; exhaustion is reported, not hidden
  • Grants.gov has no NAICS; grants are matched by agency/keyword only
  • Category-leader matching is by UEI; pre-UEI awards are excluded
  • cancelled is emitted only when SAM Type confirms cancellation (e.g. Modification/Amendment/Cancel); otherwise absence is removed with reason archived | deadline_passed | unknown
  • No entity/registration data (D&B restrictions); no scraping of sam.gov pages

Candidate builds / GIT_SHA

Every Apify build is cut from a tagged commit. The image receives GIT_SHA as a Docker build-arg (also ENV GIT_SHA) and echoes it on RUN_SUMMARY. See docs/BUILD_NOTES.md for the candidate 0.1.26 SHA. Store tip / latest stays on 0.1.25 until Mark promotes after one clean scheduled night on the candidate tag.

SAM.gov opportunity data: open US government data, used via the official API under https://sam.gov/about/terms-of-use. Grants.gov: https://grants.gov/api/terms-conditions. USASpending: https://www.usaspending.gov/about (D&B limits apply; this feed is not a D&B substitute). See TERMS.md.