# Nih Reporter Grants Scraper (`bigibyte/nih-reporter-grants-scraper`) Actor

Search and collect funded NIH research grants, principal investigators, and organization details by topic and fiscal year. Export clean project records to JSON, CSV, or Excel effortlessly.

- **URL**: https://apify.com/bigibyte/nih-reporter-grants-scraper.md
- **Developed by:** [BigiByte](https://apify.com/bigibyte) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

![NIH RePORTER Scraper for Grants and Principal Investigators](https://images.bigibyte.com/cdn-cgi/image/width=800,quality=80,format=auto/apify-actors-covers/nih-reporter-scraper-cover.png)

## NIH RePORTER Scraper for Grants and Principal Investigators

An efficient grant search tool designed to extract funded research projects, principal investigators, and award details seamlessly. The output can be exported to JSON, CSV, or Excel for easy analysis.

### Use cases

- **Grant prospecting**: Search funded projects for specific topics like diabetes and keep track of award amounts alongside organizations.
- **PI lists**: Collect contact investigators and profile IDs quickly.
- **State filters**: Limit searches to specific organization state codes such as AL or WA.
- **Fiscal year cuts**: Pull data for a single year or multiple years without manual paging.
- **Scheduled refresh**: Run recurring searches to track updates whenever project lists change.
- **Research desks**: Gather capped samples of public awards for literature or funding scans.

### What data does this scraper extract?

Each run saves structured information per funded project, including nested organization and investigator details.

| Field | Type | Description |
| --- | --- | --- |
| `appl_id` | integer | Application ID |
| `fiscal_year` | integer | Fiscal year of the award |
| `organization` | object | Performing organization, including name, city, state, and identifiers |
| `award_amount` | integer | Award amount in US dollars |
| `principal_investigators` | array | Investigators associated with the project |
| `project_title` | string | Project title |
| `scrapedAt` | string | UTC timestamp when the row was saved |
| `error` | string | Recorded only if a request encounters an issue |

#### Output example

```json
{
  "appl_id": 10996093,
  "fiscal_year": 2025,
  "organization": {
    "org_name": "UNIVERSITY OF ALABAMA AT BIRMINGHAM",
    "org_city": "BIRMINGHAM",
    "org_country": "UNITED STATES",
    "org_state": "AL",
    "dept_type": "INTERNAL MEDICINE/MEDICINE",
    "primary_duns": "063690705",
    "primary_uei": "YND4PLMC9AN7",
    "org_fips": "US"
  },
  "award_amount": 160324,
  "principal_investigators": [
    {
      "profile_id": 12435328,
      "first_name": "Caroline",
      "middle_name": "A",
      "last_name": "Presley",
      "is_contact_pi": true,
      "full_name": "Caroline A Presley",
      "title": "ASSISTANT PROFESSOR"
    }
  ],
  "project_title": "Mindfulness-Based Diabetes Education for adults with elevated diabetes distress",
  "scrapedAt": "2026-10-12T00:00:00+00:00"
}

```

### Input parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `searchText` | string | `diabetes` | Keywords matched across project fields |
| `fiscalYears` | array | `[2025]` | List of fiscal years to include |
| `orgStates` | string list | empty | Organization state codes, one per line |
| `maxItems` | integer | `100` | Maximum number of rows to collect per run |
| `timeoutSecs` | integer | `300` | Maximum run duration in seconds |

***

### Related Tools

If you plan to map or join these rows, a geocoding pass or a quick CSV cleanup are the usual next steps. BigiByte also builds scrapers for other open-data portals when you need them as a separate job.

Need another city's open data, a scheduled monitor, or a custom pipeline? BigiByte builds custom scrapers and APIs: <https://bigibyte.com>

***

### Is web scraping legal?

Web scraping publicly available directories and registries is generally permissible, provided you adhere to standard ethical guidelines and data privacy regulations. Here are a few important considerations:

- **Personal Data:** If your extracted dataset includes personal details (such as names or professional profiles), ensure compliance with relevant regional privacy frameworks like GDPR or CCPA. Collect and store personal data strictly when you have a legitimate, transparent purpose.
- **Copyright & Content:** Do not republish or redistribute protected textual content or proprietary assets without proper authorization.
- **Usage Conduct:** Respect recommended pacing and rate guidelines to ensure smooth, uninterrupted operations.
- **Legal Disclaimer:** This guidance is for informational purposes and does not constitute formal legal advice. When in doubt regarding specific compliance requirements, consult a qualified legal professional.

To learn more, read Apify's guide: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

# Actor input Schema

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

What to collect. Projects returns one row per NIH RePORTER funded project.

## `searchText` (type: `string`):

Text matched across project fields with an AND search. Example: diabetes.

## `fiscalYears` (type: `array`):

NIH fiscal years to include, as a JSON array of integers. Example: \[2025]. An empty array drops the year filter.

## `orgStates` (type: `array`):

Optional two-letter US state codes for the performing organization, one per line, such as AL or WA. Leave empty to search every state.

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

Maximum rows to save in one run, including error rows. Hard cap is 1000.

## `timeoutSecs` (type: `integer`):

Stop starting new requests after this many seconds.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for a single NIH RePORTER response.

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

Optional proxy. Leave Apify Proxy off. The public projects search does not need a proxy, and a proxy must not be used to get around NIH RePORTER rate limits.

## Actor input object example

```json
{
  "mode": "projects",
  "searchText": "diabetes",
  "fiscalYears": [
    2025
  ],
  "orgStates": [],
  "maxItems": 100,
  "timeoutSecs": 300,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `datasetUrl` (type: `string`):

Default dataset for this run, with one row per funded project or error.

## `overviewUrl` (type: `string`):

Table of application id, fiscal year, organization, award amount, investigators, and project title.

# 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 = {
    "mode": "projects",
    "searchText": "diabetes",
    "fiscalYears": [
        2025
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("bigibyte/nih-reporter-grants-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 = {
    "mode": "projects",
    "searchText": "diabetes",
    "fiscalYears": [2025],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("bigibyte/nih-reporter-grants-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 '{
  "mode": "projects",
  "searchText": "diabetes",
  "fiscalYears": [
    2025
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call bigibyte/nih-reporter-grants-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bigibyte/nih-reporter-grants-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/jgfGPIUCxrfxXmKMo/builds/iv7KoLYRbbWpTbO7i/openapi.json
