SAM.gov Opportunities Scraper — Federal Contract Monitor avatar

SAM.gov Opportunities Scraper — Federal Contract Monitor

Pricing

from $2.43 / 1,000 opportunities

Go to Apify Store
SAM.gov Opportunities Scraper — Federal Contract Monitor

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

Vitalii Bondarev

Maintained by Community

Actor stats

0

Bookmarked

13

Total users

2

Monthly active users

4 days ago

Last modified

Features

Limited permissions

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 familyFieldsTypeDescription
Identitynotice_id, title, solicitation_numberstringOpportunity identifier, title and solicitation or notice number
Noticenotice_type, notice_type_codestringNotice classification and code
Lifecycleis_active, is_canceledbooleanActive and canceled status flags
Datespublish_date, response_date, modified_datestringPosting 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
Amendmentsmodification_countintegerAmendment count
Organizationdepartment, agency, officestringAwarding-organization hierarchy
Classificationnaics_code, classification_code, set_asidestringNAICS, PSC/classification code and small-business set-aside
Contactcontact_name, contact_email, contact_phonestringPrimary point-of-contact details; contact_name can be free text rather than a clean name
Locationpop_city, pop_state, pop_zip, pop_countrystringPlace of performance
ContentdescriptionstringSearch-result snippet; the detail-page text fills it only when the snippet is empty
Awardaward_amountnumber or nullAward amount from the detail payload; null when the detail request is off or the notice has no award
LinkurlstringDirect 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.

PlanActor Start eventOpportunity event
Free plan$0.00005 per Actor Start event$0.0025 per opportunity event

Each row below uses one Actor Start event.

ResultsOpportunity eventsActor Start eventTotal on the Free plan
100100 × $0.0025 = $0.25$0.00005$0.25005
1,0001,000 × $0.0025 = $2.50$0.00005$2.50005
10,00010,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

  1. Open the Actor in Apify and enter the filters for the federal opportunities you want to collect.
  2. Leave activeOnly on to return only currently active (not archived) opportunities; turn it off to remove this restriction.
  3. Enable includeDetails to fetch detail pages.
  4. Set maxItems between 1 and 10000.
  5. Run the Actor and review the resulting flat records in the Apify dataset.
  6. 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

ParameterWhat it doesDefault
keywordSearches 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)
naicsCodeFilters by a NAICS code, such as 541512.Empty string
noticeTypeRestricts 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
setAsideRestricts 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
organizationIdFilters by awarding agency using its SAM.gov organization ID.Empty string
placeOfPerformanceStateFilters by a two-letter US state code, such as VA.Empty string
modifiedFromIncludes opportunities modified on or after this date. Use YYYY-MM-DD-04:00 format with a timezone offset.Empty string
modifiedToIncludes opportunities modified on or before this date. Use YYYY-MM-DD-04:00 format with a timezone offset.Empty string
activeOnlyWhen on, returns only currently active (not archived) opportunities; turn it off to remove this restriction.true
includeDetailsFetches 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
maxItemsSets the maximum number of opportunities to return. Accepted range: 1 to 10000.100
apiKeyOptional public api.sam.gov key. It is not required for the Actor to work.Empty string
proxyConfigurationConfigures the Apify proxy used to reach SAM.gov.Apify Proxy with RESIDENTIAL and country US
disableUsageStatsSet to true to turn off the run summary described in Usage statistics.false

Limits and edge cases

ConditionWhat the buyer seesWhat to do
The search service reaches its maximum result ceilingThe 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 filtersThe 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 responseOnly 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 opportunityThe 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 runRecords 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.

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.

Full list of collected fields