# USAspending Awards Search: Federal Contracts and IDVs (`conserving_celerytop/usaspending-awards-api`) Actor

Search US federal contracts and contract vehicles (IDVs) by keyword, recipient, agency, date, amount, state and NAICS code. Get flat rows with recipient, amount, agency, dates, NAICS and PSC codes. Public data, $4.00 per 1,000 awards.

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

## Pricing

from $2.80 / 1,000 award results

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

## USAspending Awards Search: Federal Contracts and IDVs

USAspending awards search that returns one flat row per US federal contract or contract vehicle (IDV): recipient company, amount, awarding agency, dates, place of performance, NAICS and product or service codes, ready for a spreadsheet, a database or an AI agent. Pick contracts or IDVs, add keywords, a recipient or an agency, set a date range and a maximum, then run. Results cost $4.00 per 1,000 awards, and a run of 20 awards costs about eight cents. I built this Actor as an independent developer. It is not affiliated with or endorsed by USAspending.gov or the US Department of the Treasury.

Contracts and IDVs only; assistance awards are excluded because they can name individuals.

### Sample output

One row from a USAspending awards search for contracts with the keyword `cybersecurity`, signed between 2025-10-01 and 2026-09-30, sorted by award amount. Values were read from the source on 2026-10-04 and change over time. Fields with no value (`null`) are left out here for space.

```json
{
  "recordType": "award",
  "rank": 1,
  "awardId": "47QFCA26F0024",
  "awardCategory": "contracts",
  "awardType": "DELIVERY ORDER",
  "recipientName": "GENERAL DYNAMICS INFORMATION TECHNOLOGY, INC.",
  "recipientUei": "SMNWM6HN79X5",
  "recipientCity": "FAIRFAX",
  "recipientState": "VA",
  "recipientZip": "22030",
  "recipientCountry": "UNITED STATES",
  "awardingAgency": "General Services Administration",
  "awardingSubAgency": "Federal Acquisition Service",
  "fundingAgency": "Department of Defense",
  "fundingSubAgency": "Department of the Army",
  "description": "ENTERPRISE NETWORK OPERATIONS AND CYBERSECURITY SUPPORT ENOCS",
  "awardAmountUsd": 87754106,
  "signedDate": "2026-07-01",
  "startDate": "2026-06-29",
  "endDate": "2027-06-30",
  "naicsCode": "541512",
  "naicsDescription": "COMPUTER SYSTEMS DESIGN SERVICES",
  "pscCode": "DJ10",
  "pscDescription": "IT AND TELECOM - SECURITY AND COMPLIANCE AS A SERVICE",
  "performanceCity": "ARLINGTON",
  "performanceState": "VA",
  "awardUrl": "https://www.usaspending.gov/award/CONT_AWD_47QFCA26F0024_4732_47QTCK18D0003_4732"
}
```

### How to search USAspending awards with this Actor

1. Open the Actor and choose an **Award category**: Contracts or Contract vehicles (IDVs). One run searches one category. An IDV is an indefinite delivery vehicle, a contract that agencies place later orders against.
2. Add **Keywords** to find words in award descriptions, for example `cybersecurity`. An award that matches any keyword is returned.
3. Add **Recipients** (names or UEI codes) or an **Awarding agency** such as `Department of Defense` or `DOD`.
4. Enter a **Start date** and an **End date** as YYYY-MM-DD. The earliest date is 2007-10-01.
5. Set **Maximum awards**. The prefill is 20, so the first run is cheap. One run returns up to 10,000 awards.
6. Open **Advanced options** to choose the date type, an amount range, states, NAICS codes and the sort order.
7. Click Start. Rows appear in the dataset as they are saved. Use the Overview table, or export to JSON, CSV or Excel.

You can also call the Actor from code through the Apify API. The example below lists the 100 largest contracts signed in fiscal year 2026 for one NAICS code.

```bash
curl -X POST "https://api.apify.com/v2/acts/conserving_celerytop~usaspending-awards-api/run-sync-get-dataset-items" \
  -H "Authorization: Bearer <YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"awardCategory": "contracts", "naicsCodes": ["541512"], "startDate": "2025-10-01", "endDate": "2026-09-30", "maxItems": 100}'
```

### What data you get from the USAspending awards API

