USASpending Federal Awards Scraper
Scrape US federal awards: recipient, amount, awarding agency, period and place of performance. Filter by agency, state, NAICS, amount or date. No API key.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
searchTerms,awardTypes,maxItems(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0005 per award = $0.5 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Award scraped | One federal award with its recipient, amount and period of performance. Searches that match nothing are never charged. | $0.0005 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-20, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
searchTerms | Free-text search across the award record - the description, the recipient, the award id and several fields this Actor does not return. Each term is a separate search and the rows are pooled. Minimum three characters per term, up to 10 terms. Because the search reaches fields you cannot see in the output, a row can be a genuine hit with the word nowhere visible on it. | array |
awardTypes | Which families of award to search. Federal spending is filed in six families and the service will not mix them in one query, so each one you tick is a separate search and the row budget is split between them. Leave it empty and you get contracts plus grants, which is what most people mean by federal awards. | array |
maxItems | Total awards to return across every kind of award you ticked. The budget is split between them and whatever one family leaves unused is handed to the next. Hard ceiling 10,000. Keep it low while you are testing - you pay per row. | integer |
agencies | Limit to awards handed out by these departments, written exactly as the source writes them: "Department of Defense", "Department of Energy", "National Aeronautics and Space Administration". This is the cabinet-level department, not the office inside it - the office still comes back on every row. A name the service does not recognise returns nothing rather than everything. | array |
recipientSearch | Match the organisation that received the money - a company name, or a UEI. Partial names work. Several entries widen the search rather than narrowing it. | array |
placeOfPerformanceStates | Two-letter US state codes for where the work was actually done, for example TX or CA. This is not the same as where the recipient is registered - a Virginia contractor doing work in Guam is a Guam row. Note that indefinite-delivery vehicles carry only a country for place of performance - no state and no city - so ticking that award family alongside this filter returns nothing for it. | array |
recipientStates | Two-letter US state codes for the recipient's own address, for example VA or MD. Use this when you want the companies in a state rather than the work in a state. | array |
minAwardAmountUsd | Drop awards below this figure. Useful for cutting out the long tail of small purchase orders, which is most of the row count on a contract search. Leave it empty and nothing is dropped, including the negative rows that record money being taken back off an award. | integer |
maxAwardAmountUsd | Drop awards above this figure. Leave it empty for no upper limit. | integer |
dateFrom | Only awards with activity on or after this date, as YYYY-MM-DD. The earliest the service accepts is 2007-10-01 and anything earlier is moved up to it. Read the warning on "Date meaning" below - this window is about when money moved, not about the period of performance on the row. | string |
dateTo | Only awards with activity on or before this date, as YYYY-MM-DD. Leave empty for today. | string |
dateType | What the date window is measured against. "Action date" is when money moved, including a modification to an old award - so a 2019 contract amended last month appears in a window covering last month, still showing its 2019 start date. "New awards only" restricts it to awards first signed inside the window, which is what you want for a feed of new business. | string |
naicsCodes | Six-digit NAICS codes, such as 541512 for computer systems design. Contracts and IDVs carry these; grants and other assistance mostly do not, so a NAICS filter on a grant search will return very little. | array |
pscCodes | Four-character PSC codes such as R425 for engineering support or D310 for IT services. Contracts only - this is how the government classifies what it bought. | array |
assistanceListingNumbers | Programme numbers such as 93.778 or 20.205, for grants, loans, direct payments and other assistance. This follows one federal programme across every award it has ever made, which is the tightest filter here. Contracts have no assistance listing, so this will return nothing on a contract search. | array |
awardIds | Look up specific awards by the id printed on them, for example W912DQ24C4003. An id that does not exist returns an uncharged row saying so, not a wrong match. | array |
sortBy | Biggest awards first, or most recent first. Either way you get the top of that ordering, so if you ask for 100 rows on a search that matches 40,000 you get the 100 largest or the 100 newest - not a random hundred. | string |
proxyUrls | Leave this empty unless you want the requests to go through proxy servers of your own. Add each one as http://user:pass@host:port. | array |
What you get
A structured dataset — each result includes fields like:
awardIdrecipientNameawardAmountUsdawardTypeawardingAgencyawardingSubAgencyperiodOfPerformanceStartperiodOfPerformanceEndplaceOfPerformanceStateplaceOfPerformanceCityrecipientStateurlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
USASpending Federal Awards Scraper: who got federal money, how much and for what
Give it a keyword, an agency, a state, an industry code or a recipient, and it searches the federal awards published on USASpending.gov: contracts, grants, loans, direct payments and the rest. Each row is one award with its id, the recipient and their UEI, the amount, the awarding and funding agency, the period of performance, where the work was done and a link to the public award page. Two things surprise people: this is money already awarded, not a list of work you can still bid on, and the date filter follows when money moved, so a contract signed in 2008 and amended last month is a correct hit for last month.
| Input | Keywords, agencies, recipients, states, amount bands, dates, NAICS, PSC or Assistance Listing numbers, or exact award ids |
| Output | One row per award |
| Ceiling | 10,000 awards and 10 search terms per run, awards back to 2007-10-01 |
| Account needed | None |
| Price | $0.50 per 1,000 awards, flat on every plan |
🔍 What USASpending Federal Awards Scraper does
Federal spending is filed in six families: contracts, grants and cooperative agreements, indefinite-delivery vehicles, loans, direct payments, and insurance and other assistance. USASpending will not mix them in one search. So each family you pick is searched on its own, your row budget is shared between them, and whatever one family leaves unused goes to the next.
Where the work was done comes back separately from where the recipient is registered. "Work done in Texas" and "company registered in Texas" are two different filters here.
Every row is checked against your filters before it is charged. A row from the wrong agency, state, amount band or code is dropped, and a free row says how many and why. A row that cannot be checked, such as a state filter on an award that records no state, is dropped the same way rather than guessed at.
📥 What you give it
| Field | If you leave it out | What it does |
|---|---|---|
searchTerms | no keyword | Free text across the award record, 3 characters or more, up to 10 terms. It reaches fields the row does not show, so a hit can have the word nowhere visible. |
awardTypes | contracts and grants | contracts, grants, idvs, loans, direct_payments, other. Each one you tick is a separate search sharing the row budget. |
maxItems | 50 | Total awards across every family, 1 to 10,000. |
agencies | every agency | Cabinet-level names spelled the way USASpending spells them, such as Department of Energy. A name it does not recognise returns nothing rather than everything. |
recipientSearch | anyone | A company name or a UEI. Partial names work, and several entries widen the search. |
placeOfPerformanceStates | anywhere | Two-letter codes for where the work was done, such as TX. |
recipientStates | anywhere | Two-letter codes for where the recipient is registered. |
minAwardAmountUsd | no minimum | Drops smaller awards and cuts the long tail of small purchase orders. Left empty, the negative rows that record money taken back off an award stay in. |
maxAwardAmountUsd | no maximum | Drops larger awards. |
dateFrom | no window | YYYY-MM-DD. Anything before 2007-10-01 is moved up to it. |
dateTo | today, when a start date is set | YYYY-MM-DD. A window that runs backwards stops the run with a free BAD_INPUT row. |
dateType | action_date | What the window measures: action_date (any money moved), date_signed, last_modified_date or new_awards_only. Only used when a date is set. |
naicsCodes | any | Six-digit industry codes such as 541512. Contracts and IDVs carry them, grants mostly do not. |
pscCodes | any | Four-character product and service codes such as R425. Contracts only. |
assistanceListingNumbers | any | Programme numbers such as 93.778, for grants, loans and other assistance. Contracts have none. |
awardIds | none | Exact award ids such as W912DQ24C4003. One that does not exist returns a free row saying so. |
sortBy | amount | amount for the largest first, date for the newest first. You get the top of that order, not a random sample. |
proxyUrls | not used | Your own servers to send the traffic through, as http://user:pass@host:port. Leave it empty unless you need that. |
{
"agencies": ["Department of Energy"],
"placeOfPerformanceStates": ["TX", "NM"],
"awardTypes": ["contracts"],
"minAwardAmountUsd": 1000000,
"dateFrom": "2026-01-01",
"maxItems": 200
}
An input that only picks award types, or has nothing in it at all, returns one free sample row. That is deliberate: award types on their own would mean every federal contract since 2007.
📤 What you get back
A real row from a real run for solar, sorted by amount, with the description cut short:
{
"ok": true,
"charged": true,
"recordType": "award",
"awardId": "NNG09HR00C",
"awardUniqueKey": "CONT_AWD_NNG09HR00C_8000_-NONE-_-NONE-",
"awardTypeGroup": "contracts",
"awardType": "DEFINITIVE CONTRACT",
"recipientName": "LOCKHEED MARTIN CORP",
"recipientUei": "FYHNA5WC8XD7",
"recipientCity": "LITTLETON",
"recipientState": "CO",
"recipientCountry": "UNITED STATES",
"awardAmountUsd": 2032829134.57,
"totalOutlaysUsd": 306532392.81,
"loanSubsidyCostUsd": null,
"awardingAgency": "National Aeronautics and Space Administration",
"awardingAgencyCode": "080",
"awardingSubAgency": "National Aeronautics and Space Administration",
"awardingSubAgencyCode": "8000",
"fundingAgency": "Department of Commerce",
"fundingSubAgency": "National Oceanic and Atmospheric Administration",
"periodOfPerformanceStart": "2008-12-04",
"periodOfPerformanceEnd": "2039-04-30",
"placeOfPerformanceCity": "LITTLETON",
"placeOfPerformanceState": "CO",
"placeOfPerformanceZip": "80125",
"placeOfPerformanceCountry": "UNITED STATES",
"naicsCode": "336414",
"naicsDescription": "GUIDED MISSILE AND SPACE VEHICLE MANUFACTURING",
"pscCode": "AR35",
"pscDescription": "R&D- SPACE: FLIGHT (OPERATIONAL SYSTEMS DEVELOPMENT)",
"assistanceListingNumber": null,
"assistanceListingTitle": null,
"description": "THE GOVERNMENT IS PROCURING THE NEXT-GENERATION GEOSTATIONARY OPERATIONAL ENVIRONMENTAL SATELLITES (GOES) SERIES TO CONTINUE ITS MISSION THROUGH NEW REQUIREMENTS SPECIFIED IN THE GOES-R LEVEL I REQUIREMENTS DOCUMENT AND MISSION REQUIREMENTS DOCUMENT (MRD). …",
"baseObligationDate": "2008-12-04",
"lastModified": "2026-07-27 15:48:00",
"url": "https://www.usaspending.gov/award/CONT_AWD_NNG09HR00C_8000_-NONE-_-NONE-",
"scrapedAt": "2026-09-30T02:38:01.767Z"
}
| Field | What it is |
|---|---|
awardId, awardUniqueKey | The id printed on the award is unique within one agency only. awardUniqueKey is unique everywhere, builds the url, and is the key to compare runs on. |
awardTypeGroup, awardType | Which of the six families the row came from, and the type inside it. |
awardAmountUsd | The current total obligated, after every modification. On a loan it is the face value, and loanSubsidyCostUsd is what the loan cost the government. It can be negative. |
totalOutlaysUsd | Money actually paid out so far. Often 0 on a new award, null on loans. |
awardingAgency, fundingAgency | Who signed it and who paid for it. They can differ: the row above was signed by NASA and paid for by the Department of Commerce. |
periodOfPerformanceStart, periodOfPerformanceEnd | The work window. On an indefinite-delivery vehicle the end is the last date to order. A loan has an issue date and no end. |
placeOfPerformanceState, placeOfPerformanceCity | Where the work was done. Blank on indefinite-delivery vehicles, and the city is blank on most grants. |
recipientState, recipientCity | Where the recipient is registered. Almost always filled. |
naicsCode, pscCode | The industry and what was bought, on contracts. |
assistanceListingNumber, assistanceListingTitle | The federal programme, on grants and other assistance. |
description | The agency's own words, cut at 2,000 characters. Often terse, sometimes an internal code, sometimes empty. |
🧾 Reading the output
Three kinds of row can share a dataset, and charged is the field that separates them.
| Row | How to spot it | Charged |
|---|---|---|
| An award | charged: true | yes |
| The sample | _sample: true, charged: false | no |
| A diagnostic | _diagnostic: true, charged: false, an errorCode | no |
The sample row also says recordType: "award", so filter on charged == true, not on recordType.
| Code | What it means |
|---|---|
NO_RESULTS | Nothing matched for one award family. Also written when a very deep search could not go any further, and then it says how many rows were delivered first. |
BAD_INPUT | Rows came back that did not match your filters and were dropped. Also used when a filter was not applied, so the search stopped, and when the input itself was refused, such as a backwards date window. |
SERVER_ERROR | USASpending answered with an error of its own. A re-run later usually works. |
NETWORK | The service could not be reached, so nothing was searched. |
TIME_BUDGET | The run ran out of time before one of the families was searched. |
NO_RESULTS and NETWORK are the pair to tell apart. The first means nothing is there. The second means nobody looked.
▶️ How to run it
1. Open USASpending Federal Awards Scraper and click Try for free. 2. Put a keyword in Search terms, or clear it and use the filters instead. The form arrives with solar in it. 3. Tick the Kinds of award you want, and narrow it with Awarding agency, Work performed in (state) or From date. 4. Set Maximum rows, low on a first run, and choose an Order. 5. Click Start, then download the dataset as CSV, JSON or Excel.
💰 How much does it cost?
$0.50 per 1,000 awards, which is $0.0005 a row, flat on every Apify plan. A thousand awards comes to fifty cents.
You pay for award rows and nothing else per row. The sample row and every diagnostic row are free, and so are rows dropped for not matching your filters and repeats inside one run. A backwards date window or amount band stops the run before anything is searched. If you set a maximum charge on the run, it stops at that figure instead of going past it.
💡 What people use it for
- Working out who already holds the work before bidding on the recompete: filter by agency and industry code, sort by amount, read the top twenty names.
- Following one company across the whole government, every contract, grant and loan it received, in one table.
- A reporter adding up the federal money spent on work in one state over a year, agency by agency.
- A monthly feed of new business, with
dateTypeset tonew_awards_onlyand rows compared onawardUniqueKey.
🚧 What it does not do
- Awards, not opportunities. No deadline, no eligibility, no application link, because the money is already committed. For grants you can still apply for, see the table below.
- Federal only. State, county and city spending is not in this data.
- Nothing before 2007-10-01. Older awards exist, but this search cannot reach them.
- One row per award, not per transaction. A contract amended fourteen times is one row carrying the current total.
- No sub-awards. A prime recipient who subcontracts most of the work still shows the whole amount.
- No street addresses or contact details. City, state and country are on the row. Nothing is joined against other sources. Sole traders and individuals do appear under their own names, because the government publishes them that way.
- Place of performance is thin on some families. In one 3,000-row run, none of the 1,000 indefinite-delivery vehicles had a state or a city for the work, and 287 of the 1,000 grants had a city.
- Figures are as current as USASpending. An agency that has not filed a modification leaves a stale total, and the row repeats it.
🧭 Which US government data scraper do you need?
| If you want | Use |
|---|---|
| Federal awards already made, with the recipient and the amount | This one |
| Federal grants you can still apply for | US Federal Grants Scraper |
| Open bids from states, counties, cities and school districts | US Local Bid Portals Scraper |
| Tender notices scored against what your company does | RFP & Tender Monitor |
| A recipient company's revenue, headcount and ownership | Company Firmographics Scraper |
❓ Questions people ask
Is this a list of contracts I can bid on? No, and it is the most common mix-up. Every row is an award already made, with a recipient and an amount and no deadline.
Why does a row start years ago when I asked for this month? The window follows when money moved, not the period of performance. Awards get modified for years after signing. Set dateType to new_awards_only if you only want awards first signed inside the window.
Why is place of performance empty on some rows? The government does not record it for those award types. If you filter on a state and tick a family with no state on it, those rows are dropped uncharged.
Do I need an account or an API key? No. Nothing to sign up for and nothing to paste.
Can I run it on a schedule? Yes. A daily schedule with a recent dateFrom and dateType set to new_awards_only, compared on awardUniqueKey, shows only what is new.
🆘 If something breaks
Open the Issues tab on the actor page and send the run ID with the input you used. The errorCode and details on a diagnostic row usually name the reason already.