Disclosure: I'm Ben, and I built the Apify Actor mentioned later in this post. I charge per result for it. Everything in the tutorial part works with free tools too.
Every US federal contract and grant award ends up on USAspending.gov, Treasury's public spending database. If you do GovCon business development, look for teaming partners, track competitors, or sell to companies that just received federal money, it's the place to look. It shows who won, how much, from which office, under which NAICS and contract vehicle.
(It isn't where you find open solicitations. Those are on SAM.gov. USAspending is awards that were already made.)
The website's Award Search is free and has CSV downloads, and for one-off questions it's all you need. When you want the same filtered list every week, the API is better. It's public and needs no key.
Step 1: Search awards with the API
This returns the three largest contract awards matching "artificial intelligence" with activity in a 30-day window. It ran as-is on 25 Oct 2026:
curl -s -X POST "https://api.usaspending.gov/api/v2/search/spending_by_award/" \
-H "Content-Type: application/json" \
-d '{
"filters": {
"award_type_codes": ["A", "B", "C", "D"],
"keywords": ["artificial intelligence"],
"time_period": [{"start_date": "2026-09-25", "end_date": "2026-10-24"}]
},
"fields": ["Award ID", "Recipient Name", "Award Amount", "Awarding Agency"],
"sort": "Award Amount", "order": "desc", "limit": 3
}'
Top results:
| Award ID | Recipient | Amount | Awarding agency |
|---|---|---|---|
| 47QFHA26F0005 | BOOZ ALLEN HAMILTON INC | $30.72M | General Services Administration |
| 75FCMC23F0001 | INDEX ANALYTICS LLC | $22.94M | Department of Health and Human Services |
| 70B04C26F00001201 | BOOZ ALLEN HAMILTON INC | $14.18M | Department of Homeland Security |
Each result has a generated_internal_id. Pass it to GET /api/v2/awards/{generated_internal_id}/ for the detail record: recipient UEI and parent company, number of offers, set-aside, parent award (the IDIQ or GWAC it was ordered under), subaward count and period of performance. For the first Booz Allen award, that call returned UEI JCBMLGPE6Z71, parent "BOOZ ALLEN HAMILTON HOLDING CORPORATION", 3 offers received, parent award 47QFHA24D0005, and a performance period from 2026-09-15 with a potential end date of 2030-09-14.
Step 2: The pitfalls
-
One award-type group per request. Contracts (
A–D), IDVs, grants, loans, direct payments and other assistance are separate groups. MixAwith grant code02and the API replies: "'award_type_codes' must only contain types from one group." Run one search per group and merge. -
"In the last 30 days" isn't "new".
time_periodmatches awards with activity in the window. That's why the Index Analytics award above, a 2023 order, shows up in a September–October 2026 search. Modifications and option exercises count as activity. If you want new wins only, filter on the award's start or signed date. -
Amount vs ceiling.
Award Amountis obligations so far. The potential value ("base and all options") can be far larger. In one real award I pulled on 17 Oct, Accenture Federal Services' CDAO delivery order, the amount was $36.7M while base-and-all-options was $821.3M. - DoD data lags. Defense contract data has a 90-day publication delay, so recent DoD wins won't be there yet.
- The detail record is one call per award. For a list of 500 awards, that's 500 more requests. Add pacing and retries.
- Agency names must match USAspending's top-tier names exactly ("Department of Defense", not "DoD").
- Result ceilings. A single search returns roughly 10,000 awards per award type. Split big pulls by date range.
Step 3: Or use the packaged version
I packaged this into an Apify Actor, USAspending Scraper – Federal Contracts & Awards Data. It runs one search per award type you pick (contracts, IDVs, grants, loans, direct payments, other assistance), paginates, joins in the detail record for every award (on by default), and flattens it all into one row.
Run-ready link: open it in Apify Console with an example input already filled in ({"awardTypes": ["contracts"], "keywords": ["artificial intelligence"], "daysBack": 30, "maxItems": 25}). Click Start, or change the input first.
{
"awardTypes": ["contracts"],
"naicsCodes": ["541512"],
"setAsideTypes": ["SBA"],
"daysBack": 7,
"dateType": "new_awards_only",
"maxItems": 300
}
Filters: keywords, recipient name or UEI, awarding agency, NAICS, PSC, place-of-performance state, recipient state, set-aside (SBA, 8(a), HUBZone, SDVOSB, WOSB…), min/max amount, last N days or a custom range, and the date type (action date, signed date, last modified, or new awards only).
That Accenture award is a good example of what one row holds (trimmed):
{
"awardId": "47QFCA26F0023",
"awardType": "DELIVERY ORDER",
"amount": 36709970,
"baseAndAllOptions": 821270642,
"actionDate": "2026-06-25",
"lastModified": "2026-09-30 17:02:48",
"awardingSubAgency": "Federal Acquisition Service",
"fundingAgency": "Department of Defense",
"recipientName": "ACCENTURE FEDERAL SERVICES LLC",
"recipientUei": "C47BNA8GM833",
"parentRecipientName": "ACCENTURE PLC",
"naicsCode": "541512",
"extentCompeted": "FULL AND OPEN COMPETITION",
"numberOfOffers": 5,
"solicitationId": "47QFCA26R0014",
"parentAwardType": "GWAC",
"subawardCount": 17
}
Note the dates: action date in June, last modified on 30 Sept. That's how a June award lands in a "last 30 days" search on 18 Oct, and why new_awards_only exists.
The default test (contracts, "artificial intelligence", last 30 days, 25 results, sorted by amount) ran on 18 Oct 2026 in about 6 seconds and returned 25 awards totalling $190.0M. Each run also writes a SUMMARY record with the filters, matching counts by type, items saved and total dollars.
Uses I had in mind
- Teaming and subcontracting: primes winning work in your NAICS and state
- Competitor tracking: a weekly run filtered by a competitor's UEI
- B2B sales: companies that just received federal money, with address, parent company and business categories
Limits, honestly
- Awards only. No open opportunities (SAM.gov's opportunity API needs a key).
- As reported by agencies to FPDS/FABS. Contract actions usually appear within days, except DoD's 90-day delay.
- About 10,000 awards per type per search. Split by date for more.
- No contact people. You get the recipient's address and UEI, not a named BD contact.
What it costs
$0.002 per award ($2 per 1,000), detail enrichment included, no start fee. Runs stop at your "maximum cost per run". The 25-award test was 5 cents. The free website search and the API above cost nothing.
GovCon folks: which field do you look at first when you size up a competitor's win? Tell me in the comments, I'd like to know what's missing.
Top comments (0)