| Field | Applies to | Meaning |
|---|---|---|
| `rank`, `recordType`, `awardId`, `awardCategory`, `awardType`, `awardUrl`, `internalId` | all | Position in the result, row type, award identifier, category, award type and the award page link |
| `recipientName`, `recipientUei`, `recipientId` | all | Recipient organization, its UEI code and the source recipient id |
| `recipientCity`, `recipientState`, `recipientZip`, `recipientCountry` | all | Recipient location (city, state, five digit ZIP, country) |
| `awardingAgency`, `awardingSubAgency`, `fundingAgency`, `fundingSubAgency` | all | Agencies that made and paid for the award |
| `description` | all | Award description, cut to 1,000 characters |
| `awardAmountUsd`, `totalOutlaysUsd` | all | Award amount and total outlays in US dollars |
| `signedDate`, `startDate`, `endDate`, `lastModified` | all | Signing date, period of performance and last change in the source |
| `lastDateToOrder` | contract vehicles (IDVs) | Last date an order can be placed |
| `naicsCode`, `naicsDescription`, `pscCode`, `pscDescription` | all | Industry code and product or service code |
| `performanceCity`, `performanceState`, `performanceZip`, `performanceCountry` | all | Primary place of performance |
| `fetchedAt` | all | Time the row was read |
| `statusCode`, `message` | message rows | Source status code and the plain text of a `no_results` or `error` row |

Fields that do not apply to a category (`endDate` for IDVs, `lastDateToOrder` for contracts) are `null`, so every award row has the same columns. Street addresses and nine digit postal codes are not returned.

### USAspending awards search pricing

Pricing is pay per event. One event is **one saved award row**, plus the standard Actor start event.

| Plan | Price per award | Price per 1,000 awards |
|---|---|---|
| Free | $0.0040 | $4.00 |
| Bronze | $0.0036 | $3.60 |
| Silver | $0.0032 | $3.20 |
| Gold | $0.0028 | $2.80 |

Worked example: a search for the 500 largest contracts that mention `cybersecurity` returns 500 rows. On the Free plan that is 500 x $0.004 = $2.00, plus $0.00005 for the Actor start, so about $2.00 in total. The same run on the Gold plan costs $1.40.

How charging works:

- A row is charged only after it is saved to the dataset.
- A valid search with no matches saves one message row and charges one award.
- A search the source rejects returns one error row with the source message and charges one award.
- When the source is unavailable and no rows were saved, the run saves one error row and charges one award. Rows saved before such a stop are charged as usual.
- Input the Actor rejects (for example a Maximum awards of 0, or an agency name that does not exist) ends the run with a plain message, saves one error row with that message and charges one award.
- The run stops when the maximum charge you set for the run is reached.

### Input example

```json
{
  "awardCategory": "contracts",
  "keywords": ["zero trust", "cloud migration"],
  "awardingAgency": "Department of Homeland Security",
  "startDate": "2025-10-01",
  "endDate": "2026-09-30",
  "minAmount": 1000000,
  "performanceStates": ["VA", "MD"],
  "sortBy": "amount",
  "maxItems": 200
}
```

| Field | Type | Notes |
|---|---|---|
| `awardCategory` | select | `contracts` or `contract_idvs` |
| `keywords` | list | Words in award descriptions, 3 or more characters each, matched with OR |
| `recipients` | list | Recipient names or UEI codes, matched with OR. A search for a parent company can also return its subsidiaries |
| `awardingAgency` | text | Federal agency name, abbreviation or code. Checked against the official list before the search |
| `startDate`, `endDate` | text | `YYYY-MM-DD`, from 2007-10-01 on |
| `maxItems` | integer | 1 to 10,000 |
| `dateType` | select | `new_awards_only` (signed in the period), `action_date` or `last_modified_date` |
| `minAmount`, `maxAmount` | number | US dollars |
| `performanceStates`, `recipientStates` | list | Two letter state or territory codes |
| `naicsCodes` | list | 2 to 6 digit codes such as `541512` |
| `sortBy`, `sortOrder` | select | `amount`, `startDate`, `lastModified` or `recipientName`; `desc` or `asc` |
| `onlyNew` | checkbox | When on, the run returns only awards that this monitor has not delivered before. Default off |
| `monitorName` | text | Names the memory of the monitor. Letters, numbers, `-` and `_`, up to 40 characters. Default `default` |

### Output example for a contract vehicle (IDV)

```json
{
  "recordType": "award",
  "rank": 1,
  "awardId": "75F40126D00019",
  "awardCategory": "contract_idvs",
  "awardType": "INDEFINITE DELIVERY / INDEFINITE QUANTITY",
  "recipientName": "DCT, INCORPORATED",
  "recipientUei": "CXCYMF7NMDS4",
  "recipientCity": "MCALESTER",
  "recipientState": "OK",
  "awardingAgency": "Department of Health and Human Services",
  "awardingSubAgency": "Food and Drug Administration",
  "awardAmountUsd": 9069523,
  "signedDate": "2026-09-15",
  "startDate": "2026-09-21",
  "lastDateToOrder": "2031-09-20",
  "naicsCode": "561210",
  "naicsDescription": "FACILITIES SUPPORT SERVICES",
  "pscCode": "Z1AZ",
  "performanceState": "OK"
}
```

