# USAspending New Contract Awards Scraper (`usta/usaspending-new-contract-awards`) Actor

Pick a week and get every federal prime contract newly awarded in it: vendor, amount, awarding agency, NAICS and PSC. One row per award, read live from the public USAspending API.

- **URL**: https://apify.com/usta/usaspending-new-contract-awards.md
- **Developed by:** [US Tech Automations](https://apify.com/usta) (community)
- **Categories:** Business, Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 result rows

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

## This Week's New Federal Contract Awards

Govcon business-development reps get this week's newly awarded federal prime contracts, with modifications to old contracts already filtered out.

### Introduction

Pick a week. Get back one row for every federal prime contract that was newly
awarded in it, with the company that won it, the dollar amount, the agency that
awarded it, the industry code, the product or service code and a link to that
award's own public record.

The word *newly* is the whole point. Federal award data is mostly modifications
to contracts signed years ago. This Actor asks the government's award search for
awards whose **first** transaction lands inside the chosen period, so what comes
back is contracts that did not exist last week. Grants, loans, direct payments
and indefinite-delivery vehicles are left out. Four prime contract types are
included: definitive contracts, purchase orders, delivery orders and calls
against a blanket purchase agreement.

Each run reads api.usaspending.gov live, at the moment the run starts. Nothing
is served from a stored copy, and no row is ever written that did not come back
from that API in that run.

Every row carries these fields:

| Field | What it holds |
| --- | --- |
| `award_unique_key` | The government's own unique key for the award |
| `award_id` | The contract number as printed on the award |
| `award_type` | Definitive contract, purchase order, delivery order or BPA call |
| `action_date` | Date of the award's first transaction, as YYYY-MM-DD |
| `recipient_name` | The company that won the contract |
| `recipient_state` | Two-letter state code of the company |
| `recipient_country` | Country code of the company |
| `awarding_agency` | The department that awarded it |
| `awarding_sub_agency` | The office inside that department |
| `award_amount_usd` | The award amount in US dollars, as a number |
| `naics_code`, `naics_description` | Industry code and its wording |
| `psc_code`, `psc_description` | Product or service code and its wording |
| `place_of_performance_state` | Two-letter state code where the work happens |
| `period_of_performance_start` | Start date of the work |
| `period_of_performance_end` | Current end date of the work |
| `award_description` | The government's own description of what was bought |
| `source_url` | Link to that one award's public page |
| `api_url` | The public API the row came from |
| `attribution` | The credit that has to travel with the row |
| `fetched_at` | UTC time the API was read, as an ISO timestamp |

A field the government does not publish on a record arrives as `null`. It is
never guessed and never filled in from anywhere else.

### Tutorial

1. Set **Weeks back from today** to how far back to look, 1 to 8. One week
   means the last seven days.
2. Or, instead, fill in **Award date from** and **Award date to** as
   `YYYY-MM-DD`. Both days are included. Filling in both of those makes Weeks
   back irrelevant.
3. Optionally type part of an agency name into **Awarding agency contains**,
   such as `navy`, `veterans` or `coast guard`. It is matched against the
   government's own list of awarding agencies, and every agency whose name
   contains that text is included. Leave it empty for all agencies.
4. Optionally set **Minimum award amount** in whole dollars to skip small
   purchase orders.
5. Set **Maximum rows**. This is a hard ceiling on rows returned, so it is also
   a hard ceiling on what the run can cost. It starts at 100.
6. Start the run.
7. Open **New contract awards** to browse the rows, or **Download as CSV** to
   take them away. **Run status and coverage** holds the row count, the dates
   used, the agencies matched, how many awards the government says exist for
   those filters, and any warnings.

### Pricing

**$0.002 per row, charged from the first row. There is no start fee.**

Billing is per result. One row pushed is one charged result. A run that returns
100 rows costs $0.20. A run that returns 1,000 rows costs $2.00. A run that
returns 12 rows costs $0.024.

Three kinds of run push no rows, and a run that pushes no rows costs nothing:

- A run where the government's API cannot be read. Status is `UNKNOWN`, the
  exact error is reported, and no rows are pushed.
- A run rejected for bad input, including an agency name that matches nothing.
  Status is `INVALID_INPUT` and no rows are pushed.
- A run where no contract matching those filters was awarded in that period.
  Zero rows pushed is zero charged.

Because nothing is charged except a pushed row, **Maximum rows** is a real
spending cap. Set it to 100 and a run cannot cost more than $0.20.

Apify handles billing and account charges. Apify platform usage is separate from
the per-row price.

### Input and output examples

Input, which is also `example.json`:

```json
{
  "weeksBack": 1,
  "awardingAgency": "coast guard",
  "minAmount": 100000,
  "maxItems": 100
}
```

Run live on 15 September 2026, that input returned 83 rows, and the government's
own count endpoint said 83 awards matched. One of those rows, trimmed for
length. The full three-row sample is in `sample-output.json`:

```json
{
  "award_unique_key": "CONT_AWD_70Z05026F43000039_7008_70Z04723DPCNI0004_7008",
  "award_id": "70Z05026F43000039",
  "award_type": "DELIVERY ORDER",
  "action_date": "2026-09-11",
  "recipient_name": "TUTOR PERINI CORPORATION",
  "recipient_state": "CA",
  "recipient_country": "USA",
  "awarding_agency": "Department of Homeland Security",
  "awarding_sub_agency": "U.S. Coast Guard",
  "award_amount_usd": 315000000.0,
  "naics_code": "236220",
  "naics_description": "COMMERCIAL AND INSTITUTIONAL BUILDING CONSTRUCTION",
  "psc_code": "Y1JZ",
  "psc_description": "CONSTRUCTION OF MISCELLANEOUS BUILDINGS",
  "place_of_performance_state": "AK",
  "period_of_performance_start": "2026-09-11",
  "period_of_performance_end": "2030-09-30",
  "award_description": "THE PURPOSE OF THIS DESIGN BUILD TO BUDGET AWARD IS FOR THE DESIGN AND CONSTRUCTION OF A FUEL PIER AND MAJOR CUTTER MOORING AT USCG BASE KODIAK, AK.",
  "source_url": "https://www.usaspending.gov/award/CONT_AWD_70Z05026F43000039_7008_70Z04723DPCNI0004_7008",
  "fetched_at": "2026-09-15T02:55:00+00:00"
}
```

Opening that `source_url` returns that one award's page on the government's own
site. Every row works the same way.

### Limitations

Read this part before paying for anything.

- **The government reports late, and that lag is the government's.** On
  15 September 2026 the most recent award date anywhere in the file was
  12 September 2026. Awards signed in the last few days keep arriving for weeks
  afterwards. Re-running an old week later will return awards that were not
  there the first time. `fetched_at` records when the API was read, not when the
  government last updated it.
- **Prime contracts only.** Not grants, not loans, not direct payments, not
  indefinite-delivery vehicles, and not subcontracts. A subcontractor hunting
  work will see the prime that won, and nothing below it.
- **No set-aside status.** The government's award search returns that field
  empty on every record, including when the request filters on set-aside codes.
  An always-empty column is worse than no column, so there is none.
- **No contact details, ever.** No phone number, no email address, no website,
  no street address. The recipient's state and country are the only location
  details about the company that are returned. This is an award feed, not a
  contact list.
- **No individuals.** A row whose recipient name reads as a person trading
  under their own name is dropped rather than returned, and the run status says
  how many were dropped. The test errs towards dropping, so a handful of small
  firms named after their founder go too.
- **`maxItems` cuts the smallest awards.** Rows come back largest amount first.
  Hitting the ceiling means the smaller awards in that period were not returned,
  and the run status says so.
- **Field completeness, measured on 300 consecutive live rows on 15 September
  2026.** Company name, award ID, dates, amount, NAICS, PSC and description were
  present on 100% of rows. Awarding agency and sub agency were present on 99.0%.
  Place of performance state was present on 98.7%.
- **The amount is the award amount as the government reports it**, which changes
  when the contract is modified later. It is not a forecast and it is not what
  has actually been paid out.
- **These are the government's records and the government revises them.** An
  award can be corrected, cancelled or re-stated after it appears. This reports
  what the API held at `fetched_at` and makes no claim that the government's own
  table is complete or correct.
- **This is not a licence to the underlying data.** The charge is for the
  collection, the filtering and the schema. USAspending's terms still apply to
  what is done with the rows, and the API stays open to anyone directly.

### Recommendations

Start with one week, one agency and the default 100-row ceiling. That run costs
at most $0.20, and the rows show exactly what the feed holds before more is
spent.

Set **Minimum award amount** rather than raising **Maximum rows**. Most federal
contract actions are small purchase orders, so a floor of $100,000 or $1,000,000
cuts the row count hard and keeps the contracts worth reading. In the seven days
to 15 September 2026 the government counted 13,538 newly awarded prime
contracts of every size.

For a weekly watch, schedule one run per week with **Weeks back** set to 1, and
re-run the previous week once a month to pick up awards that arrived late.

Filter on `naics_code` or `psc_code` after the run rather than on the wording.
The codes are stable; the wording is the government's and it varies.

Keep the `attribution` field with the rows. Dun & Bradstreet requires a written
credit to travel with the company name and state, and that field carries the
exact wording.

### FAQ

**What counts as a new award?**
An award whose first transaction falls inside the chosen period. Modifications
to older contracts are excluded, which is what makes this different from a
plain export of federal contract actions.

**Does this cover SAM.gov opportunities?**
No. These are contracts already awarded, not open solicitations.

**Can the data be had without paying?**
Yes. api.usaspending.gov is public and needs no key. Going direct means writing
the search request, resolving agency names to exact matches, paging, dropping
the address fields and personal names, and building a schema. That work is what
the per-row price covers.

**Why did a run return no rows?**
Either no matching contract was awarded in that period, or the agency text
matched no agency. The run status says which, and either way nothing is charged.

**What happens if the API is down?**
The run reports status `UNKNOWN` with the exact error, pushes no rows and
charges nothing. Nothing is invented and nothing stale is substituted.

**Can a row be checked?**
Yes. Open its `source_url`. It is that award's page on usaspending.gov.

**Is there support?**
Use this Actor's Issues tab with the run ID and an example row. There is no
promise of a reply from a person and no service-level agreement.

### Source credit

USAspending.gov, U.S. Department of the Treasury, Bureau of the Fiscal Service,
award search API. Recipient business name and state are D\&B Open Data, licensed
by Dun & Bradstreet, Inc. (D\&B). That credit is carried on every row in the
`attribution` field. D\&B Open Data is not supplied here as a substitute for a
D\&B product: no DUNS number, no street address, no city and no postal code is
requested or returned.

### Refunds and support

Refunds: if a run returns zero rows for a valid input, email operations@ustechautomations.com within 7 days and we refund that run. Support: same address, replies within 2 business days.

# Actor input Schema

## `weeksBack` (type: `integer`):

How far back to look, counted in whole weeks ending today (UTC). 1 means the last 7 days. Ignored if Award date from and Award date to are both filled in.

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

Optional exact start of the period, written as YYYY-MM-DD, included in the results. Fill in both this and Award date to, or leave both empty and use Weeks back. Longest period allowed is 366 days.

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

Optional exact end of the period, written as YYYY-MM-DD, included in the results. Must be the same day as Award date from or later.

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

Optional. Part of an agency name, such as navy, veterans or coast guard. It is matched against the government's own list of awarding agencies and every agency whose name contains it is included. Leave empty for all agencies. If nothing matches, the run stops with a message and returns no rows.

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

Optional. Only awards worth at least this much are returned. Leave empty for every size of award, including small purchase orders.

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

Hard ceiling on how many rows this run returns, and therefore on what it can cost. Rows come back largest award amount first, so the cap drops the smallest awards.

## Actor input object example

```json
{
  "weeksBack": 1,
  "maxItems": 100
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `report` (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 = {
    "weeksBack": 1,
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("usta/usaspending-new-contract-awards").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 = {
    "weeksBack": 1,
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("usta/usaspending-new-contract-awards").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 '{
  "weeksBack": 1,
  "maxItems": 100
}' |
apify call usta/usaspending-new-contract-awards --silent --output-dataset

```

## MCP server setup

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

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/fk1dCaq261rUqNNfu/builds/KeVje0cikrCMcg0nU/openapi.json
