US Federal Contract Opportunities from SAM.gov (Unofficial) avatar

US Federal Contract Opportunities from SAM.gov (Unofficial)

Pricing

from $0.90 / 1,000 opportunities

Go to Apify Store
US Federal Contract Opportunities from SAM.gov (Unofficial)

US Federal Contract Opportunities from SAM.gov (Unofficial)

Daily feed of US federal contracts and government contract opportunities from SAM.gov's public extract. Filter by NAICS, PSC, set-aside, agency, state; track new, amended and awarded notices. Not affiliated with or endorsed by the U.S. General Services Administration (GSA) or SAM.gov.

Pricing

from $0.90 / 1,000 opportunities

Rating

0.0

(0)

Developer

Clearpath Data

Clearpath Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Not affiliated with or endorsed by the U.S. General Services Administration (GSA) or SAM.gov. This is an independent tool built on SAM.gov's public daily Contract Opportunities extract.

US Federal Contract Opportunities: Daily Feed and Change Monitor

Get US federal contract opportunities (solicitations, combined synopsis/solicitations, presolicitations, sources sought, special notices and award notices) as clean rows, filtered to your NAICS codes, PSC codes, set-asides, notice types, agencies, place-of-performance states and keywords. Run it on a schedule to get only the notices that are new since your last run, or switch to Changes mode to see which notices were amended (for example, deadline moved), awarded or removed since the last run.

The data comes from the public Contract Opportunities data extract that SAM.gov publishes once a day for bulk download (Data Services, "Contract Opportunities", public). The Actor downloads that one file per run. It does not visit sam.gov web pages, does not log in and does not use any API key.

What does it do?

  • Downloads SAM.gov's public daily Contract Opportunities extract (a CSV file of about 210–220 MB with roughly 70,000 active notices) and reads it as a stream.
  • Drops award rows dated before 4 April 2022 (see "Dun & Bradstreet rule" below).
  • Filters by NAICS prefix, PSC prefix, set-aside, notice type, agency or department, place-of-performance state, keywords, "open for responses only" and "posted within N days".
  • Three modes:
    • New since last run (default): only notices you haven't received yet under your state name. The first run covers the last few days.
    • All matching notices: everything in today's file that matches, nothing remembered.
    • Changes since last run: compares today's file with the last run's and lists new, amended (with the fields that changed, such as responseDeadline), awarded and removed notices. The first run saves a baseline and lists nothing.
  • Each row has the notice ID, title, solicitation number, notice type, posted date, response deadline (as published and in UTC), agency, sub-tier and office, set-aside, NAICS, PSC, place of performance, award details (number, date, amount, awardee), contracting contacts (can be switched off), the description text and a link to the public notice page.

Quick start

  1. Leave Mode on New since last run, set NAICS code prefixes (for example 54) and any other filters.
  2. Set Max results while you try it out.
  3. Click Start. Later runs with the same State name return only notices you haven't received yet.
  4. To watch amendments and awards, run a second schedule in Changes since last run mode with its own State name. A step-by-step version is in Recipe: daily bid alert.

Recipe: daily bid alert

A morning list of new notices in your NAICS codes, plus a second schedule for amendments and awards.

  1. Create a task for new notices. In Apify Console, open the Actor, set the input below and save it as a task:

    {
    "mode": "new",
    "postedWithinDays": 3,
    "naicsPrefixes": ["541511", "541512", "541519"],
    "setAsides": ["SBA", "SBP"],
    "openForResponseOnly": true,
    "includeContacts": false,
    "stateName": "bid-alert-it-small-business",
    "maxResults": 200
    }

    Use your own NAICS codes (a prefix such as 5415 covers all codes that start with it) and set-asides, or leave setAsides out for all notices. Keep one State name per alert so each schedule remembers only its own notices.

  2. Schedule it once a day. In Schedules, add the task with a daily time after SAM.gov's daily update, for example 06:00 UTC. Running more often returns the same file.

  3. Optional: a second task for changes. Same filters, "mode": "changes" and a different State name, for example bid-alert-it-small-business-changes. Its first run saves a baseline and lists nothing; from the next day it lists new, amended (for example a moved response deadline), awarded and removed notices.

  4. Get the results.

    • Each run's rows are in its dataset: open it in Console, export CSV, Excel or JSON, or read it with the Apify API.
    • To be notified, add an integration or webhook to the task (for example on "Run succeeded") that sends the rows to email, a chat tool, a spreadsheet, your CRM or your own endpoint.
    • Set the task's maximum cost per run if you want a hard cap.