### Use cases for a federal contract list

- Build a list of agencies and companies that buy in your industry, filtered by NAICS code, state and amount.
- Watch a competitor or a partner: search by recipient name and sort by signing date.
- Track new contracts for a keyword or an agency each month with a scheduled run.
- Size a market: total award amounts by agency, state or code in a spreadsheet pivot.
- Find the contract vehicles (IDVs) a competitor holds and when their last order date falls.
- Feed award rows with agency and amount into a sales tool, a research notebook or an AI agent.

### Run it every day

Use a saved Task and a schedule to get only the new awards each day.

1. Open the Actor, fill in your search, tick **Only new since the last run** and give the search a **Monitor name**, for example `cyber-daily`. Use one monitor name per saved task.
2. Click **Save as a new task**.
3. In the Apify Console open **Schedules**, click **Create new**, pick your Task and enter a cron expression for once a day, for example `0 7 * * *` (every day at 07:00).
4. Each run returns only awards that the monitor has not delivered before. The first run returns everything that matches, up to **Maximum awards**, and becomes the baseline.

Settings that suit a daily run:

- Leave **End date** empty, so each run searches up to today.
- Set **Sort by** to Start date and **Sort order** to Highest or newest first, so the newest awards come first.
- Set **Maximum awards** above the number of new awards you expect in a day. Awards that the maximum cuts off are not remembered, so the next run delivers them.
- Changing a search value, such as a keyword, an agency or a date, starts a new memory, and the next run counts as a first run. Changing **Maximum awards** or the sort order does not.
- An award is delivered once. If the source changes the award later, it is not delivered again.

Where the memory lives: in a key-value store in your own Apify account named `usaspending-monitor-<monitorName>`. It holds award ids only, no award content. A run with no new awards saves no row and charges no award, only the Actor start.

Worked example on the Free plan, with the prices above ($0.004 per award, $0.00005 per Actor start). Assume a saved task with Maximum awards set to 100.

- First run, 100 awards: 100 x $0.004 + $0.00005 = $0.40005.
- A day with 12 new awards: 12 x $0.004 + $0.00005 = $0.04805.
- A day with no new awards: $0.00005.
- A 30 day month with 12 new awards every day: 30 x $0.04805 = $1.4415.

Awards that the monitor skips because it delivered them before are never charged.

### Related Actors

