SAM.gov Scraper - Federal Contract Opportunities & Contacts avatar

SAM.gov Scraper - Federal Contract Opportunities & Contacts

Pricing

from $2.50 / 1,000 opportunity scrapeds

Go to Apify Store
SAM.gov Scraper - Federal Contract Opportunities & Contacts

SAM.gov Scraper - Federal Contract Opportunities & Contacts

Scrape SAM.gov federal contract opportunities: RFPs, solicitations, sources sought, awards. Filter by keyword, NAICS, PSC, set-aside, notice type, dates. Returns contracting officer names, emails, phones, full descriptions, and attachment download links. No API key needed.

Pricing

from $2.50 / 1,000 opportunity scrapeds

Rating

0.0

(0)

Developer

Scrape Sage

Scrape Sage

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Share

Extract U.S. federal contract opportunities from SAM.gov — RFPs, solicitations, sources sought, and award notices — into clean JSON with full descriptions, contracting officer contacts (name, email, phone), and direct attachment download links. No login / no cookies — no SAM.gov account and no API key required.

Why this SAM.gov scraper?

Typical scrapersThis actor
Require a SAM.gov account and API key issuanceNo account, no API key — works out of the box
Return truncated summariesFull solicitation description text
Give you a listing row onlyCombines search + detail page + attachments in one record
No contact dataContracting officer name, email, and phone per opportunity
Link-only attachmentsLists every attachment with a direct download URL — and can download the files for you
One notice type at a timeFilter across all notice types, NAICS, PSC, set-asides, and date ranges

Use cases

  • Government BD & capture teams — find RFPs matching your NAICS codes before competitors do, with the contracting officer's email in the same row.
  • Proposal teams — pull full solicitation text and attachment files (SOWs, specs, amendments) straight into your pipeline tools.
  • Market intelligence & consultants — track award notices by agency and awardee (UEI) to see who's winning contracts in your market.
  • Subcontractors — monitor award notices to find primes who just won work in your niche.
  • Daily opportunity feeds — schedule a run with a relative postedFrom like "2 days" to capture only freshly posted opportunities.

How to use

  1. Sign up for Apify — the free plan is enough to try this actor.
  2. Open the SAM.gov Scraper, fill in the inputs you need, and click Start.
  3. Watch results stream into the dataset table as each record is parsed.
  4. Export as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the Apify API.

Input

The simplest input — the 100 most recently modified active software opportunities, with contacts and attachments:

{
"keywords": "software",
"keywordMode": "ALL",
"status": "active",
"maxResults": 100,
"fetchFullDetails": true,
"includeAttachments": true
}

A daily-feed input for new small-business IT set-asides:

{
"naicsCodes": ["541511", "541512"],
"setAsideCodes": ["SBA", "8A"],
"noticeTypes": ["o", "k", "p"],
"postedFrom": "2 days",
"sortBy": "-modifiedDate",
"maxResults": 500
}

Or scrape specific opportunities directly by URL or notice ID (search filters are ignored when this is set):

{
"noticeIds": ["https://sam.gov/opp/ecf37a7275fd4b0cb17b9e0cfd660654/view"]
}

Core fields:

  • keywords — search text (e.g. "janitorial services"); leave empty to match all and rely on filters. keywordMode controls how words combine: ALL, ANY, or EXACT.
  • noticeTypes — limit to notice types such as o (Solicitation), p (Presolicitation), k (Combined Synopsis/Solicitation), r (Sources Sought), s (Special Notice), a (Award Notice), u (J&A), g (Surplus Sale), i (Intent to Bundle).
  • naicsCodes / pscCodes — filter by NAICS industry codes (e.g. 541511) and Product Service Codes (e.g. D302).
  • setAsideCodes — limit to small-business set-aside categories such as SBA, 8A, HZC, SDVOSBC, WOSB, EDWOSB, and more.
  • statusactive (default), inactive (archived), or all.
  • postedFrom / postedTo, modifiedFrom / modifiedTo, responseDueFrom / responseDueTo — date windows accepting ISO dates (2026-06-01) or relative values ("7 days", "2 weeks", "3 months").
  • maxResults — opportunities per run (default 100, max 10,000 — SAM.gov caps any single query at 10,000 records). sortBy-modifiedDate (default) or -relevance.
  • fetchFullDetails — fetch each detail page for full description, contracting officer contacts, place of performance, and exact deadline (default true); disable for a faster, cheaper basic feed.
  • includeAttachments — list attachments with download URLs (default true); downloadAttachments also saves the files to the key-value store (default false), with maxAttachmentSizeMb capping file size (default 25 MB).
  • noticeIds — scrape specific notice IDs / sam.gov opportunity URLs directly.
  • proxyConfiguration — proxy settings; Apify datacenter proxy (default) is recommended for reliability at scale.

Output

One dataset record per opportunity:

{
"noticeId": "ecf37a7275fd4b0cb17b9e0cfd660654",
"parentNoticeId": null,
"title": "6515--NEW Seattle Patient Lift Replacement",
"noticeType": "Combined Synopsis/Solicitation",
"noticeTypeCode": "k",
"solicitationNumber": "36C26026Q0576",
"status": "Published",
"isActive": true,
"postedDate": "2026-06-09T23:08:15.561+00:00",
"responseDeadline": "2026-07-16T10:00:00-07:00",
"responseTimeZone": "America/Los_Angeles",
"archiveDate": "2026-07-21",
"archiveType": "autocustom",
"department": "VETERANS AFFAIRS, DEPARTMENT OF",
"subTier": "VETERANS AFFAIRS, DEPARTMENT OF",
"office": "NETWORK CONTRACT OFFICE 20 (36C260)",
"naicsCodes": ["339113"],
"pscCode": "6515",
"setAside": "Total Small Business Set-Aside",
"setAsideCode": "SBA",
"placeOfPerformance": {
"streetAddress": "Department of Veterans Affairs Seattle VA Medical Center, 1660 S Columbian Way",
"city": "Seattle",
"state": "WA",
"zip": "98499",
"country": "UNITED STATES"
},
"descriptionText": "The Seattle VA Medical Center requires replacement of facility-wide patient lifts...",
"pointsOfContact": [
{
"type": "primary",
"fullName": "Denise Patches",
"title": "Contracting Officer",
"email": "Denise.Patches@va.gov",
"phone": "253-888-4922"
}
],
"attachments": [
{
"name": "SOW - Facility Wide Patient Lift Replacement_V1.docx",
"type": "file",
"url": "https://sam.gov/api/prod/opps/v3/opportunities/resources/files/b74dff59617b459fbfc6462042b34523/download",
"mimeType": ".docx",
"sizeBytes": 44515,
"accessLevel": "public",
"resourceId": "b74dff59617b459fbfc6462042b34523",
"exportControlled": false
}
],
"url": "https://sam.gov/opp/ecf37a7275fd4b0cb17b9e0cfd660654/view"
}

Notes:

  • Detail fields like descriptionText, pointsOfContact, placeOfPerformance, and exact deadlines are populated only when fetchFullDetails is enabled; attachments is populated only when includeAttachments is enabled. Listing attachment URLs is free — download URLs are always included in the dataset, and you only download the files when downloadAttachments is true.
  • Award notices additionally include an award object with the awardee name and UEI (SAM unique entity ID).
  • This data is published by the U.S. federal government for public dissemination; the actor only accesses publicly available opportunity data.

Automate & schedule

Run this actor on autopilot and pull results into your own stack:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });
const run = await client.actor('scrapesage/sam-gov-scraper').call({
naicsCodes: ['541511', '541512'],
setAsideCodes: ['SBA', '8A'],
noticeTypes: ['o', 'k', 'p'],
postedFrom: '2 days',
maxResults: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} records`);

Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

  • Make — multi-step automation scenarios.
  • Zapier — push new records straight into your CRM or sheet.
  • Slack — get notified when a run finds something new.
  • Google Drive / Sheets — auto-export every run to a spreadsheet.
  • Airbyte — pipe results into your data warehouse.
  • GitHub — trigger runs from commits or releases.

Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the Apify MCP server — ask your assistant to "find active small-business IT solicitations posted in the last week and list each contracting officer's email" and let it run this scraper for you.

More scrapers from scrapesage

Need data from somewhere else? Try these:

Tips

  • Build a daily opportunity feed by setting postedFrom to a relative value like "2 days", sorting by -modifiedDate, and running the actor on an Apify Schedule — then pipe new records to Slack, Make, or Google Sheets.
  • Beat the 10,000-record cap by segmenting large pulls with postedFrom/postedTo date windows; any single SAM.gov query returns at most 10,000 records.
  • Run faster and cheaper by disabling fetchFullDetails and includeAttachments when you only need basic listing fields — each adds one extra request per opportunity.
  • Use responseDueFrom to exclude nearly-closed solicitations and focus on opportunities you can still respond to.
  • Keep the default Apify datacenter proxy — SAM.gov is a lenient public API, so datacenter proxy is recommended for reliability at scale.

FAQ

Do I need a SAM.gov account or API key? No. This actor accesses public opportunity data without any login, account, or API key — and returns richer combined records (search + detail + attachments in one row) than the official API.

Is this legal? SAM.gov contract opportunity data is published by the U.S. federal government for public dissemination and is in the public domain. This actor only accesses publicly available data — no login, no bypassing of access controls.

How fresh is the data? It is scraped live from SAM.gov at run time.

Can I download the attachment files, not just the links? Yes. Download URLs are always included in each record; set downloadAttachments to true to also save the files into the run's key-value store, capped by maxAttachmentSizeMb.

What if my filters match no opportunities? A run with no matches finishes successfully with an empty dataset.

Can I export the results? Yes — export as JSON, CSV, Excel, XML, or RSS, or pull them via the Apify API and official SDKs.

Need help?

Open an issue on the actor's Issues tab, or visit the Apify help center. Feature requests are welcome — this actor is actively maintained.