SAM.gov Opportunities Feed (Unofficial)
Pricing
from $2.50 / 1,000 opportunity saveds
SAM.gov Opportunities Feed (Unofficial)
Federal contract opportunities from SAM.gov: keyless daily public extract, or the SAM.gov API with your own key. Filter by date, keyword, NAICS, set-aside, notice type, state and agency. Validated output with change tracking. Not affiliated with GSA or SAM.gov.
Pricing
from $2.50 / 1,000 opportunity saveds
Rating
0.0
(0)
Developer
Gray Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
What does SAM.gov Opportunities Feed (Unofficial) do?
This Actor gives you federal contract opportunities posted on SAM.gov (solicitations, presolicitations, sources sought, special notices and award notices) as one clean, flat row per notice, with a link to the notice on SAM.gov. Every row is checked against a fixed schema before it is saved.
It has two data sources:
- Daily CSV (default, no key needed). Reads SAM.gov's public Contract Opportunities data extract, which GSA publishes on SAM.gov Data Services and refreshes once a day. Best for a daily feed of new notices.
- SAM.gov API (needs your own free SAM.gov API key). Searches the live SAM.gov Get Opportunities Public API. Use it for notices posted today, inactive or archived notices, and SAM.gov's own search.
Put it on a schedule to get a daily feed of new and changed notices for your NAICS codes, set-asides, states or agencies, or run it once to research a market.
This actor is not affiliated with, endorsed by, or sponsored by the U.S. General Services Administration (GSA) or SAM.gov. Data comes from SAM.gov's public data extract and public API.
What data can you extract?
| Field | What it is |
|---|---|
noticeId | SAM.gov notice ID (unique key) |
title, solicitationNumber | Notice title and solicitation number |
noticeType, baseNoticeType, active | Notice type (e.g. Solicitation, Sources Sought, Award Notice) and status |
postedDate, responseDeadline, archiveDate, archiveType | Key dates |
department, subTier, office, agencyPath, agencyPathCode | Buying organization (agencyPathCode: API only) |
naicsCode, classificationCode | NAICS and product/service code |
setAsideCode, setAsideDescription | Small-business set-aside |
placeOfPerformanceCity/State/Zip/Country | Where the work happens |
officeCity/State/Zip/Country | Contracting office location (no street address) |
awardNumber, awardDate, awardAmount, awardeeName, awardeeUeiSam, awardeeWithheld | Award details for award notices (awardeeUeiSam: API only; see Limits) |
samUrl | Link to the notice on SAM.gov |
descriptionApiUrl, additionalInfoLink, attachmentLinks | Description API link (needs an API key to open), additional-info and attachment links (attachments: API only) |
description | Plain-text notice description, only when Include full descriptions is on (otherwise null) |
changeStatus | new, updated or unchanged when change tracking is on |
source | SAM.gov Contract Opportunities public data extract (CSV) or SAM.gov Get Opportunities Public API v2 |
retrievedAt | When the row was fetched |
Point-of-contact names, emails and phone numbers are not included, in either mode.
Awardee names are passed through only as SAM.gov publishes them in the award notice. The Actor does not enrich them (no lookups in other sources), does not combine them with other data, and does not build any person-level or company-level profiles or aggregates. In the CSV, SAM.gov sometimes appends the awardee's street address to the name; the Actor removes that address.
Reliability
- Validated rows. Every row is checked against a fixed schema before it is saved; rows that fail are skipped, counted in the run summary and not charged.
- Retries. CSV downloads are retried with backoff and resume past rows already read; API calls are retried with backoff and respect SAM.gov's
Retry-After. - Freshness checks. The run status shows when SAM.gov last updated the CSV and the newest posted date in it, and warns if the file is more than 48 hours old, missing, or has changed format.
- Change tracking. Optional
new/updated/unchangedlabels, and an option to save only new or updated notices, so a daily schedule gives you just what changed. - Two sources. If you need same-day or inactive notices, switch to API mode with your own key; the output format is the same.
- Past deadlines skipped. SAM.gov sometimes posts or updates notices whose response deadline is already over (we have seen a notice posted in October 2026 with a 2022 deadline). By default (Skip notices whose response deadline has passed,
skipPastDeadlines: true) these are not saved or charged; the run log andRUN_SUMMARY.pastDeadlineSkippedshow how many were skipped. - Run summary. A
RUN_SUMMARYrecord lists counts, skipped rows, API requests used and the CSV file's date.
Use cases
- Small businesses and 8(a)/WOSB/SDVOSB firms: a daily list of new set-aside opportunities in your NAICS codes.
- Capture and BD teams: track sources-sought and presolicitation notices early, before the RFP.
- GovCon consultants: run saved searches for each client and send them to a spreadsheet.
- Market researchers: pull award notices for an agency or NAICS code.
- Developers: feed validated JSON into a CRM, database or alerting workflow through the Apify API.
How to use it
Daily CSV (no key):
- Leave Data source on Daily public CSV extract.
- Pick a date range (Posted in the last N days; default 3) and any filters: keywords, NAICS codes, notice types, set-aside, state, agency.
- Set Max results and click Start. For a daily feed, schedule it once a day with Mark new and updated notices and Only save new or updated notices.
SAM.gov API (your key):
- Get your free SAM.gov API key: sign in to SAM.gov (sign-in uses login.gov), open Account Details, and copy your Public API Key.
- Set Data source to SAM.gov API and paste the key into SAM.gov API key. It is a secret input: Apify stores it encrypted and masks it in the UI. The Actor sends it only to api.sam.gov and never writes it to logs, results, the key-value store or error messages.
- Pick the date range and filters, then click Start.
Download the results as JSON, CSV or Excel, or connect them to your tools.
Input examples
These are also in the examples/ folder.
Daily keyless feed of small-business IT notices (schedule it daily) (examples/daily-it-small-business-feed.json):
{"lastNDays": 3,"naicsCodes": ["541512"],"noticeTypes": ["o", "k", "r"],"setAside": "SBA","maxResults": 200,"trackChanges": true,"onlyNewOrUpdated": true}
Keyword search over the last 30 days, with full descriptions (keyless CSV source) (examples/keyword-search-30-days.json):
{"lastNDays": 30,"keywords": ["cyber", "software"],"noticeTypes": ["o", "k"],"maxResults": 500,"includeDescriptions": true}
Live API search for today's notices, with your own SAM.gov key (replace the placeholder) (examples/live-api-today.json):
{"mode": "api","apiKey": "YOUR_SAM_GOV_PUBLIC_API_KEY","lastNDays": 1,"naicsCodes": ["541512"],"maxResults": 100}
Output example
Real sample: 3 rows from a test run on October 17, 2026, with the default input (links shown without ``; the dataset has full links).
[{"noticeId": "99fd1b07ae8f43b28278ad6ba7a45046","title": "Industry Day Announcement - Area Maintenance Support Activity (AMSA) / Vehicle Maintenance Shop (VMS) located in Joint Base Elmendorf-Richardson, Alaska","solicitationNumber": null,"noticeType": "Special Notice","baseNoticeType": "Special Notice","active": true,"postedDate": "2026-10-16","responseDeadline": "2026-10-26T10:00:00-08:00","archiveDate": "2026-11-10","archiveType": "auto15","agencyPath": "DEPT OF DEFENSE.DEPT OF THE ARMY.W072 ENDIST LOUISVILLE","agencyPathCode": null,"department": "DEPT OF DEFENSE","subTier": "DEPT OF THE ARMY","office": "W072 ENDIST LOUISVILLE","naicsCode": null,"classificationCode": null,"setAsideCode": null,"setAsideDescription": null,"placeOfPerformanceCity": "JBER","placeOfPerformanceState": "AK","placeOfPerformanceZip": null,"placeOfPerformanceCountry": "USA","officeCity": "LOUISVILLE","officeState": "KY","officeZip": "40202-2230","officeCountry": "USA","awardNumber": null,"awardDate": null,"awardAmount": null,"awardeeName": null,"awardeeUeiSam": null,"awardeeWithheld": false,"samUrl": "sam.gov/opp/99fd1b07ae8f43b28278ad6ba7a45046/view","descriptionApiUrl": "api.sam.gov/prod/opportunities/v1/noticedesc?noticeid=99fd1b07ae8f43b28278ad6ba7a45046","description": null,"additionalInfoLink": null,"attachmentLinks": [],"changeStatus": null,"source": "SAM.gov Contract Opportunities public data extract (CSV)","retrievedAt": "2026-10-18T00:04:12.125Z"},{"noticeId": "67dc8ac85a804bbaa45e354f377edc40","title": "Human Cadaver - Based Medical Training and Program Support Services for the 44th Medical Brigade stationed at Fort Bragg Army Base, North Carolina.","solicitationNumber": "0012468284","noticeType": "Sources Sought","baseNoticeType": "Sources Sought","active": true,"postedDate": "2026-10-16","responseDeadline": "2026-10-30T16:00:00-05:00","archiveDate": "2026-11-14","archiveType": "auto15","agencyPath": "DEPT OF DEFENSE.DEPT OF THE ARMY.W40M MRC0 WEST","agencyPathCode": null,"department": "DEPT OF DEFENSE","subTier": "DEPT OF THE ARMY","office": "W40M MRC0 WEST","naicsCode": "621991","classificationCode": "6555","setAsideCode": "NONE","setAsideDescription": "No Set aside used","placeOfPerformanceCity": "JBSA Ft Sam Houston","placeOfPerformanceState": "TX","placeOfPerformanceZip": "78234","placeOfPerformanceCountry": "USA","officeCity": "JBSA FT SAM HOUSTON","officeState": "TX","officeZip": "78234-4504","officeCountry": "USA","awardNumber": null,"awardDate": null,"awardAmount": null,"awardeeName": null,"awardeeUeiSam": null,"awardeeWithheld": false,"samUrl": "sam.gov/opp/67dc8ac85a804bbaa45e354f377edc40/view","descriptionApiUrl": "api.sam.gov/prod/opportunities/v1/noticedesc?noticeid=67dc8ac85a804bbaa45e354f377edc40","description": null,"additionalInfoLink": null,"attachmentLinks": [],"changeStatus": null,"source": "SAM.gov Contract Opportunities public data extract (CSV)","retrievedAt": "2026-10-18T00:04:12.125Z"},{"noticeId": "57659a9c0f784b7586319003cdd087cc","title": "W9124G26CBARRACKS","solicitationNumber": "052917","noticeType": "Combined Synopsis/Solicitation","baseNoticeType": "Combined Synopsis/Solicitation","active": true,"postedDate": "2026-10-16","responseDeadline": "2026-11-17T12:00:00-06:00","archiveDate": "2026-12-02","archiveType": "auto15","agencyPath": "DEPT OF DEFENSE.DEPT OF THE ARMY.W6QM MICC-FT RUCKER","agencyPathCode": null,"department": "DEPT OF DEFENSE","subTier": "DEPT OF THE ARMY","office": "W6QM MICC-FT RUCKER","naicsCode": "561621","classificationCode": "S211","setAsideCode": "SBA","setAsideDescription": "Small Business Set Aside - Total","placeOfPerformanceCity": "Fort Rucker","placeOfPerformanceState": "AL","placeOfPerformanceZip": "36362","placeOfPerformanceCountry": "USA","officeCity": "FORT RUCKER","officeState": "AL","officeZip": "36362","officeCountry": "USA","awardNumber": null,"awardDate": null,"awardAmount": null,"awardeeName": null,"awardeeUeiSam": null,"awardeeWithheld": false,"samUrl": "sam.gov/opp/57659a9c0f784b7586319003cdd087cc/view","descriptionApiUrl": "api.sam.gov/prod/opportunities/v1/noticedesc?noticeid=57659a9c0f784b7586319003cdd087cc","description": null,"additionalInfoLink": null,"attachmentLinks": [],"changeStatus": null,"source": "SAM.gov Contract Opportunities public data extract (CSV)","retrievedAt": "2026-10-18T00:04:12.125Z"}]
The full field list is in the Output tab.
How much does it cost?
- $0.01 per run start (Apify's Actor start event) plus $2.50 per 1,000 opportunities saved ($0.0025 each, the
opportunityevent), the same in either data source. Example: 1,000 results = $0.01 + $2.50 = $2.51. Runs using more than 1 GB of memory incur one extra start charge per additional GB. - You pay only for rows that are saved. Rows skipped as duplicates, invalid, filtered out or unchanged are free.
- Set Maximum cost per run when you start a run; the Actor stops when it reaches your cap.
- The daily CSV needs no SAM.gov account or key. A SAM.gov API key is free, but personal keys of non-federal users without an entity role may be limited to about 10 API requests a day (GSA's documentation for SAM.gov public APIs states this; it isn't confirmed for this API). See Limits for what that means and how to get about 1,000 a day for free.
Limits
Daily CSV:
- Updated once a day. GSA refreshes the extract daily (observed around 03:30 UTC), and it lists notices posted up to the previous day. The run status shows when the file was last updated and the newest posted date in it. Use the API source for notices posted today.
- Active notices only. Archived or inactive notices aren't in the file.
- Fields the CSV doesn't have: awardee UEI, attachment links and the agency path code are
nullor empty. - Fast for recent dates. The file lists the newest notices first, so a run for the last few days reads only a few MB of the roughly 200 MB file. Very long date ranges read the whole file (a few seconds of download in our tests, more if many rows are saved).
- If the file is missing, changes format, or is more than 48 hours old, the run says so clearly.
SAM.gov API:
- Request quota. SAM.gov limits requests per key per 24 hours. GSA's SAM.gov System Account User Guide (v3.03) lists 10 requests per 24 hours for a personal key of a non-federal user who is not associated with an entity, and 1,000 for a non-federal user with a role on an entity registration and for federal users. The Get Opportunities API page says only that limits depend on "federal or non-federal or general roles", so the exact limit for your key can differ. Users report the quota resets at midnight UTC.
- What 10 requests a day gets you. Each request returns up to 1,000 notices, so 10 requests is at most 10,000 notices a day. Each NAICS code is at least one request, and each full description is one more. A daily search for one NAICS code is usually 1 request.
- About 1,000 requests a day, free. Per the same GSA guide, non-federal users get 1,000 a day once they have a role on an entity registered in SAM.gov, for example a Viewer role. If your company is registered in SAM.gov, request the role in SAM.gov and your entity's administrator approves it; if it isn't, entity registration comes first. Copy your API key again after the role is approved.
- How the Actor saves requests. It asks for the largest page needed (up to 1,000), pages before it splits date ranges, keeps full descriptions off by default, and stops at Max SAM.gov requests per run (default 8). The run summary shows
SAM.gov requests used: X of Y allowed this run. If SAM.gov says the quota is used up, the Actor keeps everything already saved and shows when SAM.gov says the key can be used again. - Slow responses. Some users report SAM.gov API requests taking up to about a minute each.
- Very busy days. If more than about 1,000 notices match on a single day, SAM.gov may not let the API page through all of them; the run summary reports any it couldn't reach.
- Keywords match titles only (in both sources).
Both sources:
- One set-aside per run.
- Older award notices. For awards dated before April 4, 2022, the awardee name and ID are left out (
awardeeWithheld: true), because SAM.gov's terms say those records may contain restricted third-party data. - Descriptions are off by default. With Include full descriptions on, the CSV source takes them from the file at no extra cost; the API source uses one request per description, capped by Max descriptions (default 5). Emails and phone numbers are removed from the text. Descriptions are written by contracting offices and can still mention people by name.
- No personal data: contact names, emails, phones and street addresses are dropped.
- Past-deadline filter (
skipPastDeadlines, on by default). A notice is skipped only when its response deadline has certainly passed at the time of the run: deadlines with a time zone are compared exactly, a deadline without a time zone counts as passed only once it has passed everywhere (UTC-12), and a date-only deadline lasts until the end of that day everywhere. Notices with no deadline (or one that can't be read) are always kept. Award notices, justifications and bundling notices are never skipped, because they record something that already happened and their deadline field doesn't mean the notice is closed. Turn the option off to get every notice, for example for research on past solicitations. In API mode, with the option on, each request asks for a full page (up to 1,000 notices) so that skipped notices don't cost extra requests.
Integrations and API
Schedule runs daily, send results to Google Sheets, Slack or email through Apify integrations, trigger webhooks when a run finishes, or start runs and fetch results from your own code with the Apify API. A RUN_SUMMARY record in the key-value store lists counts, requests used, the CSV file's date and anything skipped.
FAQ
Which data sources does it use? Only two: SAM.gov's public Contract Opportunities data extract (the daily CSV file GSA publishes on SAM.gov Data Services, which SAM.gov describes as "available as a daily electronic download in order to promote data sharing"), and the SAM.gov Get Opportunities Public API (api.sam.gov) with your own key. It doesn't scrape sam.gov pages or use SAM.gov's internal website search. SAM.gov's terms of use say that SAM.gov "makes certain data available via APIs and extracts" and that "Automated data gathering, web scraping tools are prohibited". They also say "Most material on our site is free of copyright and may be copied and distributed without permission", with exceptions such as restricted Dun & Bradstreet data in older award records (see Limits). This is not legal advice; read SAM.gov's terms of use for your own use case.
Do I need a SAM.gov account or API key? Not for the default daily CSV. You need your own free key only for the API source.
Why use my own key for the API? SAM.gov's terms of use say "Do not share your individual account API key with anyone", and each key has its own daily quota.
How many API requests do I get? It depends on your SAM.gov account. GSA's documentation for SAM.gov public APIs lists about 10 requests a day for personal keys of non-federal users without an entity role and 1,000 a day with a role (such as Viewer) on a registered entity, approved by that entity's administrator. That number isn't confirmed for this specific API.
Why did I get fewer results than expected? Check the run summary: your filters, keywords (title only), the date range (the CSV holds notices up to the previous day, active ones only), the API request cap, or a very busy day can reduce results. Notices skipped as duplicates, unchanged, or past their response deadline (skipPastDeadlines) are listed there too.
My key stopped working. SAM.gov asks users to renew API keys every 90 days. Copy the current key from Account Details.
I got an "over its request limit" error. Your key used its daily quota (HTTP 429). Results saved before that are kept. Run again after the time shown in the run status, use fewer NAICS codes, turn off full descriptions, or switch to the daily CSV.
How do I report a problem? Open an issue on the Issues tab with the run ID. Please don't paste your API key.