Size and cost, for reference: in the file of 29 October 2026, 23 notices with a NAICS code starting with 5415 were posted on 28 October; 7 of them had a small-business set-aside (SBA or SBP). At the Free and Bronze price ($0.0015 per notice), 23 notices cost about $0.035 plus the start charge. Your numbers depend on your filters and on the day.

Sample output

A notice row (values from the extract of 29 October 2026; contacts switched off and description shortened here):

{
"noticeId": "80ca6e7f11fa481cafc50f5d3b3cfa8e",
"title": "Request for Information (RFI) for On-Premise Serve",
"solicitationNumber": "28321327RI0000003",
"noticeType": "Solicitation",
"postedDate": "2026-10-28 15:03:44",
"postedDay": "2026-10-28",
"responseDeadline": "2026-11-05T17:00:00-05:00",
"responseDeadlineUtc": "2026-11-05T22:00:00.000Z",
"isOpenForResponse": true,
"archiveDate": "2026-11-20",
"department": "SOCIAL SECURITY ADMINISTRATION",
"subTier": "SOCIAL SECURITY ADMINISTRATION",
"office": "SSA OFC OF ACQUISITION GRANTS",
"setAsideCode": null,
"naicsCode": "541519",
"pscCode": "7A21",
"popState": null,
"awardNumber": null,
"awardAmount": null,
"awardee": null,
"primaryContactName": null,
"contactsIncluded": false,
"officeCity": "BALTIMORE",
"officeState": "MD",
"samUrl": "https://sam.gov/opp/80ca6e7f11fa481cafc50f5d3b3cfa8e/view",
"description": "Request for Information (RFI) for On-Premise Server Backup & Recovery software. Amdt 1 to extend response due date to 11/5/2026.",
"descriptionLength": 128,
"descriptionTruncated": false,
"sourceFileLastModified": "2026-10-29T03:30:32.000Z",
"retrievedAt": "2026-10-29T12:02:25.006Z"
}

A change row in Changes mode has the same notice fields plus these (illustrative values):

{
"changeType": "amended",
"changedFields": ["responseDeadline"],
"changeSummary": "Response deadline moved from 2026-11-30T17:00:00-05:00 to 2026-12-31T17:00:00-05:00",
"previousResponseDeadline": "2026-11-30T17:00:00-05:00",
"previousNoticeType": null,
"previousSetAsideCode": null,
"previousTitle": null,
"removedReason": null,
"detectedAt": "2026-10-29T12:01:47.000Z"
}

The dataset has four views: Overview, Changes, Awards and Contacts. Every field is described in the output schema.

How the modes remember what you've seen

  • State is kept in a named key-value store in your own Apify account (us-federal-contract-opportunities-state), one record per mode and State name. Use a separate State name for each schedule or filter set; the run report warns you when the filters differ from the ones a state was saved with.
  • New since last run stores the IDs of notices already delivered (and forgets them once they leave the extract). If a run stops at Max results or at your maximum cost per run, the next run continues with what's left.
  • Changes stores a compact record per notice: hashes of the title, description and award details, plus the response deadline, notice type and set-aside. A notice is:
    • new when its ID wasn't in the last run's file and it matches your filters (awarded when a new notice is an award notice);
    • amended when one of those watched fields changed (changedFields and changeSummary say which; previous deadline, type, set-aside and title are given);
    • awarded when award details appear or the type changes to Award Notice;
    • removed when it's no longer in the extract. The extract only lists active notices, so this usually means the notice was archived; removedReason says whether its archive date had passed.
  • Changes that happen to notices outside your filters aren't listed, except a change that moves a notice into or out of your filters, which is listed once.
  • If a run stops at Max results or the cost limit, changes it couldn't list are kept for the next run.
  • Update state = off reads the saved state without changing it, so test runs don't affect your schedule.

