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

Export SAM.gov federal contract opportunities, RFPs and award notices with the contracting officer's name, email and phone, deadline, NAICS, PSC, set-aside, place of performance, awardee and attachment links. Filter by NAICS, agency, state and dates; run daily with only-new results. No API key.

- **URL**: https://apify.com/epicscrapers/sam-gov-scraper.md
- **Developed by:** [Epic Scrapers](https://apify.com/epicscrapers) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 opportunity saveds

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

### SAM.gov Scraper: federal contract opportunities, contracting officer contacts and awards

SAM.gov Scraper exports U.S. federal contract opportunities from SAM.gov as clean rows: solicitations, RFQs, sources sought, presolicitations, special notices and award notices. Each row has the response deadline, the buying agency and office, NAICS and PSC codes, the set-aside, the place of performance, the **contracting officer's name, title, email and phone**, award details (date, amount, awardee and UEI), the full description as text and a **direct download link for every attachment**.

Filter by keyword, NAICS, PSC, set-aside, notice type, agency or office, state and posted or deadline dates, then put it on a schedule: with **Only new notices** each run delivers only what was posted since the last one, so you get a daily bid feed for your CRM, Google Sheet, Slack or proposal pipeline and pay for each notice once.

- **Contacts you can use.** Agencies type phones, titles and labels into the name field ("Jeremy EtringerDSN312-850-9747", "Telephone: 2156972530", "Hall, Jenna"). The Actor splits them into clean name, title, email and phone fields, and every contact of a notice is kept, not just the first.
- **All the filters SAM.gov has, as lists.** Many NAICS codes (or prefixes like `5415`), PSC codes, set-asides, notice types, states, agencies and keywords in one run.
- **Agencies by name.** `Department of Veterans Affairs`, `Army`, `DLA`, `NAVSEA`, an office code like `W91CRB` or a sam.gov organization ID. Everything below it is included.
- **Deadline filters.** Skip expired bids with `responseDeadlineFrom: "today"`, or only keep bids due in the next 30 days. Each row has `daysUntilDeadline`.
- **Amendments flagged.** An amended notice (new deadline, Q\&A, revised SOW) comes as its latest version with `isAmendment: true` and the original notice ID.
- **Award research.** Award notices with date, amount, contract number, awardee name, UEI and CAGE code, for competitor and teaming research.
- **No API key, no SAM.gov account, no proxy.** The Actor reads the same JSON data the sam.gov website shows, not the rate-limited public API (which allows 10 requests a day without a registered role).
- **More than 10,000 results.** SAM.gov returns at most 10,000 records per search; longer date ranges are read day by day, so a full month or year comes back complete.

### Who uses it?

| You are | What you do with it | Typical setup |
| --- | --- | --- |
| Small business or BD / capture team | Get every new bid in your NAICS codes and set-asides each morning, with the contracting officer to email. | NAICS + set-asides + open notice types, daily schedule, Only new notices |
| GovCon consultant or proposal shop | Watch opportunities for several clients and send each a shortlist. | One saved task per client, each with its own filters and schedule |
| Lead-gen or market-intelligence agency | Sell contract-award leads (who just won what, for how much) or agency buying signals. | Award notices, active and archived, by NAICS or agency |
| Subcontractor or supplier | Find primes that just won work in your field and pitch teaming. | Award notices in your NAICS, daily schedule |
| Developer or AI agent | Feed SAM.gov data into a bid-matching app, dashboard, RAG index or alerting bot. | API calls with JSON input, webhooks on run finish |

### Quick start

1. Add your **NAICS codes** (or keywords).
2. Pick **notice types**: Solicitation, Combined Synopsis/Solicitation, Presolicitation and Sources Sought are the open bids.
3. Optional: set-asides, agencies, states, a response deadline range.
4. Click **Start**. Results appear in the **Opportunities**, **Contracting contacts** and **Awards** tables; export them as CSV, Excel or JSON.
5. To make it a daily feed: save the input as a task, turn on **Only new notices**, set **Posted in the last N days** to `2` and add a daily schedule.

### What data do you get?

One row per notice. Real example (posted October 16, 2026; description and attachments shortened):

```json
{
    "noticeId": "3505c1f7e0584df499030ca75a30294e",
    "url": "https://sam.gov/opp/3505c1f7e0584df499030ca75a30294e/view",
    "title": "R602--Medical Courier Services",
    "solicitationNumber": "36C24927B0001",
    "noticeType": "Presolicitation",
    "noticeTypeCode": "p",
    "isActive": true,
    "isCanceled": false,
    "isAmendment": false,
    "originalNoticeId": null,
    "postedDate": "2026-10-16T15:00:07.313+00:00",
    "modifiedDate": "2026-10-16T15:00:07.313+00:00",
    "responseDeadline": "2026-11-30T11:00:00-06:00",
    "responseTimeZone": "America/Chicago",
    "daysUntilDeadline": 44,
    "archiveDate": "2027-01-29",
    "department": "VETERANS AFFAIRS, DEPARTMENT OF",
    "agency": "VETERANS AFFAIRS, DEPARTMENT OF",
    "office": "249-NETWORK CONTRACT OFFICE 9 (36C249)",
    "officeCode": "36C249",
    "organizationPath": "VETERANS AFFAIRS, DEPARTMENT OF > VETERANS AFFAIRS, DEPARTMENT OF > 249-NETWORK CONTRACT OFFICE 9 (36C249)",
    "organizationId": "100163849",
    "officeAddress": { "streetAddress": "VISN 9 CONSOLIDATED ACQUISITION, 3400 LEBANON ROAD", "city": "MURFREESBORO", "state": "TN", "zip": "37129", "country": "USA" },
    "naicsCode": "492110",
    "naicsCodes": ["492110"],
    "pscCode": "R602",
    "setAsideCode": "SDVOSBC",
    "setAside": "Service-Disabled Veteran-Owned Small Business (SDVOSB) Set-Aside (FAR 19.14)",
    "placeOfPerformance": { "streetAddress": "Robley Rex VA Medical Center (RRVAMC) & its CBOCs", "city": "LOUISVILLE", "state": "KY", "stateName": "Kentucky", "zip": "40206", "country": "USA", "countryName": "UNITED STATES" },
    "placeOfPerformanceCity": "LOUISVILLE",
    "placeOfPerformanceState": "KY",
    "placeOfPerformanceZip": "40206",
    "primaryContactName": "Sascha Hertslet",
    "primaryContactTitle": "Contracting Officer",
    "primaryContactEmail": "sascha.hertslet@va.gov",
    "primaryContactPhone": "615-225-6664",
    "contacts": [
        { "type": "primary", "name": "Sascha Hertslet", "title": "Contracting Officer", "email": "sascha.hertslet@va.gov", "phone": "615-225-6664", "fax": null }
    ],
    "awardDate": null,
    "awardAmount": null,
    "awardNumber": null,
    "awardeeName": null,
    "awardeeUei": null,
    "awardeeCageCode": null,
    "description": "The Department of Veterans Affairs, Network Contracting Office 9, anticipates issuing a competitive solicitation for medical courier services supporting the Robley Rex VA Medical Center in Louisville, Kentucky…",
    "attachmentCount": 2,
    "attachments": [
        {
            "name": "36C24927B0001-PresolicitationNotice.docx",
            "type": "file",
            "url": "https://sam.gov/api/prod/opps/v3/opportunities/resources/files/265812090240473ca4a082a66515831a/download",
            "mimeType": "docx",
            "sizeBytes": 24716,
            "postedDate": "2026-10-16T15:00:07.313+00:00",
            "accessLevel": "public",
            "exportControlled": false
        }
    ],
    "scrapedAt": "2026-10-17T11:10:59.853Z"
}
```

What to expect, measured on 1,500 open notices (solicitations, combined synopses, presolicitations, sources sought) posted October 11–17, 2026:

| Field | Filled in |
| --- | --- |
| Contracting contact with email | 100% (1.26 contacts per notice) |
| Contact phone | 41% (many agencies list only an email) |
| Contact title | 6% (most agencies leave it empty) |
| Response deadline | 99% |
| NAICS code | 96% |
| Attachments | 92% (3.5 files or links per notice) |
| Set-aside | 40% (31% Total Small Business, 5% SDVOSB) |
| Place of performance state | 33% |

Field notes:

- `responseDeadline` is in the notice's own time zone (`responseTimeZone`); `daysUntilDeadline` is counted from the run.
- `postedDate` is when the current version was posted; for an amendment that is the amendment date.
- `awardAmount` is a number in dollars. Award fields are filled for award notices, and `awardeeName` / `awardeeUei` also for some justifications.
- Attachment `url`s are permanent sam.gov download links (they redirect to the file). Deleted attachment versions are left out. Files marked `exportControlled` or `accessLevel: "private"` need a SAM.gov login to open.
- `department` / `agency` / `office` are the first, second and last levels of the federal hierarchy; `organizationPath` has all levels.

### Input reference

All list fields take several values; a single value is a one-item list.

| Field | Type | Default | What it does |
| --- | --- | --- | --- |
| `keywords` | string\[] | – | Words to search in title, description and solicitation number. Each entry is its own search; results are combined. |
| `keywordMode` | `ALL` / `ANY` / `EXACT` | `ALL` | How the words of one entry match. |
| `noticeTypes` | string\[] | all | `o` Solicitation, `k` Combined Synopsis/Solicitation, `p` Presolicitation, `r` Sources Sought, `s` Special Notice, `a` Award Notice, `u` Justification (J\&A), `i` Intent to Bundle, `g` Sale of Surplus Property. |
| `naicsCodes` | string\[] | – | NAICS codes or prefixes (`541512`, `5415`). |
| `pscCodes` | string\[] | – | PSC codes or prefixes (`DA01`, `R4`, `D`). |
| `setAsides` | string\[] | all | `SBA`, `SBP`, `8A`, `8AN`, `HZC`, `HZS`, `SDVOSBC`, `SDVOSBS`, `WOSB`, `WOSBSS`, `EDWOSB`, `EDWOSBSS`, `LAS`, `IEE`, `ISBEE`, `BICiv`, `VSA`, `VSS`. |
| `agencies` | string\[] | – | Department, agency or office names, acronyms, office codes or sam.gov organization IDs. |
| `states` | string\[] | – | Place of performance state codes (`VA`, `TX`, `PR`). Notices without a place of performance are left out. |
| `postedWithinDays` | integer | `7` | Posted (or amended) in the last N days, counting today, Eastern time. `0` = any date. |
| `postedFrom`, `postedTo` | date | – | Exact posted range: `2026-01-01` or relative (`30 days` = 30 days ago). Overrides `postedWithinDays`. |
| `responseDeadlineFrom`, `responseDeadlineTo` | date | – | Deadline range: `today`, `2026-12-31`, `30 days` (= 30 days from today). Notices without a deadline are left out. |
| `activeOnly` | boolean | `true` | Turn off to include archived notices (award history, past solicitations, recompetes). |
| `includeAmendments` | boolean | `true` | Turn off to drop notices that were amended. |
| `onlyNewNotices` | boolean | `false` | Skip notices saved by earlier runs of the same task. |
| `noticeIds` | string\[] | – | sam.gov URLs or notice IDs to fetch directly; filters are ignored. |
| `maxResults` | integer | `100` | Most notices to save in one run. `0` = no limit. |

Invalid values never fail a run: unknown codes are logged and skipped. If every value of a filter is invalid the run saves nothing, rather than silently returning (and charging for) everything.

### Ready-to-run examples

#### Daily bid feed for an IT small business

```json
{
    "naicsCodes": ["541511", "541512", "541519", "518210"],
    "noticeTypes": ["o", "k", "p", "r"],
    "setAsides": ["SBA", "SDVOSBC", "8A"],
    "responseDeadlineFrom": "today",
    "postedWithinDays": 2,
    "onlyNewNotices": true,
    "maxResults": 0
}
```

Save it as a task and schedule it daily. Two days of overlap make sure nothing posted late in the evening is missed; the memory makes sure nothing is delivered twice.

#### Everything the VA and the Army want built in Texas and Oklahoma

```json
{
    "agencies": ["Department of Veterans Affairs", "Army"],
    "naicsCodes": ["2362", "2371", "2382"],
    "states": ["TX", "OK"],
    "noticeTypes": ["o", "k", "p", "r"],
    "postedWithinDays": 30,
    "maxResults": 500
}
```

#### Who won cybersecurity contracts this quarter

```json
{
    "keywords": ["cybersecurity", "zero trust"],
    "noticeTypes": ["a"],
    "activeOnly": false,
    "postedFrom": "2026-07-01",
    "maxResults": 0
}
```

The **Awards** table shows award date, amount, awardee and UEI, ready for teaming outreach or a competitor list.

#### Bids closing in the next two weeks for janitorial services

```json
{
    "keywords": ["janitorial", "custodial"],
    "keywordMode": "ANY",
    "noticeTypes": ["o", "k"],
    "responseDeadlineFrom": "today",
    "responseDeadlineTo": "14 days",
    "postedWithinDays": 0,
    "maxResults": 300
}
```

#### Specific notices

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

### How much does it cost?

You pay per notice saved: **$0.003 per opportunity** on the free plan, less on paid Apify plans ($0.0027 Bronze, $0.0024 Silver, $0.002 Gold and up). Platform usage is included, and runs that save nothing cost almost nothing. Notices skipped by **Only new notices** are free.

| Use | Notices | Cost (free plan) |
| --- | --- | --- |
| Daily feed for 4 NAICS codes and small-business set-asides | ~5–20 a day | under $2 a month |
| Every open bid posted in a week (all agencies) | ~3,800 | ~$11.40 |
| Every notice of all types posted in a month | ~25,000 | ~$75 |

Set a maximum cost per run in the run options to cap any run; the Actor stops cleanly at that budget.

### Use it from the API or in an AI agent

```bash
curl -X POST "https://api.apify.com/v2/acts/epicscrapers~sam-gov-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"naicsCodes":["541512"],"noticeTypes":["o","k"],"postedWithinDays":3,"maxResults":50}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("epicscrapers/sam-gov-scraper").call(run_input={
    "naicsCodes": ["541512"],
    "setAsides": ["SBA"],
    "responseDeadlineFrom": "today",
    "maxResults": 100,
})
for notice in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(notice["responseDeadline"], notice["title"], notice["primaryContactEmail"])
```

Connect runs to Google Sheets, Slack, Airtable, HubSpot, Zapier, Make or n8n with Apify integrations, or receive a webhook when each scheduled run finishes.

### For AI agents

Call `epicscrapers/sam-gov-scraper` with a JSON input; every field is optional. Minimal input:

```json
{ "naicsCodes": ["541512"], "noticeTypes": ["o", "k", "p", "r"], "postedWithinDays": 7, "maxResults": 50 }
```

- Filters: `keywords`, `naicsCodes`, `pscCodes`, `setAsides` (codes like `SBA`, `SDVOSBC`), `noticeTypes` (`o`, `k`, `p`, `r`, `s`, `a`, `u`, `i`, `g`), `agencies` (names or IDs), `states` (2-letter), `postedWithinDays` / `postedFrom` / `postedTo`, `responseDeadlineFrom` / `responseDeadlineTo` (`today`, `YYYY-MM-DD`, `30 days`), `activeOnly`, `noticeIds`.
- Key output fields: `noticeId`, `url`, `title`, `solicitationNumber`, `noticeType`, `postedDate`, `responseDeadline`, `daysUntilDeadline`, `department`, `agency`, `office`, `naicsCode`, `pscCode`, `setAsideCode`, `placeOfPerformanceState`, `primaryContactName`, `primaryContactEmail`, `primaryContactPhone`, `contacts[]`, `awardAmount`, `awardeeName`, `awardeeUei`, `description`, `attachments[].url`.
- Each saved notice costs $0.003 (free plan). Keep `maxResults` small for exploratory calls.

### How it works

The Actor uses the JSON endpoints behind the sam.gov website: the opportunity search (with SAM.gov's own filters), each notice's detail record (contacts, codes, award, description) and its attachment list. Agency names are resolved through the federal hierarchy. It doesn't need a key, a login or a proxy, and it stays at a modest request rate. It reads public data only: notices behind a SAM.gov login (controlled unclassified attachments) aren't downloaded.

### FAQ

**How fresh is the data?** Live: notices show up as soon as SAM.gov publishes them. Most notices are posted on business days, between 8 am and 11 pm Eastern time.

**Why do some rows have no phone or title?** The contracting office didn't enter one. The Actor never invents data; it only cleans what the notice lists (and takes the name from the email address when an agency typed only a phone or email into the name field).

**Do I need a SAM.gov API key?** No.

**Can I get more than 10,000 notices?** Yes. Set a posted date range; the Actor reads it day by day past SAM.gov's 10,000-record limit per search.

**Does "Only new notices" work across different tasks?** The memory is per task, so two tasks with overlapping filters each deliver (and charge) the same notice once.

**Can it download the attachment files?** It gives a direct download link for every file, which works without login for public files. Tell us if you need the files saved in the run storage.

Questions, a missing field or a filter you need? Open an issue on the Actor's **Issues** tab.

### Related Actors

- [SEC Form D Scraper](https://apify.com/epicscrapers/sec-form-d-scraper): recently funded companies and private fund raises from SEC filings.

# Actor input Schema

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

Words to search in the title, description and solicitation number, for example <code>cybersecurity</code> or <code>janitorial services</code>. Each entry is its own search and results are combined (OR). Leave empty to rely on the filters below.

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

How the words of one keyword entry are matched: all words, any word, or the exact phrase.

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

Leave empty for all types. Open bids are Solicitation, Combined Synopsis/Solicitation, Presolicitation and Sources Sought. Award Notice tells you who won, for how much.

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

Industry codes, for example <code>541512</code>. A shorter prefix matches every code under it (<code>5415</code> = all computer systems design codes).

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

Product Service Codes, for example <code>DA01</code> or <code>R425</code>. Prefixes work too (<code>D</code> = all IT services).

## `setAsides` (type: `array`):

Only notices reserved for these small-business programs. Leave empty to include unrestricted and set-aside notices.

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

Departments, agencies or offices, by name, acronym, office code or sam.gov organization ID, for example <code>Department of Veterans Affairs</code>, <code>Army</code>, <code>DLA</code>, <code>NAVSEA</code>, <code>W91CRB</code>. Includes everything below them.

## `states` (type: `array`):

Only notices with the place of performance in these states or territories. Many notices list no place of performance and are left out by this filter.

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

Notices posted (or amended) in the last N days, counting today (Eastern time). 0 = any date. Ignored when 'Posted from' is set. For a daily schedule use 2 with 'Only new notices'.

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

First posting date, e.g. <code>2026-01-01</code> or <code>30 days</code> (30 days ago). Overrides 'Posted in the last N days'.

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

Last posting date. Defaults to today.

## `responseDeadlineFrom` (type: `string`):

Only notices due on or after this date, e.g. <code>today</code> to skip expired bids or <code>7 days</code> to leave a week for the proposal. Notices without a deadline (most award and special notices) are left out by this filter.

## `responseDeadlineTo` (type: `string`):

Only notices due on or before this date, e.g. <code>30 days</code> (30 days from today).

## `activeOnly` (type: `boolean`):

Skip archived and inactive notices. Turn off to search the full history (for award research, past solicitations and recompetes).

## `includeAmendments` (type: `boolean`):

Amended notices (new deadline, Q\&A, revised documents) are returned as their latest version with <code>isAmendment: true</code>. Turn off to get only notices that were never amended.

## `onlyNewNotices` (type: `boolean`):

Skip notices saved by earlier runs of the same task, so a scheduled task delivers (and charges) each notice once. An amendment is a new notice and is delivered again. The memory is per task, or per input when run without a task.

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

Get specific notices by sam.gov URL (<code>https://sam.gov/opp/…/view</code>) or 32-character notice ID. All search filters are ignored when this is set.

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

The most notices to save (and pay for) in one run. 0 = no limit.

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

Not needed: sam.gov serves this data without a proxy. Set it only if your runs get blocked.

## Actor input object example

```json
{
  "keywords": [
    "software"
  ],
  "keywordMode": "ALL",
  "noticeTypes": [
    "o",
    "k",
    "p",
    "r"
  ],
  "postedWithinDays": 7,
  "activeOnly": true,
  "includeAmendments": true,
  "onlyNewNotices": false,
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "keywords": [
        "software"
    ],
    "noticeTypes": [
        "o",
        "k",
        "p",
        "r"
    ],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("epicscrapers/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"],
    "noticeTypes": [
        "o",
        "k",
        "p",
        "r",
    ],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("epicscrapers/sam-gov-scraper").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"
  ],
  "noticeTypes": [
    "o",
    "k",
    "p",
    "r"
  ],
  "maxResults": 100
}' |
apify call epicscrapers/sam-gov-scraper --silent --output-dataset

```

## MCP server setup

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

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/VixTPP88CbH3K5772/builds/9LuWT7KNHH5GjXpHJ/openapi.json
