# SAM.gov Scraper - Federal Contract Opportunities & Contacts (`scrapesage/sam-gov-scraper`) Actor

Scrape SAM.gov federal contract opportunities: RFPs, solicitations, sources sought, awards. Filter by keyword, NAICS, PSC, set-aside, notice type, dates. Returns contracting officer names, emails, phones, full descriptions, and attachment download links. No API key needed.

- **URL**: https://apify.com/scrapesage/sam-gov-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Lead generation, Automation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 opportunity scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## SAM.gov Scraper - Federal Contract Opportunities & Contacts

Extract **U.S. federal contract opportunities** from **SAM.gov** — RFPs, solicitations, sources sought, and award notices — into clean JSON with **full descriptions, contracting officer contacts (name, email, phone), and direct attachment download links**. No login / no cookies — no SAM.gov account and no API key required.

### Why this SAM.gov scraper?

| Typical scrapers | This actor |
| --- | --- |
| Require a SAM.gov account and API key issuance | No account, no API key — works out of the box |
| Return truncated summaries | Full solicitation description text |
| Give you a listing row only | Combines search + detail page + attachments in one record |
| No contact data | Contracting officer name, email, and phone per opportunity |
| Link-only attachments | Lists every attachment with a direct download URL — and can download the files for you |
| One notice type at a time | Filter across all notice types, NAICS, PSC, set-asides, and date ranges |

### Use cases

- **Government BD & capture teams** — find RFPs matching your NAICS codes before competitors do, with the contracting officer's email in the same row.
- **Proposal teams** — pull full solicitation text and attachment files (SOWs, specs, amendments) straight into your pipeline tools.
- **Market intelligence & consultants** — track award notices by agency and awardee (UEI) to see who's winning contracts in your market.
- **Subcontractors** — monitor award notices to find primes who just won work in your niche.
- **Daily opportunity feeds** — schedule a run with a relative `postedFrom` like `"2 days"` to capture only freshly posted opportunities.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **SAM.gov Scraper**, fill in the inputs you need, and click **Start**.
3. Watch results stream into the dataset table as each record is parsed.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

The simplest input — the 100 most recently modified active software opportunities, with contacts and attachments:

