SAM.gov Opportunities Scraper — Federal Contract Monitor
Pricing
from $2.43 / 1,000 opportunities
SAM.gov Opportunities Scraper — Federal Contract Monitor
Collect SAM.gov opportunities. Use filters; no API key. Description is a short search-result snippet; detail-page text fills it only when empty with NAICS, set-aside, classification, contact_* and pop_*; contact_name may be free text. Pricing: $0.0025/opportunity + $0.00005/Actor Start on Free.
Pricing
from $2.43 / 1,000 opportunities
Rating
0.0
(0)
Developer
Vitalii Bondarev
Maintained by CommunityActor stats
0
Bookmarked
13
Total users
2
Monthly active users
4 days ago
Last modified
Categories
Features
Share
SAM.gov Opportunities Scraper
Scrape active US federal contract opportunities from SAM.gov, including solicitations, sources-sought notices, combined synopses and award notices. A run can return up to 10,000 records, and it reaches SAM.gov through an Apify residential proxy in the US by default.
- Filter opportunities by keyword, NAICS code, notice type, set-aside, agency, state and modification date.
- Monitor new and amended notices with a modified-date window and most-recently-modified ordering.
- Qualify GovCon leads using agency hierarchy, deadlines, NAICS, set-aside, contacts and place-of-performance fields.
- Extract structured records without a SAM.gov API key.
- Receive one flat record per opportunity with a direct SAM.gov URL and optional detail enrichment.
What you get
| Field family | Fields | Type | Description |
|---|---|---|---|
| Identity | notice_id, title, solicitation_number | string | Opportunity identifier, title and solicitation or notice number |
| Notice | notice_type, notice_type_code | string | Notice classification and code |
| Lifecycle | is_active, is_canceled | boolean | Active and canceled status flags |
| Dates | publish_date, response_date, modified_date | string | Posting date, offer deadline and last-modified date; response_date can be a plain date (2026-11-09) or a datetime with an offset, so parse both forms |
| Amendments | modification_count | integer | Amendment count |
| Organization | department, agency, office | string | Awarding-organization hierarchy |
| Classification | naics_code, classification_code, set_aside | string | NAICS, PSC/classification code and small-business set-aside |
| Contact | contact_name, contact_email, contact_phone | string | Primary point-of-contact details; contact_name can be free text rather than a clean name |
| Location | pop_city, pop_state, pop_zip, pop_country | string | Place of performance |
| Content | description | string | Search-result snippet; the detail-page text fills it only when the snippet is empty |
| Award | award_amount | number or null | Award amount from the detail payload; null when the detail request is off or the notice has no award |
| Link | url | string | Direct SAM.gov link |
The fields naics_code, set_aside, classification_code, award_amount, the contact and place-of-performance fields come from detail pages. With includeDetails off they stay empty.
Sample output
The sample below shows selected fields from one real record.
{"notice_id": "89983d6eef8d4d4e8954a7281804a249","title": "10--LH GAU-21 ADAPTER A","solicitation_number": "SPE7L127T2795","notice_type": "Combined Synopsis/Solicitation","notice_type_code": "k","is_active": true,"publish_date": "2026-10-28T02:40:10+00:00","response_date": "2026-11-09","modified_date": "2026-10-28T02:40:10+00:00","modification_count": 0,"department": "DEPT OF DEFENSE","agency": "DEFENSE LOGISTICS AGENCY","office": "DLA LAND","naics_code": "332994","set_aside": "SBA","url": "https://sam.gov/opp/89983d6eef8d4d4e8954a7281804a249/view"}
Pricing
The apify-actor-start event is charged once per GB of run memory, with a minimum of one event. The primary opportunity event represents one government contract opportunity with all fields, and one opportunity event is charged for each pushed opportunity record.
You pay only for the events listed below. This Actor does not use the Pay per event + usage option, so the platform usage of your runs (compute, proxy traffic and storage) is not billed to you separately.
| Plan | Actor Start event | Opportunity event |
|---|---|---|
| Free plan | $0.00005 per Actor Start event | $0.0025 per opportunity event |
Each row below uses one Actor Start event.
| Results | Opportunity events | Actor Start event | Total on the Free plan |
|---|---|---|---|
| 100 | 100 × $0.0025 = $0.25 | $0.00005 | $0.25005 |
| 1,000 | 1,000 × $0.0025 = $2.50 | $0.00005 | $2.50005 |
| 10,000 | 10,000 × $0.0025 = $25.00 | $0.00005 | $25.00005 |
The Free plan's $5 monthly credit covers 1,999 opportunity results at one Actor Start event, calculated as floor(($5 - $0.00005) / $0.0025).
How to use
- Open the Actor in Apify and enter the filters for the federal opportunities you want to collect.
- Leave
activeOnlyon to return only currently active (not archived) opportunities; turn it off to remove this restriction. - Enable
includeDetailsto fetch detail pages. - Set
maxItemsbetween1and10000. - Run the Actor and review the resulting flat records in the Apify dataset.
- Repeat the run through Apify Schedules, using daily as a starting point for a recurring opportunity monitor.
{"keyword": "cybersecurity","naicsCode": "541512","noticeType": "o","setAside": "SDVOSBC","placeOfPerformanceState": "VA","modifiedFrom": "2026-06-01-04:00","activeOnly": true,"includeDetails": true,"maxItems": 200,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }}
Export the resulting Apify dataset as JSON or CSV, or read it through the Apify dataset API.
Input parameters
| Parameter | What it does | Default |
|---|---|---|
keyword | Searches opportunity titles and descriptions for a free-text term. The Console form is prefilled with information technology; API runs without this field use no keyword. | No keyword (Console prefill: information technology) |
naicsCode | Filters by a NAICS code, such as 541512. | Empty string |
noticeType | Restricts results to one notice type. Accepted codes are o Solicitation, p Presolicitation, k Combined synopsis/solicitation, r Sources sought, g Sale of surplus, s Special notice, i Intent to bundle, a Award notice and u Justification. | Empty string, meaning any |
setAside | Restricts results to a small-business set-aside category. Accepted codes are SBA, 8A, 8AN, HZC, HZS, SDVOSBC, SDVOSBS, WOSB, EDWOSB, VSA, VSB, LAS, IEE, BI and SBP. | Empty string, meaning any |
organizationId | Filters by awarding agency using its SAM.gov organization ID. | Empty string |
placeOfPerformanceState | Filters by a two-letter US state code, such as VA. | Empty string |
modifiedFrom | Includes opportunities modified on or after this date. Use YYYY-MM-DD-04:00 format with a timezone offset. | Empty string |
modifiedTo | Includes opportunities modified on or before this date. Use YYYY-MM-DD-04:00 format with a timezone offset. | Empty string |
activeOnly | When on, returns only currently active (not archived) opportunities; turn it off to remove this restriction. | true |
includeDetails | Fetches each opportunity detail page. This adds one extra request per opportunity. When off, naics_code, set_aside, classification_code, the contact and place-of-performance fields stay empty. | true |
maxItems | Sets the maximum number of opportunities to return. Accepted range: 1 to 10000. | 100 |
apiKey | Optional public api.sam.gov key. It is not required for the Actor to work. | Empty string |
proxyConfiguration | Configures the Apify proxy used to reach SAM.gov. | Apify Proxy with RESIDENTIAL and country US |
disableUsageStats | Set to true to turn off the run summary described in Usage statistics. | false |
Limits and edge cases
| Condition | What the buyer sees | What to do |
|---|---|---|
| The search service reaches its maximum result ceiling | The Actor returns no more than 10000 records for a run. | Split a broad search into smaller keyword, agency or modified-date windows. |
| No opportunities match the selected filters | The dataset is empty because the search returned no result records. | Broaden the keyword, NAICS, set-aside, agency, state or modified-date filters. |
| SAM.gov returns an HTTP 429, any other non-2xx status or a non-JSON response | Only HTTP 429 is retried, up to 4 times with growing pauses. Any other non-2xx or non-JSON response stops the search immediately. All search pages are collected before any record is pushed, so the dataset can be empty. The Actor log shows SAM.gov API error. | Check the Actor log for SAM.gov API error and rerun; an empty dataset does not always mean no matches. |
| A detail request fails for an individual opportunity | The base record is retained, and the detail-enriched fields for that record may be empty. | Review the record and rerun if enrichment is important. |
| Records are collected during a run | Records are pushed to the dataset in batches of up to 100, with a final smaller batch after collection. An abort, timeout or uncaught failure can leave already pushed batches in the dataset; records still buffered are not pushed. | Run the Actor again to collect records that were not pushed. |
FAQ
How much does it cost to scrape SAM.gov opportunities?
See the Pricing section above for the per-event prices and cost examples.
What happens if the dataset is empty?
See the Limits and edge cases table: an empty dataset means either no matches or a SAM.gov error, and the Actor log tells them apart. Also review the modified-date format before rerunning.
What should I do if the Actor is not working?
Check that maxItems is between 1 and 10000 and confirm that date filters follow YYYY-MM-DD-04:00 format. Run a one-result test to check whether the selected filters return a record.
Is collecting public SAM.gov data legal or allowed?
The Actor collects publicly available US federal procurement information from SAM.gov for business-development and market-research use. Source terms and applicable law depend on your use case, so review them before using the data; this Actor does not provide a legal guarantee.
Usage statistics
This Actor creates a small, content-free summary at the end of each run, used only to monitor reliability and improve this Actor. No input values, credentials or scraped data are sent.
A copy of the exact record for your run is saved as USAGE_STATS in your own Apify key-value store.
To opt out, set disableUsageStats to true in the input. Nothing is sent then.