How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
contractsin Award types. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
USAspending Federal Awards & Recipient Monitor finds US federal contracts, grants, loans and other awards in the official USAspending.gov data. Filter by recipient name or UEI, awarding agency, NAICS, PSC, keyword and dates. You get one clean row per award, with the recipient, the agencies, the obligated amount and the outlays as separate numbers, dates, codes and links to USAspending.
- Award search. Pick award types (contracts, IDVs, grants, loans, direct payments, other assistance) and filters. Each award type is searched on its own, and
maxResultsapplies to each type. - Clear names. Agency names and abbreviations (
VA,NIH,DOD) are checked against the official agency list. A name that does not exist stops the run with suggestions. It does not silently return nothing. - Monitoring. With a
monitorKey, the Actor saves the awards it saw in your account. The next run marks each awardnew,updatedorunchanged, and by default writes only the new and updated ones.
Good for
- See who wins contracts at an agency for your NAICS or PSC codes.
- List all federal awards of a company or university by name or UEI.
- Watch an agency, a competitor or a market every week and get only the changes.
- Find grants or loans of an agency in a period, with the amount obligated and the amount already paid out.
Not a good fit
- Open tenders, solicitations or bid deadlines. This is award data, not SAM.gov.
- Sub-awards, transaction history or contract officers.
- A full copy of USAspending. Use the official bulk downloads for that.
- Phone numbers, emails or company ownership data.
Who uses it
Government contractors
See who wins contracts in your NAICS or PSC codes.
Due diligence analysts
List the federal awards of one company or university.
Grant researchers
Find grants of an agency in a time period.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.002 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Award record | $0.002 | One federal award row (contract, IDV, grant, loan or other assistance) saved to the Dataset. Unchanged awards skipped by onlyChanges are not charged. |
Examples
- One award: about $0.004.
- 1,000 awards: about $2.00.
- Every day 100 awards, for 30 days: about $6.06 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 2,400 awards.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Can I find open tenders to bid on?
No. These are awards already made. For open bids, use SAM.gov.
What is the difference between amount and outlays?
The amount is money the agency committed. Outlays are money already paid out.
Do I need an API key?
No. USAspending is open and free.
Does monitoring cost extra?
No. Unchanged awards are not saved and not charged.
What is the difference between awardAmount and totalOutlays?
awardAmount is the money the agency obligated (committed). totalOutlays is the money already paid out. They are different numbers, so the Actor never adds them up.
How fresh is the data?
Each run reads USAspending live. Agencies report awards to USAspending with some delay, so the newest awards can appear days or weeks after they are made. Each row has lastModifiedDate (source) and source.fetchedAt (our read time).
Details
Step by step on Apify
- Open the Input tab. The form already has an example: contracts of the Department of Veterans Affairs, NAICS 541512 (computer systems design), last 30 days, 20 awards.
- Click Start.
- Open the Awards view in the Output tab. Check
recipientName,awardAmount,totalOutlaysandawardUrl. - Change the agency, codes or recipients to your own. To get only changes next time, add a
monitorKeysuch asva-it-contracts.
Use cases
| Task | Input | You get | Key fields |
|---|---|---|---|
| Who wins in my market | awardingAgencies + naicsCodes or pscCodes | contract rows | recipientName, recipientUei, awardAmount, awardingSubAgency |
| Company due diligence | recipients (name or UEI), several awardTypes | all award types of that recipient | awardTypeGroup, awardAmount, totalOutlays, recipientUrl |
| Grant research | awardTypes: ["grants"] + agency + dates | grant rows | assistanceListings, awardAmount, totalOutlays, description |
| Weekly competitor watch | filters + monitorKey, on a schedule | only new and updated awards | changeType, changedFields, previousValues |
Tips for better results
- Use agency short names like VA or NIH. A wrong name stops the run with ideas.
- Use a monitor key to get only new and updated awards.
- New awards can show up days or weeks late. Look a bit back in time.
Limits and good to know
- Up to 500 awards per award type, so up to 3,000 rows per run with all six types. In our test, 3,000 rows took about 85 seconds
- The Actor sends one request at a time, with a pause between requests, and retries when the source is busy. USAspending does not publish a rate limit
- Internal time budget is 270 seconds. If time runs out, you get the rows found so far and
PARTIAL - If USAspending is down or does not answer (up to 30 seconds per try and about 60 seconds per request in total, at most 3 tries and 2 timeouts), the run stops early and does not ask for the other award types. You get the rows found so far
- Monitor snapshots keep up to 20,000 awards per
monitorKey.previousDatasetIdreads up to 20,000 rows totalOutlays,endDateand other values come from the USAspending search index. The search index can be behind the award page on USAspending.gov, so outlays on the award page can be higherendDateis alwaysnullfor IDVs (uselastDateToOrder) and for loans: the search index does not have it- Loans have no
awardAmountin the source. UseloanFaceValueandloanSubsidyCost. For loans,startDateis the loan's issued date
Troubleshooting
| Symptom | Check | Action |
|---|---|---|
INVALID_INPUT, agency not found | RUN_SUMMARY.message | Use one of the suggested names, or the full official name. |
NO_RESULTS | RUN_SUMMARY.filters | Widen the date range, remove a filter, or try dateFilter: "activity". |
| Other recipients than expected | recipientName, recipientUei | Name search is text search. Use the UEI for an exact recipient. |
| Grants missing with NAICS | RUN_SUMMARY.warnings | NAICS and PSC exist only on contracts and IDVs. Remove them for grants. |
truncated: true | groups[].hasMoreAtSource | Raise maxResults (up to 500) or narrow the filters. |
| Outlays differ from the USAspending award page | totalOutlays | The search index can be behind the award page. Open awardUrl for the latest value. |
ERROR | RUN_SUMMARY.message | USAspending was down or busy. Run again later. Your monitor snapshot is not changed by a failed run. |
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"changeType": "updated",
"changedFields": ["totalOutlays", "lastModifiedDate"],
"awardTypeGroup": "contracts",
"awardId": "36C10B21N10150057",
"awardType": "DELIVERY ORDER",
"recipientName": "BOOZ ALLEN HAMILTON INC",
"recipientUei": "KHK6E1JW9C15",
"awardingAgency": "Department of Veterans Affairs",
"awardAmount": 753054309.17,
"totalOutlays": 561175619.99,
"startDate": "2021-09-30",
"endDate": "2027-09-23",
"naicsCode": "541512",
"pscCode": "DA01",
"awardUrl": "https://www.usaspending.gov/award/CONT_AWD_36C10B21N10150057_3600_VA11816D1015_3600"
}Use it from code
Actor ID: cliqtomedia/usaspending-federal-awards-monitor. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/usaspending-federal-awards-monitor").call(run_input={
"awardTypes": [
"contracts"
],
"awardingAgencies": [
"Department of Veterans Affairs"
]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~usaspending-federal-awards-monitor/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"awardTypes": ["contracts"], "awardingAgencies": ["Department of Veterans Affairs"]}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/usaspending-federal-awards-monitor")
result = tool.invoke({"run_input": {"awardTypes": ["contracts"], "awardingAgencies": ["Department of Veterans Affairs"]}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (39)
| Field | Type | Meaning |
|---|---|---|
changeType | string | Change since the baseline: initial (first monitored run), new, updated or unchanged. null when no monitorKey/previousDatasetId is used. |
changedFields | array | For updated awards: which tracked fields changed (awardAmount, totalOutlays, loanFaceValue, loanSubsidyCost, startDate, endDate, lastDateToOrder, lastModifiedDate). |
previousValues | object | For updated awards: previous value of each changed field. |
awardTypeGroup | string | Award type group the row was searched under. Never mix groups in totals without care: loans and IDVs measure different things. |
generatedInternalId | string | Stable USAspending award key, e.g. CONT_AWD_..._9700_... Use it to deduplicate and join. |
awardId | string | Display award ID (PIID for contracts, FAIN/URI for assistance). |
awardType | string | Award type as published, e.g. DELIVERY ORDER, DEFINITIVE CONTRACT, PROJECT GRANT (B), DIRECT LOAN (E). |
recipientName | string | Recipient (awardee) name as published. |
recipientUei | string | 12-character Unique Entity ID of the recipient; null for some legacy or redacted awards. |
recipientId | string | USAspending recipient hash with level suffix (-C child, -P parent, -R recipient). |
recipientLocation | object | Recipient address: city, county, stateCode, stateName, zip5, countryCode, countryName, congressionalDistrict. |
awardingAgency | string | Awarding top-tier agency, e.g. Department of Veterans Affairs. |
awardingAgencyCode | string | Awarding agency code (e.g. 036). |
awardingSubAgency | string | Awarding sub-agency. |
awardingSubAgencyCode | string | Awarding sub-agency code. |
fundingAgency | string | Funding top-tier agency (may differ from the awarding agency). |
fundingSubAgency | string | Funding sub-agency. |
awardAmount | number | Total obligated amount over the award life, USD (contracts: total obligation; grants/assistance: federal obligation). Can be negative after de-obligations. null for loans and when not reported — never 0 by default. |
totalOutlays | number | Cash actually paid out so far, USD. Separate from awardAmount and never added to it; null when not reported (common for contracts). Value from the search index, which can lag the award page. |
loanFaceValue | number | Loans only: face value of the loan, USD. |
loanSubsidyCost | number | Loans only: estimated subsidy cost to the government, USD. |
covid19Obligations | number | Obligations funded by COVID-19 supplemental appropriations, USD; null when not reported. |
infrastructureObligations | number | Obligations funded by the Infrastructure Investment and Jobs Act, USD; null when not reported. |
currency | string | Always USD. |
startDate | string | Period of performance start (loans: issued date), YYYY-MM-DD; null when not published. |
endDate | string | Current period of performance end, YYYY-MM-DD, as published in the USAspending search index. Always null for IDVs (use lastDateToOrder) and loans (not in the search index). |
lastDateToOrder | string | IDVs only: last date to place orders, YYYY-MM-DD. |
baseObligationDate | string | Date of the base (first) obligation, YYYY-MM-DD. |
lastModifiedDate | string | When USAspending last changed the award record (sourceUpdatedAt), YYYY-MM-DDTHH:MM:SS as published, without time zone. |
naicsCode | string | NAICS industry code (contracts and IDVs). |
naicsDescription | string | NAICS description. |
pscCode | string | Product and Service Code (contracts and IDVs). |
pscDescription | string | PSC description. |
assistanceListings | array | Assistance listings (CFDA) for grants and other assistance: [{number, title}]. Empty for contracts. |
description | string | Award description as published (often uppercase, may be truncated by the source). |
placeOfPerformance | object | Primary place of performance: city, county, stateCode, stateName, zip5, countryCode, countryName, congressionalDistrict. |
awardUrl | string | Award page on USAspending.gov. |
recipientUrl | string | Recipient profile on USAspending.gov; null for placeholder recipients such as MULTIPLE RECIPIENTS. |
source | object | Provenance: provider, endpoint and fetchedAt (when this Actor read the record). |
Input settings (15)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Award types | awardTypes | array | ["contracts"] |
| Awarding agencies | awardingAgencies | array | ["Department of Veterans Affairs"] |
| Recipients (name or UEI) | recipients | array | |
| NAICS codes | naicsCodes | array | ["541512"] |
| PSC codes | pscCodes | array | |
| Keywords | keywords | array | |
| Date filter | dateFilter | string | "activity" |
| Look back (days) | lookbackDays | integer | 30 |
| From date | dateFrom | string | |
| To date | dateTo | string | |
| Sort by | sortBy | string | "amount" |
| Max awards per award type | maxResults | integer | 20 |
| Monitor key (for scheduled runs) | monitorKey | string | |
| Compare with previous dataset | previousDatasetId | string | |
| Only output new and updated awards | onlyChanges | boolean | true |
Use cases with this tool
Each guide shows all the steps and the other tools.
