US Federal Grants Scraper avatar

US Federal Grants Scraper

Pricing

from $1.94 / 1,000 opportunities

Go to Apify Store
US Federal Grants Scraper

US Federal Grants Scraper

Search US federal grant opportunities on grants.gov. One row per opportunity: number, title, agency, status, who may apply, award ceiling and floor, open and close dates, Assistance Listing number and link. Grants you can still apply for, not past awards. $2.00 per 1,000 opportunities.

Pricing

from $1.94 / 1,000 opportunities

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Categories

Share

Search US federal grant opportunities on grants.gov and get one row per opportunity: the number, title, agency, status, who may apply, the award ceiling and floor, the open and close dates and a link to the notice. Give it keywords, or filters such as an agency code, an applicant type or an Assistance Listing number.

Two things catch people out. These are grants you can still apply for, not awards already paid out, and roughly half of them publish no award ceiling at all.

InputKeywords, agency codes, applicant types, categories, Assistance Listing numbers or exact opportunity numbers
OutputOne row per grant opportunity: number, title, agency, status, who may apply, award ceiling and floor, total funding, open and close dates, Assistance Listing numbers, description, link
Ceiling5,000 opportunities and 25 search terms per run
Account neededNone, and no API key
Price$2.00 per 1,000 opportunities on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 2,500

🔍 What US Federal Grants Scraper does

Each search term runs as its own search over the title and the full description, so a grant whose title never mentions your word can still turn up. Your filters narrow every term the same way. Everything lands in one dataset, and an opportunity found by two terms is delivered once.

Forecasts come in when opportunityStatus includes forecasted, or when you leave it empty. A forecast is an agency saying money is coming. Its close date is the agency's guess, which is why every row carries closeDateIsEstimated.

Every row is checked against your filters before it is charged. One that comes back for the wrong agency, status, category or listing number is dropped, and a free row tells you how many went and why.

📋 What data you get from each grant opportunity

What you getField
The published number, grants.gov's own id, and the titleopportunityNumber, opportunityId, title
The office that posted it, and its departmentagencyName, departmentName, agencyCode
Status, and whether it is a real posting or a forecastopportunityStatus, recordKind
Open, close and archive datesopenDate, closeDate, closeDateIsEstimated, archiveDate
Award ceiling and floor, total funding and the number of awardsawardCeilingUsd, awardFloorUsd, estimatedTotalFundingUsd, expectedAwardCount
Whether the applicant has to put up matching moneycostSharingRequired
Who may apply, in words and as codeseligibleApplicants, eligibilityCodes
The category and the kind of agreementfundingCategories, fundingCategoryCodes, fundingInstruments, fundingInstrumentCodes
Assistance Listing numbersalnNumbers
The agency's synopsis, the link, and when grants.gov last changed itdescription, url, lastUpdated

▶️ How to scrape federal grants from grants.gov

  1. Open US Federal Grants Scraper and click Try for free.
  2. Type your keywords into Search terms, one per line. The form arrives with rural broadband in it, so replace that.
  3. Pick a Status. To narrow it, use Agency codes, Who may apply or Assistance Listing (ALN/CFDA) numbers under Filters.
  4. Set Maximum rows. Keep it small on a first run.
  5. Click Start, then download the dataset as CSV, JSON or Excel, or read it from the Apify API.

💰 How much does it cost to scrape grants.gov?

$2.00 per 1,000 opportunities on the Free plan. Paid plans pay a little less: $1.98 on Starter, $1.96 on Scale and $1.94 on Business. On the free plan, the $5 Apify gives you each month covers about 2,500 opportunities. A 100-row run comes to about twenty cents.

You pay for opportunity 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. If you set a maximum charge on the run, it stops at that figure instead of going past it.

📥 What you give it

