NSF Award Scraper avatar

NSF Award Scraper

Pricing

from $1.00 / 1,000 grants

Go to Apify Store
NSF Award Scraper

NSF Award Scraper

Extract National Science Foundation awards: award id, title, abstract, awardee organisation and location, principal investigator, program, obligated and estimated amounts, start and expiry dates. Export data, run via API, schedule and monitor runs, or integrate with other tools.

Pricing

from $1.00 / 1,000 grants

Rating

5.0

(1)

Developer

Public Money

Public Money

Maintained by Apify

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

21 hours ago

Last modified

Categories

Share

This Actor reads National Science Foundation awards. It returns one record per award, filtered server-side by keyword and date range so a run returns what you asked for rather than everything. The portal itself is built for someone reading one award at a time, which is what makes a pipeline over it painful. Each record comes back with a stable set of named fields, so the shape does not change between runs.

What it does

  • Returns one record per award, with startDate as the first column.
  • Filters at the source, not after it. Keyword and date range are passed to the portal, so a narrow query costs less rather than the same.
  • Handles the pagination. The portal serves awards a page at a time and the Actor walks them until your Max items cap is reached.
  • Normalises the source into named fields, so awardId means the same thing on every run.
  • Needs no API key. The source is open data and the Actor reads it unauthenticated.
  • Reads api.nsf.gov directly rather than scraping a rendered page, so a layout change on the site does not break the run.

Use cases

You need toHow this Actor does it
Find who funds your fieldSet a keyword and group by the funding programme
Track an institutionFilter on the recipient and total what it received
Benchmark an award sizeFilter by keyword and compare amounts
Watch a programmeFilter on the programme and schedule the run
Feed a research agentCall the Actor over MCP and let the model set the filters
Build a historySchedule the run and let the dataset accumulate

Quick start

  1. Click Try for free.
  2. Put a Keyword in, or leave it empty to take everything the filters allow.
  3. Set the date window. A scheduled run usually wants the rolling window rather than fixed dates, so it picks up only what is new.
  4. Set Max items, which is what caps the cost of the run.
  5. Click Start, then export as JSON, CSV, Excel or XML, or read the dataset over the API.

Input

FieldTypeDefaultWhat it controls
keywordstringemptyMatched server-side by the portal, so a narrow keyword cuts the run and the bill rather than filtering after the fact
startDateFromstringemptyEarliest award start date, in YYYY-MM-DD form
startDateTostringemptyLatest award start date, in YYYY-MM-DD form
awardeeStatestringemptyTwo-letter US state code of the awardee organisation
activeOnlybooleanFalseSet to true to drop awards NSF has marked inactive
maxItemsinteger500Caps how many records are returned, and therefore what the run costs
{
"keyword": "bridge",
"maxItems": 500
}

Output

One dataset item per award, with the same named fields on every run.

Field groupFields
IdentityawardId
DatesstartDate
MoneyestimatedTotalAmount
Partiesawardee
LinkawardUrl
Detailtitle, fundProgram
{
"startDate": "2026-09-04",
"awardId": "RFP-2026-0184",
"title": "Replacement of the north bridge deck",
"awardee": "Department of Transportation",
"estimatedTotalAmount": 184220.5,
"awardUrl": "https://example.gov/notice/8842"
}

Integrations

Run it over the API and get the rows back in one call:

curl -X POST "https://api.apify.com/v2/acts/publicmoney~nsf-awards-grants-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keyword": "bridge", "maxItems": 500}'

From Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("publicmoney/nsf-awards-grants-scraper").call(run_input={"keyword": "bridge", "maxItems": 500})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

Give an AI agent the Actor over MCP:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?actors=publicmoney/nsf-awards-grants-scraper"
}
}
}

Schedules run it on any cron, webhooks fire when a run finishes, and platform integrations push the dataset to Google Sheets, Slack, Airtable, Zapier or your own endpoint.

Cost

Pay per event, so you pay for records rather than compute time.

EventFree tierTop volume tier
Grant$0.002$0.0007
Actor start$0.00005 per GBSame

Six volume tiers apply, so the per-record price falls with monthly volume. The filters are the lever on cost: a keyword and a date range are applied by the portal before anything is returned, so a narrow run is a cheap run. Max items is the hard cap.

Troubleshooting

IssueSolution
The run returns nothingThe filters excluded everything. Widen the date range or clear the keyword, and remember the keyword is matched by the portal rather than by us, so it matches the portal's way.
Fewer records than the portal showsMax items caps the run. Raise it, and check the date range covers the period you meant.
The run is slower than expectedThe portal serves awards a page at a time and the Actor walks the pages. A narrower filter is faster as well as cheaper.
A field is empty on some awardsThe source publishes it for some records and not others. The field is dropped rather than filled with a placeholder, so an empty one means the portal had nothing.
The source changed and the run brokeOpen an issue on the Issues tab. A daily test runs every Actor in this fleet against its live source, so a break is usually already known.

FAQ

Does this source have an API?

Some of these portals publish one and some do not, and where one exists it is usually paginated, rate limited and shaped differently from every other portal. This Actor gives you the same input and the same record shape as the rest of the fleet, so a pipeline over many jurisdictions does not need a special case for each.

Do I need an API key?

No. The source is open data and the Actor reads it unauthenticated. You need an Apify token to call the Actor over the API.

How do I keep the cost down?

Filter. The keyword, date range and amount are applied by the portal before any record is returned, so they cut the bill rather than just the output. Max items is the hard cap if you want a guaranteed ceiling, and a award that returns no data is not charged.

Can I get history, or only what is current?

As far back as the portal publishes, using the date range. Portals differ: some carry years, some only an open window. To build your own history, schedule the Actor and let the dataset accumulate.

Can an AI agent call this Actor?

Yes. Add it to an MCP client with the config above and the model can set the filters itself. Every record is flat JSON, so no post-processing is needed.

Can I get the data into Excel or Google Sheets?

Yes. Export the dataset as XLSX or CSV, or connect the Google Sheets integration so each run appends to a sheet.

This is public procurement and public spending data that governments publish deliberately, and the Actor reads it as published with no login. Named individuals do appear in some sources, such as a contact on a notice, so handle those under your own obligations. Take your own legal advice for your use case.

Changelog

  • 0.0.1 First release.

Feedback

Found a column the portal publishes that this Actor misses, or a filter that does not behave the way the portal documents it? Open an issue on the Issues tab with the input you used and what you expected. A daily test runs every Actor in this fleet against its live source, so parser fixes ship fast.