# US Grant Opportunities Scraper | Grants.gov Research (`springlike_meadowland/us-grant-opportunities-scraper`) Actor

Search Grants.gov funding opportunities by keyword, agency, status and posting date. Export stable IDs, deadlines when published, award ranges, eligibility excerpts and source links to a clean table.

- **URL**: https://apify.com/springlike\_meadowland/us-grant-opportunities-scraper.md
- **Developed by:** [Akshay Aggarwal](https://apify.com/springlike_meadowland) (community)
- **Categories:** Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 saved 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 Grant Opportunities Scraper

Find federal funding opportunities on Grants.gov and export a research-ready table with stable IDs, agency names, posting and close dates, award ranges, eligibility categories, synopsis text, funding instruments, and links back to each public notice. Use it to build grant watchlists, compare programs, or review a focused agency and topic.

### Quick start

```json
{
  "keyword": "health",
  "agencies": ["HHS"],
  "status": "posted",
  "maxOpportunities": 10
}
```

The default sample saves up to 10 opportunities. Set `dateFrom` and `dateTo` as `YYYY-MM-DD` to filter by **posting date**. Set `maxOpportunities` up to 1,000 for broader research. Agency filters accept up to five Grants.gov agency codes; a parent code such as `HHS` also matches its subagencies. Agency and date filters are applied while scanning search results, so broad searches can reach the page limit before all matches are found. Status choices are `posted`, `forecasted`, `closed`, `archived`, or `all`.

#### Public record preview

A [Grants.gov opportunity](https://www.grants.gov/search-results-detail/362925) shows the kind of information available for extraction:

```json
{
  "opportunity_id": "362925",
  "number": "DHS-26-GPD-008-00-99",
  "title": "Fiscal Year 2026 Nonprofit Security Grant Program",
  "agency": "Department of Homeland Security - FEMA",
  "posted_date": "2026-06-24",
  "close_date": "2026-07-24",
  "award_floor": null,
  "award_ceiling": 300000000.0,
  "currency": "USD",
  "funding_instrument": "Grant",
  "opportunity_url": "https://www.grants.gov/search-results-detail/362925"
}
```

This is a preview of a public source record, not a promise that a particular search will return that record. Actual rows include the full field set below. Opportunity status and available fields can change as agencies update notices.

### Result fields

Each dataset row has `opportunity_id`, `number`, `title`, `agency`, `status`, `posted_date`, `close_date`, `award_floor`, `award_ceiling`, `currency`, `eligibility_excerpt`, `description`, `funding_instrument`, `opportunity_url`, and `source_url`. IDs are Grants.gov IDs. Unknown dates and amounts are `null`; no deadline, award, or eligibility determination is inferred. Eligibility is a source excerpt, not an assessment of whether you qualify. Descriptions are public synopsis text; attachments and private application materials are outside the scope.

The Actor reads Grants.gov's public opportunity search and detail APIs. The output reflects the source at run time. Follow the opportunity URL to review the latest notice, application requirements, and amendments before making decisions.

### Coverage, limits and billing

The Actor requests up to 100 search results per page and scans at most 40 pages per run. Date bounds are applied to returned posting dates; a narrow date range among a large result set may reach that scan limit before all matches are found. Search `all` can also be broad. The `OUTPUT` summary reports search hits inspected, rows saved, skipped records, pages scanned, errors, and the reason a run stopped. Check it when planning a larger search. If source requests fail or a spending limit is reached, already saved rows remain available and OUTPUT marks the run partial.

The billing unit is one opportunity row successfully saved to the dataset. Duplicate, skipped, error, and summary records are not paid result rows. Check the Actor's current price and your run budget in Apify before starting a larger search.

# Actor input Schema

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

Optional search phrase matched by Grants.gov. Leave blank to browse the selected opportunity status; up to 160 characters.

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

Optional list of up to five Grants.gov agency codes, such as HHS or NSF. Parent codes include subagencies; filtering occurs during a bounded search scan.

## `status` (type: `string`):

Select the Grants.gov status to search. Posted means currently announced opportunities; All scans forecasted, posted, closed and archived records.

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

Optional YYYY-MM-DD posting-date lower bound. Records without a documented posting date are excluded when this filter is set.

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

Optional YYYY-MM-DD posting-date upper bound. This filters the opportunity posting date, not the application close date.

## `maxOpportunities` (type: `integer`):

Save up to 1,000 distinct opportunity rows. The default 10 is a small sample; check OUTPUT for the scanned hit count and any partial-coverage limit.

## Actor input object example

```json
{
  "keyword": "health",
  "agencies": [],
  "status": "posted",
  "maxOpportunities": 10
}
```

# Actor output Schema

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

Distinct public Grants.gov opportunities with source links and funding details when available.

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

Run counts, partial coverage, limits and source errors; these are separate from the paid results dataset.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("springlike_meadowland/us-grant-opportunities-scraper").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("springlike_meadowland/us-grant-opportunities-scraper").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 '{}' |
apify call springlike_meadowland/us-grant-opportunities-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,springlike_meadowland/us-grant-opportunities-scraper"
        }
    }
}
```

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/2kcDXFQXn3IKkgAiv/builds/cM8mRNFezDGdXglHK/openapi.json