{
"searchTerms": ["wildfire", "watershed restoration"],
"opportunityStatus": ["posted", "forecasted"],
"eligibility": ["12", "25", "99"],
"maxItems": 100
}
FieldDefaultWhat it is
searchTermsnone, so the filters decide; the box starts at rural broadbandWords to search for, up to 25. Each runs as its own search and the rows are pooled. Two words in one term are not a phrase: the form's own rural broadband also brings back rural grants that never mention broadband.
opportunityStatusforecasted and posted; the box starts at postedforecasted, posted, closed, archived. Add archived only if you want the long tail of about 73,000 older records.
maxItems25Total rows, 1 to 5,000, split evenly between the searches.
agenciesevery agencyAgency codes. HHS covers every Health and Human Services office, HHS-ACF-OHS only the Office of Head Start. An office code matches only itself, so HHS-ACF leaves out HHS-ACF-OHS.
eligibilityanyoneApplicant-type codes from the list on the Input tab. A grant open to any one of them is kept.
fundingCategoriesevery categoryThe category the agency filed it under, such as Health (HL) or Natural Resources (NR).
fundingInstrumentsevery kindGrant (G), cooperative agreement (CA), procurement contract (PC) or other (O).
alnNumbersanyAssistance Listing numbers, the old CFDA numbers, such as 93.600 for Head Start. Up to 30.
opportunityNumbersnoneExact published numbers such as HHS-2026-ACF-OHS-HS-0001, up to 25. Each one is looked up on its own.
postedWithinDaysany timeOnly opportunities posted in the last 3, 7, 14, 21, 28, 35, 42, 49 or 56 days. There are no other windows.
proxyUrlsnoneYour own servers to send the traffic through, as http://user:pass@host:port. Leave it empty unless you need that.

A word on eligibility: a lot of grants are coded "Others" (25) or "Unrestricted" (99) rather than naming your applicant type. In one five-row run, three were coded "Others" and nothing else. So a narrow pick here can hide grants you qualify for.

An input with nothing to search for, such as {} sent through the API, returns one free sample row so you can see the shape before you spend anything.

📤 What you get back

A real row from a run on 30 September 2026, with the description cut short:

{
"ok": true,
"charged": true,
"recordType": "opportunity",
"opportunityId": "363804",
"opportunityNumber": "RD-RBS-26-03-MPPEP",
"title": "MPPEP Phase 3 Invasive Wild-Caught Catfish",
"agencyName": "Rural Business-Cooperative Service ",
"departmentName": "Department of Agriculture",
"agencyCode": "USDA-RBCS",
"opportunityStatus": "posted",
"recordKind": "synopsis",
"openDate": "2026-09-08",
"closeDate": "2026-12-07",
"closeDateIsEstimated": false,
"archiveDate": "2027-01-06",
"awardCeilingUsd": 2000000,
"awardFloorUsd": 50000,
"estimatedTotalFundingUsd": 6000000,
"expectedAwardCount": 6,
"costSharingRequired": true,
"eligibleApplicants": [
"City or township governments",
"County governments",
"Native American tribal organizations (other than Federally recognized tribal governments)",
"Native American tribal governments (Federally recognized)",
"Others (see text field entitled \"Additional Information on Eligibility\" for clarification)",
"For profit organizations other than small businesses",
"Nonprofits having a 501(c)(3) status with the IRS, other than institutions of higher education",
"State governments",
"Small businesses"
],
"eligibilityCodes": ["02", "01", "11", "07", "25", "22", "12", "00", "23"],
"fundingCategories": ["Agriculture"],
"fundingCategoryCodes": ["AG"],
"fundingInstruments": ["Grant"],
"fundingInstrumentCodes": ["G"],
"alnNumbers": ["10.381"],
"description": "The Meat and Poultry Processing Expansion Program (MPPEP) provides grants to help eligible meat and poultry processors expand their capacity, which creates new, better and more processing options for meat and poultry producers. …",
"url": "https://www.grants.gov/search-results-detail/363804",
"lastUpdated": "2026-09-03",
"detailFetched": true,
"scrapedAt": "2026-09-30T02:37:45.963Z"
}
FieldHow to read it
opportunityNumberThe number the agency published, the one people quote. opportunityId is grants.gov's own key and builds the url.
agencyName, departmentName, agencyCodeThe office that posted it, as the agency typed it, and the cabinet department above it.
recordKindsynopsis for a real posting, forecast for money announced but not open yet.
closeDate, closeDateIsEstimatedThe deadline. On a forecast it is the agency's estimate and the flag is true.
awardCeilingUsd, awardFloorUsdThe largest and smallest single award, in dollars. null means the agency did not publish one, not that there is no limit.
estimatedTotalFundingUsd, expectedAwardCountThe whole pot and how many awards they plan to make. Often null for the same reason.
eligibleApplicants, eligibilityCodesWho may apply, spelled out, and the same list as the codes the input takes.
alnNumbersAssistance Listing numbers. Some opportunities carry more than one.
costSharingRequiredWhether the applicant has to put up matching money. null when the notice does not say.
descriptionThe agency's synopsis with the HTML taken out, cut at 8,000 characters.
detailFetchedAlways true on a row you receive. An opportunity whose full record could not be read is left out, see NO_RESULTS below.

