# Grants & Funding Monitor (`codepal/grants-funding-monitor`) Actor

Find open grants and calls for proposals from Grants.gov, the EU Funding & Tenders Portal and any funder website or RSS feed. Deadlines, amounts, eligibility, country fit, relevance to your organisation, new-call alerts and a deadline calendar.

- **URL**: https://apify.com/codepal/grants-funding-monitor.md
- **Developed by:** [Jared Keanche](https://apify.com/codepal) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 funding 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

## Grants & Funding Monitor

**Find every open grant and call for proposals that fits your organisation, with deadlines, amounts and eligibility in one table, and get alerted when new calls appear.**

Built for NGOs, startups, universities, consultants and grant writers, especially in Africa. Grant hunting usually means checking a dozen portals and foundation websites every week. This Actor does it in one run.

### Sources

| Source | How | What you get |
|---|---|---|
| **Grants.gov** (US federal) | Official API | Posted and forecast opportunities, award floor/ceiling, total funding, number of awards, cost sharing, applicant types, eligibility text, agency contact |
| **EU Funding & Tenders Portal** | Official portal search API | Horizon Europe (incl. ERC, MSCA, EIC), LIFE, Erasmus+, Creative Europe, Digital Europe, CEF, EU4Health, CERV and cascade funding: budget, min/max EU contribution, expected grants, all deadlines/stages, eligibility conditions |
| **Any funder website** | Paste the opportunities page | Foundations, development agencies, embassies, African funds, corporate programmes. Listing pages are parsed, "Next" pages followed, and each call's own page is opened for deadline, amount, eligibility, guidelines PDFs and the apply link |
| **Any RSS/Atom feed** | Paste the feed URL | Aggregators and funder news feeds |

### What each opportunity includes

- `title`, `funder`, `programme`, `call_identifier`, `url`, `apply_url`, `documents`
- `status`: open, closing_soon, forthcoming, rolling, unknown (closed calls are dropped by default)
- `opens_at`, `deadline`, `days_to_deadline`, `additional_deadlines` (multi-stage calls), `deadline_note`
- `amount_min`, `amount_max`, `total_budget`, `currency`, `amount_display`, `expected_awards`, `cost_sharing`
- `applicant_types` (nonprofit, business, university-research, government, individual, international-org), `eligibility_text`, `eligible_countries_text`
- `country_eligibility` for your country: `eligible_mentioned`, `region_mentioned` (e.g. "Sub-Saharan Africa"), `global` (e.g. "low- and middle-income countries", "foreign organizations"), `restricted_elsewhere` ("U.S. entities only", "EU Member States only") or `unknown`
- `themes` (climate, energy, agriculture, health, education, research, tech, SMEs, gender, youth, governance, WASH, arts, humanitarian, infrastructure), `funding_type` (grant, cooperative agreement, fellowship, prize, loan, equity)
- `relevance_score` and `matched_profile_words`, scored against your organisation description
- `is_new`, `changed_since_last_run`, `previous_deadline`, `previous_status`, `also_listed_at` (same call found on several sources)
- `extraction_method` and `confidence`: official API rows are 1.0; website rows are scored heuristically

### Outputs

- **Dataset**: views *Opportunities* and *Eligibility & money*. Export to Excel, CSV or JSON, or send to Google Sheets.
- **DIGEST**: email-ready HTML with new calls and deadlines in the next 14 days.
- **DEADLINES**: `.ics` calendar with every deadline and a reminder 7 days before. Import it into Google Calendar or Outlook.
- **OUTPUT**: counts by source, theme and status, what each filter removed, warnings and errors.

### Quick starts

**NGO in Kenya looking for climate funding**

```json
{ "searchTerms": ["climate adaptation", "resilience"], "eligibleCountry": "Kenya", "applicantTypes": ["nonprofit"],
  "organizationProfile": "Kenyan NGO supporting smallholder farmers and women with climate-smart agriculture and water", "sortBy": "relevance" }
```

**Weekly alert to Slack, including foundation pages**

```json
{ "searchTerms": ["digital health"], "startUrls": [{ "url": "https://www.example-foundation.org/grants" }, { "url": "https://www.example-news.org/funding/feed/" }],
  "onlyNew": true, "monitorName": "digital-health", "webhookUrl": "https://hooks.slack.com/services/…" }
```

Then schedule it weekly in Apify (Schedules). The first run builds the baseline. Later runs alert only on new or changed calls, including extended deadlines.

### Tips

- Search terms go to the official APIs; "Must contain any of" filters everything, including website rows.
- "Your country" with the default mode only removes calls that clearly exclude you. Choose "mentioned-only" for a stricter list.
- Amount filters use each call's own currency (USD, EUR, KES…). Calls without a stated amount are kept.
- Website extraction is heuristic: check `confidence` and the call page before applying. Increase "Call pages to open" for richer rows.

### Limits

- Grants.gov and EU data come from their public APIs and can change format without notice. The run reports a failing source and continues with the others.
- Eligibility tags come from text analysis and are a triage aid, not legal advice. Always read the official call documents.
- Only public pages are read. Nothing requires a login.

### Pricing

$0.002 per opportunity saved ($2 per 1,000). Duplicates, filtered-out calls and unchanged calls in "Only new or changed" mode are free. See PRICING.md.

# Actor input Schema

## `builtInSources` (type: `array`):

Official databases searched through their APIs. Grants.gov lists US federal grants (many are open to foreign organisations); the EU portal covers Horizon Europe, LIFE, Erasmus+, Creative Europe, Digital Europe, EU4Health, cascade funding and more.

## `searchTerms` (type: `array`):

Searched in the built-in sources, e.g. 'climate adaptation', 'malaria', 'digital skills'. Leave empty to get all open calls (capped by 'Max results per source').

## `startUrls` (type: `array`):

Grant or opportunity pages of foundations, development agencies, embassies and African funds, or any RSS/Atom feed of calls. A Grants.gov or EU portal search URL also works (its keywords are used). Optional label: userData {"funder": "Name"}.

## `maxResultsPerSource` (type: `integer`):

How many calls to read from each built-in source.

## `keywords` (type: `array`):

Keep only opportunities whose title, description, eligibility or funder contains at least one of these words.

## `excludeKeywords` (type: `array`):

Drop opportunities mentioning any of these words.

## `themes` (type: `array`):

Keep only these themes (detected from the text).

## `applicantTypes` (type: `array`):

Keep calls open to these applicant types. Calls that don't state applicant types are kept.

## `fundingTypes` (type: `array`):

Keep only these types.

## `eligibleCountry` (type: `string`):

e.g. Kenya. Each call gets a 'country_eligibility' tag (eligible_mentioned, region_mentioned, global, restricted_elsewhere, unknown).

## `countryMode` (type: `string`):

How to use your country.

## `minAmount` (type: `integer`):

Drop calls whose maximum award (or total budget) is below this, in the call's own currency. Calls without an amount are kept.

## `onlyOpen` (type: `boolean`):

Drop calls whose deadline has passed.

## `includeForthcoming` (type: `boolean`):

Include calls announced but not yet open (Grants.gov forecasts, EU forthcoming topics), so you can prepare early.

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

Only calls with a deadline in the next N days. 0 = no limit.

## `minDaysToDeadline` (type: `integer`):

Drop calls closing sooner than this. 0 = no limit.

## `organizationProfile` (type: `string`):

A few sentences about what you do, where and for whom. Each call gets a 'relevance_score' (0–100) and the matched words.

## `sortBy` (type: `string`):

Order of results.

## `onlyNew` (type: `boolean`):

For scheduled monitoring: output only calls that are new or whose deadline, amount or status changed.

## `monitorName` (type: `string`):

Runs with the same name share memory of what was already seen.

## `webhookUrl` (type: `string`):

Receives new/updated calls after each run (except the first). Works with Slack, Teams, Discord, Zapier, Make, n8n.

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

Upper limit on opportunities saved (and charged) per run.

## `maxPagesPerSite` (type: `integer`):

Follows 'Next' links on funder pages up to this many pages.

## `maxDetailPages` (type: `integer`):

Funder sites usually show amount and eligibility only on each call's own page. Total call pages to open per run.

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

Used for funder websites only (the official APIs don't need it).

## Actor input object example

```json
{
  "builtInSources": [
    "grants-gov",
    "eu-funding-tenders"
  ],
  "searchTerms": [
    "climate"
  ],
  "maxResultsPerSource": 300,
  "eligibleCountry": "Kenya",
  "countryMode": "exclude-restricted",
  "minAmount": 0,
  "onlyOpen": true,
  "includeForthcoming": true,
  "closingWithinDays": 0,
  "minDaysToDeadline": 0,
  "sortBy": "deadline",
  "onlyNew": false,
  "monitorName": "default",
  "maxResults": 1000,
  "maxPagesPerSite": 2,
  "maxDetailPages": 40,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per grant or call for proposals.

## `digest` (type: `string`):

New calls and deadlines within 14 days.

## `calendar` (type: `string`):

Import or subscribe in Google Calendar / Outlook. Includes a reminder 7 days before each deadline.

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

Counts by source, theme and status, filters applied, warnings and errors.

# 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 = {
    "searchTerms": [
        "climate"
    ],
    "eligibleCountry": "Kenya"
};

// Run the Actor and wait for it to finish
const run = await client.actor("codepal/grants-funding-monitor").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 = {
    "searchTerms": ["climate"],
    "eligibleCountry": "Kenya",
}

# Run the Actor and wait for it to finish
run = client.actor("codepal/grants-funding-monitor").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 '{
  "searchTerms": [
    "climate"
  ],
  "eligibleCountry": "Kenya"
}' |
apify call codepal/grants-funding-monitor --silent --output-dataset

```

## MCP server setup

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

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/7vkViElQ2aMO3AJSt/builds/hopdVcJQ1S3biUgKZ/openapi.json
