# Bdns Spain National Grants Subsidy Awards Scraper (`jungle_synthesizer/bdns-spain-national-grants-subsidy-awards-scraper`) Actor

The single largest untapped company-money dataset found in this sweep. Five competitors validate that

- **URL**: https://apify.com/jungle\_synthesizer/bdns-spain-national-grants-subsidy-awards-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Business, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 record scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## BDNS Spain National Grants & Subsidy Awards Scraper

Extract Spain's national public subsidy and grant **award** data from BDNS (Base de Datos Nacional de Subvenciones) — every public grant, subsidy, and aid payment issued to a named beneficiary since national tracking began, not just the call/announcement listing that most BDNS tools stop at. Each record carries the beneficiary's tax ID, the euro amount, the granting body, and a flag for EU Next Generation / MRR recovery-fund financing.

### Features

- Millions of award records — the beneficiary-level half of BDNS that most tools skip in favor of the much smaller call index
- Beneficiary tax ID (NIF/CIF) parsed out of the raw name field into a clean tax ID + legal/personal name, alongside the untouched original value
- Distinguishes legal entities (`juridica`) from natural persons (`persona fisica`) — individuals are privacy-masked by BDNS, and this is preserved rather than discarded
- Each award enriched with its parent call's metadata: title, granting body, granting region, administrative level, and an EU Next Generation / MRR recovery-fund flag
- Incremental by default — only awards added since your last run; full historical backfill available on demand
- Pay-per-record pricing

### Who Uses Spanish Subsidy Award Data and Why?

- **State-aid compliance teams** — verify what public aid a company has already received before approving new aid
- **EU Next Generation / MRR auditors** — isolate recovery-fund awards for compliance reporting
- **B2B lead generation and sales intelligence** — build lists of companies that just received public subsidy money
- **Competitor intelligence** — track public funding flowing to competitors by sector, region, or granting body
- **Economic and policy researchers** — analyze Spanish public spending patterns by administrative level, region, and beneficiary type

### How It Works

1. `maxItems` controls how many award records the run returns.
2. By default, a run returns only awards added since your previous successful run (or the last 30 days, on a first-ever run).
3. Set `full_backfill` to `true` to pull the entire historical archive in one run — this is a long job; run it as a dedicated one-off rather than on your regular schedule.
4. Each record includes the award amount, grant date, granting body/region/administrative level, beneficiary name and tax ID, the parent call's title and recovery-fund status, and more.

### Input

#### Basic: recent awards

```json
{
  "maxItems": 100
}
```

#### Full historical backfill

```json
{
  "maxItems": 1000000,
  "full_backfill": true
}
```

#### Resume incrementally from a specific date

```json
{
  "maxItems": 500,
  "since_date": "2026-01-01"
}
```

#### Input Parameters

| Field           | Type    | Default | Description                                                                                 |
|-----------------|---------|---------|---------------------------------------------------------------------------------------------|
| `maxItems`      | integer | 10      | Maximum number of award records to return.                                                  |
| `full_backfill` | boolean | false   | Pull the entire historical award archive instead of only awards added since the last run.   |
| `since_date`    | string  | —       | Override the incremental start date (`YYYY-MM-DD`). Ignored when `full_backfill` is `true`. |

### Output Fields

| Field                                                 | Description |
|-------------------------------------------------------|----------------------------------------------------------------------------------|
| `award_id`                                            | Internal award record id. |
| `award_code`                                          | Public award code. |
| `award_date`                                          | Date the award was granted. |
| `beneficiary_tax_id`                                  | Beneficiary's tax ID — a real CIF/NIF for a legal entity, or a masked token for a natural person. |
| `beneficiary_name`                                    | Beneficiary's legal or personal name. |
| `beneficiary_type`                                    | `juridica` (legal entity) or `persona fisica` (natural person). |
| `beneficiary_raw`                                     | The original, unparsed beneficiary field. |
| `amount_eur`                                          | Award amount in euros. |
| `equivalent_aid_eur`                                  | Gross grant equivalent aid amount in euros. |
| `instrument`                                          | Aid instrument type (subvención, préstamo, entrega dineraria, etc). |
| `call_id` / `call_number` / `call_title` / `call_url` | Identifiers and title/URL of the parent grant call. |
| `admin_level` / `granting_region` / `granting_body`   | Which government level, region, and body issued the award. |
| `has_project`                                         | Whether the award is tied to a specific funded project. |
| `is_recovery_fund`                                    | Whether the parent call is funded under the EU Next Generation / MRR program. |
| `person_id`                                           | Stable beneficiary key — the same value across every award to the same beneficiary. |
| `call_opening_date`                                   | Date the parent call was published. |

### FAQ

#### Does this include the beneficiary's name and tax ID?

Yes. Every award record includes the beneficiary's parsed tax ID (`beneficiary_tax_id`) and name (`beneficiary_name`), plus the untouched original value (`beneficiary_raw`). Legal entities carry a full CIF; individuals are privacy-masked, which is how the source data itself represents them — this actor does not unmask them.

#### What is `person_id` useful for?

`person_id` is a stable key that stays the same across every award a given beneficiary has received, so you can group and roll up all awards to one company or individual even when their name is formatted slightly differently across records.

#### How do I get every award ever issued instead of just recent ones?

Set `full_backfill` to `true`. This pages the entire historical archive rather than the incremental window used by default, so budget it as a long-running, one-off job rather than part of a frequent schedule.

#### Does this cover EU recovery-fund (Next Generation) awards?

Yes — `is_recovery_fund` flags every award whose parent call is funded under the EU Next Generation / MRR program, so you can isolate that slice directly.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

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

Maximum number of award records to scrape.

## `full_backfill` (type: `boolean`):

Fetch the entire ~29.1M-row historical award archive instead of only awards added since the last successful run. This can take a long time — schedule it as a dedicated one-off run, separate from your regular incremental schedule.

## `since_date` (type: `string`):

Manually override the incremental start date (YYYY-MM-DD). Only awards added to BDNS on or after this date are fetched. Leave blank to resume automatically from the last successful run. Ignored when Full Backfill is enabled.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 10,
  "full_backfill": false
}
```

# Actor output Schema

## `results` (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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/bdns-spain-national-grants-subsidy-awards-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/bdns-spain-national-grants-subsidy-awards-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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 10
}' |
apify call jungle_synthesizer/bdns-spain-national-grants-subsidy-awards-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/bdns-spain-national-grants-subsidy-awards-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/M35cG29Mtbo32Xctf/builds/e0pz1aXnaAEyXkQMw/openapi.json