Use cases

  • Bid alerts for small contractors and business development teams: new solicitations in your NAICS codes and set-aside categories every morning.
  • Proposal and capture teams: catch amendments, especially moved response deadlines, on the notices you are tracking.
  • Set-aside programs (8(a), WOSB, SDVOSB, HUBZone): open notices reserved for your category.
  • Award research: award notices with awardee, amount and date, to see who is winning work in your market.

Input

FieldWhat it does
ModeNew since last run (default), All matching notices, or Changes since last run.
Posted within (days)Only notices posted in the last N days. In New since last run it sets the first run's window (2 days if empty). Not used in Changes mode. Empty in All mode means every active notice.
NAICS code prefixese.g. 54, 5415, 236220.
PSC prefixese.g. D3, R4, 7A.
Set-asidesCodes such as SBA, 8A, HZC, SDVOSBC, WOSB. NONE also matches notices with no set-aside given.
Notice typese.g. Solicitation, Combined Synopsis/Solicitation, Sources Sought, Award Notice.
Agency or department containsText matched against department, sub-tier agency and office, e.g. VETERANS AFFAIRS, NAVY.
Place-of-performance states2-letter codes. Most notices have no place-of-performance state, and those are excluded when you set this.
Keywords / Keywords: title onlyWhole words or phrases, case-insensitive, in the title and description (or title only).
Open for responses onlyOnly notices whose response deadline is still ahead.
Include contracting contactsOn by default. Off empties the contact name, title, email, phone and fax fields.
Description length limitCut descriptions to at most N characters, including the "…" that marks a cut (so N−1 characters of text are kept, never splitting a character). descriptionTruncated is true and descriptionLength gives the full length. 0 leaves descriptions out; empty keeps the full text.
State name / Update stateMemory between runs (see above).
Max resultsStop after this many rows.

Example input for a daily IT-services bid alert for small businesses:

{
"mode": "new",
"postedWithinDays": 2,
"naicsPrefixes": ["5415"],
"setAsides": ["SBA", "8A", "SDVOSBC", "WOSB", "HZC"],
"noticeTypes": ["Solicitation", "Combined Synopsis/Solicitation", "Sources Sought"],
"openForResponseOnly": true,
"stateName": "it-small-business"
}

How much does it cost?

The Actor is priced per event:

EventPrice
Opportunity (one notice row)$0.0015 (Silver: $0.0012, Gold and higher: $0.0009)
Change (one row in Changes mode)$0.002
Actor start$0.00005 per run (set by Apify)

That is $1.50 per 1,000 notices on the Free and Bronze plans. Filtered-out notices are never charged, and a Changes run that finds nothing charges only the start. Rows are saved first and then charged, and the run stops at Max results or your maximum cost per run, so you are never charged for rows you didn't get. Platform usage (compute) is billed by Apify as usual; each run reads the whole file, so it takes about the same time whatever your filters (see Limits).

Contracting contacts: use them for the solicitation only

Notices list the contracting officers and specialists to contact about that solicitation, with name, email and phone. They are published so that vendors can ask questions about the solicitation and submit responses.

  • They are included by default because that is what a bidder needs. Switch Include contracting contacts off if you don't need them.
  • Use them only for questions about the solicitation or your response, and not for bulk marketing, cold outreach lists, resale or spam. Although published, names and contact details are personal data under laws such as the GDPR and CCPA; you are responsible for a lawful basis for using them and for following marketing rules (e.g. CAN-SPAM, TCPA).
  • Descriptions sometimes contain contact details too; turning contacts off doesn't remove those.

