# Federal Grants Feed (Grants.gov) (`thoob/grants-gov-feed`) Actor

Clean, flat US federal funding opportunities from the official Grants.gov API, joined with the full record so each row carries award ceiling, eligibility, deadline and contact. Filter by keyword, agency, category and award size, with a changes-only mode. Billed per delivered opportunity.

- **URL**: https://apify.com/thoob/grants-gov-feed.md
- **Developed by:** [Pono Data](https://apify.com/thoob) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 opportunity records

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Federal Grants Feed (Grants.gov)

Clean, flat US federal funding opportunities from the official Grants.gov API,
joined with each opportunity's full record so every row already carries the money
and the eligibility, not just a title and a link. Filter by keyword, agency,
category, eligibility and award size, and run a changes-only mode that returns
just the opportunities that moved since your last run.

You pay only for a delivered opportunity. Filtered-out rows, unchanged rows in
changes mode, and malformed records cost nothing. There is no start fee.

### No API key needed, by anyone

Grants.gov is a public, keyless, documented federal API. There is no key to
create and none is stored, by you or by this actor.

### The join is the product

The Grants.gov search returns a thin hit: id, number, title, agency, dates. The
things a buyer needs, the award ceiling and floor, the estimated funding, who can
apply, the deadline and the agency contact, live only on a second per-opportunity
call. This actor makes that call for every opportunity and hands you one flat row.

### What a record is

- identity: `opportunityId`, `opportunityNumber`, `title`
- agency: `agency`, `agencyCode`, `category`
- timeline: `postedDate`, `closeDate`, `archiveDate`, `lastUpdatedDate`, `status`
- money: `awardCeiling`, `awardFloor`, `estimatedFunding`, `expectedAwards`,
  `costSharingRequired`
- who can apply: `applicantTypes`, `eligibilityDesc`
- what it funds: `fundingInstruments`, `fundingCategories`, `cfdaNumbers`,
  `description`
- contact: `contactName`, `contactEmail`, `contactPhone`
- provenance: `sourceUrl`, `retrievedAt`, `confidence`, `jurisdiction`,
  `dataSource`, and in changes mode `changeType`

Every value appears verbatim in the Grants.gov record, and `sourceUrl` is that
opportunity's own public page. Dates are normalised to ISO. Description and
eligibility text arrive as HTML and are converted to plain text without
reordering or summarising. A missing amount is reported as null, never as zero,
because zero is a different and real answer. Nothing is guessed.

An opportunity whose detail call fails is still delivered, carrying its search
fields and `isEnriched: false`, rather than being silently dropped.

### Two modes

- **full**: every opportunity matching your filter.
- **changes**: only opportunities that are new to you, or whose status, deadline,
  archive date or funding amounts have moved since this account's last run. The
  state is tracked per account, so it is your timeline. The first changes run has
  no baseline, so it returns everything matching once, then tracks deltas.

### Filters

- **keyword**, **agencies**, **fundingCategories**, **eligibilities**: passed
  through to the Grants.gov search.
- **statuses**: posted (open now), forecasted (announced, not yet open), closed,
  archived. Defaults to posted.
- **minAward**: keep only opportunities whose ceiling, or estimated funding when
  no ceiling is stated, is at least this much.
- **closingWithinDays**: keep only deadlines between today and N days out.
- **requireFundingAmount**: drop opportunities that state no money at all. Many
  forecasts do not.
- **includeDetail**: on by default. Turn it off for a fast list of titles and
  deadlines with no money or eligibility.
- **maxRecords**: cap on delivered and billed rows. Defaults to 100, because each
  row costs one extra request to Grants.gov and there are only around 1,200
  posted opportunities at a time. Set 0 for no cap.

### What to expect

- Around 1,200 posted and 500 forecasted opportunities at any time, with roughly
  8,600 closed and 72,000 archived reachable through `statuses`.
- The actor calls Grants.gov politely, with a declared identifying User-Agent and
  a jittered pause between requests, so a large pull is a matter of time. A run
  that reaches its time limit stops cleanly, delivers what it fetched, and in
  changes mode picks up from there next run.
- The raw API is public and free directly from Grants.gov. What this actor sells
  is the join with the detail record, the money and eligibility extraction, the
  filtering the API cannot express, and the per-account change feed.

### Source and scope

What this collects: public US federal funding opportunity notices.
Source: the official Grants.gov REST API (`api.grants.gov`), accessed over its
documented endpoints with a declared identifying User-Agent. `robots.txt` is
`Allow: /`. No scraping, no key, no access bypass.
Scope: US federal opportunities. Every row is stamped `jurisdiction=US`.
Billing: charged only on a delivered opportunity; rejects are free; no start fee.
Provenance: every row carries its Grants.gov source URL and retrieval time.

These are public government notices. This is a data tool, not grant-writing or
legal advice, and an opportunity notice is a public filing rather than an
assessment of whether you qualify.

### See also

More clean, pay-only-for-results data tools from Pono Data:

- [Federal Contract Opportunities Feed](https://apify.com/thoob/sam-opportunities-feed) - US federal contract opportunities from SAM.gov
- [Federal Spending Feed](https://apify.com/thoob/federal-spending-feed) - US federal awards from USAspending.gov

Full catalog: https://apify.com/thoob

# Actor input Schema

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

Optional. Free-text search across the opportunity. Leave empty to get everything matching your other filters.

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

Which statuses to include: posted (open now), forecasted (announced, not yet open), closed, archived. Defaults to posted.

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

Optional. Grants.gov agency codes, for example HHS-NIH, DOE, USDA-NIFA. Leave empty for all agencies.

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

Optional. Grants.gov category codes, for example HL for health, ED for education, ST for science and technology, ENV for environment.

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

Optional. Grants.gov eligibility codes, for example 25 for others, 12 for small businesses, 06 for public and state institutions of higher education.

## `includeDetail` (type: `boolean`):

Fetch each opportunity's full record so the row carries award ceiling and floor, estimated funding, eligibility text, description and agency contact. This is one extra request per opportunity and is what makes a row useful. Turn it off for a fast list of titles and deadlines only.

## `minAward` (type: `integer`):

Optional. Keep only opportunities whose award ceiling, or estimated funding when no ceiling is stated, is at least this much. Requires the full record.

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

Optional. Keep only opportunities whose deadline falls between today and N days from now. Opportunities with no stated deadline are dropped by this filter.

## `requireFundingAmount` (type: `boolean`):

Drop opportunities that state neither an award ceiling nor an estimated total. Many forecasts do not.

## `mode` (type: `string`):

full returns every matching opportunity. changes returns only opportunities that are new to you or whose status, deadline, archive date or funding amounts have moved since your last run.

## `maxRecords` (type: `integer`):

Cap on how many opportunities a run delivers and bills. Defaults to 100, because each delivered row costs one extra request to Grants.gov and there are only around 1,200 posted opportunities at a time. Set 0 for no cap. In changes mode nothing is lost to the cap; the rest arrives on a later run and is never billed twice.

## Actor input object example

```json
{
  "keyword": "broadband",
  "statuses": [
    "posted"
  ],
  "includeDetail": true,
  "requireFundingAmount": false,
  "mode": "full",
  "maxRecords": 100
}
```

# Actor output Schema

## `opportunities` (type: `string`):

One row per federal funding opportunity matching your filter.

# 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 = {
    "keyword": "broadband"
};

// Run the Actor and wait for it to finish
const run = await client.actor("thoob/grants-gov-feed").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 = { "keyword": "broadband" }

# Run the Actor and wait for it to finish
run = client.actor("thoob/grants-gov-feed").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 '{
  "keyword": "broadband"
}' |
apify call thoob/grants-gov-feed --silent --output-dataset

```

## MCP server setup

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

```

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/rkADnnvshsDZDFj9p/builds/PN4lzq69e5BcBRcDC/openapi.json