```json
{
    "keywords": "software",
    "keywordMode": "ALL",
    "status": "active",
    "maxResults": 100,
    "fetchFullDetails": true,
    "includeAttachments": true
}
````

A daily-feed input for new small-business IT set-asides:

```json
{
    "naicsCodes": ["541511", "541512"],
    "setAsideCodes": ["SBA", "8A"],
    "noticeTypes": ["o", "k", "p"],
    "postedFrom": "2 days",
    "sortBy": "-modifiedDate",
    "maxResults": 500
}
```

Or scrape specific opportunities directly by URL or notice ID (search filters are ignored when this is set):

```json
{
    "noticeIds": ["https://sam.gov/opp/ecf37a7275fd4b0cb17b9e0cfd660654/view"]
}
```

Core fields:

- **`keywords`** — search text (e.g. `"janitorial services"`); leave empty to match all and rely on filters. **`keywordMode`** controls how words combine: `ALL`, `ANY`, or `EXACT`.
- **`noticeTypes`** — limit to notice types such as `o` (Solicitation), `p` (Presolicitation), `k` (Combined Synopsis/Solicitation), `r` (Sources Sought), `s` (Special Notice), `a` (Award Notice), `u` (J\&A), `g` (Surplus Sale), `i` (Intent to Bundle).
- **`naicsCodes`** / **`pscCodes`** — filter by NAICS industry codes (e.g. `541511`) and Product Service Codes (e.g. `D302`).
- **`setAsideCodes`** — limit to small-business set-aside categories such as `SBA`, `8A`, `HZC`, `SDVOSBC`, `WOSB`, `EDWOSB`, and more.
- **`status`** — `active` (default), `inactive` (archived), or `all`.
- **`postedFrom`** / **`postedTo`**, **`modifiedFrom`** / **`modifiedTo`**, **`responseDueFrom`** / **`responseDueTo`** — date windows accepting ISO dates (`2026-06-01`) or relative values (`"7 days"`, `"2 weeks"`, `"3 months"`).
- **`maxResults`** — opportunities per run (default 100, max 10,000 — SAM.gov caps any single query at 10,000 records). **`sortBy`** — `-modifiedDate` (default) or `-relevance`.
- **`fetchFullDetails`** — fetch each detail page for full description, contracting officer contacts, place of performance, and exact deadline (default `true`); disable for a faster, cheaper basic feed.
- **`includeAttachments`** — list attachments with download URLs (default `true`); **`downloadAttachments`** also saves the files to the key-value store (default `false`), with **`maxAttachmentSizeMb`** capping file size (default 25 MB).
- **`noticeIds`** — scrape specific notice IDs / `sam.gov` opportunity URLs directly.
- **`proxyConfiguration`** — proxy settings; Apify datacenter proxy (default) is recommended for reliability at scale.

### Output

One dataset record per opportunity:

```json
{
    "noticeId": "ecf37a7275fd4b0cb17b9e0cfd660654",
    "parentNoticeId": null,
    "title": "6515--NEW Seattle Patient Lift Replacement",
    "noticeType": "Combined Synopsis/Solicitation",
    "noticeTypeCode": "k",
    "solicitationNumber": "36C26026Q0576",
    "status": "Published",
    "isActive": true,
    "postedDate": "2026-06-09T23:08:15.561+00:00",
    "responseDeadline": "2026-07-16T10:00:00-07:00",
    "responseTimeZone": "America/Los_Angeles",
    "archiveDate": "2026-07-21",
    "archiveType": "autocustom",
    "department": "VETERANS AFFAIRS, DEPARTMENT OF",
    "subTier": "VETERANS AFFAIRS, DEPARTMENT OF",
    "office": "NETWORK CONTRACT OFFICE 20 (36C260)",
    "naicsCodes": ["339113"],
    "pscCode": "6515",
    "setAside": "Total Small Business Set-Aside",
    "setAsideCode": "SBA",
    "placeOfPerformance": {
        "streetAddress": "Department of Veterans Affairs Seattle VA Medical Center, 1660 S Columbian Way",
        "city": "Seattle",
        "state": "WA",
        "zip": "98499",
        "country": "UNITED STATES"
    },
    "descriptionText": "The Seattle VA Medical Center requires replacement of facility-wide patient lifts...",
    "pointsOfContact": [
        {
            "type": "primary",
            "fullName": "Denise Patches",
            "title": "Contracting Officer",
            "email": "Denise.Patches@va.gov",
            "phone": "253-888-4922"
        }
    ],
    "attachments": [
        {
            "name": "SOW - Facility Wide Patient Lift Replacement_V1.docx",
            "type": "file",
            "url": "https://sam.gov/api/prod/opps/v3/opportunities/resources/files/b74dff59617b459fbfc6462042b34523/download",
            "mimeType": ".docx",
            "sizeBytes": 44515,
            "accessLevel": "public",
            "resourceId": "b74dff59617b459fbfc6462042b34523",
            "exportControlled": false
        }
    ],
    "url": "https://sam.gov/opp/ecf37a7275fd4b0cb17b9e0cfd660654/view"
}
```

Notes:

- Detail fields like `descriptionText`, `pointsOfContact`, `placeOfPerformance`, and exact deadlines are populated only when `fetchFullDetails` is enabled; `attachments` is populated only when `includeAttachments` is enabled. Listing attachment URLs is free — download URLs are always included in the dataset, and you only download the files when `downloadAttachments` is `true`.
- Award notices additionally include an `award` object with the awardee name and UEI (SAM unique entity ID).
- This data is published by the U.S. federal government for public dissemination; the actor only accesses publicly available opportunity data.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it on a cron to keep your data fresh.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/sam-gov-scraper').call({
    naicsCodes: ['541511', '541512'],
    setAsideCodes: ['SBA', '8A'],
    noticeTypes: ['o', 'k', 'p'],
    postedFrom: '2 days',
    maxResults: 500,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} records`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new records straight into your CRM or sheet.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a run finds something new.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find active small-business IT solicitations posted in the last week and list each contracting officer's email" and let it run this scraper for you.

### More scrapers from scrapesage

Need data from somewhere else? Try these:

