# Grants.gov Scraper: US Federal Grant Opportunities API (`nexus-scrapers/grants-gov-opportunities`) Actor

Search Grants.gov for US federal grant opportunities and funding announcements. Filter by keyword, agency, funding category, eligibility (nonprofits, small businesses, universities, tribes), status or closing date, with deadlines and award amounts. JSON, CSV or Excel. No API key.

- **URL**: https://apify.com/nexus-scrapers/grants-gov-opportunities.md
- **Developed by:** [Nexus Scrapers](https://apify.com/nexus-scrapers) (community)
- **Categories:** Lead generation, Business, AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 grant opportunities

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Grants.gov Scraper - US Federal Grant Opportunities (NOFO) as Clean JSON

Search and export **US federal grant opportunities** from the official **Grants.gov** API as clean, normalized JSON, CSV or Excel. Filter by keyword, **agency**, funding category, **eligible applicant type**, funding instrument, Assistance Listing (ALN/CFDA) number, posting date, deadline and funding amount. Each result carries the **deadline, award ceiling and floor, total funding, number of awards, eligibility, and a link to the PDF announcement**. Forecasted (upcoming), posted (open), closed and archived opportunities are all available. No API key, no proxy, no browser and no login needed.

The Actor reads the public **Grants.gov REST API** (`search2` and `fetchOpportunity`). Each result follows the same **tender schema v1** used by the other Actors of this public-money family (EU TED, UK Find a Tender and Contracts Finder), with grant-specific fields prefixed `grants`, so grants and tenders can be loaded into one table.

### Who is it for

- **Grant writers, consultants and nonprofits** who want a daily list of new federal opportunities for their sector, with deadline and award size.
- **Universities and research offices** tracking NIH, NSF, DOE and other agency notices of funding opportunity (NOFO) in their fields.
- **Startups and small businesses** looking for opportunities open to small businesses (SBIR-type programs, innovation grants).
- **Local governments, tribes and school districts** filtering by eligible applicant type.
- **Analysts and AI agents (MCP)**: the dataset schema describes every field, so an agent can query grants in plain language (see [API, MCP and AI agents](#api-mcp-and-ai-agents)).

### What you get

One dataset item per opportunity, with:

- opportunity id, agency opportunity number, title, status (forecasted, posted, closed, archived) and link to the Grants.gov page
- the awarding agency (and parent department), posting date and **application deadline**
- with `includeDetails` (on by default): the **description**, **total funding, award ceiling and floor**, **expected number of awards**, cost sharing, funding instruments and categories, **eligible applicant types** and the free-text eligibility description, ALN numbers with program titles, and the list of attached files with a direct link to the main PDF
- for forecasts: fiscal year and the estimated posting, application, award and start dates
- optional agency contact (name, e-mail, phone) as published in the notice, off by default

The full field reference is in [SCHEMA.md](./SCHEMA.md) and in the Actor's dataset schema (visible in the Apify UI and to AI agents using MCP).

### Use cases

- **Grant alerts**: schedule the Actor daily with `daysBack: 1` and your keywords or agencies, and send new opportunities to Slack, e-mail or a spreadsheet.
- **Deadline tracking**: `closingWithinDays: 30` lists open opportunities closing soon, soonest first.
- **Size filtering**: `minValue` / `maxValue` keep only opportunities in your funding band.
- **Early planning**: add the `forecasted` status to see opportunities before they open.
- **Eligibility search**: open to small businesses, individuals, state or local governments, tribal governments, nonprofits and so on.
- **Market and policy research**: which agencies fund which categories, how much, and how often.
- **AI agents (MCP)**: ask in natural language, get structured opportunities back.

### Input

All filters are optional and are combined with AND. The defaults return the 20 most recently posted open opportunities, with full details, in a few seconds.

| Field | Description |
|---|---|
| `statuses` | `posted` (open, default), `forecasted`, `closed`, `archived` |
| `keyword` | Search words, matched by Grants.gov (title, description, opportunity number). Several words narrow the search |
| `agencies` | Agency codes: `HHS`, `DOD`, `USDA`, `ED` (include sub-agencies) or an exact code such as `HHS-NIH11`, `NSF`, `DOT-NHTSA` |
| `fundingCategories` | Health (`HL`), Science and Technology (`ST`), Education (`ED`), Energy (`EN`), Environment (`ENV`), ... any of the selected |
| `eligibilities` | Eligible applicants, e.g. `23` Small businesses, `21` Individuals, `00` State governments, `12` 501(c)(3) nonprofits |
| `fundingInstruments` | `G` Grant, `CA` Cooperative Agreement, `PC` Procurement Contract, `O` Other |
| `alnNumber` | One Assistance Listing (CFDA) number such as `93.543`, or a prefix such as `93` |
| `sortBy` | `newest` (default) or `closing-soon` |
| `daysBack` | Posted in the last N days (0 = no limit) |
| `dateFrom` / `dateTo` | Posting date range, `YYYY-MM-DD` (override `daysBack`) |
| `closingWithinDays` | Deadline between today and N days from now (sorted by deadline) |
| `minValue` / `maxValue` | Funding band in USD (total program funding, or the award ceiling if no total is given). Needs the detail records, so it reads up to 500 opportunities |
| `includeDetails` | Fetch the full record of each opportunity (default on). Off = a faster list of title, agency, dates only |
| `includeContact` | Add the agency contact published in the notice (default off) |
| `maxItems` | Maximum results (default 20, maximum 10,000) |

#### Example: open small-business opportunities in health, closing within 60 days

```json
{
  "statuses": ["posted"],
  "fundingCategories": ["HL"],
  "eligibilities": ["23"],
  "closingWithinDays": 60,
  "maxItems": 100
}
```

#### Example: new NSF and NIH opportunities of the last week

```json
{
  "agencies": ["NSF", "HHS-NIH11"],
  "daysBack": 7,
  "maxItems": 100
}
```

#### Example: large opportunities, forecasted or open, about artificial intelligence

```json
{
  "statuses": ["forecasted", "posted"],
  "keyword": "artificial intelligence",
  "minValue": 5000000,
  "maxItems": 50
}
```

### Output example

Real record (posted on Grants.gov on 4 November 2026), description shortened:

```json
{
  "schemaVersion": "1.0",
  "source": "grants-gov",
  "sourceId": "364212",
  "url": "https://www.grants.gov/search-results-detail/364212",
  "documentUrls": {
    "html": "https://www.grants.gov/search-results-detail/364212",
    "pdf": "https://apply07.grants.gov/grantsws/rest/opportunity/att/download/355535",
    "xml": null
  },
  "noticeType": "contract-notice",
  "noticeTypeCode": "synopsis",
  "title": "State Process for Informing Consumers of Recalls Program",
  "description": "The objective of the State Process for Informing Consumers of Recalls Grant program is to establish a recall notification program in a state to improve traffic safety in the following areas…",
  "language": "en",
  "buyer": { "name": "National Highway Traffic Safety Administration", "country": "US", "city": null, "nutsCode": null, "buyerType": "central-government" },
  "cpvCodes": [],
  "estimatedValue": { "amount": 1500000, "currency": "USD" },
  "publicationDate": "2026-11-04",
  "submissionDeadline": "2027-02-04",
  "awardInfo": null,
  "scrapedAt": "2026-11-04T22:03:31+00:00",
  "grantsOpportunityNumber": "NHTSA-693JJ927R000007-FY27",
  "grantsStatus": "posted",
  "grantsAgencyCode": "DOT-NHTSA",
  "grantsTopAgency": { "code": "DOT", "name": "Department of Transportation" },
  "grantsAln": [{ "code": "20.614", "title": "National Highway Traffic Safety Administration (NHTSA) Discretionary Safety Grants and Cooperative Agreements" }],
  "grantsCategory": { "code": "D", "description": "Discretionary" },
  "grantsFundingInstruments": [{ "id": "G", "description": "Grant" }],
  "grantsActivityCategories": [{ "id": "CP", "description": "Consumer Protection" }],
  "grantsEstimatedValueBasis": "totalProgramFunding",
  "grantsEstimatedTotalFunding": { "amount": 1500000, "currency": "USD" },
  "grantsAwardCeiling": { "amount": 1500000, "currency": "USD" },
  "grantsAwardFloor": { "amount": 300000, "currency": "USD" },
  "grantsExpectedAwards": 5,
  "grantsCostSharing": false,
  "grantsEligibility": {
    "applicantTypes": [{ "id": "00", "description": "State governments" }],
    "additionalInfo": "An eligible applicant is a State agency that has the authority to register motor vehicles…"
  },
  "grantsAttachments": [{ "name": "State Process for Informing Consumers of Recalls Program NOFO_Final 11.4.2026 - 695JJ927R000007.pdf", "folder": "Full Announcement", "mimeType": "application/pdf", "sizeBytes": 4243557, "url": "https://apply07.grants.gov/grantsws/rest/opportunity/att/download/355535" }],
  "grantsContact": null,
  "grantsDetailsIncluded": true
}
```

Fields starting with `grants` are Grants.gov-specific extras (the output shows a subset above; the dataset has more, such as the archive date and the forecast block). All other fields are shared with the other Actors of the family. Fields that make no sense for grants (`cpvCodes`, `lots`, `awardInfo`, `placeOfPerformance`, procedure and nature) are empty or `null`, see [SCHEMA.md](./SCHEMA.md) for the mapping: the estimated value is the total program funding (or the award ceiling when no total is given), the deadline is the application close date, and the Assistance Listing number replaces the classification code.

### Pricing

Pay only for the results you get. Set **Maximum results** (and the run's maximum cost) to control spending: the Actor stops as soon as either limit is reached. Runs that find no opportunities return no results and charge nothing. See the Pricing tab of this Actor for the current price.

Speed: the list is fast (500 opportunities in about 3 seconds); the full details cost one extra request per opportunity, which the Actor spaces politely (about 5 per second). A run of 20 results with details takes a few seconds, 500 results with details about 2 minutes, and 500 results without details about 3 seconds.

### API, MCP and AI agents

Every Apify Actor can be called over the API, and this one is also available as a tool for AI agents.

**Apify API (Python)**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("nexus-scrapers/grants-gov-opportunities").call(run_input={
    "keyword": "cybersecurity", "closingWithinDays": 45, "maxItems": 50,
})
for grant in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(grant["submissionDeadline"], grant["buyer"]["name"], grant["title"], grant["estimatedValue"])
```

**Apify API (JavaScript)**

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('nexus-scrapers/grants-gov-opportunities').call({ agencies: ['NSF'], daysBack: 7 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**MCP and AI agents.** Apify exposes Actors as MCP tools through the [Apify MCP server](https://mcp.apify.com). Add `https://mcp.apify.com` (with `?actors=nexus-scrapers/grants-gov-opportunities` to load this Actor directly) to Claude, ChatGPT-compatible clients, Cursor, VS Code or any MCP client, authorize with your Apify account, and ask in plain language, for example: "Which open federal grants for small businesses in energy close in the next 60 days, and how big are they?" or "List forecasted NIH opportunities above 5 million dollars". The input and dataset schemas tell the agent every parameter and output field. Also works with LangChain, LlamaIndex, CrewAI and n8n through the Apify integrations.

### FAQ

**Do I need an API key?** No. The `search2` and `fetchOpportunity` endpoints of the Grants.gov API need no key or login; the Actor uses only these.

**Is the data official?** Yes. It comes straight from the Grants.gov API run by the U.S. Department of Health and Human Services for all federal grant-making agencies. Every record links to the official Grants.gov page.

**What do the statuses mean?** `posted` = open for applications; `forecasted` = announced in advance by the agency, not yet open (a good early signal); `closed` = deadline passed but still listed; `archived` = older opportunities.

**What is `estimatedValue`?** The total funding of the opportunity when the agency states it, otherwise the award ceiling (the maximum for one award). `grantsEstimatedValueBasis` tells you which, and the award ceiling, floor and total are always given separately. Amounts are in US dollars, never converted. Many opportunities state no amount (`null`).

**What is an ALN number?** The Assistance Listing number (formerly CFDA number) identifies a federal assistance program, for example `93.543`. It replaces the CPV code used in tenders; it is in `grantsAln`.

**Why is the deadline a date only?** Grants.gov lists a close date; the exact cut-off time (often 11:59 pm Eastern) is in the announcement text, which is linked.

**Are awards or winners included?** No. Grants.gov lists opportunities, not who won. Award data is published separately by USAspending.gov.

**What does `includeDetails` change?** Off, you get title, agency, dates, status and ALN numbers from the search list only, very fast. On (default), each opportunity's full record is fetched: description, amounts, eligibility, attachments. The funding filters (`minValue`, `maxValue`) and `includeContact` switch it on automatically.

**Does it include contact details?** Only if you ask for them (`includeContact`): the contact person or mailbox the agency publishes in the notice. It is off by default because it can name a person; if you use it, handle it in line with the privacy rules that apply to you.

**How fresh is the data?** The Actor queries Grants.gov live, so new opportunities appear as soon as they are published.

**How many results can I get?** Up to 10,000 per run. With value or deadline filters the Actor examines at most 500 to 2,000 opportunities per run and says in the status message when it stopped early.

**Can I get the application forms or packages?** No. The Actor returns opportunity data and links to the announcement files; applications are made on Grants.gov.

### Data source, attribution and terms

This product uses the Grants.gov API but is not endorsed or certified by the U.S. Department of Health and Human Services.

Data comes from [Grants.gov](https://www.grants.gov), operated by the U.S. Department of Health and Human Services (HHS), through its public API (`search2`, `fetchOpportunity`), which needs no authentication. Use is subject to the [Grants.gov API Terms of Service](https://www.grants.gov/api/terms-conditions): searching, displaying, analysing and retrieving the data is permitted, the attribution notice above must be shown, the content must not be modified or falsely represented, and Grants.gov may limit or block clients that exceed or circumvent its limits. The Actor does not alter the content (descriptions are converted from HTML to plain text and shortened to 1,500 characters; amounts and dates are reformatted). Federal grant announcements are US government information; the Actor is an independent tool and is not affiliated with HHS or Grants.gov. It accesses the API politely (descriptive User-Agent, request pacing, back-off on rate limits).

### Limitations

- Only opportunities published on Grants.gov are covered. Some agencies post notices only on their own sites, and state, local and private foundation grants are not on Grants.gov.
- Grants.gov search is run by Grants.gov: the `keyword` matching (stemming, word logic) is theirs and is not an exact-phrase search.
- Funding amounts, descriptions, eligibility and attachments exist only in the detail records (`includeDetails`). Many opportunities state no amount, or the string "none"; the Actor returns `null` then.
- `minValue` / `maxValue` exclude opportunities without a stated amount, and read at most 500 opportunities per run.
- The attachment download links point to the Grants.gov attachment service used by its website; they are not part of the documented API and may change.
- Award results, applicant data and application packages are not available.
- Archived opportunities number in the tens of thousands; for very broad queries over them, split the search by date range. Date and deadline filters beyond what Grants.gov filters itself are applied by the Actor on at most 2,000 examined opportunities per run.

# Actor input Schema

## `statuses` (type: `array`):

Which opportunities to return. 'Posted' = open for applications (default). 'Forecasted' = announced in advance, not yet open. 'Closed' and 'Archived' are past opportunities.

## `keyword` (type: `string`):

Search words, matched by Grants.gov itself (title, description, opportunity number). Several words narrow the search. Leave empty to search everything.

## `agencies` (type: `array`):

Agency codes as used by Grants.gov. A bare department code such as 'HHS', 'DOD', 'USDA' or 'ED' includes its sub-agencies; a full code such as 'HHS-NIH11' (NIH), 'NSF' or 'DOT-NHTSA' selects exactly one.

## `fundingCategories` (type: `array`):

Grants.gov funding activity categories (any of the selected).

## `eligibilities` (type: `array`):

Only opportunities open to these kinds of applicants (for example Small businesses, Individuals, State governments).

## `fundingInstruments` (type: `array`):

Grant, Cooperative Agreement, Procurement Contract or Other (any of the selected).

## `alnNumber` (type: `string`):

One Assistance Listing number (formerly CFDA), for example '93.543', or a prefix such as '93' or '93.5\*'.

## `sortBy` (type: `string`):

Newest first (default) or soonest deadline first.

## `daysBack` (type: `integer`):

Only opportunities posted in the last N days (server-side filter). Ignored if 'Posted from' or 'Posted to' is set. 0 = no date limit.

## `dateFrom` (type: `string`):

Earliest posting date, format YYYY-MM-DD. Overrides 'last N days'.

## `dateTo` (type: `string`):

Latest posting date (inclusive), format YYYY-MM-DD.

## `closingWithinDays` (type: `integer`):

Only opportunities whose application deadline falls between today and N days from now; results are then sorted by deadline. Opportunities without a deadline are excluded. 0 = off.

## `minValue` (type: `number`):

Minimum estimated value in USD (total program funding, or the award ceiling when the total is not stated). Amounts are only in the detail records, so this turns on 'Include full details' and reads up to 500 opportunities; opportunities without a stated amount are excluded.

## `maxValue` (type: `number`):

Maximum estimated value in USD, same rules as the minimum.

## `includeDetails` (type: `boolean`):

Fetch each opportunity's full record (one extra request each, about 0.2 s per result): description, award ceiling/floor, total funding, expected number of awards, eligibility text, attachments. Switch off for a faster list of titles, agencies and dates only.

## `includeContact` (type: `boolean`):

Add the contact name, e-mail and phone that the agency publishes in the notice (grantsContact). Off by default: it can contain a named person. Turns on 'Include full details'.

## `maxItems` (type: `integer`):

Maximum number of opportunities to return. You are charged per result, so keep this low while testing.

## Actor input object example

```json
{
  "statuses": [
    "posted"
  ],
  "keyword": "cybersecurity",
  "agencies": [
    "HHS",
    "NSF"
  ],
  "fundingCategories": [
    "HL",
    "ST"
  ],
  "eligibilities": [
    "23"
  ],
  "fundingInstruments": [
    "G"
  ],
  "alnNumber": "93.543",
  "sortBy": "newest",
  "daysBack": 0,
  "dateFrom": "2026-10-01",
  "dateTo": "2026-10-31",
  "closingWithinDays": 30,
  "minValue": 1000000,
  "maxValue": 10000000,
  "includeDetails": true,
  "includeContact": false,
  "maxItems": 20
}
```

# Actor output Schema

## `overview` (type: `string`):

All opportunities in the default dataset, opened on the Overview table (posted date, status, title, agency, funding, deadline, link).

## `funding` (type: `string`):

The same dataset opened on the Funding view: total funding, award ceiling and floor, number of awards, cost sharing.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "statuses": [
        "posted"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexus-scrapers/grants-gov-opportunities").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "statuses": ["posted"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("nexus-scrapers/grants-gov-opportunities").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "statuses": [
    "posted"
  ],
  "maxItems": 20
}' |
apify call nexus-scrapers/grants-gov-opportunities --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexus-scrapers/grants-gov-opportunities"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/oHeJFyzcC4BFZoGIF/builds/DK8CkwE2QcdNaf91b/openapi.json