🧾 Reading the output

Three kinds of row can share a dataset, and charged is the field that separates them.

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

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

CodeWhat it means
NO_RESULTSThe search ran and nothing matched. Also used when one opportunity's full record could not be read: that row names its number and link, and the opportunity is left out rather than delivered half empty.
BAD_INPUTRows came back that did not match your filters and were dropped, or the search was refused. Usually a code in the input that grants.gov does not know.
NETWORKThe search could not be completed because grants.gov did not answer properly.
TIME_BUDGETThe run ran out of time before one of your searches was made.

NO_RESULTS and NETWORK are the pair worth telling apart. The first means nothing is there. The second means nobody looked, and a re-run later is the answer.

💡 What people use it for

  • A grant writer who wants a spreadsheet of what is open in their field this month, sorted by closeDate.
  • A nonprofit tracking one Assistance Listing number, because last year's programme usually comes back under a new opportunity number and the same ALN.
  • A consultant pulling everything open to 501(c)(3) nonprofits in one category before a client call.
  • Anyone watching forecasts so the proposal is half written before the notice goes live.

🚧 What it does not do

  • Opportunities, not awards. Who received a grant, and how much, is a different dataset. The table below points to it.
  • Federal only. State, county, city and foundation grants are not on grants.gov, so they are not here.
  • No contact details. The source records name a programme officer with a phone number and an e-mail. None of that is returned. Open the url if you need to reach them.
  • No attachments. The application package and its PDFs stay on the notice. You get the record and the link.
  • Award amounts are often blank. In a sample of 40 posted opportunities, 21 published a ceiling and 11 a floor. That is the agencies, not the scraper.
  • Fixed date windows. postedWithinDays takes only the nine windows listed above, never an arbitrary date range.
  • No judgement. It does not score your chances or match you to grants. It returns what the agency published, as current as grants.gov has it.
  • It is not an official Grants.gov tool. Dami's Studio is independent and is not affiliated with or endorsed by Grants.gov, or by any other company named on this page.

🧭 Which US government data scraper do you need?

If you wantUse
Federal grants you can still apply forThis one
Federal money already paid out, and to whomUSASpending Federal Awards Scraper
Open bids from states, counties, cities and school districtsUS Local Bid Portals Scraper
Federal contract notices from SAM.gov, plus EU and UK tenders, scored against what you doRFP & Tender Monitor

❓ Questions people ask

Do I need a grants.gov account or an API key?

No. There is nothing to sign up for and nothing to paste.

Can I get the list of who won a grant?

Not from this one. Awards are a different dataset with almost no columns in common, and the USASpending scraper in the table above covers them.

Why is the award ceiling empty on so many grants?

The agency did not publish one. null means not published. It does not mean unlimited.

What is an ALN, and why filter on it?

An Assistance Listing number, the old CFDA number, names the federal programme rather than one notice. If you have had a grant before, its ALN finds this year's round even when the opportunity number changed.

How do I pick up only new grants every day?

Schedule a daily run with postedWithinDays set to 3, and use opportunityNumber as the key for comparing against yesterday.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/us-federal-grants-scraper. Either way the run happens on your Apify account at the same price.

These are public notices the federal government publishes so that anyone can apply, and nothing here needs a login. Apify's write-up on the legality of web scraping is a fair starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page and send the run ID with the input you used. The errorCode on a diagnostic row usually names the reason already.