- [Public Tenders API: EU TED and UK Find a Tender](https://apify.com/conserving_celerytop/eu-uk-public-tenders) lists open public tenders in the EU and the UK.
- [Startup Funding Rounds Tracker: SEC Form D](https://apify.com/conserving_celerytop/form-d-funding-rounds) lists private funding rounds filed with the SEC.
- [Company Registry Search: GLEIF LEI, Norway and Finland](https://apify.com/conserving_celerytop/open-company-registries) looks up companies in open registries.
- [Company Name to Domain](https://apify.com/conserving_celerytop/company-name-to-domain) turns a recipient name into a website.

### FAQ

#### Is it legal to search USAspending awards with this Actor?

The Actor reads the public award search API of USAspending.gov without a login or an API key. The documentation of the API states: "Endpoints do not currently require any authorization." The project describes its data as "open source and provided to the public as part of the DATA Act". The Actor covers contracts and IDVs only. Assistance awards (grants, loans, direct payments and other assistance) are excluded because the source can show individuals there. Contract searches keep only recipients recorded as corporations, partnerships, LLCs, nonprofits, universities and government bodies, awards the source masks as individual recipients are left out, person-like names are checked and left out (see the FAQ), and street addresses are not returned. I found no clause on rate limits or automated use in the sources I could read, so the Actor makes one request at a time, pauses between pages and follows Retry-After. This is not legal advice.

#### How many awards can one run return?

Up to 10,000 awards per run. The source returns at most 50,000 results for one search, so use dates, an agency or a state to split a larger search into several runs.

#### Which dates does the date range use?

By default the range applies to the signing date, so you get awards first signed in the period. Choose `action_date` for awards with a transaction in the period or `last_modified_date` for awards changed in the period. Some agencies publish with a delay, so a very recent window can hold few awards.

#### Why are some recipients missing?

Contract and IDV searches only keep recipients recorded as an organization form, so sole proprietorships and recipients with no recorded organization type are left out (about 2 percent of contracts). Rows with masked names such as `INDIVIDUAL RECIPIENT`, `REDACTED DUE TO PII` and `MULTIPLE RECIPIENTS` are also left out. As a last guard, a name written like a person (for example `JOHN Q PUBLIC`) is left out, and a short name with no company word (for example `JANE DOE`) is checked once against the recipient profile and left out when the source records a sole proprietorship. Names without a company suffix are otherwise kept, because many companies have none, so a rare individual can remain when the source records them as another organization form.

#### Why are grants, loans and other assistance not included?

Those awards can name individuals such as sole recipients and family trusts, and this Actor returns no personal data. Contracts and IDVs go to organizations, so they are covered.

#### Why does an amount differ from the award page?

`awardAmountUsd` is the amount from the source award search. The award page on USAspending.gov reads a second table and can show a newer or different figure for the same award. Open `awardUrl` to compare.

#### The run ended with status invalid_input. What do I change?

The status message names the field, for example a date written in another format, an award category other than contracts or IDVs, or an agency name the source does not know. Fix that field and run again. The run saves one error row with the message and charges one award.

#### The search returned one row with a message. What does it mean?

A `no_results` row means no award matched: widen the dates, remove a filter or change the keywords. An `error` row carries the message of the source. If the source is down, run again later.

#### Can I restart a long run?

Yes. The Actor saves its progress after every page and continues from the saved page when the platform restarts it.

If this saved you time, a rating helps others find it.

# Actor input Schema

## `awardCategory` (type: `string`):

Choose the kind of award to search. One run searches one category. Only contracts and IDVs are covered; assistance awards are excluded.

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

Add words or phrases to find in award descriptions, one per entry. Awards that match any entry are returned. Each entry needs 3 or more characters.

## `recipients` (type: `array`):

Add recipient names or UEI codes, one per entry, for example LOCKHEED MARTIN or SZPJL5ZRCLF4. Awards to any entry are returned.

## `awardingAgency` (type: `string`):

Enter a federal agency name or abbreviation, for example Department of Defense or DOD.

## `startDate` (type: `string`):

Enter the first day of the period as YYYY-MM-DD, for example 2025-10-01. The earliest date is 2007-10-01.

## `endDate` (type: `string`):

Enter the last day of the period as YYYY-MM-DD, for example 2026-09-30.

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

Set how many awards to return, from 1 to 10,000. Each saved award is one charged result.

## `dateType` (type: `string`):

Choose which date the start and end dates apply to. The signing date returns awards first signed in the period.

## `minAmount` (type: `number`):

Enter the lowest award amount in US dollars, for example 1000000.

## `maxAmount` (type: `number`):

Enter the highest award amount in US dollars, for example 5000000.

## `performanceStates` (type: `array`):

Add two-letter state or territory codes where the work happens, for example VA or TX.

## `recipientStates` (type: `array`):

Add two-letter state or territory codes of the recipient address, for example CA or NY.

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

Add industry codes of 2 to 6 digits, for example 541512.

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

Return only items that this monitor has not delivered before. The first run returns everything and becomes the baseline. Use it with a daily schedule.

## `monitorName` (type: `string`):

Names the memory of this monitor. Use one name per saved task, so two tasks never share their memory.

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

Choose the column that orders the rows.

## `sortOrder` (type: `string`):

Choose the direction of the sort.

## Actor input object example

```json
{
  "awardCategory": "contracts",
  "keywords": [
    "cybersecurity"
  ],
  "startDate": "2025-10-01",
  "endDate": "2026-09-30",
  "maxItems": 20,
  "dateType": "new_awards_only",
  "onlyNew": false,
  "monitorName": "default",
  "sortBy": "amount",
  "sortOrder": "desc"
}
```

# Actor output Schema

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

No description

## `stats` (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 = {
    "awardCategory": "contracts",
    "keywords": [
        "cybersecurity"
    ],
    "startDate": "2025-10-01",
    "endDate": "2026-09-30",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("conserving_celerytop/usaspending-awards-api").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 = {
    "awardCategory": "contracts",
    "keywords": ["cybersecurity"],
    "startDate": "2025-10-01",
    "endDate": "2026-09-30",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("conserving_celerytop/usaspending-awards-api").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 '{
  "awardCategory": "contracts",
  "keywords": [
    "cybersecurity"
  ],
  "startDate": "2025-10-01",
  "endDate": "2026-09-30",
  "maxItems": 20
}' |
apify call conserving_celerytop/usaspending-awards-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,conserving_celerytop/usaspending-awards-api"
        }
    }
}
```

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/6GVD39jjnDl2G8DJN/builds/bj1fdc91nKVf7youh/openapi.json
