# Federal Contract Opportunities Feed (SAM.gov public data) (`appropriate_songbird/federal-contract-opportunities-feed`) Actor

Daily feed of open U.S. federal contract opportunities from GSA's public SAM.gov extract. Filter by keyword, NAICS, PSC, set-aside, agency, state and deadline. No API key needed. Only-new-since-last-run delta mode.

- **URL**: https://apify.com/appropriate_songbird/federal-contract-opportunities-feed.md
- **Developed by:** [Puneet](https://apify.com/appropriate_songbird) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Federal Contract Opportunities Feed (SAM.gov public data)

**Never miss a U.S. federal bid again.** Get every new federal contract opportunity that fits your business, as clean structured data, every morning. No SAM.gov API key, no 10-requests-a-day limit, no copy-pasting from search pages.

This Actor reads the public daily Contract Opportunities extract that the U.S. General Services Administration (GSA) publishes for SAM.gov. It filters the extract to your NAICS codes, keywords, set-asides, agencies and states, and returns only what is new since your last run.

### Who it's for

- **Small businesses and 8(a) / HUBZone / SDVOSB / WOSB firms** that want a daily list of set-aside bids they qualify for.
- **Capture and BD teams** that pipe new solicitations into a CRM, Slack, Airtable or Google Sheets.
- **Proposal consultants** that watch opportunities for several clients, using one saved task per client.
- **Market researchers** tracking what agencies are buying, and award notices with amounts.

### Why this one

| | This Actor | Typical alternatives |
|---|---|---|
| API key needed | **No** (optional: bring your own) | Usually yes, and personal keys are capped at about 10 requests/day |
| Coverage | **All active notices** in the official daily extract (70,000+ rows) | Limited by key quota / page scraping |
| Only new since last run | **Built in** (per filter set, stored in your own account) | Rare |
| Personal data | **Contracting officers' names, emails and phones removed** | Often included |
| Price | **$1.50 per 1,000 notices** + $0.01 per run | Paid alert services cost $49–$149/month |

### What you get (sample output)

One dataset item per notice:

```json
{
  "noticeId": "f50d635e4b9d4404916c47df2357fc66",
  "title": "Admin Management, Data Management, Software Development (Quality Assurance Inspection Software for EMS)",
  "solicitationNumber": "36C26026Q1017",
  "noticeType": "Combined Synopsis/Solicitation",
  "baseType": "Combined Synopsis/Solicitation",
  "department": "VETERANS AFFAIRS, DEPARTMENT OF",
  "subTier": "VETERANS AFFAIRS, DEPARTMENT OF",
  "office": "260-NETWORK CONTRACT OFFICE 20 (36C260)",
  "officeCity": "VANCOUVER",
  "officeState": "WA",
  "postedDate": "2026-10-13T18:26:14",
  "responseDeadline": "2026-11-03T17:00:00-08:00",
  "archiveDate": "2026-11-18",
  "naicsCode": "541519",
  "pscCode": "H979",
  "setAsideCode": "SDVOSBC",
  "setAside": "Service-Disabled Veteran-Owned Small Business (SDVOSB) Set-Aside (FAR 19.14)",
  "placeOfPerformance": {"city": null, "state": "OR", "zip": "97239", "country": "USA"},
  "active": true,
  "award": null,
  "daysUntilDeadline": 19,
  "samUrl": "https://sam.gov/opp/f50d635e4b9d4404916c47df2357fc66/view",
  "additionalInfoLink": null,
  "source": "SAM.gov Contract Opportunities public data (U.S. General Services Administration). U.S. Government work, public domain. Not affiliated with or endorsed by GSA.",
  "dataMode": "public-extract",
  "extractLastModified": "2026-10-14T03:30:44+00:00"
}
```

Award notices also fill `award` with `number`, `date`, `amountUsd` and `awardeeName`. The dataset has two ready-made table views: **Opportunities** and **Awards**. Export as JSON, CSV, Excel or XML, or connect it to Zapier, Make, Google Sheets or a webhook.

### Inputs

| Field | What it does | Example |
|---|---|---|
| `keywords` | Match any word or phrase in the title and description | `["software", "zero trust"]` |
| `excludeKeywords` | Drop notices containing these | `["construction"]` |
| `naicsCodes` | NAICS, prefix match | `["541512", "5415"]` |
| `pscCodes` | Product Service Codes, prefix match | `["D3", "7030"]` |
| `setAside` | Set-aside codes (`NONE` = no set-aside) | `["SBA", "8A", "SDVOSBC"]` |
| `noticeTypes` | Solicitation, Combined Synopsis/Solicitation, Presolicitation, Sources Sought, Special Notice, Award Notice, Justification, Sale of Surplus Property | `["Solicitation"]` |
| `agencies` | Department / sub-tier / office contains | `["ARMY", "VETERANS"]` |
| `placeOfPerformanceStates` | Two-letter state codes | `["CA", "TX"]` |
| `postedWithinDays` | Posted in the last N days (0 = any) | `7` |
| `responseDeadlineAfter` | Still open on this date | `2026-11-01` |
| `onlyNewSinceLastRun` | Deliver each notice once per filter set (default on) | `true` |
| `includeDescription` | Add the full agency description text | `false` |
| `maxResults` | Cap, newest first | `1000` |
| `ownSamApiKey` | Optional: your own SAM.gov key for same-day data (stored as a secret, never logged) | — |

**Tip:** create one saved Task per client or per capability (for example "IT set-asides in VA/MD/DC") and schedule it daily at 8 am. With *Only new since last run* on, each morning's dataset has just the new bids.

### Pricing (pay per event)

| Event | Price |
|---|---|
| Run started | $0.01 |
| Opportunity delivered | $0.0015 (= $1.50 per 1,000) |
| Full description added (only if enabled) | $0.0005 per opportunity |

Example: a daily scheduled run that finds 25 new matching notices costs about $0.05 a day, roughly **$1.50 a month**. You can cap any run with Apify's *maximum cost per run* setting; the Actor stops cleanly when the cap is reached. Platform compute is included in these prices.

### Data source and licence

- **Source:** the Contract Opportunities public data extract published by the U.S. General Services Administration through SAM.gov Data Services (`sam.gov/data-services`), refreshed daily. Each item links to the notice on SAM.gov.
- **Licence:** works of the U.S. Government are in the public domain in the U.S. (17 U.S.C. §105), as SAM.gov's own Terms of Use note.
- **How we access it:** one download of the public extract per run, the route GSA's terms point automated users to. This Actor never scrapes SAM.gov web pages and never uses a shared API key. If you supply your own key, it is used only for your run, as the SAM.gov terms require.
- **Freshness:** the public extract is refreshed once a day, so scheduling more than daily adds no new data. Use your own key for same-day notices.

### Privacy and legal note

- **Person-level contact data is never output.** The extract's primary and secondary contact columns (names, emails, phone and fax numbers, and titles) are dropped. You get the contracting office instead (department, sub-tier, office, city, state).
- **Awardee names** are kept only on award notices, and only when the name looks like an organisation. A name without a business suffix (a possible sole proprietor) is withheld, and so is any award dated before 2022-04-04, because older records may include Dun & Bradstreet data that may not be redistributed in bulk. `awardeeWithheldReason` says why a name was withheld.
- **Descriptions are opt-in.** When enabled, personal-looking email addresses and phone numbers inside the agency text are replaced with `[email removed]` / `[phone removed]`.
- **Attachments are not downloaded or re-hosted.** You get links only.
- This Actor is an independent tool. It is **not affiliated with, endorsed by or sponsored by GSA, SAM.gov or any U.S. Government agency.** "SAM.gov" is used only to describe the data source. Always confirm details on the notice page before bidding.

### Reliability

- Retries with backoff on network errors and 429/5xx responses, plus a format check on the extract (it fails loudly if columns change instead of returning bad data).
- Malformed rows are skipped and counted rather than crashing the run.
- Each run writes a `RUN_SUMMARY` record (rows scanned, matched, delivered, skipped, retries). A persistent run-health counter (runs started / succeeded / failed / unfinished, plus the last error) is kept in your account's `fcof-state` key-value store.
- A run that finds nothing new **succeeds** with zero items. That is not an error.

### FAQ

**Do I need a SAM.gov account?** No. The default mode needs nothing.

**How fresh is the data?** The public extract is regenerated daily (overnight U.S. time). For same-day notices, add your own API key.

**Can I get notices for several NAICS codes at once?** Yes. All list inputs accept several values; within one filter any value matches, and different filters combine with AND.

**Something broke or a field looks wrong?** Open an issue on the Actor's Issues tab. Issues are answered within a few days.

# Actor input Schema

## `keywords` (type: `array`):

Case-insensitive words or phrases matched in the title and description. Leave empty for all.

## `excludeKeywords` (type: `array`):

Drop notices whose title/description contains any of these.

## `naicsCodes` (type: `array`):

e.g. 541512, or 5415 to match every code starting with 5415.

## `pscCodes` (type: `array`):

Product Service Codes, e.g. D3 or 7030.

## `setAside` (type: `array`):

e.g. SBA, SBP, 8A, 8AN, HZC, SDVOSBC, WOSB, EDWOSB, VSA, ISBEE. Use NONE for notices with no set-aside.

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

Leave empty for all types.

## `agencies` (type: `array`):

Matched against department, sub-tier and office names, e.g. ARMY, VETERANS AFFAIRS.

## `placeOfPerformanceStates` (type: `array`):

Two-letter state codes, e.g. CA, TX, VA.

## `postedWithinDays` (type: `integer`):

0 = no posted-date limit.

## `responseDeadlineAfter` (type: `string`):

Only notices still open on this date (YYYY-MM-DD).

## `onlyNewSinceLastRun` (type: `boolean`):

Remembers notices already delivered for this exact filter set (in your own account) so scheduled runs return only new ones.

## `includeDescription` (type: `boolean`):

Adds the agency-written description text (small extra charge per item). Personal-looking emails and phone numbers are removed from it.

## `maxResults` (type: `integer`):

Newest notices first.

## `ownSamApiKey` (type: `string`):

Optional. Uses the Get Opportunities API with YOUR key for same-day freshness. Personal keys are usually limited to 10 requests/day. Never logged or shared. Leave empty to use the no-key public extract.

## Actor input object example

```json
{
  "keywords": [
    "software",
    "cybersecurity"
  ],
  "postedWithinDays": 7,
  "onlyNewSinceLastRun": true,
  "includeDescription": false,
  "maxResults": 1000
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset of contract opportunities matching the input filters.

## `runSummary` (type: `string`):

Counts for this run (scanned, matched, delivered, skipped).

# 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 = {
    "keywords": [
        "software",
        "cybersecurity"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("appropriate_songbird/federal-contract-opportunities-feed").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 = { "keywords": [
        "software",
        "cybersecurity",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("appropriate_songbird/federal-contract-opportunities-feed").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 '{
  "keywords": [
    "software",
    "cybersecurity"
  ]
}' |
apify call appropriate_songbird/federal-contract-opportunities-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,appropriate_songbird/federal-contract-opportunities-feed"
        }
    }
}
```

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/dRuceXPDjJ5hTT7XU/builds/rvgguXezY3Bk1bx1t/openapi.json