Dun & Bradstreet rule (award notices before 2022-04-04)

SAM.gov's Terms of Use say that base award notices with an award date before 4 April 2022 may contain Dun & Bradstreet data, which may not be used for commercial, resale or marketing purposes or shared in bulk. This Actor therefore drops every row with an award date before 2022-04-04 (whatever its notice type), and award notices without an award date that were posted before then. On the extract of 29 October 2026 that removed 826 of 71,800 rows. The number dropped is in the run report. The Actor never adds entity-registration data.

Limits and honest notes

  • Once a day: SAM.gov regenerates the extract daily (the file of 29 October 2026 had Last-Modified 03:30 UTC). A notice posted today appears in tomorrow's file, so schedule one run per day, for example at 06:00 UTC. Running more often returns the same file.
  • Active notices only: the extract lists active notices. Archived notices aren't in it, so you can't get older history from this Actor.
  • Not everything on the notice page: attachments, amendments' document files and interested-vendor lists are not in the extract. Descriptions in the extract can be cut at about 32,000 characters (seen on 2026-10-29).
  • Encoding: the file mixes UTF-8 and Windows-1252 text; the Actor decodes each field accordingly, but a few characters in unusual encodings may still look odd.
  • Dates: posted dates are as in the extract, without a time zone. Response deadlines usually carry an offset; the few without one are read as UTC-5 in responseDeadlineUtc and isOpenForResponse.
  • Amendments: Changes mode compares the extract's fields. If SAM.gov publishes an amendment under a new notice ID, it shows up as a new row, and the replaced notice later as removed.
  • Whole-file read: every run downloads and reads the whole file (about 5–10 seconds of reading plus the download), so platform usage per run is roughly the same whatever your filters.
  • Order: rows come in the extract's order, which is roughly newest first.
  • Notice links: samUrl is the public notice page, https://sam.gov/opp/<noticeId>/view. The extract also has its own link column, but that link opens a SAM.gov workspace page that needs a sign-in, so the Actor doesn't use it.
  • Run report counts: when a run stops at Max results or your cost limit, it stops reading the file there, so matched in the run report never exceeds Max results and the other counts cover only the rows read up to that point. rowsSaved is the number of rows saved and charged.

Integrations, schedules and AI agents

Schedule the Actor daily in Apify Console and send new rows to Google Sheets, Slack, email, webhooks, Make, Zapier or your CRM with Apify integrations, or call it from the Apify API.

  • AI agents and assistants (MCP): connect an MCP client to https://mcp.apify.com?tools=clearpath-data/us-federal-contract-opportunities with your Apify account (OAuth or API token) and the agent can run this Actor as a tool, charged per event at the prices under "How much does it cost?". Agents without an Apify account can use a prepaid token from Apify's agentic payments (experimental). See the Apify MCP server docs.

Sources and notices

  • Source: SAM.gov Data Services, "Contract Opportunities" public extract (ContractOpportunitiesFullCSV.csv), also listed on data.gov as "Contract Opportunities from SAM.gov".
  • SAM.gov states that most material on the site is free of copyright and that works of federal employees are in the public domain in the U.S. Follow SAM.gov's Terms of Use, including the Restricted Data Use section, when you use the data.
  • This Actor is independent. It is not affiliated with, endorsed by or reviewed by GSA or SAM.gov. "SAM.gov" is used only to describe the data source.

FAQ

Why did my first Changes run return no rows?

The first run for a State name saves a baseline. The next run, after SAM.gov publishes a new file, lists what changed.

Why did a run return 0 new notices?

The file is updated once a day. If you ran twice on the same day, everything was already delivered.

Can I export to CSV or Excel?

Yes. Use the dataset's export button or the API; choose a view (Overview, Changes, Awards or Contacts) for a narrower table.

Is this official data?

The rows come from the public extract that SAM.gov publishes. The Actor's filtering, change detection and D&B rule are its own, and the Actor is not an official GSA or SAM.gov product.