# US Federal Grants (Grants.gov) (`openrows/us-federal-grants`) Actor

US federal funding opportunities from the official Grants.gov API: forecasted, open, closed and archived grants with agency, deadlines, award amounts, eligibility and assistance listings. Filter by keyword, agency, applicant type, category and posting date.

- **URL**: https://apify.com/openrows/us-federal-grants.md
- **Developed by:** [openrows](https://apify.com/openrows) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.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

## US Federal Grants (Grants.gov)

US federal funding opportunities from the official Grants.gov API — forecasted, open, closed and
archived grants and cooperative agreements, with agency, deadlines, award amounts, eligibility and
assistance listing (CFDA) numbers. Filter by keyword, agency, applicant type, funding category,
funding instrument and posting date.

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

The Actor calls the documented, keyless [Grants.gov API](https://www.grants.gov/api/api-guide) and
delivers one clean row per opportunity that you can download as JSON, CSV or Excel, or pull through
the API. Titles, codes, dates, amounts and categories are the values the API serves, put into
standard formats (ISO dates, amounts as numbers, HTML entities decoded). The one free-text field, the
eligibility notes, is an
**edited extract**: converted from the agency's HTML to plain text, with e-mail addresses and phone
numbers removed. Every row links to the original opportunity on [Grants.gov](https://www.grants.gov/).
HTTP-only, no browser, so runs are fast.

**Who it is for:** grant consultants and grant writers, nonprofit development teams, university
research offices, and anyone building a grant-alert feed or tracking federal funding by agency or
topic. Set **Posted since** to the date of your previous run to get only new opportunities (see
*Tips* for running it on a schedule).

### What data you get

For every funding opportunity the Actor returns:

| Field                                        | Description                                                                                 |
| -------------------------------------------- | ------------------------------------------------------------------------------------------- |
| `url`                                        | The opportunity's public page on Grants.gov                                                 |
| `scrapedAt`                                  | ISO 8601 timestamp of the extraction                                                        |
| `opportunityId`                              | Grants.gov's numeric id                                                                     |
| `opportunityNumber`                          | The funding opportunity number the agency assigned                                          |
| `title`                                      | Opportunity title                                                                           |
| `agencyCode`, `agencyName`                   | The posting agency (e.g. `HHS-NIH11`, National Institutes of Health)                        |
| `topAgencyCode`, `topAgencyName`             | Its department (e.g. `HHS`, Department of Health and Human Services)                        |
| `status`                                     | `forecasted`, `posted`, `closed` or `archived`                                              |
| `opportunityCategory`                        | Discretionary, Mandatory, Continuation, Earmark or Other                                    |
| `postingDate`, `closeDate`, `archiveDate`    | Dates as `YYYY-MM-DD`; `closeDate` is the application deadline                              |
| `estimatedPostingDate`, `estimatedCloseDate` | Forecasts only: when the agency expects to post the opportunity and its deadline            |
| `lastUpdatedDate`                            | When the agency last changed the record (ISO 8601, US Eastern offset)                       |
| `awardCeiling`, `awardFloor`                 | Largest and smallest single award, numbers in USD                                           |
| `estimatedTotalFunding`                      | Estimated total program funding, number in USD                                              |
| `expectedNumberOfAwards`                     | Expected number of awards                                                                   |
| `currency`                                   | `USD` with full details; `null` when `includeDetails` is off                                |
| `costSharing`                                | Whether cost sharing or matching is required                                                |
| `fundingInstruments`                         | Grant, Cooperative Agreement, Procurement Contract, Other                                   |
| `fundingCategories`                          | Categories of funding activity (Health, Education, Agriculture, …)                          |
| `eligibleApplicantTypes`                     | Applicant types the opportunity is open to                                                  |
| `eligibilityDescription`                     | Eligibility notes, edited: HTML → plain text, e-mails and phones removed; original at `url` |
| `assistanceListingNumbers`                   | Assistance Listing numbers (formerly CFDA)                                                  |
| `additionalInfoUrl`                          | The agency's link to the full announcement or program page                                  |

A field the agency left empty is `null`. With `includeDetails: false` only the search fields are
filled (`opportunityNumber`, `title`, `agencyCode`, `agencyName`, `status`, `postingDate`, `closeDate`,
`assistanceListingNumbers`); the rest are `null`.

**The opportunity's description is not included**, because agencies often name their staff in it as
the contact for questions (see *Data and compliance*). Each row's `url` opens the opportunity on
Grants.gov, where the full description is, and `additionalInfoUrl` links to the agency's own
announcement when the agency gives one.

### Input

| Option                | Type    | Default                    | Description                                                                                                   |
| --------------------- | ------- | -------------------------- | ------------------------------------------------------------------------------------------------------------- |
| `keyword`             | string  | -                          | Free-text search. Empty lists every opportunity matching the other filters, newest first.                     |
| `statuses`            | array   | `["posted", "forecasted"]` | Any of `forecasted`, `posted`, `closed`, `archived`                                                           |
| `postedSince`         | string  | -                          | Only opportunities posted on or after this date, `YYYY-MM-DD`                                                 |
| `includeDetails`      | boolean | `true`                     | Fetch each opportunity's full record (one extra API call per result)                                          |
| `maxItems`            | integer | `50`                       | Stop after this many results (max 10,000). Also your cost cap.                                                |
| `agencies`            | array   | -                          | Agency codes. A department code (`HHS`, `USDA`, `DOD`, …) includes all its sub-agencies; `HHS-NIH11` narrows  |
| `eligibilities`       | array   | -                          | Grants.gov applicant-type codes, e.g. `12` nonprofits with 501(c)(3), `23` small businesses, `21` individuals |
| `fundingCategories`   | array   | -                          | Category codes, e.g. `HL` Health, `ED` Education, `ST` Science and Technology, `AG` Agriculture               |
| `fundingInstruments`  | array   | -                          | `G` Grant, `CA` Cooperative Agreement, `PC` Procurement Contract, `O` Other                                   |
| `maxRequestsPerCrawl` | integer | derived from `maxItems`    | Safety cap on API requests per run (search pages plus one detail call per result)                             |
| `proxyConfiguration`  | object  | Apify datacenter           | Proxy settings                                                                                                |

**Large runs.** With details on, the Actor fetches about one opportunity per 1.2 seconds (it stays
polite to the API), roughly 1,000 per 20 minutes. For runs above a few thousand results, raise the
run timeout in the run options.

The code lists for `eligibilities`, `fundingCategories` and `fundingInstruments` are Grants.gov's own,
taken from the API; the input form shows them by name. Values inside one filter are combined with OR,
different filters with AND. An empty input returns the 50 newest posted and forecasted opportunities.

Example input — open health grants for nonprofits posted since 1 September 2026:

```json
{
    "statuses": ["posted"],
    "fundingCategories": ["HL"],
    "eligibilities": ["12", "13"],
    "fundingInstruments": ["G"],
    "postedSince": "2026-09-01",
    "maxItems": 100
}
```

### Output example

A real row from a local run on 2026-09-27 (posted and forecasted opportunities; this one is a
forecast, so the estimated dates are filled and `closeDate` is `null`):

```json
{
    "url": "https://www.grants.gov/search-results-detail/363963",
    "scrapedAt": "2026-09-27T10:27:18.576Z",
    "opportunityId": 363963,
    "opportunityNumber": "HHS-2027-ACL-NIDILRR-ARCP-0300",
    "title": "Advanced Rehabilitation Research Training (ARRT) Program - Community Living and Participation",
    "agencyCode": "HHS-ACL",
    "agencyName": "Administration for Community Living",
    "topAgencyCode": "HHS",
    "topAgencyName": "Department of Health and Human Services",
    "status": "forecasted",
    "opportunityCategory": "Discretionary",
    "postingDate": "2026-09-25",
    "closeDate": null,
    "archiveDate": "2027-09-30",
    "estimatedPostingDate": "2026-10-05",
    "estimatedCloseDate": "2026-12-07",
    "lastUpdatedDate": "2026-09-25T13:03:22-04:00",
    "awardCeiling": 250000,
    "awardFloor": 245000,
    "estimatedTotalFunding": 250000,
    "expectedNumberOfAwards": 1,
    "currency": "USD",
    "costSharing": false,
    "fundingInstruments": ["Grant"],
    "fundingCategories": ["Science and Technology and other Research and Development"],
    "eligibleApplicantTypes": [
        "Public and State controlled institutions of higher education",
        "Private institutions of higher education"
    ],
    "eligibilityDescription": "Public and State controlled institutions of higher education; Private institutions of higher education. Foreign entities are not eligible to compete for, or receive, awards made under this announcement.",
    "assistanceListingNumbers": ["93.433"],
    "additionalInfoUrl": "https://acl.gov/grants/open-opportunities"
}
```

A run summary (items pushed, items skipped by category, the number of matching opportunities
Grants.gov reported, API requests made, failed requests by category, stop reason) is stored in the
run's key-value store under the key `OUTPUT`.

### Pricing

**Pay per result.** You are charged per result and nothing else: no platform usage, no compute units.
Search pages, retries and failed requests are free. The current rate is on the *Pricing* tab of this
Actor — that is the only place it is set, so no figure is repeated here.

- `maxItems` caps the number of results, and therefore the cost, of a run.
- The run also stops when it reaches the *maximum total charge* you set for the run in Apify Console
  or through the API.

### Tips

- Start with `maxItems: 20` to check the fields before a large run.
- To collect only new opportunities, set `postedSince` to the date of your previous run. Results come
  newest first and the run stops at the first opportunity older than that date. A schedule in Apify
  Console starts every run with the same input, so update the date before each run, or start each
  run through the API with the date in its input.
- Turn `includeDetails` off for a faster run with the search fields only (about 100 opportunities per
  API call instead of one call per opportunity). The price per result is the same either way.

### Limitations

- Only what Grants.gov publishes. Opportunities an agency announces elsewhere, and awards already
  made, are not in this data.
- `status` is the status at run time; a forecast becomes a posted opportunity, and a posted one closes,
  on Grants.gov's schedule.
- With details on, the Actor makes one API call per opportunity, at about one call per second, so a
  run of several thousand opportunities takes an hour or more.
- When many departments are combined with closed or archived statuses, the agency list is longer than
  one Grants.gov search accepts. The Actor then sends it as several searches and returns the results
  batch by batch, each newest first, rather than one list sorted across all of them.
- Attachments (full announcement PDFs, application packages) are not downloaded; `additionalInfoUrl`
  and `url` link to them.

**Source caveats.** What Grants.gov says about the data, and what we saw in it:

- The Grants.gov API is provided "as is" and "as available", with no warranty that it is error-free or
  uninterrupted (API terms of service).
- Amounts and dates are as each agency entered them. Agencies often leave award amounts empty, and
  some enter `0` where no figure applies; both are passed through as the source gives them (`null` for
  empty or "none", `0` for 0).
- Deadlines are stored as dates; the time of day, when an agency gives one, is in the announcement.

### Data and compliance

This Actor collects **publicly available, non-personal data only**:

- It uses the official, documented Grants.gov API, which needs no account or key, and does not bypass
  access controls.
- It does not collect names, e-mail addresses, phone numbers, addresses or any other field that
  identifies a person. Grants.gov records carry an agency contact block — the name, e-mail and phone of
  the government employee handling the opportunity. That block is never read, and neither is the
  record's free-text agency-name field, where agencies often type the contact person's name.
- **The description text is not included.** Agencies often name their own staff inside an
  opportunity's description, as the contact for questions: in 156 opportunities checked on
  2026-09-27, 7 descriptions (4.5 %) still named an agency employee after e-mail addresses and phone
  numbers had been removed. Names in running text cannot be removed reliably, so the Actor does not
  output the description at all. The `url` of each row leads to the full text on Grants.gov.
- `eligibilityDescription` is converted from the agency's HTML to plain text, and e-mail addresses
  and phone numbers are removed from it. **It is therefore an edited extract, not the verbatim
  Grants.gov text**; the `url` of each row leads to the original. In 141 opportunities checked on
  2026-09-27, no eligibility note named a person except inside an institution's name (for example a
  tribal college named after a historical figure).
- It identifies itself with a plain User-Agent and sends no headers that imitate a browser.
- It sends at most two requests at a time, waits at least one second between requests, and stops
  instead of working around a block.

Program titles are kept as published, including programs named after a person (for example
"John R. Justice Formula Grant Program").

#### How robots.txt is handled

This Actor talks to one host only: the Grants.gov API at `api.grants.gov`, through its two documented
endpoints (`search2` and `fetchOpportunity`). That host is an API gateway and serves no `robots.txt`
(the address answers HTTP 403, as it does for any path the API does not define); the Grants.gov
website's own `robots.txt` allows all crawlers. The Actor therefore does not fetch `robots.txt`, and
the run summary shows `robots.respected: false`. The API's terms of service set no numeric limits on
calls; they reserve the right to impose them ("may be subject to certain limitations on access, calls,
or use as set forth within this Agreement or otherwise provided by HHS") and to block a user who tries
to exceed or circumvent them. The Actor keeps to the modest request rate above and records a block
instead of working around it.

**Removal requests.** If you believe this Actor exposes data it should not, open an issue on the Actor's
*Issues* tab and state the URL(s) concerned. Requests are answered there, and the fields or pages in
question are removed.

You are responsible for using the extracted data in line with the
[Grants.gov API terms of service](https://www.grants.gov/api/terms-conditions) — including its
attribution notice, quoted at the top of this page — and the laws that apply to you.

### Support

Report bugs and request fields on the *Issues* tab of this Actor. Include the run ID.

# Actor input Schema

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

Free-text search across Grants.gov opportunities (title, number, description). Leave empty to list every opportunity matching the other filters, newest first.

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

Which opportunities to include. Forecasted: announced ahead of time, not yet open. Posted: open for applications. Closed: deadline passed. Archived: removed from active listings.

## `postedSince` (type: `string`):

Only opportunities posted (or, for forecasts, announced) on or after this date, YYYY-MM-DD. To collect only new opportunities, set it to the date of your previous run. A schedule in Apify Console reuses the same input every time, so update this date before each run, or pass it in the input when you start the run through the API.

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

Fetch each opportunity's full record: award amounts, funding instruments and categories, eligible applicant types, eligibility notes, archive date, link to the announcement. Costs one extra API call per result. Turn off for a fast list with the search fields only (number, title, agency, status, posting and closing dates, assistance listing numbers).

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

Stop after this many opportunities. You are charged per result, so this is also your cost cap. Maximum 10,000 per run; split a bigger job across runs.

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

Grants.gov agency codes. A department code such as HHS, USDA, DOC, DOD, DOE, DOI, DOS, DOT, USDOJ, DOL, VA, NASA, NEA, NEH or NSF includes all of its sub-agencies; a sub-agency code such as HHS-NIH11 or USDA-NIFA narrows to that agency. Codes are shown on every Grants.gov opportunity and in this Actor's agencyCode / topAgencyCode output fields.

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

Only opportunities open to at least one of these applicant types (Grants.gov's own categories).

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

Only opportunities in at least one of these categories of funding activity.

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

Only opportunities using at least one of these funding instruments.

## `proxyConfiguration` (type: `object`):

Proxy settings. Apify datacenter proxies are the default; the Grants.gov API needs nothing more.

## `maxRequestsPerCrawl` (type: `integer`):

Hard cap on API requests, search pages included. Defaults to 2 x Max results + 10.

## Actor input object example

```json
{
  "statuses": [
    "posted",
    "forecasted"
  ],
  "includeDetails": true,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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",
        "forecasted"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("openrows/us-federal-grants").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",
        "forecasted",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("openrows/us-federal-grants").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",
    "forecasted"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call openrows/us-federal-grants --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,openrows/us-federal-grants"
        }
    }
}
```

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/fEVMC8jcp9txSX9mg/builds/zpBgtMcpz9T2G4ZRY/openapi.json
