# SAM.gov Federal Contracts Monitor + USAspending Awards (`krundle/samgov-federal-contracts-monitor`) Actor

Find US federal contract opportunities on SAM.gov, plus USAspending awards. In: keywords, NAICS, PSC, set-aside, agency, state, dates (all optional). Out: one JSON row per notice: title, agency, NAICS, set-aside, deadline, link; optional full text + attachments. $0.002/notice; 20 by default.

- **URL**: https://apify.com/krundle/samgov-federal-contracts-monitor.md
- **Developed by:** [Krundle Freako](https://apify.com/krundle) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 opportunities

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

## SAM.gov Federal Contracts Monitor + USAspending Awards

Find **U.S. federal contract opportunities** on **SAM.gov** and get alerts when new ones match your filters. Optionally, look up **who won similar contracts** on **USAspending.gov**. No API key, login or SAM.gov account needed.

The Actor reads GSA's official **daily Contract Opportunities extract** (the full CSV published on data.gov, about 200 MB and 70,000 active notices). It streams and filters that file in a few seconds instead of paging through a rate-limited search API, so runs are fast, cheap and consistent. If you want them, it then pulls the full description and all attachment download links for each match from sam.gov. It can also query the free USAspending.gov awards API.

### What you can do

- **Search opportunities** by keywords (any/all, with exclusions), **NAICS** (prefix match: `5415` covers 541511/541512/541519), **PSC** (prefix match: `D`, `DA01`), **set-aside type** (SBA, 8(a), HUBZone, SDVOSB, WOSB, EDWOSB, VOSB, ...), **agency** (department, sub-tier or office name, abbreviation such as `VA`/`DHS`/`DLA`, or CGAC/AAC code), **place-of-performance state**, **notice type** (solicitation, combined synopsis, sources sought, presolicitation, award notice, ...), **posted date** and **response deadline** ranges, **active only** and **still open for response**. You can also look up exact **solicitation numbers** or **notice IDs**.
- **Alerts.** *Only new since last run* remembers what it already delivered (in a named key-value store), so a daily schedule returns, and charges for, **new notices and amendments only**. If GSA hasn't published a new extract since your last complete run, the run ends in under a second.
- **Full details (optional).** Adds the full HTML/text description (the extract cuts descriptions at 32,000 characters) and **every attachment and link** with a stable sam.gov download URL, file type, size and posting date, plus the latest modified date, status and cancellation flag.
- **Contracting officer contacts (optional, off by default).** Primary and secondary contact name, title, email and phone.
- **USAspending awards (optional).** Search awarded contracts and IDVs by **recipient**, **NAICS**, **PSC**, **awarding agency**, **state**, **set-aside**, **keywords**, **amount** and **date window** (action date, new awards only, or last modified). Use it to see incumbents, competitors' wins and agency spending in your niche. The award lookup can reuse your opportunity NAICS/agency/state filters automatically.

### Example inputs

Cybersecurity work under NAICS 541512:

```json
{ "keywords": ["cybersecurity"], "naicsCodes": ["541512"], "maxOpportunities": 100 }
```

Daily alert for open SDVOSB/small-business VA notices in VA/MD/DC, with attachments, plus recent VA awards in the same NAICS:

```json
{
    "agencies": ["Veterans Affairs"],
    "setAsideCodes": ["SDVOSBC", "SBA"],
    "naicsCodes": ["541512", "541519"],
    "states": ["VA", "MD", "DC"],
    "stateMatch": "placeOfPerformanceOrOffice",
    "openForResponseOnly": true,
    "includeDetails": true,
    "onlyNew": true,
    "stateKey": "va-it-dmv",
    "baselineOnFirstRun": true,
    "searchAwards": true,
    "awardDateType": "new_awards_only",
    "awardLookbackDays": 30,
    "maxAwards": 50
}
```

Awards only. Booz Allen's largest VA contracts and IDVs since January:

```json
{
    "searchOpportunities": false,
    "searchAwards": true,
    "awardRecipients": ["Booz Allen Hamilton"],
    "awardAgencies": ["Department of Veterans Affairs"],
    "awardTypes": ["contracts", "idvs"],
    "awardDateFrom": "2026-01-01",
    "awardSortBy": "amount",
    "maxAwards": 25
}
```

### Output

Every dataset item has `recordType`: `opportunity` or `award`. Use the **Opportunities** and **Awards** views in the dataset tab, or export to JSON, CSV or Excel.

Opportunity (real example, shortened):

```json
{
    "recordType": "opportunity",
    "noticeId": "d6491df7d2f04213b1330e1e96e99cbc",
    "title": "Technical and Programmatic Support Services (TPSS) MATOC III",
    "solicitationNumber": "W912DY27RA014",
    "noticeType": "Combined Synopsis/Solicitation",
    "department": "DEPT OF DEFENSE",
    "subTier": "DEPT OF THE ARMY",
    "office": "W2V6 USA ENG SPT CTR HUNTSVIL",
    "postedDate": "2026-10-01T19:04:38.000Z",
    "responseDeadline": "2026-10-19T14:00:00.000Z",
    "daysUntilResponse": 1,
    "naicsCode": "541519",
    "pscCode": "J059",
    "setAsideCode": null,
    "placeOfPerformance": { "city": null, "state": null, "zip": null, "country": null },
    "officeAddress": { "city": "REDSTONE ARSENAL", "state": "AL", "zip": "35898-0000", "country": "USA" },
    "description": "Amendment 0003 - provide responses to remaining questions ...",
    "url": "https://sam.gov/opp/d6491df7d2f04213b1330e1e96e99cbc/view",
    "matchedKeywords": ["cybersecurity"],
    "attachments": [
        {
            "name": "PIEE Solicitation Module Link for W912DY27RA014",
            "type": "link",
            "url": "https://piee.eb.mil/sol/xhtml/unauth/search/oppMgmtLink.xhtml?noticeId=W912DY27RA014&noticeType=CombinedSynopsisSolicitation"
        }
    ],
    "attachmentCount": 4,
    "lastModifiedDate": "2026-10-15T16:48:53.412+00:00",
    "detailsFetched": true
}
```

A file attachment looks like this. The `url` redirects to a short-lived signed download, so it keeps working.

```json
{ "name": "ATTACHMENT B SOW Hemochron Reagents.docx", "type": "file", "mimeType": "docx", "sizeBytes": 27499,
  "url": "https://sam.gov/api/prod/opps/v3/opportunities/resources/files/f7f50f810c984dbaaad37709046814df/download" }
```

Award (real example, shortened):

```json
{
    "recordType": "award",
    "awardId": "15B40827F00000039",
    "awardType": "DELIVERY ORDER",
    "recipientName": "BCT PARTNERS LLC",
    "recipientUei": "PFSLMY1VAK71",
    "amount": 3012.04,
    "baseObligationDate": "2026-10-16",
    "startDate": "2026-11-01",
    "endDate": "2026-11-30",
    "awardingAgency": "Department of Justice",
    "awardingSubAgency": "Federal Prison System / Bureau of Prisons",
    "naicsCode": "541512",
    "pscCode": "Q522",
    "placeOfPerformance": { "state": "NJ", "country": "USA", "zip5": "07103" },
    "url": "https://www.usaspending.gov/award/CONT_AWD_15B40827F00000039_1540_HHSN316201200074W_7529"
}
```

With *Include contracting officer contacts* on, opportunities also get `primaryContact`/`secondaryContact` objects (`title`, `fullName`, `email`, `phone`, `fax`). Each run also stores a `RUN_SUMMARY` record in the default key-value store, with the filters, rows scanned, number of matches, already-seen skips and charged events.

### Alerts: "only new since last run"

1. Turn on **Only new since last run** and set a **State key** (e.g. `my-naics-alert`).
2. Optionally turn on **Baseline on first run**. The first run then marks everything that matches today as seen, without outputting or charging for it, so you are alerted only about notices posted afterwards.
3. Schedule the Actor daily (GSA refreshes the extract once a day, early morning US Eastern), and connect the dataset to email, Slack, Google Sheets, Zapier or Make via Apify integrations.

The memory lives in the named key-value store `samgov-contracts-state` on your account. Delete the store or change the state key to start over. SAM.gov gives every amendment a new notice ID, so amendments of tracked solicitations show up as new items.

### Pricing (pay per event)

| Event | Price | When |
|---|---|---|
| Actor start | $0.00005 | once per run (Apify standard) |
| Opportunity | **$0.002** ($2 per 1,000) | each opportunity saved, data from the extract |
| Opportunity with details | **$0.004** ($4 per 1,000) | instead of *Opportunity* when full details (full description + attachments) were loaded |
| Award | **$0.003** ($3 per 1,000) | each USAspending award saved |

You don't pay for platform compute. Already-seen items in alert mode are free, and so are runs when nothing changed. Set a maximum cost per run in the Console and the Actor stops cleanly at that limit. Example: a daily alert that finds 15 new notices with details and 10 awards costs 15 × $0.004 + 10 × $0.003 + $0.00005 ≈ **$0.09** a day.

### Use from AI agents and the API (MCP, x402, Skyfire)

**Tool summary for agents.** Input (all optional): `keywords`, `naicsCodes`, `pscCodes`, `setAsideCodes`, `agencies`, `states`, `noticeTypes`, `postedWithinDays` or `postedFrom`/`postedTo`, `responseFrom`/`responseTo`; set `searchAwards: true` for USAspending awards. Output: one JSON item per record with `recordType` `opportunity` (`title`, `noticeType`, `department`, `naicsCode`, `setAside`, `postedDate`, `responseDeadline`, `url`…) or `award` (`recipientName`, `amount`, `awardingAgency`…). Defaults: 20 opportunities, 20 awards. Cost: $0.002 per opportunity, so a default call costs about $0.04 and finishes in about 20 seconds. Set `includeDescription: false` for compact output in LLM context.

- **REST API:** `POST https://api.apify.com/v2/acts/krundle~samgov-federal-contracts-monitor/run-sync-get-dataset-items` with `Authorization: Bearer <token>` and the input JSON as the body.
- **MCP:** `https://mcp.apify.com?tools=krundle/samgov-federal-contracts-monitor` works in Claude, Cursor, ChatGPT and other MCP clients.
- **Agentic payments (no Apify account):** agents can pay with **x402** (USDC on Base or Solana) or **MPP** through a prepaid token from [agi.apify.com](https://agi.apify.com), or with **Skyfire** via `https://mcp.apify.com?payment=skyfire&tools=krundle/samgov-federal-contracts-monitor`. This Actor is pay-per-event with limited permissions, so it is eligible for both.

### Tips and limitations

- **Data freshness.** The extract is regenerated once a day, so notices posted after the latest refresh appear in the next day's file. For same-hour alerts, run the Actor after GSA's morning refresh.
- **Active notices only.** The full extract contains currently active notices (about 70,000). Older archived notices are not included.
- **Place of performance** is filled in only on about a quarter of notices. Use *State match → Or office state* to also catch notices whose contracting office is in your state.
- **Keyword search** is a case-insensitive word-start match on the title, solicitation number and description in the extract (not SAM.gov's relevance search). `cyber` matches *cybersecurity*. Phrases match across spaces and hyphens.
- **Descriptions** in the extract are capped at 32,000 characters (`descriptionTruncated: true`). Turn on details for the full text.
- **Attachments.** Controlled-access (CUI/export-controlled) files still require a SAM.gov login to download. They are listed with `accessLevel` and `exportControlled`.
- **USAspending** only searches awards from 2007-10-01 on. Agency names are mapped to USAspending's agency list (the log shows the mapping). Award data typically lags by days to weeks behind contract signature, and DoD data by about 90 days.
- **Large exports.** Exporting everything (`maxOpportunities: 0` with no filters) works with the default 512 MB memory and takes about 2 minutes for 70,000 notices. Use 1 GB for extra headroom.

# Actor input Schema

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

Words or phrases to find in the title, solicitation number and description. Examples: \["cybersecurity"], \["zero trust", "SOC"]. Case-insensitive, matched at word starts ("cyber" matches "cybersecurity"). Combine with keywordMatch.

## `keywordMatch` (type: `string`):

any: a notice matches if it contains at least one keyword. all: it must contain every keyword.

## `keywordFields` (type: `string`):

Where keywords are searched.

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

Skip notices that contain any of these words or phrases, e.g. janitorial.

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

NAICS codes, prefix match. Examples: \["541512"] (Computer Systems Design Services), \["5415"] (matches 541511, 541512, 541519…), \["236220"] (commercial construction).

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

Product Service Codes, prefix match. Examples: \["D"] (all IT and telecom services), \["DA01"], \["R4"].

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

Only notices with one of these set-asides. No set-aside matches notices with an empty or NONE set-aside.

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

Agency names, abbreviations or codes (word match). Examples: \["Veterans Affairs"], \["VA", "DHS"], \["Navy"], \["Defense Logistics Agency"], CGAC/AAC codes \["036"], \["36C10B"].

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

Two-letter US state codes for place of performance, e.g. \["VA", "MD", "DC"]. Only ~25% of notices state one; see stateMatch.

## `stateMatch` (type: `string`):

Place of performance only (strict). Or office state also includes notices without a place of performance whose contracting office is in one of the states.

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

Only these notice types. Leave empty for all types.

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

Only notices posted in the last N US Eastern calendar days (today included), e.g. 7. 0 = no limit. Ignored when postedFrom is set.

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

Only notices posted on or after this date, YYYY-MM-DD (US Eastern), e.g. "2026-10-01".

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

Only notices posted on or before this date, YYYY-MM-DD, e.g. "2026-10-18".

## `responseFrom` (type: `string`):

Only notices whose response deadline is on or after this date, YYYY-MM-DD. Notices without a deadline are excluded when a deadline range is set.

## `responseTo` (type: `string`):

Only notices whose response deadline is on or before this date, YYYY-MM-DD.

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

Skip notices that SAM.gov marks inactive or whose archive date has passed.

## `openForResponseOnly` (type: `boolean`):

Skip notices whose response deadline has already passed (notices without a deadline, such as award notices, are kept).

## `solicitationNumbers` (type: `array`):

Exact solicitation numbers to track, e.g. \["36C10B26Q0610"]. Useful with onlyNew to catch amendments.

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

Exact 32-character SAM.gov notice IDs (from sam.gov/opp/<id>/view), e.g. \["7b59a22732dd452ca9a04386363a9e15"].

## `maxOpportunities` (type: `integer`):

Maximum opportunities returned (after sorting). Default 20 keeps calls cheap (~$0.04); raise it (e.g. 100, 1000) for bigger exports. 0 = unlimited (~70,000 notices).

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

Order of the output (applied before Max opportunities).

## `includeDetails` (type: `boolean`):

For each opportunity, also loads the full description from sam.gov (the extract cuts long ones at 32,000 characters and has no HTML) plus every attachment and link with a download URL, file type, size and posting date. Takes two extra requests per notice and is charged as opportunity-with-details instead of opportunity.

## `includeDescriptionHtml` (type: `boolean`):

With details on, also returns the original HTML description (descriptionHtml).

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

true (default) = include the description text from the extract (can be several thousand characters per notice). Set false for compact output, e.g. for LLM context.

## `includeContacts` (type: `boolean`):

Adds primary and secondary contracting officer/specialist name, title, email, phone and fax. Off by default. These are business contacts of government staff; use them only for responding to the notice, in line with applicable laws and SAM.gov terms.

## `searchOpportunities` (type: `boolean`):

Turn off to run only the USAspending awards lookup.

## `searchAwards` (type: `boolean`):

Also look up federal contract awards from USAspending.gov, for example who won past work in your NAICS code or at your target agency. Charged per award record.

## `awardRecipients` (type: `array`):

Recipient company names or UEIs, e.g. \["Booz Allen Hamilton"], \["Leidos"].

## `awardNaicsCodes` (type: `array`):

NAICS codes for awards. If empty and Reuse opportunity filters is on, the opportunity NAICS codes are used.

## `awardPscCodes` (type: `array`):

PSC codes or prefixes for awards. Falls back to the opportunity PSC codes like NAICS.

## `awardAgencies` (type: `array`):

Awarding agency names, abbreviations or CGAC codes, e.g. \["Department of Veterans Affairs"], \["VA"], \["Navy"], \["036"].

## `awardStates` (type: `array`):

Two-letter state codes.

## `awardKeywords` (type: `array`):

Keywords USAspending searches in award descriptions (3+ characters), e.g. \["cloud migration"]. Opportunity keywords are not reused.

## `awardSetAsideCodes` (type: `array`):

USAspending set-aside codes, e.g. \["SBA"], \["8A"], \["SDVOSBC"], \["WOSB"], \["HZC"].

## `reuseOpportunityFiltersForAwards` (type: `boolean`):

When an award NAICS/PSC/agency/state/set-aside field is empty, use the matching opportunity filter instead.

## `awardLookbackDays` (type: `integer`):

Award date window when Award date from is not set: the last N days up to today.

## `awardDateFrom` (type: `string`):

Start of the award date window, YYYY-MM-DD (2007-10-01 or later), e.g. "2026-01-01".

## `awardDateTo` (type: `string`):

End of the award date window, YYYY-MM-DD. Default: today.

## `awardDateType` (type: `string`):

Action date: any obligation/modification in the window (includes older awards with new actions). New awards only: base award signed in the window. Last modified: records updated in the window.

## `awardTypes` (type: `array`):

contracts: definitive contracts, purchase orders, delivery orders, BPA calls. idvs: indefinite delivery vehicles (IDIQs, GWACs, BPAs, BOAs, FSS).

## `awardMinAmount` (type: `integer`):

Only awards worth at least this much.

## `awardMaxAmount` (type: `integer`):

Only awards worth at most this much.

## `awardSortBy` (type: `string`):

Newest first (base obligation date) or largest first.

## `maxAwards` (type: `integer`):

Maximum USAspending award records returned when searchAwards is true. Default 20; 0 = unlimited (broad searches return millions).

## `onlyNew` (type: `boolean`):

Remembers which notices and awards were already delivered (named key-value store samgov-contracts-state) and outputs, and charges for, new ones only. Schedule the Actor daily for alerts. When the SAM.gov extract has not changed since the last complete run, the run ends without downloading it.

## `stateKey` (type: `string`):

Name of the alert memory. Runs with the same key share it even if filters change. Empty = derived from the filters, so each filter combination gets its own memory.

## `baselineOnFirstRun` (type: `boolean`):

In only-new mode, the first run marks all current matches as seen without outputting (or charging for) them, so you only get alerts for notices posted afterwards.

## `csvUrl` (type: `string`):

Contract Opportunities full CSV published daily by GSA on data.gov. Change only if GSA moves the file.

## `maxConcurrency` (type: `integer`):

Parallel requests to sam.gov for details.

## `maxRetries` (type: `integer`):

Retries with exponential backoff on network errors, 429 and 5xx.

## Actor input object example

```json
{
  "keywords": [
    "cybersecurity"
  ],
  "keywordMatch": "any",
  "keywordFields": "titleAndDescription",
  "naicsCodes": [
    "541512"
  ],
  "stateMatch": "placeOfPerformance",
  "postedWithinDays": 0,
  "activeOnly": true,
  "openForResponseOnly": false,
  "maxOpportunities": 100,
  "sortBy": "postedDateDesc",
  "includeDetails": false,
  "includeDescriptionHtml": false,
  "includeDescription": true,
  "includeContacts": false,
  "searchOpportunities": true,
  "searchAwards": false,
  "reuseOpportunityFiltersForAwards": true,
  "awardLookbackDays": 90,
  "awardDateType": "action_date",
  "awardTypes": [
    "contracts"
  ],
  "awardSortBy": "date",
  "maxAwards": 100,
  "onlyNew": false,
  "baselineOnFirstRun": false,
  "csvUrl": "https://s3.amazonaws.com/falextracts/Contract%20Opportunities/datagov/ContractOpportunitiesFullCSV.csv",
  "maxConcurrency": 3,
  "maxRetries": 5
}
```

# Actor output Schema

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

SAM.gov contract opportunities (recordType = opportunity): title, notice type, agency, dates, NAICS/PSC, set-aside, place of performance, description, link; with details also the full description and attachment download links.

## `awards` (type: `string`):

USAspending.gov contract awards (recordType = award): recipient, amount, agency, NAICS/PSC, dates, award page link.

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

RUN_SUMMARY record: filters, rows scanned, matches, already-seen skips, charged events and estimated cost.

# 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": [
        "cybersecurity"
    ],
    "naicsCodes": [
        "541512"
    ],
    "maxOpportunities": 100,
    "maxAwards": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("krundle/samgov-federal-contracts-monitor").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": ["cybersecurity"],
    "naicsCodes": ["541512"],
    "maxOpportunities": 100,
    "maxAwards": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("krundle/samgov-federal-contracts-monitor").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": [
    "cybersecurity"
  ],
  "naicsCodes": [
    "541512"
  ],
  "maxOpportunities": 100,
  "maxAwards": 100
}' |
apify call krundle/samgov-federal-contracts-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,krundle/samgov-federal-contracts-monitor"
        }
    }
}
```

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/UDU3OmEjGZKSVuRC4/builds/HBIx70cWUQbgY14rG/openapi.json
