US Federal Grants Scraper
Scrape US federal grant opportunities from grants.gov: opportunity number, agency, eligibility, award ceiling and floor, deadlines and links.
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,opportunityStatus,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.002 per opportunity = $2 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Opportunity scraped | One federal grant opportunity with its award ceiling, eligibility and dates. Searches that match nothing are never charged. | $0.002 |
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 | Words to search for. Each term is searched on its own and the rows are pooled, so "wildfire" and "drought" in one run gives you both. The search covers the opportunity title and its full description, so a term can match a grant whose title never mentions it. Up to 25 terms per run. Leave empty to get everything the filters below select. | array |
opportunityStatus | Which stage of the lifecycle to return. "Posted" is open for applications now. "Forecasted" is an agency saying money is coming, usually with estimated dates rather than real ones. "Closed" has passed its deadline but is still on the site, and "archived" is the long tail going back two decades. Leave empty and you get forecasted plus posted, which is everything you could still apply for. | array |
maxItems | Total opportunities to return across every search term. The budget is split evenly between the terms, so five terms and 50 rows gives you ten of each. Hard ceiling 5,000. Keep it low while you are testing - you pay per row. | integer |
agencies | Limit results to one or more agencies, by code. A top-level code covers everything under it: "HHS" catches every Health and Human Services office, while "HHS-ACF-OHS" narrows it to the Office of Head Start. An office code matches only itself, so "HHS-ACF" leaves out "HHS-ACF-OHS". Other common ones are ED, DOE, NSF, USDA, DOI, DOT, EPA, HUD, DOL, NASA, SBA, VA, DOS and DHS. Case does not matter. | array |
eligibility | Keep only opportunities open to these applicant types. Pick several and a grant open to any one of them is kept. Note that a great many federal grants are coded "Unrestricted" or "Others" rather than naming your exact category, so a narrow pick here can hide grants you are in fact eligible for. | array |
fundingCategories | Keep only opportunities filed under these categories. Agencies pick the category themselves when they post, so it is their label rather than a strict taxonomy - broad searching plus a keyword usually beats a narrow category pick. | array |
fundingInstruments | The kind of agreement on offer. A grant hands money over with reporting obligations; a cooperative agreement means the agency stays involved in the work. | array |
alnNumbers | Exact programme numbers such as 93.600 or 47.076. This is the tightest filter available - it follows a specific federal programme across every opportunity it has ever posted, which is what you want for tracking a grant you have had before. | array |
opportunityNumbers | Look up specific opportunities by their published number, for example HHS-2026-ACF-OHS-HS-0001. Each one is fetched on its own, so a number that no longer exists returns an uncharged row saying so rather than a wrong match. | array |
postedWithinDays | Only opportunities posted in the last N days. The service accepts a fixed set of windows, listed here. Useful for a daily or weekly schedule that should only pick up what is new. | 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:
opportunityNumbertitleagencyNamedepartmentNameagencyCodeopportunityStatusfundingCategorieseligibleApplicantsawardCeilingUsdawardFloorUsdopenDatecloseDateurlExport 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
US Federal Grants Scraper: open and upcoming grants.gov opportunities, no account needed
Give it keywords, or filters such as an agency code, an applicant type or an Assistance Listing number, and it searches the federal grant opportunities published on grants.gov. You get one row per opportunity with the number, title, agency, status, who may apply, the award ceiling and floor, the open and close dates and a link to the notice. 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.
| Input | Keywords, agency codes, applicant types, categories, Assistance Listing numbers or exact opportunity numbers |
| Output | One row per grant opportunity |
| Ceiling | 5,000 opportunities and 25 search terms per run |
| Account needed | None |
| Price | $2.00 per 1,000 opportunities, flat on every plan |
🔍 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 you give it
| Field | If you leave it out | What it does |
|---|---|---|
searchTerms | no keyword, the filters decide | Words 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. |
opportunityStatus | forecasted and posted | forecasted, posted, closed, archived. Add archived only if you want the long tail of about 73,000 older records. |
maxItems | 25 | Total rows, 1 to 5,000, split evenly between the searches. |
agencies | every agency | Agency 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. |
eligibility | anyone | Applicant-type codes from the list on the Input tab. A grant open to any one of them is kept. |
fundingCategories | every category | The category the agency filed it under, such as Health (HL) or Natural Resources (NR). |
fundingInstruments | every kind | Grant (G), cooperative agreement (CA), procurement contract (PC) or other (O). |
alnNumbers | any | Assistance Listing numbers, the old CFDA numbers, such as 93.600 for Head Start. Up to 30. |
opportunityNumbers | none | Exact published numbers such as HHS-2026-ACF-OHS-HS-0001, up to 25. Each one is looked up on its own. |
postedWithinDays | any time | Only opportunities posted in the last 3, 7, 14, 21, 28, 35, 42, 49 or 56 days. There are no other windows. |
proxyUrls | not used | Your 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.
{
"searchTerms": ["wildfire", "watershed restoration"],
"opportunityStatus": ["posted", "forecasted"],
"eligibility": ["12", "25", "99"],
"maxItems": 100
}
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 real run, 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"
}
| Field | What it is |
|---|---|
opportunityNumber | The number the agency published, the one people quote. opportunityId is grants.gov's own key and builds the url. |
agencyName, departmentName, agencyCode | The office that posted it, as the agency typed it, and the cabinet department above it. |
recordKind | synopsis for a real posting, forecast for money announced but not open yet. |
closeDate, closeDateIsEstimated | The deadline. On a forecast it is the agency's estimate and the flag is true. |
awardCeilingUsd, awardFloorUsd | The largest and smallest single award, in dollars. null means the agency did not publish one, not that there is no limit. |
estimatedTotalFundingUsd, expectedAwardCount | The whole pot and how many awards they plan to make. Often null for the same reason. |
eligibleApplicants, eligibilityCodes | Who may apply, spelled out, and the same list as the codes the input takes. |
alnNumbers | Assistance Listing numbers. Some opportunities carry more than one. |
costSharingRequired | Whether the applicant has to put up matching money. null when the notice does not say. |
description | The agency's synopsis with the HTML taken out, cut at 8,000 characters. |
detailFetched | Always 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.
| Row | How to spot it | Charged |
|---|---|---|
| An opportunity | 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: "opportunity", so filter on charged == true, not on recordType.
| Code | What it means |
|---|---|
NO_RESULTS | The 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_INPUT | Rows 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. |
NETWORK | The search could not be completed because grants.gov did not answer properly. |
TIME_BUDGET | The 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.
▶️ How to run it
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. If you want 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.
💰 How much does it cost?
$2.00 per 1,000 opportunities, which is $0.002 a row, flat on every Apify plan. 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 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 email. None of that is returned. Open the
urlif 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.
postedWithinDaystakes 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.
🧭 Which US government data scraper do you need?
| If you want | Use |
|---|---|
| Federal grants you can still apply for | This one |
| Federal money already paid out, and to whom | USASpending Federal Awards 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 |
❓ 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 rows? 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.
Can I run it on a schedule? Yes. A daily schedule with postedWithinDays set to 3 picks up what is new, and opportunityNumber is a stable key for comparing against yesterday.
What if my search matches nothing? You get one free NO_RESULTS row and the run still finishes as succeeded.
🆘 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.