# NIH RePORTER Funded Biotech & Lab Research Grant Leads (`afkdigital/newapi24-nih-biotech-research-grants`) Actor

Official NIH-funded biotech and lab grant research, by fiscal year, Notice of Award, state, organization and research topics. One verified project-year per result, $0.008 per unique record; export JSON/CSV. Not contact or procurement leads.

- **URL**: https://apify.com/afkdigital/newapi24-nih-biotech-research-grants.md
- **Developed by:** [AFK Digital](https://apify.com/afkdigital) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$8.00 / 1,000 unique nih funded project-years

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

## NIH RePORTER Funded Biotech & Lab Research Grant Leads — NEWAPI24

Official NIH RePORTER v2 grant research data • JSON/CSV • institutional context only • no contact automation.

### Data & fields

The Actor calls the official NIH API v2 projects/search POST endpoint (https://api.reporter.nih.gov/v2/projects/search). It returns project_num, organization_name, org_city_state, award_amount_usd, award_notice_date, fiscal_year, principal_investigator_name, project_title, abstract_terms, source_url, observed_at, plus record_key, source_application_id, amount_scope.

NIH RePORTER covers NIH and other federal agencies. With nihOnly=true (default) the Actor only emits projects with funding confirmed from recognized NIH Institutes/Centers. Disabling it broadens this coverage to all RePORTER agencies.

Funding is for a selected award APPLICATION in a specific NIH fiscal year. The amount is NOT an aggregated multiyear total, and fiscal year does NOT necessarily match the notice date's calendar year. Researchers are attributed for scientific context ONLY, never asserted to be sales, purchasing or contact leads. PI may be null; raw full abstracts and personal addresses are never exported.

### Unique billing unit

One output per CORE PROJECT NUMBER + FISCAL YEAR, unless includeSubprojects=true, when identified subproject IDs are included as a distinct key. Multiple NIH application IDs, supplements and renewals sharing this key produce one charged result per Actor run. When duplicates exist among scanned pages the Actor selects the record with latest award_notice_date, breaking ties by highest application ID; it does not calculate multi-application or multi-year sums. source_application_id and project_num show exactly which application award was selected. Two fiscal years can legitimately create two separate paid records. Across separate Actor runs, up-to-date project-year data may appear again.

Missing/invalid award dates, amounts, project numbers, fiscal years and source links are rejected without being charged. This tool is a public research dataset, not a verified current procurement opportunity.

### Inputs

- awardNoticeFrom / awardNoticeTo: inclusive official award notice YYYY-MM-DD, optional
- fiscalYears: NIH fiscal year integers, empty for all
- researchKeywords: up to 12 OR-matched topics or phrases in title/NIH terms/abstract
- spendingCategoryIds + matchAllCategories: official NIH RCDC numeric IDs
- states: organization two-letter US state codes, empty for all
- organizationTypes: organization_type labels supported by NIH API
- minAwardUsd: minimum selected application award, default 10000
- maxResults: unique rows, default 10
- maxCostUsd: RESULT EVENT charges ceiling, default $0.08 (ten x $0.008)
- includeSubprojects: default false
- nihOnly: default true
- maxPages: default 5, maximum 30; timeoutSeconds: default 20, max 60

Sample input for two topics, two states:

```
{
  "fiscalYears": [2025],
  "researchKeywords": ["genomics", "cell culture"],
  "states": ["CA", "MA"],
  "awardNoticeFrom": "2024-10-01",
  "awardNoticeTo": "2025-12-31",
  "minAwardUsd": 20000,
  "maxResults": 100,
  "maxCostUsd": 0.8
}
```

Default input targets small 2025–2026 genomics NIH awards in CA/MA and finishes under five minutes when NIH is responsive. No email or messaging functionality.

### JSON / CSV for Clay and n8n

Use the Apify default Dataset ID from a run. The output is flat, ready to import via Clay or n8n Apify/HTTP Request nodes. For JSON request:

https://api.apify.com/v2/datasets/DATASET_ID/items?format=json\&clean=1

For CSV request:

https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv\&clean=1

Authenticate via your own Apify connection. No credentials must appear in URLs or logs. RUN_SUMMARY in default KV store provides pages, scanned items, deduplication, charges estimate and timestamps.

### Pricing & operating costs

Set Apify Publishing → Monetization to Pay Per Event. Define the primary custom event project-year-record for $0.008 per emitted row. Disable / avoid pricing a second apify-default-dataset-item event, which would double-bill rows. Optional automatic apify-actor-start event can add $0.00005 per run beyond the maxCostUsd **result event** input cap; Apify's platform max total charge is separately enforced by the SDK.

The SDK calls Actor.pushData(row, 'project-year-record') once per unique row to save/bill, checking charge cap status and ending gracefully. Test and publish using actual Apify infrastructure to verify cost and price; PPE profit from paying users is 80% of event revenue minus usage charges, per Apify pricing documents.

Rate-limited NIH POSTs: at least 1.05 seconds apart, at most 500 items per page, offset at most 14999, timeouts, 429/5xx Retry-After and exponential backoff with at most two retries. No proxies, aggressive crawling or unsolicited outreach.

Local development (Node 22+): npm ci, npm test, npm start. Billing test: ACTOR_TEST_PAY_PER_EVENT=true npm start. Local test charges show SDK synthetic test prices, not the production price.

### NIH attribution

Source: https://api.reporter.nih.gov/ . NIH data is public, updated and sometimes revised, including past years. Check NIH project detail links before any important claim. Independent Actor, not NIH-endorsed.

# Actor input Schema

## `awardNoticeFrom` (type: `string`):

Award Notice (NoA) issue date, YYYY-MM-DD. Leave empty for no lower bound.

## `awardNoticeTo` (type: `string`):

Award Notice issue date, YYYY-MM-DD. Leave empty for no upper bound.

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

NIH fiscal years; empty for all. Years are separate billable project-year records.

## `researchKeywords` (type: `array`):

OR matching in NIH project titles, terms and abstracts. Add phrases such as genomics, biomarker, cell culture, proteomics.

## `spendingCategoryIds` (type: `array`):

Optional NIH RCDC spending-category integer IDs, not free-text names. Empty disables this filter.

## `matchAllCategories` (type: `boolean`):

All specified spending category IDs must match. Off = any.

## `states` (type: `array`):

Two-letter USPS state codes. Empty = all states.

## `organizationTypes` (type: `array`):

Optional organization_type criterion using the NIH API's official type labels; empty = any.

## `minAwardUsd` (type: `number`):

Minimum award_amount for an NIH application in the selected fiscal year, not a multi-year project total.

## `maxResults` (type: `integer`):

Only one charged row per core project number, FY and optional subproject. 1–15000.

## `maxCostUsd` (type: `number`):

Hard result event ceiling, $0.008 per output. Excludes an optional automatic $0.00005 Apify start event.

## `includeSubprojects` (type: `boolean`):

Off (recommended): exclude subprojects. On: separate subproject IDs under each parent project and fiscal year.

## `nihOnly` (type: `boolean`):

On: require a confirmed NIH institute/center funding record; exclude other federal agency-only grants.

## `maxPages` (type: `integer`):

Safety cap: max 30 pages, ≤500 records per page, ≥1 sec between requests.

## `timeoutSeconds` (type: `integer`):

Bounded timeout for each POST; 2 retries on 429/5xx/timeouts.

## Actor input object example

```json
{
  "fiscalYears": [
    2025,
    2026
  ],
  "researchKeywords": [
    "genomics"
  ],
  "spendingCategoryIds": [],
  "states": [
    "CA",
    "MA"
  ],
  "organizationTypes": [],
  "minAwardUsd": 10000,
  "maxResults": 10,
  "maxCostUsd": 0.08,
  "nihOnly": true,
  "maxPages": 5,
  "timeoutSeconds": 20
}
```

# 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 = {
    "fiscalYears": [
        2025,
        2026
    ],
    "researchKeywords": [
        "genomics"
    ],
    "spendingCategoryIds": [],
    "matchAllCategories": false,
    "states": [
        "CA",
        "MA"
    ],
    "organizationTypes": [],
    "minAwardUsd": 10000,
    "maxResults": 10,
    "maxCostUsd": 0.08,
    "includeSubprojects": false,
    "nihOnly": true,
    "maxPages": 5,
    "timeoutSeconds": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("afkdigital/newapi24-nih-biotech-research-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 = {
    "fiscalYears": [
        2025,
        2026,
    ],
    "researchKeywords": ["genomics"],
    "spendingCategoryIds": [],
    "matchAllCategories": False,
    "states": [
        "CA",
        "MA",
    ],
    "organizationTypes": [],
    "minAwardUsd": 10000,
    "maxResults": 10,
    "maxCostUsd": 0.08,
    "includeSubprojects": False,
    "nihOnly": True,
    "maxPages": 5,
    "timeoutSeconds": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("afkdigital/newapi24-nih-biotech-research-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 '{
  "fiscalYears": [
    2025,
    2026
  ],
  "researchKeywords": [
    "genomics"
  ],
  "spendingCategoryIds": [],
  "matchAllCategories": false,
  "states": [
    "CA",
    "MA"
  ],
  "organizationTypes": [],
  "minAwardUsd": 10000,
  "maxResults": 10,
  "maxCostUsd": 0.08,
  "includeSubprojects": false,
  "nihOnly": true,
  "maxPages": 5,
  "timeoutSeconds": 20
}' |
apify call afkdigital/newapi24-nih-biotech-research-grants --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,afkdigital/newapi24-nih-biotech-research-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/2eYWl9XtacIfbij6F/builds/xXXWAHQQKgG2QJsfj/openapi.json