- **[Bark Listing Scraper](https://apify.com/scrapesage/bark-listing-scraper)** — Bark.com service-provider directory listings.
- **[Bark Scraper](https://apify.com/scrapesage/bark-scraper)** — Bark.com provider profiles & leads.
- **[Multi-ATS Job Scraper](https://apify.com/scrapesage/multi-ats-job-scraper)** — jobs from Greenhouse, Lever, Ashby, Workday & more.
- **[LinkedIn Jobs Scraper](https://apify.com/scrapesage/linkedin-jobs-scraper)** — filter-based LinkedIn job postings, no login.
- **[Google Ads Transparency Scraper](https://apify.com/scrapesage/google-ads-transparency-scraper)** — see who's advertising what on Google.
- **[Facebook Ad Library Scraper](https://apify.com/scrapesage/facebook-ad-library-scraper)** — Meta/Instagram competitor ad intelligence.
- **[Eventbrite Scraper](https://apify.com/scrapesage/eventbrite-scraper)** — events plus organizer leads with contacts.

### Tips

- **Build a daily opportunity feed** by setting `postedFrom` to a relative value like `"2 days"`, sorting by `-modifiedDate`, and running the actor on an Apify [Schedule](https://docs.apify.com/platform/schedules) — then pipe new records to Slack, Make, or Google Sheets.
- **Beat the 10,000-record cap** by segmenting large pulls with `postedFrom`/`postedTo` date windows; any single SAM.gov query returns at most 10,000 records.
- **Run faster and cheaper** by disabling `fetchFullDetails` and `includeAttachments` when you only need basic listing fields — each adds one extra request per opportunity.
- **Use `responseDueFrom`** to exclude nearly-closed solicitations and focus on opportunities you can still respond to.
- **Keep the default Apify datacenter proxy** — SAM.gov is a lenient public API, so datacenter proxy is recommended for reliability at scale.

### FAQ

**Do I need a SAM.gov account or API key?** No. This actor accesses public opportunity data without any login, account, or API key — and returns richer combined records (search + detail + attachments in one row) than the official API.

**Is this legal?** SAM.gov contract opportunity data is published by the U.S. federal government for public dissemination and is in the public domain. This actor only accesses publicly available data — no login, no bypassing of access controls.

**How fresh is the data?** It is scraped live from SAM.gov at run time.

**Can I download the attachment files, not just the links?** Yes. Download URLs are always included in each record; set `downloadAttachments` to `true` to also save the files into the run's key-value store, capped by `maxAttachmentSizeMb`.

**What if my filters match no opportunities?** A run with no matches finishes successfully with an empty dataset.

**Can I export the results?** Yes — export as JSON, CSV, Excel, XML, or RSS, or pull them via the Apify API and official SDKs.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `keywords` (type: `string`):

Search keywords, e.g. 'janitorial services' or 'cybersecurity'. Leave empty to match all opportunities (combine with filters below).

## `keywordMode` (type: `string`):

How multiple keywords are combined: require all words, any word, or the exact phrase.

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

Limit to specific notice types. Leave empty for all types.

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

Filter by NAICS industry codes, e.g. 541511 (custom software), 561720 (janitorial). One code per line.

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

Filter by Product Service Codes (classification codes), e.g. D302 (IT systems development), 7510 (office supplies). One code per line.

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

Limit to small-business set-aside categories. Leave empty for all.

## `status` (type: `string`):

Active opportunities (open for response), inactive (archived), or everything.

## `postedFrom` (type: `string`):

Only opportunities first published on/after this date. ISO date (2026-06-01) or relative ('7 days', '2 weeks', '3 months'). TIP: schedule this actor daily with '2 days' for a monitoring feed of new opportunities.

## `postedTo` (type: `string`):

Only opportunities first published on/before this date. ISO date or relative value.

## `modifiedFrom` (type: `string`):

Only opportunities updated on/after this date. ISO date or relative value like '1 day'.

## `modifiedTo` (type: `string`):

Only opportunities updated on/before this date. ISO date or relative value.

## `responseDueFrom` (type: `string`):

Only opportunities whose response/offer deadline is on/after this date. ISO date or relative value. Useful to exclude nearly-closed solicitations.

## `responseDueTo` (type: `string`):

Only opportunities whose response/offer deadline is on/before this date. ISO date or relative value.

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

Maximum number of opportunities to scrape in this run. SAM.gov caps any single query at 10,000 records - narrow with date ranges or filters to cover more.

## `sortBy` (type: `string`):

Order of results. 'Recently modified' is best for monitoring; 'Relevance' is best with keywords.

## `fetchFullDetails` (type: `boolean`):

Fetch each opportunity's detail page: full description, contracting officer contacts (name, email, phone), NAICS/PSC codes, set-aside, place of performance, and exact response deadline. Adds one extra request per opportunity. Disable for a faster, cheaper feed of basic fields only.

## `includeAttachments` (type: `boolean`):

Fetch the list of attachments (SOWs, specs, amendments) for each opportunity, with direct download URLs. Adds one extra request per opportunity.

## `downloadAttachments` (type: `boolean`):

Download attachment files into the run's key-value store (download URLs are always included in the dataset regardless). Only public files up to the size limit below.

## `maxAttachmentSizeMb` (type: `integer`):

Skip downloading files larger than this. Only used when 'Download attachment files' is enabled.

## `noticeIds` (type: `array`):

Scrape specific opportunities directly: paste SAM.gov opportunity URLs (https://sam.gov/opp/<id>/view) or 32-character notice IDs, one per line. When set, the search filters above are ignored.

## `proxyConfiguration` (type: `object`):

Proxy settings. SAM.gov is a public API and lenient; Apify datacenter proxy (default) is recommended for reliability at scale.

## Actor input object example

```json
{
  "keywords": "software",
  "keywordMode": "ALL",
  "naicsCodes": [
    "541511",
    "541512"
  ],
  "pscCodes": [
    "D302"
  ],
  "status": "active",
  "maxResults": 100,
  "sortBy": "-modifiedDate",
  "fetchFullDetails": true,
  "includeAttachments": true,
  "downloadAttachments": false,
  "maxAttachmentSizeMb": 25,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `opportunities` (type: `string`):

One record per federal contract opportunity, including title, notice type, agency hierarchy, NAICS/PSC, set-aside, deadlines, description, contracting officer contacts, and attachment links.

## `attachmentFiles` (type: `string`):

Attachment files (SOWs, specifications, amendments) downloaded into the default key-value store when 'Download attachment files' is enabled.

# 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",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/sam-gov-scraper").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",
    "proxyConfiguration": { "useApifyProxy": True },
}

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapesage/sam-gov-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/sam-gov-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "SAM.gov Scraper - Federal Contract Opportunities & Contacts",
        "description": "Scrape SAM.gov federal contract opportunities: RFPs, solicitations, sources sought, awards. Filter by keyword, NAICS, PSC, set-aside, notice type, dates. Returns contracting officer names, emails, phones, full descriptions, and attachment download links. No API key needed.",
        "version": "1.0",
        "x-build-id": "HPs3bzwDTIgZwP04j"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapesage~sam-gov-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapesage-sam-gov-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/scrapesage~sam-gov-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapesage-sam-gov-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/scrapesage~sam-gov-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapesage-sam-gov-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "keywords": {
                        "title": "Keywords",
                        "type": "string",
                        "description": "Search keywords, e.g. 'janitorial services' or 'cybersecurity'. Leave empty to match all opportunities (combine with filters below)."
                    },
                    "keywordMode": {
                        "title": "Keyword matching",
                        "enum": [
                            "ALL",
                            "ANY",
                            "EXACT"
                        ],
                        "type": "string",
                        "description": "How multiple keywords are combined: require all words, any word, or the exact phrase.",
                        "default": "ALL"
                    },
                    "noticeTypes": {
                        "title": "Notice types",
                        "type": "array",
                        "description": "Limit to specific notice types. Leave empty for all types.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "o",
                                "p",
                                "k",
                                "r",
                                "s",
                                "a",
                                "u",
                                "g",
                                "i"
                            ],
                            "enumTitles": [
                                "Solicitation",
                                "Presolicitation",
                                "Combined Synopsis/Solicitation",
                                "Sources Sought",
                                "Special Notice",
                                "Award Notice",
                                "Justification (J&A)",
                                "Sale of Surplus Property",
                                "Intent to Bundle"
                            ]
                        }
                    },
                    "naicsCodes": {
                        "title": "NAICS codes",
                        "type": "array",
                        "description": "Filter by NAICS industry codes, e.g. 541511 (custom software), 561720 (janitorial). One code per line.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "pscCodes": {
                        "title": "PSC codes",
                        "type": "array",
                        "description": "Filter by Product Service Codes (classification codes), e.g. D302 (IT systems development), 7510 (office supplies). One code per line.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "setAsideCodes": {
                        "title": "Set-aside types",
                        "type": "array",
                        "description": "Limit to small-business set-aside categories. Leave empty for all.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "SBA",
                                "SBP",
                                "8A",
                                "8AN",
                                "HZC",
                                "HZS",
                                "SDVOSBC",
                                "SDVOSBS",
                                "WOSB",
                                "WOSBSS",
                                "EDWOSB",
                                "EDWOSBSS",
                                "LAS",
                                "IEE",
                                "ISBEE",
                                "VSA",
                                "VSS"
                            ],
                            "enumTitles": [
                                "Total Small Business",
                                "Partial Small Business",
                                "8(a) Set-Aside",
                                "8(a) Sole Source",
                                "HUBZone Set-Aside",
                                "HUBZone Sole Source",
                                "SDVOSB Set-Aside",
                                "SDVOSB Sole Source",
                                "Women-Owned Small Business",
                                "WOSB Sole Source",
                                "Economically Disadvantaged WOSB",
                                "EDWOSB Sole Source",
                                "Local Area Set-Aside",
                                "Indian Economic Enterprise",
                                "Indian Small Business Economic Enterprise",
                                "Veteran-Owned Small Business",
                                "VOSB Sole Source"
                            ]
                        }
                    },
                    "status": {
                        "title": "Opportunity status",
                        "enum": [
                            "active",
                            "inactive",
                            "all"
                        ],
                        "type": "string",
                        "description": "Active opportunities (open for response), inactive (archived), or everything.",
                        "default": "active"
                    },
                    "postedFrom": {
                        "title": "Posted after",
                        "type": "string",
                        "description": "Only opportunities first published on/after this date. ISO date (2026-06-01) or relative ('7 days', '2 weeks', '3 months'). TIP: schedule this actor daily with '2 days' for a monitoring feed of new opportunities."
                    },
                    "postedTo": {
                        "title": "Posted before",
                        "type": "string",
                        "description": "Only opportunities first published on/before this date. ISO date or relative value."
                    },
                    "modifiedFrom": {
                        "title": "Modified after",
                        "type": "string",
                        "description": "Only opportunities updated on/after this date. ISO date or relative value like '1 day'."
                    },
                    "modifiedTo": {
                        "title": "Modified before",
                        "type": "string",
                        "description": "Only opportunities updated on/before this date. ISO date or relative value."
                    },
                    "responseDueFrom": {
                        "title": "Response deadline after",
                        "type": "string",
                        "description": "Only opportunities whose response/offer deadline is on/after this date. ISO date or relative value. Useful to exclude nearly-closed solicitations."
                    },
                    "responseDueTo": {
                        "title": "Response deadline before",
                        "type": "string",
                        "description": "Only opportunities whose response/offer deadline is on/before this date. ISO date or relative value."
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of opportunities to scrape in this run. SAM.gov caps any single query at 10,000 records - narrow with date ranges or filters to cover more.",
                        "default": 100
                    },
                    "sortBy": {
                        "title": "Sort order",
                        "enum": [
                            "-modifiedDate",
                            "-relevance"
                        ],
                        "type": "string",
                        "description": "Order of results. 'Recently modified' is best for monitoring; 'Relevance' is best with keywords.",
                        "default": "-modifiedDate"
                    },
                    "fetchFullDetails": {
                        "title": "Fetch full details",
                        "type": "boolean",
                        "description": "Fetch each opportunity's detail page: full description, contracting officer contacts (name, email, phone), NAICS/PSC codes, set-aside, place of performance, and exact response deadline. Adds one extra request per opportunity. Disable for a faster, cheaper feed of basic fields only.",
                        "default": true
                    },
                    "includeAttachments": {
                        "title": "List attachments",
                        "type": "boolean",
                        "description": "Fetch the list of attachments (SOWs, specs, amendments) for each opportunity, with direct download URLs. Adds one extra request per opportunity.",
                        "default": true
                    },
                    "downloadAttachments": {
                        "title": "Download attachment files",
                        "type": "boolean",
                        "description": "Download attachment files into the run's key-value store (download URLs are always included in the dataset regardless). Only public files up to the size limit below.",
                        "default": false
                    },
                    "maxAttachmentSizeMb": {
                        "title": "Max attachment size (MB)",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Skip downloading files larger than this. Only used when 'Download attachment files' is enabled.",
                        "default": 25
                    },
                    "noticeIds": {
                        "title": "Specific notice IDs or URLs",
                        "type": "array",
                        "description": "Scrape specific opportunities directly: paste SAM.gov opportunity URLs (https://sam.gov/opp/<id>/view) or 32-character notice IDs, one per line. When set, the search filters above are ignored.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. SAM.gov is a public API and lenient; Apify datacenter proxy (default) is recommended for reliability at scale.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
