SAM.gov Bid Finder for Small Contractors avatar

SAM.gov Bid Finder for Small Contractors

Pricing

from $3.00 / 1,000 opportunity returneds

Go to Apify Store
SAM.gov Bid Finder for Small Contractors

SAM.gov Bid Finder for Small Contractors

Find open federal contract opportunities in the public SAM.gov extract. Filter by keyword, NAICS, set-aside, state, and agency. Optional Grok bid-fit score. Contacts removed.

Pricing

from $3.00 / 1,000 opportunity returneds

Rating

0.0

(0)

Developer

Ryan Kirkendall

Ryan Kirkendall

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 days ago

Last modified

Categories

Share

SAM.gov Bid Finder

Finds open federal contract opportunities from the public SAM.gov Contract Opportunities extract and returns the ones that match your filters, best matches first.

It is for small contractors and bid teams looking for federal work they can still respond to. It does not log in to SAM.gov and it does not use a SAM.gov API key.

What it does

  1. Downloads the public daily Contract Opportunities file that SAM.gov publishes for data.gov.
  2. Drops notices that are already past, or too close to, the response deadline, and drops notice types you did not ask for.
  3. Keeps notices that match your keywords (whole word, in the title or description), NAICS prefix, set-aside, place-of-performance state, and agency.
  4. Collapses amendments into one row per solicitation and ranks that row with a rule-based match score.
  5. Optionally sends the top rows to Grok (xAI) with your company profile and adds a 0-100 bid-fit score.

The extract is updated about once a day, so a notice can take up to a day to appear. The Actor does not download solicitation attachments. Read the full notice on SAM.gov before you decide to bid.

AI use

Grok scoring is off unless you turn it on.

  • If you do not supply an xAI key, and scoring is on, the Actor uses the key configured by the Actor owner. Each scored opportunity is an "AI bid-fit score" event.
  • If you put your own key in the secret input field xaiApiKey, Grok runs on your xAI account and that AI event is not charged.
  • Each run also has a Grok spending cap (maxGrokSpendUsd). A call that could cross the cap is not sent.
  • The model is asked to quote the notice. A quote that is not in the notice text is dropped (evidenceVerified is false).
  • This is a screening aid. It is not procurement or legal advice. Short notices can come back as insufficient_info.

Input example

{
"keywords": ["janitorial", "custodial"],
"naicsCodes": ["561720"],
"setAsides": ["SBA"],
"placeOfPerformanceStates": ["OK"],
"postedWithinDays": 30,
"minDaysUntilDeadline": 3,
"maxResults": 10,
"aiFitScoring": true,
"companyProfile": "Small Oklahoma-based janitorial and facility maintenance company, 15 employees, small business, no security clearances",
"maxAiScored": 2,
"maxGrokSpendUsd": 0.02
}

companyProfile needs at least 40 characters when AI scoring is on. Leave xaiApiKey empty to use the Actor's key, or set it to use your own.

Output example

One row from a small test run (lists shortened). Contact details in the notice text appear as [contact removed].

{
"noticeId": "50214e18baae4028a7fc4b3993ea0a6d",
"title": "S--BGNDRF CUSTODIAL SERVICES",
"solicitationNumber": "140RR027Q0001",
"agency": "INTERIOR, DEPARTMENT OF THE",
"subTier": "DEPARTMENTAL OFFICES",
"office": "RECLAMATION CONTRACTING ACTIVITY",
"noticeType": "Presolicitation",
"baseType": "Presolicitation",
"postedDate": "2026-10-07",
"responseDeadline": "2026-10-22T13:00:00-06:00",
"daysUntilDeadline": 14,
"setAsideCode": "SBA",
"setAside": "Small Business Set Aside - Total",
"naicsCode": "561720",
"pscCode": "S201",
"placeOfPerformance": {
"city": null,
"state": null,
"zip": null,
"country": null
},
"samUrl": "https://sam.gov/workspace/contract/opp/50214e18baae4028a7fc4b3993ea0a6d/view",
"additionalInfoLink": null,
"keywordsInTitle": [
"custodial"
],
"keywordsInDescription": [
"janitorial"
],
"relatedNoticeIds": [],
"matchScore": 51,
"matchReasons": [
"Keyword in title: custodial",
"Keyword in description: janitorial",
"14 days to respond"
],
"aiFit": {
"fitScore": 85,
"verdict": "strong_fit",
"summary": "The company's core business in janitorial and facility maintenance directly matches the NAICS 561720 and PSC S201 for custodial services at a government facility. It is a small business and the notice is a total small business set-aside.",
"reasons": [
"Exact match on janitorial/custodial services (NAICS 561720, PSC S201)",
"Total Small Business Set-aside aligns with company's small business status"
],
"requirements": [
"Active SAM.gov registration",
"Furnish all labor, supplies, and equipment"
],
"risks": [
"Performance Work Statement is only a draft attachment (final requirements could differ)",
"Oklahoma-based firm must be able to service the New Mexico location"
],
"evidenceQuote": null,
"evidenceVerified": false,
"suggestedNextStep": "Confirm ability to perform work at the listed location and read the full notice on SAM.gov."
},
"aiModel": "grok-4.20-0309-non-reasoning",
"aiDisclaimer": "Automated screening by Grok (xAI). Not procurement or legal advice. Check the full solicitation and attachments on SAM.gov before bidding.",
"aiStatus": "scored",
"descriptionChars": 3409,
"descriptionSnippet": "BGNDRF CUSTODIAL SERVICES PRESOLICITATION NOTICE: ... (1) Point of contact: [contact removed], at [contact removed] (2) Set asides: Total Small Business Set-aside (100%) ..."
}

Here evidenceQuote is null and evidenceVerified is false because the model's quote did not match the notice text word for word, so it was dropped. placeOfPerformance fields are null when the notice leaves them blank.

Rows that are not sent to Grok have no aiFit object and aiStatus such as not_requested or over_ai_limit. A run summary is stored in the key-value store under SUMMARY.

The Opportunities table shows title, agency, type, set-aside, NAICS, deadline, days left, match score, AI fit, AI verdict, AI summary, and the SAM.gov link.

Pricing

Pay per event:

EventPriceWhen it is charged
Run started$0.01Once per run
Opportunity returned$0.003Once per matching opportunity written to the dataset
AI bid-fit score$0.04Once per opportunity scored with the Actor's xAI key

The AI bid-fit score event is not charged when you supply your own xAI key. You still pay xAI for those calls.

Example: 10 opportunities and 2 AI scores, using the Actor's key, is $0.01 + $0.03 + $0.08 = $0.12. The same run with your own key is $0.04, plus whatever xAI charges you. You can set a maximum charge for the run in Apify. The Actor stops when that limit is reached.

These event prices are the listing prices. They are not the same as Apify platform usage, which is separate unless the owner turns on "Pay per event + usage".

Contact details

The public extract includes contracting officers' names, email addresses, and phone numbers. This Actor does not copy those fields into the output. Before a title, description, or other free-text field is saved or sent to Grok, emails (including name [at] agency [dot] gov and (at) forms), phone numbers, and the name, email, and phone listed on that notice are removed and replaced with [contact removed].

A name that is written in the notice but is not in that notice's contact fields can still appear. Use the samUrl link and get official contact information on SAM.gov.

Disclaimer

This Actor does not guarantee that you will win any contract, that a notice is still open, or that the AI score is correct. It is not affiliated with, endorsed by, or operated by SAM.gov or GSA. Confirm every opportunity on SAM.gov before you bid.