# USAspending Federal Contract Awards Monitor (No API Key) (`lukehunter/usaspending-federal-awards-monitor`) Actor

Search and monitor US federal contract awards from the official USAspending API: who won what, for how much, from which agency. Filter by NAICS, PSC, agency, state and amount, with new-award alerts for $0.004/award.

- **URL**: https://apify.com/lukehunter/usaspending-federal-awards-monitor.md
- **Developed by:** [Luke Hunter](https://apify.com/lukehunter) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 federal awards

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

## USAspending Federal Contract Awards Monitor (No API Key)

**For GovCon sales and business development teams, capture managers, subcontractors and market researchers who need to know who won which federal contract, for how much, from which agency.** Search and monitor **federal contract awards** from the official **USAspending API** in one clean dataset. Filter by NAICS code, PSC code, awarding agency, winner, state and award size, return only awards you have not seen before on a schedule, and send each new one to Slack, Discord, Telegram or your phone. A practical source of **government contracts data** without copying records by hand.

**$0.004 per delivered award — 1,000 awards = $4**

It reads the official, public **USAspending.gov API v2** (`api.usaspending.gov`). No scraping, no login, no proxy, and no API key: it is a **SAM.gov alternative (no API key)** for the "who won" side of federal contracting. SAM.gov's opportunity and entity APIs require a key; USAspending's search API is keyless and open (this Actor identifies itself with an honest User-Agent). Only awards that pass your filters are delivered, and only delivered awards are charged. Selling to other public buyers as well? See the siblings [TED EU Tenders Monitor](https://apify.com/lukehunter/ted-eu-tenders-monitor) and [UK Tenders Monitor](https://apify.com/lukehunter/uk-tenders-monitor): same inputs style, same alerts.

### What you get

One row per award, flattened and ready for a spreadsheet, CRM or alert: the **award link**, the agency's own award number (PIID), **recipient (winner) name and UEI**, **award amount** and total outlays, **awarding agency, sub-agency and funding agency**, **NAICS code and description**, **PSC code**, award, start and end dates, **place of performance (city, state, country)** and the agency's description of what is being bought.

| You want | Set |
|---|---|
| New federal IT awards over $1M | `naicsCodes: ["541512"]`, `minAmount: 1000000` |
| Who won contracts from one agency | `agencies: ["Department of Homeland Security"]` (or `["DHS"]`) |
| What one company has won lately | `recipientName: "Booz Allen"` |
| Awards performed in your region | `states: ["VA", "MD", "DC"]` |
| Anything mentioning a topic | `keywords: ["zero trust", "cloud migration"]` |
| Grants as well as contracts | `awardTypes: ["contracts", "grants"]` |
| Only what is new since yesterday | `onlyNewSinceLastRun: true` on a daily Schedule |

### Quick start

```json
{
  "naicsCodes": ["541512"],
  "awardedWithinDays": 14,
  "maxItems": 20
}
```

Run it with no filters at all and you get the 50 newest contract awards from the last 30 days across the whole federal government.

### Recipes

**New federal IT contract awards over $1M to Slack**

```json
{
  "naicsCodes": ["541512", "541511", "518210"],
  "minAmount": 1000000,
  "awardedWithinDays": 7,
  "onlyNewSinceLastRun": true,
  "maxItems": 50,
  "slackWebhookUrl": "https://hooks.slack.com/services/<T>/<B>/<token>"
}
```

Save it as a Task, add a daily Schedule, and Slack gets only the federal IT awards of $1M and up since the last run. The first run is the baseline and sends what currently matches the window.

**Who won contracts from DHS this month**

```json
{
  "agencies": ["Department of Homeland Security"],
  "awardedWithinDays": 30,
  "maxItems": 200
}
```

**Competitor watch: every new award to one company**

```json
{
  "recipientName": "Booz Allen",
  "awardedWithinDays": 30,
  "onlyNewSinceLastRun": true,
  "discordWebhookUrl": "https://discord.com/api/webhooks/<id>/<token>"
}
```

**Awards in a region for local subcontracting outreach**

```json
{
  "states": ["VA", "MD", "DC"],
  "pscCodes": ["D302", "D307"],
  "minAmount": 250000,
  "awardedWithinDays": 14,
  "maxItems": 100
}
```

**Last quarter's awards for one category (market sizing)**

```json
{
  "naicsCodes": ["5415"],
  "dateFrom": "2026-07-01",
  "dateTo": "2026-09-30",
  "maxItems": 1000
}
```

### Alerts: Discord, Telegram, Slack, Teams, Google Chat, phone push or any app

Add one or more destinations in the **Notifications (optional)** section and each run sends the awards it delivered. It is a monitor that notifies you: it only reads the public USAspending API, and never bids, applies, contacts anyone or logs in anywhere.

| Channel | Fill in | What you get |
|---|---|---|
| Discord | `discordWebhookUrl` | One card per award, 10 per message |
| Telegram | `telegramBotToken` + `telegramChatId` | Up to 10 awards per message, one line each |
| Slack | `slackWebhookUrl` | Block Kit message, up to 10 awards per message |
| Mattermost, Rocket.Chat | `slackCompatibleWebhookUrl` | A Markdown list |
| Microsoft Teams | `teamsWebhookUrl` | Adaptive Card from a Teams Workflows webhook |
| Google Chat | `googleChatWebhookUrl` | Card in a space |
| ntfy (phone push, no account) | `ntfyTopic` (optional `ntfyServer`, `ntfyToken`) | A push per award, up to 10, then one "...and N more" |
| Pushover (phone push) | `pushoverUserKey` + `pushoverAppToken` | A push per award, up to 10, then one "...and N more" |
| Zapier, Make, n8n, Pipedream | `webhookUrl` | One JSON POST per 100 delivered rows with the full dataset rows |

Each message reads like `New contract award: EXAMPLE SYSTEMS LLC — Department of Homeland Security`, with the amount, sub-agency, NAICS, PSC, award and contract dates, place and description, and a link to the USAspending award page. Nothing is sent when a run delivers nothing, a failing channel never fails the run, and notifications are free: you pay only for delivered awards. Webhook URLs and tokens are stored as secret inputs.

Setup per channel is a minute or two: for Discord copy a channel webhook URL (Server Settings → Integrations → Webhooks); for Telegram create a bot with @BotFather and give its token plus a chat id; for Slack create an incoming webhook at api.slack.com/apps; for Teams use a Workflows "Post to a channel when a webhook request is received" URL.

`maxNotifications` (default 25, max 100) caps how many awards go to chat and phone channels per run; the rest are still in the dataset. Use `onlyNewSinceLastRun` for alerts, otherwise a scheduled run repeats the same awards.

### Input

| Field | Default | What it does |
|---|---:|---|
| `keywords` | `[]` | Search the award description for any of these words or phrases. At least 3 characters each; up to 20. |
| `naicsCodes` | `[]` | NAICS industry codes of contracts: 2, 4 or 6 digits (`541512`, `5415`, `54`). USAspending rejects 3 and 5 digit codes, so those stop the run with an error. Contracts only. |
| `pscCodes` | `[]` | Product and Service Codes, 1 to 4 letters or digits (`D302`, `R`, `7A20`). Contracts only. |
| `agencies` | `[]` | Awarding top-tier agencies by exact name, or by the acronyms DoD, DHS, VA, HHS, GSA, NASA, DOE, DOS, DOJ, Treasury, USDA, DOC, DOT, DOI, DOL, HUD, EPA, SBA, SSA, NSF, USAID, OPM, NRC. Any other text is sent as typed. |
| `recipientName` | `""` | Winner name contains this text (at least 3 characters). |
| `states` | `[]` | US place of performance as two-letter codes (`VA`, `TX`, `DC`, `PR`...). |
| `minAmount`, `maxAmount` | none | Dollar bounds on the award amount. |
| `awardTypes` | `["contracts"]` | `contracts` (procurement contracts, purchase orders, delivery orders) and/or `grants`. NAICS and PSC cannot be combined with grants. |
| `awardedWithinDays` | `30` | 1 to 366 days back, including today. |
| `dateFrom`, `dateTo` | none | Explicit `YYYY-MM-DD` range, at most 366 days. Overrides `awardedWithinDays`. |
| `maxItems` | `50` | Hard cap on delivered awards, 1 to 5,000, newest first. |
| `onlyNewSinceLastRun` | `false` | Deliver and charge only awards not delivered before for this same set of filters. |
| `stateStoreName` | `usaspending-federal-awards-monitor-seen-awards` | Named store holding the alert memory. |
| notification fields | none | `discordWebhookUrl`, `telegramBotToken`, `telegramChatId`, `slackWebhookUrl`, `slackCompatibleWebhookUrl`, `teamsWebhookUrl`, `googleChatWebhookUrl`, `ntfyTopic`, `ntfyServer`, `ntfyToken`, `pushoverUserKey`, `pushoverAppToken`, `webhookUrl`, `maxNotifications`. |

Every filter is applied by USAspending itself, so you are only charged for awards that match. The window selects **new awards**: awards whose first action (base obligation) falls inside it, so a later modification to an old contract does not show up as a new award.

#### How "only new" works

With `onlyNewSinceLastRun`, the Actor remembers each delivered award by its USAspending award key in a named key-value store, per set of filters (changing a NAICS code starts a fresh baseline; changing `maxItems` or `awardedWithinDays` does not). Only awards actually delivered are remembered, so anything held back by `maxItems` or your spending limit turns up on the next run.

### Example output

```json
{
  "awardId": "CONT_AWD_70EXAMPLE26F0001_9700_-NONE-_-NONE-",
  "piid": "70EXAMPLE26F0001",
  "recipientName": "EXAMPLE SYSTEMS LLC",
  "recipientUei": "SYNTH0000001",
  "awardAmount": 2500000,
  "totalOutlays": 125000.5,
  "awardingAgency": "Department of Homeland Security",
  "awardingSubAgency": "U.S. Customs and Border Protection",
  "fundingAgency": "Department of Homeland Security",
  "naicsCode": "541512",
  "naicsDescription": "COMPUTER SYSTEMS DESIGN SERVICES",
  "pscCode": "D302",
  "pscDescription": "IT AND TELECOM - SYSTEMS DEVELOPMENT",
  "awardedDate": "2026-10-08",
  "startDate": "2026-10-15",
  "endDate": "2027-10-14",
  "placeOfPerformanceCity": "ARLINGTON",
  "placeOfPerformanceState": "VA",
  "placeOfPerformanceCountry": "USA",
  "description": "ZERO TRUST ARCHITECTURE SUPPORT SERVICES FOR CBP",
  "awardType": "DELIVERY ORDER",
  "awardCategory": "contract",
  "url": "https://www.usaspending.gov/award/CONT_AWD_70EXAMPLE26F0001_9700_-NONE-_-NONE-",
  "scrapedAt": "2026-10-11T09:00:00.000Z"
}
```

This sample is illustrative (synthetic company and award numbers), shaped like USAspending's search results. Anything an award does not publish is `null`, never guessed. `awardAmount` is the total obligated so far, so it can grow with later modifications. `awardId` is USAspending's stable award key and the dedupe key across runs; `piid` is the agency's own number.

### Use with AI agents (MCP)

This Actor works as a tool for Claude, ChatGPT, Cursor and other MCP clients through [Apify's MCP server](https://mcp.apify.com). Every input is optional, so a call can be as small as `naicsCodes` and `awardedWithinDays`.

**Claude Desktop** (`claude_desktop_config.json`), with your own token from Apify Console > Settings > API & Integrations:

```json
{
  "mcpServers": {
    "apify-usaspending-awards": {
      "command": "npx",
      "args": [
        "-y", "mcp-remote",
        "https://mcp.apify.com?tools=lukehunter/usaspending-federal-awards-monitor",
        "--header", "Authorization: Bearer ${APIFY_TOKEN}"
      ],
      "env": { "APIFY_TOKEN": "<YOUR_APIFY_TOKEN>" }
    }
  }
}
```

Clients that support OAuth (Claude.ai, VS Code) can connect with just the URL `https://mcp.apify.com?tools=lukehunter/usaspending-federal-awards-monitor` and sign in to Apify. Never paste a real token into a shared file or chat.

**Example.** You ask: "Which companies won federal IT contracts over $1M from DHS in the last two weeks?" The agent calls the tool `lukehunter--usaspending-federal-awards-monitor` with:

```json
{
  "naicsCodes": ["541512"],
  "agencies": ["DHS"],
  "minAmount": 1000000,
  "awardedWithinDays": 14,
  "maxItems": 25
}
```

It is charged $0.004 per delivered award, capped by `maxItems`. Each input property description is short and carries an example, so agents fill it in correctly.

### Pricing

Pay-per-event: **$0.004 per delivered award.** An award is charged only after it is accepted into the dataset, and only if it passed your filters (and, in alert mode, was not delivered before).

| Awards delivered | Cost |
|---:|---:|
| 20 | $0.08 |
| 50 (default cap) | $0.20 |
| 5,000 (maximum) | $20.00 |

`maxItems` (hard maximum 5,000) and your Apify per-run spending limit both stop delivery before the cap is passed. Reading USAspending, filtering and sending notifications cost nothing extra. Price changes follow Apify's notice rules; the Pricing tab always shows the rate you are charged.

### Limitations

- **Public domain US government data, attribute the source.** USAspending.gov data is public information of the US federal government and free to reuse. If you republish it, credit the source, for example "Source: USAspending.gov", and check the awards you act on at the official award page (the `url` field).
- **Not affiliated with the US government.** This is an independent Actor reading the public USAspending API.
- **Reporting lags.** Agencies report awards on their own schedule: civilian awards usually appear within days, but Department of Defense awards can be published up to 90 days late, so a recent window fills in over time. Use `onlyNewSinceLastRun` on a schedule so late awards still arrive as new when they appear, as long as their first action falls inside your window.
- **Prime awards only.** Subawards (who a prime hired) are a separate USAspending dataset and are not included. This is also not a source of open opportunities: for bids that are still open you need SAM.gov, which requires its own key.
- **Amounts are as reported and change.** `awardAmount` is the total obligated so far, not necessarily the ceiling of the contract, and later modifications can change it after you have received the row.
- **Contracts and grants only.** Loans, direct payments and IDV-only searches are not offered.
- **Agency names must match.** USAspending matches the top-tier agency name exactly. The common acronyms are expanded; a misspelled name returns no awards rather than an error.
- **Time window, not archive.** Each run covers at most 366 days and reads at most 60 pages per award type (up to 6,000 awards) over at most 15 minutes. When a window is bigger than that, the run says it stopped early; narrow the dates or add filters.
- **API changes.** If USAspending rejects an optional field the Actor drops that column and says so in the status message; if it rejects the search itself, the run fails with the API's message and nothing is charged.
- **Rate limits.** Requests are paced at no more than two a second, and 429/5xx responses are retried with backoff. If USAspending stays unavailable, nothing is charged and the run fails with a clear message.

### Use it from your code, Make, Zapier or n8n

Built for automated pipelines: small runs, stable field names, one row per item, and you pay only for rows actually delivered.

**One API call that runs the Actor and returns the data** (replace `$APIFY_TOKEN` with your token from Apify Console → Settings → Integrations):

```bash
curl -s -X POST "https://api.apify.com/v2/acts/lukehunter~usaspending-federal-awards-monitor/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"naicsCodes": ["541512"], "awardedWithinDays": 14, "maxItems": 20}'
```

**JavaScript** (`npm i apify-client`):

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('lukehunter~usaspending-federal-awards-monitor').call({
  "naicsCodes": [
    "541512"
  ],
  "awardedWithinDays": 14,
  "maxItems": 20
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**Python** (`pip install apify-client`):

```python
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('lukehunter~usaspending-federal-awards-monitor').call(run_input={"naicsCodes": ["541512"], "awardedWithinDays": 14, "maxItems": 20})
items = client.dataset(run['defaultDatasetId']).list_items().items
```

**Schedules, webhooks and no-code tools:** save your input as a Task, add a Schedule (e.g. hourly or daily), and attach a webhook or one of the Integrations tab's connectors (Make, Zapier, n8n, Google Sheets, Slack) to push each run's results into your own system.

**Only new items each run:** set `"onlyNewSinceLastRun": true` on a scheduled Task and every run after the first delivers, and charges for, only items it hasn't delivered before for that same input. That makes it a ready-made change feed.

**Feedback:** an honest rating on the Store page, good or bad, helps others decide if this Actor fits their needs. Missing a field or found a problem? Open an issue on the Actor page.

### FAQ

**Is this the official USAspending API?** Yes. It calls the public USAspending API v2 (`/api/v2/search/spending_by_award/`) that the US Treasury's Bureau of the Fiscal Service provides, anonymously, with an honest User-Agent and no proxy.

**Do I need a key or a SAM.gov account?** No. USAspending's API is keyless. This Actor is not a replacement for SAM.gov's open-opportunity feed; it is the keyless way to get federal contract award data.

**What is a NAICS code?** The North American Industry Classification System code of the work. `541512` is computer systems design, `541511` custom programming, `518210` hosting, `236220` commercial building construction. Use 2, 4 or 6 digits.

**Why is an award I saw on the USAspending website missing?** Check its first-action date against your window (this Actor selects new awards, not later modifications), its award type (contracts by default), and the agency name spelling.

**How is this different from the Emerging Federal Contractor Radar?** That Actor is a lead list: it takes new awards and keeps the winners that are new to federal work. This one is the general search and alert feed: every award that matches your filters, established incumbents included. See [Emerging Federal Contractor Radar](https://apify.com/lukehunter/emerging-federal-contractor-radar) if you want first-time winners.

**Can I get new awards in Slack, Discord or Telegram every morning?** Yes: set `onlyNewSinceLastRun`, add a destination and a daily Schedule. See the recipes above.

**Does it submit bids or contact companies?** No. It only reads and reports.

### Related Actors

Other data tools from the same developer, built to the same standard: official or public sources, hard cost caps, and honest documentation of limits.

- **[Federal Register Rule Effective-Date Radar](https://apify.com/lukehunter/federal-rule-effective-date-radar)**: final federal rules about to take effect, with citations, dockets and urgency.
- **[UK Tenders Monitor](https://apify.com/lukehunter/uk-tenders-monitor)**: new UK public-sector tenders from Contracts Finder and Find a Tender, filtered by CPV code, value, region and buyer, with Slack, Discord and Telegram alerts.
- **[TED EU Tenders Monitor](https://apify.com/lukehunter/ted-eu-tenders-monitor)**: new EU public tenders, awards and prior information notices from TED (Tenders Electronic Daily), filtered by CPV code, buyer country, value and keyword, with Slack, Discord and Telegram alerts.
- **[Chicago Contract Recompete & Extension Radar](https://apify.com/lukehunter/chicago-contract-expiration-radar)**: expiring City of Chicago contracts with extension history, for recompete prospecting.
- **[Bank Branch Closings & Merger Radar (FDIC)](https://apify.com/lukehunter/bank-branch-merger-radar)**: new US bank branch closings, openings and mergers from the FDIC.
- **[Chicago New Business License Radar](https://apify.com/lukehunter/chicago-new-business-license-radar)**: newly licensed Chicago businesses as opening leads, grouped by category.
- **[NYC FDNY Contractor Leads & Hearing Radar](https://apify.com/lukehunter/fdny-violation-radar)**: fresh NYC fire-code summonses routed by remediation trade, with hearing dates.
- **[RCRA Enforcement Response Leads](https://apify.com/lukehunter/rcra-enforcement-radar)**: new EPA hazardous-waste (RCRA) enforcement actions and penalties, by state.

# Actor input Schema

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

Search the award description text, matching at least one of these words or phrases, e.g. \["cloud migration", "cybersecurity", "zero trust"]. Each needs 3 or more characters. Up to 20. Leave empty to keep every award that passes the other filters.

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

Only contract awards classified under these NAICS industry codes: 2, 4 or 6 digits, e.g. \["541512"] (computer systems design) or \["5415", "518210"]. USAspending rejects 3 and 5 digit codes, so those stop the run with an error. Contracts only. Leave empty for any industry.

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

Only contract awards with these Product and Service Codes: 1 to 4 letters or digits, e.g. \["D302"] (IT systems development), \["R"] (professional services) or \["7A20"]. Contracts only. An invalid code stops the run with an error. Leave empty for any product or service.

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

Only awards made by these top-tier federal agencies, by exact name or common acronym, e.g. \["Department of Homeland Security"] or \["DHS", "VA", "GSA", "NASA"]. Other names are sent exactly as typed and match nothing if misspelled. Leave empty for every agency.

## `recipientName` (type: `string`):

Only awards whose recipient name contains this text, e.g. Booz Allen or Lockheed Martin. At least 3 characters. Matched by USAspending against the registered business name. Leave empty for any recipient.

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

Only awards performed in these US states or territories, as two-letter codes, e.g. \["VA", "TX", "DC"]. An unknown code stops the run with an error. Leave empty for the whole country.

## `minAmount` (type: `integer`):

Keep awards worth at least this many US dollars, e.g. 1000000 for $1M and up. Leave empty for no lower bound.

## `maxAmount` (type: `integer`):

Keep awards worth at most this many US dollars, e.g. 10000000. Leave empty for no upper bound.

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

Which awards to return, e.g. \["contracts"]. contracts = federal procurement contracts, purchase orders and delivery orders (default); grants = federal grant awards. NAICS and PSC codes cannot be combined with grants.

## `awardedWithinDays` (type: `integer`):

Only awards first signed in the last N days including today, 1 to 366, e.g. 30 for the last month. Ignored when Date from is set. Federal agencies, DoD especially, can report awards late, so very recent windows may fill in over time.

## `dateFrom` (type: `string`):

First day of an explicit award range, written YYYY-MM-DD, e.g. 2026-09-01. Use with Date to (defaults to today). The range may not exceed 366 days; a longer one stops the run with an error. Overrides Awarded within days.

## `dateTo` (type: `string`):

Last day of an explicit award range, written YYYY-MM-DD, e.g. 2026-09-30. Needs Date from. Leave empty to include everything up to today.

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

Hard cap on delivered awards, newest first, 1 to 5000, e.g. 50. At $0.004 per delivered award this caps the result charge for the run (50 awards = $0.20). Awards beyond the cap are not charged.

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

Deliver and charge only awards not delivered before for this same set of filters, e.g. on a daily Schedule. The first run creates the baseline and delivers what currently matches. Pair with a Discord, Slack or Telegram destination below.

## `stateStoreName` (type: `string`):

Named key-value store that remembers delivered awards between runs, used only when alerts are on. Example: my-it-awards. Use a different name to keep separate histories. Letters, numbers and hyphens only.

## `discordWebhookUrl` (type: `string`):

Post results to a Discord channel. In Discord: Server Settings -> Integrations -> Webhooks -> New Webhook -> choose the channel -> Copy Webhook URL. Example: https://discord.com/api/webhooks/<id>/<token>. Leave empty to skip Discord.

## `telegramBotToken` (type: `string`):

Post results to Telegram. Create a bot by chatting with @BotFather on Telegram (send /newbot) and paste the token it gives you, e.g. 123456789:AA.... Needs "Telegram chat ID" below. Leave empty to skip Telegram.

## `telegramChatId` (type: `string`):

Where the bot should post: a numeric chat id (e.g. 123456789, or -1001234567890 for a group or channel) or a public @channelusername. The bot must be added to that chat or channel first (as an administrator for a channel), and for a private chat you must press Start on the bot. Needs "Telegram bot token" above.

## `slackWebhookUrl` (type: `string`):

Post results to a Slack channel (Block Kit cards, up to 10 per message). Create an incoming webhook at api.slack.com/apps -> Create New App -> Incoming Webhooks -> Add New Webhook to Workspace. Example: https://hooks.slack.com/services/T000/B000/XXXX. Leave empty to skip Slack.

## `slackCompatibleWebhookUrl` (type: `string`):

Post results to a Mattermost or Rocket.Chat incoming webhook, which accept Slack-style webhook payloads. Must be a public https:// address, e.g. https://chat.example.com/hooks/abc123 (no localhost, private IP or .local/.internal hosts). These apps do not render Slack Block Kit, so they get a plain Markdown list. For real Slack use "Slack webhook URL" above. Leave empty to skip.

## `teamsWebhookUrl` (type: `string`):

Post results to a Teams channel as an Adaptive Card. In Teams: channel -> ... -> Workflows -> "Post to a channel when a webhook request is received" -> copy the URL. The host must end in .logic.azure.com or .powerplatform.com, e.g. https://prod-12.westeurope.logic.azure.com/workflows/... The retired Office 365 connector webhooks are not supported. Leave empty to skip Teams.

## `googleChatWebhookUrl` (type: `string`):

Post results to a Google Chat space. In the space: Apps & integrations -> Webhooks -> Add webhook -> copy the URL. Example: https://chat.googleapis.com/v1/spaces/<space>/messages?key=...\&token=.... Leave empty to skip Google Chat.

## `ntfyTopic` (type: `string`):

Get a phone push with no account via ntfy (ntfy.sh). Install the ntfy app, subscribe to a topic name, and enter the same name here. Anyone who knows the topic can read it, so pick a long, unguessable name (letters, numbers, - and \_), e.g. acme-leads-7k2x9q. At most 10 individual pushes per run, then one "...and N more". Leave empty to skip ntfy.

## `ntfyServer` (type: `string`):

Only used with "ntfy topic". Leave as https://ntfy.sh, or enter the public https:// address of your own ntfy server, e.g. https://ntfy.example.com.

## `ntfyToken` (type: `string`):

Only used with "ntfy topic", for a self-hosted server or a reserved topic that needs a login. An access token from ntfy (starts with tk\_, e.g. tk_abc123...). Leave empty for open topics.

## `pushoverUserKey` (type: `string`):

Get a phone push via Pushover. Your user key (30 characters, e.g. uQiRzpo4DXghDmr9QzzfQu27cmVRsG) is shown on the Pushover dashboard (pushover.net). Needs "Pushover app token" below. At most 10 individual pushes per run, then one "...and N more". Leave empty to skip Pushover.

## `pushoverAppToken` (type: `string`):

The API token of a Pushover application you create at pushover.net/apps/build (name it after this Actor), e.g. azGDORePK8gMaC0QOYAMyEEuzJnyUi. Needs "Pushover user key" above.

## `webhookUrl` (type: `string`):

POST the delivered rows as JSON to any public https:// URL: {source, actor, runId, count, items}. At most 100 rows per POST; every delivered row is sent regardless of the max-notifications cap. For example, route results to email, a spreadsheet or any app. Localhost, private IP and .local/.internal addresses are rejected. Leave empty to skip.

## `maxNotifications` (type: `integer`):

Caps how many results are sent to chat and phone channels per run (Discord, Telegram, Slack, Teams, Google Chat, ntfy, Pushover), 1-100, default 25 (e.g. 10). Extra results are still in the dataset. The generic webhook is not capped. Only used when a destination above is set.

## Actor input object example

```json
{
  "naicsCodes": [
    "541512"
  ],
  "awardTypes": [
    "contracts"
  ],
  "awardedWithinDays": 14,
  "maxItems": 20,
  "onlyNewSinceLastRun": false,
  "stateStoreName": "usaspending-federal-awards-monitor-seen-awards",
  "ntfyServer": "https://ntfy.sh",
  "maxNotifications": 25
}
```

# Actor output Schema

## `awards` (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 = {
    "naicsCodes": [
        "541512"
    ],
    "awardedWithinDays": 14,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("lukehunter/usaspending-federal-awards-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 = {
    "naicsCodes": ["541512"],
    "awardedWithinDays": 14,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("lukehunter/usaspending-federal-awards-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 '{
  "naicsCodes": [
    "541512"
  ],
  "awardedWithinDays": 14,
  "maxItems": 20
}' |
apify call lukehunter/usaspending-federal-awards-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lukehunter/usaspending-federal-awards-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/QVlK2n2qX0ro4R9WA/builds/CaW2DXzZZXfF4coCD/openapi.json
