# International Grant Monitor (France, Spain, by programme) (`chosen_loafer/grants-international`) Actor

Monitors open national/regional business grant calls from France (aides-entreprises.fr) and Spain (BDNS/infosubvenciones.es), filtered by programme, sector keyword, region, and deadline status. No personal data is collected.

- **URL**: https://apify.com/chosen_loafer/grants-international.md
- **Developed by:** [Pavel Staurouski](https://apify.com/chosen_loafer) (community)
- **Categories:** Business, Lead generation, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 grant checkeds

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

## International Grant Monitor (France, Spain, by programme)

Monitors open national and regional business grant calls from France
(aides-entreprises.fr) and Spain (BDNS / infosubvenciones.es), filtered by programme
keyword, sector keyword, region, and deadline status.

### What you get

One record per matching grant call: a country-prefixed id, title, a short programme/
purpose description, the funding body's name, a budget range in EUR where the source
states one, the application deadline (if any), who can apply, the geographic region,
and a link to apply or learn more. Nothing about named individuals.

### What it does not do

No contact-person data, no information about who has actually received a grant (Spain's
BDNS keeps that in a separate register this Actor never queries). Only open calls for
applications, not award/disbursement records. Germany and Italy are not covered: both
were investigated and dropped before any code was wired to them, because neither source
could be reached from a plain server-side request (see this Actor's own NOTES.md for the
live evidence).

### Why you might need this

Grant consultants, SME finance teams, and startups need early alerts on national and
regional grant calls, but the data is scattered across dozens of funding bodies with no
single feed to subscribe to. This Actor queries two countries' own reference databases
directly and normalises the result into one schema. A regional call like a Guadeloupe
investment grant can open and close within weeks, and once its budget pool is fully
committed there is no second chance until the next funding cycle, often a year away, so
finding out about it after the fact from a quarterly newsletter is a real missed-funding
cost, not just an inconvenience.

### Sample output record

```json
{
  "grantId": "FR-7658",
  "title": "Aide Regionale a l'Investissement et a la Creation d'Emplois (ARICE)",
  "programme": "Aide a l'investissement productif et a la creation d'emplois durables en Guadeloupe",
  "fundingBody": "Region Guadeloupe",
  "budgetMin": 25000,
  "budgetMax": 100000,
  "deadline": "2026-10-31T00:00:00.000Z",
  "eligibleApplicants": "TPE et PME immatriculees en Guadeloupe",
  "region": "GUADELOUPE",
  "applicationUrl": "http://www.regionguadeloupe.fr",
  "country": "FR"
}
```

### Input

```json
{
  "countries": ["FR", "ES"],
  "programme": "innovation",
  "region": "Guadeloupe",
  "deadlineStatus": "open",
  "maxResults": 100,
  "maxChecked": 300
}
```

`maxChecked` is a safety cap on how many candidate grants get fetched and checked
against your filters (each check is billed, whether or not it matches). It stops the run
even if `maxResults` matches haven't been found yet, e.g. for a narrow filter with few
matches.

`programme`, `sector`, and `region` are free-text keyword filters (case-insensitive
substring match), not formal classification lookups: neither shipped source exposes a
clean, structured NACE sector code on the grant record itself.

### Pricing

Pay per run started, plus per grant checked against your filters (not just per match:
checking is the real cost driver, since each candidate grant needs its own detail
request). See the Pricing tab for exact rates.

### Moniteur de subventions internationales (France, Espagne)

Surveille les appels a projets et aides publiques ouverts en France
(aides-entreprises.fr) et en Espagne (BDNS / infosubvenciones.es), filtres par mot-cle de
programme, secteur, region et statut de la date limite.

Ce que vous obtenez : un enregistrement par aide correspondante, avec un identifiant
prefixe par pays, le titre, une courte description de l'objet de l'aide, l'organisme
financeur, une fourchette de montant en EUR lorsque la source en indique une, la date
limite de depot (le cas echeant), les beneficiaires eligibles, la region, et un lien pour
candidater. Aucune donnee personnelle.

L'Allemagne et l'Italie ne sont pas couvertes : les deux sources ont ete testees et
ecartees avant tout developpement, car ni l'une ni l'autre n'etait accessible depuis une
simple requete serveur (voir le fichier NOTES.md de cet Actor pour le detail).

### Monitor internacional de subvenciones (Francia, España)

Vigila las convocatorias de ayudas publicas abiertas en Francia
(aides-entreprises.fr) y en España (BDNS / infosubvenciones.es), filtradas por palabra
clave de programa, sector, region y estado del plazo de solicitud.

Lo que obtiene: un registro por cada ayuda que coincide, con un identificador prefijado
por pais, el titulo, una breve descripcion de la finalidad, el organismo financiador, un
rango de presupuesto en EUR cuando la fuente lo indica, la fecha limite de solicitud (si
la hay), quien puede solicitarla, la region, y un enlace para solicitarla. Ningun dato
personal.

Alemania e Italia no estan cubiertas: ambas fuentes se investigaron y se descartaron
antes de escribir ningun codigo, porque ninguna de las dos era accesible desde una
peticion de servidor sencilla (ver el archivo NOTES.md de este Actor para la evidencia).

# Actor input Schema

## `countries` (type: `array`):

Which country sources to query. Supported: FR (aides-entreprises.fr), ES (BDNS / infosubvenciones.es). Germany and Italy were investigated and dropped (bot-protected / session-gated / client-JS-rendered sources, see NOTES.md); listing them here has no effect.

## `programme` (type: `string`):

Free-text match against the grant's title and programme description, e.g. "innovation" or "recherche".

## `sector` (type: `string`):

Free-text match against title, programme, and eligible-applicants text. Neither shipped source exposes a structured NACE code on the grant record, so this is a keyword match, not a formal classification lookup.

## `region` (type: `string`):

Free-text match against the grant's region field, e.g. "Guadeloupe" or "Andalucia".

## `deadlineStatus` (type: `string`):

Filter by whether the application deadline (if any) is still open.

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

Maximum number of matching grant records to push.

## `maxChecked` (type: `integer`):

Maximum number of candidate grants to fetch and check (independent of maxResults). Caps run cost when a narrow filter has a low match rate; see B6's own postmortem on an unbounded-cost run for why this exists as a separate cap.

## Actor input object example

```json
{
  "countries": [
    "FR",
    "ES"
  ],
  "deadlineStatus": "any",
  "maxResults": 100,
  "maxChecked": 300
}
```

# Actor output Schema

## `matchedGrants` (type: `string`):

Per-grant records.

# 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 = {
    "countries": [
        "FR",
        "ES"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("chosen_loafer/grants-international").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 = { "countries": [
        "FR",
        "ES",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("chosen_loafer/grants-international").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 '{
  "countries": [
    "FR",
    "ES"
  ]
}' |
apify call chosen_loafer/grants-international --silent --output-dataset

```

## MCP server setup

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

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/4mzqqXlyBCoTqeMWR/builds/VkbXUccGcqhZ6AedR/openapi.json
