# SAM.gov Federal Contract Opportunities (`tabulary/sam-gov-contract-notices`) Actor

US federal government contract opportunities from SAM.gov's official public extract: solicitations, RFPs, sources sought, presolicitations and awards. Filter by keyword, NAICS code, set-aside, agency and deadline. Optional contract alerts: only new notices since the last run.

- **URL**: https://apify.com/tabulary/sam-gov-contract-notices.md
- **Developed by:** [Tabulary](https://apify.com/tabulary) (community)
- **Categories:** Business, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.05 / 1,000 contract notices

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does SAM.gov Federal Contract Opportunities do?

It gives you **US federal government contract opportunities** from SAM.gov's official public
**Contract Opportunities extract**: solicitations, RFPs, combined synopses, presolicitations,
sources sought, special notices and award notices from every federal agency. Filter by keyword,
NAICS code, small-business set-aside, agency, notice type and deadline, and get one clean record
per notice. Turn on **only new since the last run** and schedule it, and you have a federal
contract alert feed that costs cents. Government contractors, capture and BD teams, consultants and
AI agents use it to find federal bids early. No SAM.gov account or API key needed.

### What you get

- Title, solicitation number, notice type (Solicitation, Sources Sought, Award Notice and more),
  agency, sub-tier and office, and the link to the notice on SAM.gov.
- Posted date, response deadline and **days left until the deadline**, plus the archive date.
- NAICS code, product/service (classification) code, and the set-aside (8(a), HUBZone, SDVOSB,
  WOSB and the rest).
- Place of performance: city, state, ZIP and country.
- For awards: award number, date, amount and awardee.
- The full notice description, with contact details removed.
- Only-new delivery for scheduled runs: you never pay twice for the same notice.
- Export as JSON, CSV or Excel, send to Google Sheets, Slack or a webhook, or call it as a tool
  from AI agents through the Apify MCP server.

### How much does it cost?

You pay per contract notice saved, with no monthly fee: **$1.50 per 1,000 contract notices** on
Apify's free plan, and 10–40% less on paid Apify plans. Each run also costs $0.001 to start. Apify's free plan includes $5 of credit
every month, enough for about 3,300 contract notices. Prices as of October 2026; the price shown on
this page is the one that applies.

| Use | Contract notices | Cost on the free plan |
|---|---|---|
| One search | 100 | about $0.15 |
| Daily alert for your NAICS codes, about 40 new notices a day | about 1,200 a month | about $1.80 a month |
| Every notice posted in the last week | about 3,500 | about $5.25 |

Set **Maximum cost per run** to cap any run; the Actor stops cleanly at the cap and keeps
everything it saved.

### Ready-made searches

Paste one of these into the JSON input tab, or set the same fields in the form.

**IT services opportunities (NAICS 5415), open for responses, last 7 days** · [open this example](https://apify.com/tabulary/sam-gov-contract-notices/examples/sam-gov-it-services-opportunities)

```json
{ "naicsPrefixes": ["5415"], "onlyOpenDeadline": true, "daysBack": 7, "maxItems": 500 }
```

**Daily small-business alert: 8(a) and SDVOSB set-asides** (schedule it every morning) · [open this example](https://apify.com/tabulary/sam-gov-contract-notices/examples/sam-gov-8a-sdvosb-set-aside-alerts)

```json
{ "setAsideCodes": ["8A", "SDVOSBC"], "daysBack": 2, "onlySinceLastRun": true, "maxItems": 1000 }
```

**Sources sought and presolicitations: get in before the RFP** · [open this example](https://apify.com/tabulary/sam-gov-contract-notices/examples/sam-gov-sources-sought-cybersecurity)

```json
{ "noticeTypes": ["Sources Sought", "Presolicitation"], "keyword": "cybersecurity", "daysBack": 14, "maxItems": 300 }
```

**Who is winning: award notices from one agency** · [open this example](https://apify.com/tabulary/sam-gov-contract-notices/examples/sam-gov-va-award-notices)

```json
{ "noticeTypes": ["Award Notice"], "agency": "Veterans Affairs", "daysBack": 30, "maxItems": 1000 }
```

### Contract alerts: only new since the last run

1. Set your filters and turn on **Only new since the last run (contract alerts)**.
2. Save it as a task and add an Apify **Schedule** (for example every weekday at 07:00).
3. Connect the output: Apify's built-in Slack and email notifications, a webhook, or Make, Zapier
   and n8n to push each new notice into Google Sheets, a CRM or a Teams channel.

Each run returns only notices that earlier runs with the same filters have not delivered, newest
first, so you pay only for what is new. A notice re-posted with a new date (for example an
amendment) is delivered again. The first run returns everything that matches. If a run stops at
your maximum results or spending limit, the rest is delivered next time. The memory is kept per
set of filters, so separate tasks never interfere.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `daysBack` | integer | `2` | Notices posted in the last 1 to 30 days. |
| `keyword` | string | `""` (all) | Keep notices whose title or description contains this word or phrase. |
| `naicsPrefixes` | array | `[]` | Keep notices whose NAICS code starts with any of these, e.g. `541512`. |
| `setAsideCodes` | array | `[]` | Keep only these set-asides: `SBA`, `SBP`, `8A`, `8AN`, `HZC`, `SDVOSBC`, `WOSB`, `WOSBSS`, `ISBEE`, `IEE`, `VSA`, `BICiv`, `NONE`. |
| `agency` | string | `""` | Keep notices whose department or agency name contains this text, e.g. `Air Force`. |
| `noticeTypes` | array | `[]` (all) | `Solicitation`, `Presolicitation`, `Combined Synopsis/Solicitation`, `Sources Sought`, `Special Notice`, `Sale of Surplus Property`, `Award Notice`, `Justification`. |
| `onlyOpenDeadline` | boolean | `false` | Skip notices whose response deadline has passed. |
| `onlySinceLastRun` | boolean | `false` | Return only notices that earlier runs with the same filters have not delivered (see Contract alerts). |
| `maxItems` | integer | `20` | Stop after this many notices, newest first. |

### Output

One dataset item per notice. A real item from a test run on 20 October 2026 (`daysToDeadline`
added for illustration):

```json
{
  "noticeId": "e5a50c4bacc5478bbea335f8ca2c1d89",
  "title": "Systems Warfighting Architecture Navigator (SWAN) Operations, Sustainment, and Decision Support Services",
  "solicitationNumber": null,
  "agency": "DEPT OF DEFENSE",
  "subTier": "DEPT OF THE AIR FORCE",
  "office": "FA8802 INTEGRATION OPERATION PIKPKE",
  "noticeType": "Special Notice",
  "baseType": "Sources Sought",
  "postedDate": "2026-10-20T20:02:16",
  "responseDeadline": "2026-10-26T17:00:00-07:00",
  "daysToDeadline": 6,
  "archiveDate": "2026-10-29",
  "setAsideCode": null,
  "setAside": null,
  "naicsCode": null,
  "classificationCode": null,
  "placeOfPerformanceCity": "El Segundo",
  "placeOfPerformanceState": "CA",
  "placeOfPerformanceZip": "90245",
  "placeOfPerformanceCountry": "USA",
  "active": true,
  "awardNumber": null,
  "awardDate": null,
  "awardAmount": null,
  "awardee": null,
  "url": "https://sam.gov/workspace/contract/opp/e5a50c4bacc5478bbea335f8ca2c1d89/view",
  "additionalInfoUrl": null,
  "description": "Description Space Systems Command (SSC) is hosting a virtual Industry Day..."
}
```

`postedDate` is exactly as published; the extract states no time zone for it (SAM.gov commonly
uses Eastern Time). `responseDeadline` includes SAM.gov's own UTC offset. `daysToDeadline` counts
whole days from the moment of the run. Fields the source leaves blank are `null`, never guessed.

### Use it from AI agents

Add the Actor to Claude, ChatGPT, Cursor or any MCP client through the Apify MCP server
(`https://mcp.apify.com?tools=tabulary/sam-gov-contract-notices`). Ask in plain language, for
example: "Find open federal sources-sought notices for cloud migration posted this week." The agent
fills in the input and gets structured records back.

### Use it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/tabulary~sam-gov-contract-notices/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"naicsPrefixes": ["541512"], "daysBack": 3, "maxItems": 50}'
```

The same works with the Apify Python and JavaScript clients. See the API tab for details.

### Data source and limits

- Source: SAM.gov's official
  [Contract Opportunities data extract](https://sam.gov/data-services/Contract%20Opportunities?privacy=Public),
  a daily CSV file of all federal contract notices, published under SAM.gov's
  [terms of use](https://sam.gov/about/terms-of-use) as a U.S. Government Work. The Actor
  downloads the published extract through its documented redirect and reads only the bytes it
  needs; it never visits sam.gov's search pages, which the terms reserve from automated access.
- The extract is refreshed once a day, so a notice posted this morning may appear tomorrow.
- Filters run inside the Actor. Longer windows read more of the file and take longer.
- The Actor sends at most about one request per second and identifies itself.
- No personal data: contact names, emails, phones and faxes are dropped from every notice, and any
  that appear in free text are redacted.
- Not affiliated with or endorsed by the U.S. General Services Administration or SAM.gov.

### Other Tabulary tools

Clean data from official and public sources, priced per result:

- [UK Tenders API: Contracts Finder & Find a Tender](https://apify.com/tabulary/uk-public-tenders)
- [EU Tenders API: TED Public Procurement Notices](https://apify.com/tabulary/eu-ted-tenders)
- [Airport METAR & TAF Weather](https://apify.com/tabulary/airport-weather-metar-taf)
- [Company Job Postings: Greenhouse, Lever, Ashby & Workable](https://apify.com/tabulary/multi-ats-job-postings)
- [Remote Jobs API: RemoteOK & Jobicy Postings](https://apify.com/tabulary/remote-jobs-feed)

### FAQ

**Is this data official?** Yes. It comes from SAM.gov's own published daily extract, unchanged
except for field names, formatting and removed contact columns.

**Do I need a SAM.gov account or API key?** No. The extract is public.

**How do I get new opportunities every morning?** Turn on only-new delivery, save the input as a
task and schedule it (see Contract alerts).

**Why are some fields `null`?** Not every notice has every field. Only award notices carry an award
amount and awardee, and some notices have no NAICS code or set-aside.

**Can I get the contracting officer's contact details?** No. The Actor deliberately leaves out
personal contact data. Each record links to the notice on SAM.gov, which shows how to respond.

**Something broke?** Open an issue on the Issues tab. The Actor is tested daily.

### Changelog

- **2026-10-21:** contract alerts now remember per set of filters and never deliver a notice twice
  (earlier, saved tasks shared one memory and notices cut off by the run limit could be skipped);
  `daysToDeadline`; ready-made searches.
- **2026-10-21:** first version: SAM.gov's official daily extract with keyword, NAICS, set-aside,
  agency, notice-type and deadline filters.

### About Tabulary

This tool is part of [Tabulary](https://apify.com/tabulary): clean tables from official public
sources. Every Tabulary tool uses the source's official API or open data where one exists,
collects no personal data, and is tested on Apify every day. Questions or ideas? Open an issue on
the Issues tab.

# Actor input Schema

## `daysBack` (type: `integer`):

Only notices posted in this many days, counting back from now. The extract is read newest-first, so a smaller window means a faster, cheaper run.

## `keyword` (type: `string`):

Optional. Keep notices whose title or description contains this word or phrase (not case-sensitive). Leave empty for every notice in the window.

## `naicsPrefixes` (type: `array`):

Optional. Keep notices whose NAICS code starts with any of these, for example 541512 (computer systems design) or 236 (construction).

## `setAsideCodes` (type: `array`):

Optional. Keep only notices reserved for these small-business set-asides. Leave empty for every set-aside (including none).

## `agency` (type: `string`):

Optional. Keep notices whose contracting department or agency name contains this text, for example "Air Force" or "Veterans Affairs" (not case-sensitive).

## `noticeTypes` (type: `array`):

Optional. Keep only these notice types. Leave empty for every type.

## `onlyOpenDeadline` (type: `boolean`):

Skip notices whose response deadline has already passed. Notices with no stated deadline (such as award notices) are always kept.

## `onlySinceLastRun` (type: `boolean`):

For scheduled runs. Remembers which notices earlier runs with the same filters returned, and returns only notices it has not delivered before (or that were re-posted), newest first, so you never pay twice for a notice. The first run returns everything that matches. Notices beyond the maximum results or your spending limit come in the next run. The memory is kept per set of filters.

## `maxItems` (type: `integer`):

Stop after this many notices, newest first. Each notice is one billable dataset item.

## Actor input object example

```json
{
  "daysBack": 2,
  "keyword": "",
  "naicsPrefixes": [],
  "setAsideCodes": [],
  "agency": "",
  "noticeTypes": [],
  "onlyOpenDeadline": false,
  "onlySinceLastRun": false,
  "maxItems": 20
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "daysBack": 2,
    "keyword": "",
    "naicsPrefixes": [],
    "setAsideCodes": [],
    "agency": "",
    "noticeTypes": [],
    "onlyOpenDeadline": false,
    "onlySinceLastRun": false,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("tabulary/sam-gov-contract-notices").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "daysBack": 2,
    "keyword": "",
    "naicsPrefixes": [],
    "setAsideCodes": [],
    "agency": "",
    "noticeTypes": [],
    "onlyOpenDeadline": False,
    "onlySinceLastRun": False,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("tabulary/sam-gov-contract-notices").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "daysBack": 2,
  "keyword": "",
  "naicsPrefixes": [],
  "setAsideCodes": [],
  "agency": "",
  "noticeTypes": [],
  "onlyOpenDeadline": false,
  "onlySinceLastRun": false,
  "maxItems": 20
}' |
apify call tabulary/sam-gov-contract-notices --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tabulary/sam-gov-contract-notices"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/XyB14RLWNP6eQPn9X/builds/KfNUZGgXGwdEqiAzJ/openapi.json
