Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
USASpending Federal Awards Scraper icon

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.

47 runs on Apify $0.0005 per award ($0.5 / 1,000)
Run this in the cloudRun on Apify →

Developer & Research Tools

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust searchTerms, awardTypes, maxItems (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export 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 forWhenPrice
Award scrapedOne 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

FieldWhat it doesType
searchTermsFree-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
awardTypesWhich 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
maxItemsTotal 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
agenciesLimit 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
recipientSearchMatch 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
placeOfPerformanceStatesTwo-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
recipientStatesTwo-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
minAwardAmountUsdDrop 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
maxAwardAmountUsdDrop awards above this figure. Leave it empty for no upper limit.integer
dateFromOnly 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
dateToOnly awards with activity on or before this date, as YYYY-MM-DD. Leave empty for today.string
dateTypeWhat 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
naicsCodesSix-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
pscCodesFour-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
assistanceListingNumbersProgramme 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
awardIdsLook 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
sortByBiggest 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
proxyUrlsLeave 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:

awardIdrecipientNameawardAmountUsdawardTypeawardingAgencyawardingSubAgencyperiodOfPerformanceStartperiodOfPerformanceEndplaceOfPerformanceStateplaceOfPerformanceCityrecipientStateurl

Export 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 iconDeveloper & Research Tools

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.

18 use cases

Stack Overflow / Stack Exchange Scraper iconDeveloper & Research Tools

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.

2 use cases

Package Registry Scraper (npm + PyPI) iconDeveloper & Research Tools

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.

2 use cases

arXiv Scraper iconDeveloper & Research Tools

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.

2 use cases

OpenAlex Scholarly Works Scraper iconDeveloper & Research Tools

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.

2 use cases

Crossref Scholarly Works Scraper iconDeveloper & Research Tools

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.

2 use cases

See all 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.

InputKeywords, agencies, recipients, states, amount bands, dates, NAICS, PSC or Assistance Listing numbers, or exact award ids
OutputOne row per award
Ceiling10,000 awards and 10 search terms per run, awards back to 2007-10-01
Account neededNone
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

FieldIf you leave it outWhat it does
searchTermsno keywordFree 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.
awardTypescontracts and grantscontracts, grants, idvs, loans, direct_payments, other. Each one you tick is a separate search sharing the row budget.
maxItems50Total awards across every family, 1 to 10,000.
agenciesevery agencyCabinet-level names spelled the way USASpending spells them, such as Department of Energy. A name it does not recognise returns nothing rather than everything.
recipientSearchanyoneA company name or a UEI. Partial names work, and several entries widen the search.
placeOfPerformanceStatesanywhereTwo-letter codes for where the work was done, such as TX.
recipientStatesanywhereTwo-letter codes for where the recipient is registered.
minAwardAmountUsdno minimumDrops 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.
maxAwardAmountUsdno maximumDrops larger awards.
dateFromno windowYYYY-MM-DD. Anything before 2007-10-01 is moved up to it.
dateTotoday, when a start date is setYYYY-MM-DD. A window that runs backwards stops the run with a free BAD_INPUT row.
dateTypeaction_dateWhat the window measures: action_date (any money moved), date_signed, last_modified_date or new_awards_only. Only used when a date is set.
naicsCodesanySix-digit industry codes such as 541512. Contracts and IDVs carry them, grants mostly do not.
pscCodesanyFour-character product and service codes such as R425. Contracts only.
assistanceListingNumbersanyProgramme numbers such as 93.778, for grants, loans and other assistance. Contracts have none.
awardIdsnoneExact award ids such as W912DQ24C4003. One that does not exist returns a free row saying so.
sortByamountamount for the largest first, date for the newest first. You get the top of that order, not a random sample.
proxyUrlsnot usedYour 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"
}
FieldWhat it is
awardId, awardUniqueKeyThe 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, awardTypeWhich of the six families the row came from, and the type inside it.
awardAmountUsdThe 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.
totalOutlaysUsdMoney actually paid out so far. Often 0 on a new award, null on loans.
awardingAgency, fundingAgencyWho 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, periodOfPerformanceEndThe 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, placeOfPerformanceCityWhere the work was done. Blank on indefinite-delivery vehicles, and the city is blank on most grants.
recipientState, recipientCityWhere the recipient is registered. Almost always filled.
naicsCode, pscCodeThe industry and what was bought, on contracts.
assistanceListingNumber, assistanceListingTitleThe federal programme, on grants and other assistance.
descriptionThe 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.

RowHow to spot itCharged
An awardcharged: trueyes
The sample_sample: true, charged: falseno
A diagnostic_diagnostic: true, charged: false, an errorCodeno

The sample row also says recordType: "award", so filter on charged == true, not on recordType.

CodeWhat it means
NO_RESULTSNothing 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_INPUTRows 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_ERRORUSASpending answered with an error of its own. A re-run later usually works.
NETWORKThe service could not be reached, so nothing was searched.
TIME_BUDGETThe 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 dateType set to new_awards_only and rows compared on awardUniqueKey.

🚧 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 wantUse
Federal awards already made, with the recipient and the amountThis one
Federal grants you can still apply forUS Federal Grants Scraper
Open bids from states, counties, cities and school districtsUS Local Bid Portals Scraper
Tender notices scored against what your company doesRFP & Tender Monitor
A recipient company's revenue, headcount and ownershipCompany 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.