# EU Funding & Tenders Scraper (`maximedupre/eu-funding-tenders-scraper`) Actor

Scrape EU Funding & Tenders Portal grants and tenders. Export deadlines, budgets, programme details, tender CPV data, official URLs, and source keywords.

- **URL**: https://apify.com/maximedupre/eu-funding-tenders-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Business, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.60 / 1,000 scraped 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

### 🔎 EU funding tenders data for grants and procurement

EU Funding & Tenders Scraper collects public grant and tender opportunities from the official [European Commission Funding & Tenders Portal](https://ec.europa.eu/info/funding-tenders/opportunities/portal/screen/home). Use it to monitor open, forthcoming, or closed calls by topic, programme, and opportunity type, then export source-backed rows with identifiers, deadlines, budgets, programme context, tender CPV data, and official URLs.

- [EU funding tenders monitoring](https://apify.com/maximedupre/eu-funding-tenders-scraper/examples/eu-funding-tenders-monitoring) for grant offices, bid teams, researchers, and public-sector sales teams.
- [EU grants scraper](https://apify.com/maximedupre/eu-funding-tenders-scraper/examples/eu-grants-scraper) workflows for Horizon Europe, Digital Europe, LIFE, Erasmus, and other supported programmes.
- [EU tenders scraper](https://apify.com/maximedupre/eu-funding-tenders-scraper/examples/eu-tenders-scraper) workflows for tender opportunities published on the Funding & Tenders Portal.
- [Funding deadline tracking](https://apify.com/maximedupre/eu-funding-tenders-scraper/examples/funding-deadline-tracking) with all published cut-off dates preserved in the output.
- [Grant and procurement exports](https://apify.com/maximedupre/eu-funding-tenders-scraper/examples/grant-and-procurement-exports) for spreadsheets, CRMs, dashboards, Apify API clients, schedules, and webhooks.

#### 📦 Data you can export

Each dataset item is one successful EU Funding & Tenders opportunity. Fields can be `null` or empty when the source does not publish that fact for a specific opportunity.

- `identifier`, `title`, `opportunityType`, `status`, and official `url`
- `summary` when the source provides one
- `programme` with code, name, and period
- `call` with call identifier and call title
- `openingDate`, `deadlineDate`, `allDeadlines`, and `deadlineModel`
- `budget` with amount and currency when a grant budget or tender value is published
- `keywords` from the source opportunity
- `tender` with CPV code and contracting authority for tender rows

Grant rows keep tender-only fields as `null`, so you do not get procurement fields filled with grant data.

#### ▶️ How to run it

1. Open the Input tab.
2. Enter a **Search query**, such as `digital`, `climate`, `health`, or a known topic code.
3. Choose **Opportunity type**: grants, tenders, or both.
4. Choose **Status**: open, forthcoming, closed, or all statuses.
5. Optionally add a **Programme** code such as `HORIZON`, `DIGITAL`, `LIFE`, `ERASMUS`, or a SEDIA programme ID.
6. Set **Maximum opportunities** to control output size and cost.
7. Run the Actor and open the dataset.

You can export the dataset as JSON, CSV, Excel, XML, RSS, or HTML. You can also call the Actor through the Apify API, schedule repeat monitoring, or connect finished runs to webhooks and integrations.

#### ⚙️ Input example

```json
{
  "searchQuery": "digital",
  "opportunityType": "grants",
  "status": "open",
  "programme": "HORIZON",
  "maxItems": 100
}
````

Leave **Search query** empty when you want to browse by type, status, and programme only.

#### 📄 Output example

```json
{
  "identifier": "DIGITAL-2021-SKILLS-01-SPECIALISED",
  "title": "Specialised education programmes in key capacity areas",
  "opportunityType": "grant",
  "status": "open",
  "url": "https://ec.europa.eu/info/funding-tenders/opportunities/portal/screen/opportunities/competitive-calls-cs/43977648",
  "summary": null,
  "programme": {
    "code": "DIGITAL",
    "name": "Digital Europe Programme",
    "period": "2021 - 2027"
  },
  "call": {
    "identifier": null,
    "title": "DIGITWIN4CIUE Reduction-Fees Scholarships"
  },
  "openingDate": "2025-07-11",
  "deadlineDate": "2025-10-31",
  "allDeadlines": [
    "2025-10-31T17:00:00.000+0000",
    "2026-09-15T23:00:00.000+0000"
  ],
  "deadlineModel": "multiple cut-off",
  "budget": {
    "amount": 100000,
    "currency": "EUR"
  },
  "keywords": [],
  "tender": null
}
```

#### 💳 Pricing

This Actor charges only for saved grant or tender opportunities. It does not charge an actor-start event, no-result runs, failed-query rows, zero-result rows, or status rows.

#### 🔌 Integrations

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

- Use the Apify API to pull opportunity rows into your own grant database, CRM, or procurement workflow.
- Schedule repeat runs to monitor new open or forthcoming opportunities for a topic or programme.
- Export CSV or Excel files for analysts who review deadlines, budgets, and programme context in spreadsheets.
- Connect finished runs to webhooks or downstream Apify integrations for alerts and reporting.

#### ❓ FAQ

**What is EU Funding & Tenders Portal API scraping?**

This Actor collects public opportunity data from the EU Funding & Tenders Portal and saves it as structured Apify dataset rows. It is useful when you need repeatable exports instead of manual portal searches.

**Can I scrape both EU grants and EU tenders?**

Yes. Set **Opportunity type** to grants, tenders, or both. Tender rows include tender-only fields when the source publishes them, while grant rows keep those fields empty.

**Can I track Horizon Europe or Digital Europe calls?**

Yes. Use **Programme** with codes such as `HORIZON` or `DIGITAL`. The Actor also supports other known EU programme codes listed in the input help text, and raw SEDIA programme IDs.

**Why not use the Funding & Tenders Portal API directly?**

Use the direct source path if you want to maintain your own request code, parsing, exports, retries, and scheduling. Use this Actor when you want those rows in Apify with dataset exports, API access, schedules, and integrations already wired.

**What are EU Funding & Tenders alternatives?**

For EU-wide public procurement notices, TED-focused scrapers cover a broader procurement source. For awarded research project data, CORDIS-focused scrapers cover a different source. This Actor is focused on current Funding & Tenders Portal grant and tender opportunities.

### 📝 Changelog

- 0.1: Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~eu-funding-tenders-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Other actors

- [World Bank Projects Scraper ↗](https://apify.com/maximedupre/world-bank-projects-scraper) - Export public World Bank project and indicator data for development finance research.
- [Hospital Price Transparency Scraper ↗](https://apify.com/maximedupre/hospital-price-transparency-scraper) - Collect CMS hospital profiles and public machine-readable price files.
- [US Travel Advisories Scraper ↗](https://apify.com/maximedupre/us-travel-advisories-scraper) - Monitor State Department and CDC travel risk data.
- [Pappers Sirene Scraper ↗](https://apify.com/maximedupre/pappers-sirene-scraper) - Search official French company registry data from public sources.
- [GLEIF LEI Lookup ↗](https://apify.com/maximedupre/gleif-lei-lookup) - Look up public Legal Entity Identifier records for KYB and company enrichment.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `searchQuery` (type: `string`):

Search titles and opportunity text. Leave empty to browse by the selected type, status, and programme.

## `opportunityType` (type: `string`):

Choose grants, tenders, or both.

## `status` (type: `string`):

Choose the submission state to monitor.

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

Filter by programme code such as HORIZON, DIGITAL, LIFE, ERASMUS, or a SEDIA programme ID.

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

Limit how many matching opportunity rows the run returns.

## Actor input object example

```json
{
  "searchQuery": "climate",
  "opportunityType": "all",
  "status": "all",
  "maxItems": 800
}
```

# Actor output Schema

## `results` (type: `string`):

Open the dataset with one row for each saved EU Funding & Tenders opportunity.

# 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 = {
    "searchQuery": "climate",
    "opportunityType": "all",
    "status": "all",
    "programme": "",
    "maxItems": 800
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/eu-funding-tenders-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 = {
    "searchQuery": "climate",
    "opportunityType": "all",
    "status": "all",
    "programme": "",
    "maxItems": 800,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/eu-funding-tenders-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "climate",
  "opportunityType": "all",
  "status": "all",
  "programme": "",
  "maxItems": 800
}' |
apify call maximedupre/eu-funding-tenders-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=maximedupre/eu-funding-tenders-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "EU Funding & Tenders Scraper",
        "description": "Scrape EU Funding & Tenders Portal grants and tenders. Export deadlines, budgets, programme details, tender CPV data, official URLs, and source keywords.",
        "version": "0.1",
        "x-build-id": "JLcGFLvBAVck2Qo2G"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/maximedupre~eu-funding-tenders-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-maximedupre-eu-funding-tenders-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/maximedupre~eu-funding-tenders-scraper/runs": {
            "post": {
                "operationId": "runs-sync-maximedupre-eu-funding-tenders-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/maximedupre~eu-funding-tenders-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-maximedupre-eu-funding-tenders-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Search titles and opportunity text. Leave empty to browse by the selected type, status, and programme.",
                        "default": "climate"
                    },
                    "opportunityType": {
                        "title": "Opportunity type",
                        "enum": [
                            "grants",
                            "tenders",
                            "all"
                        ],
                        "type": "string",
                        "description": "Choose grants, tenders, or both.",
                        "default": "all"
                    },
                    "status": {
                        "title": "Status",
                        "enum": [
                            "open",
                            "forthcoming",
                            "closed",
                            "all"
                        ],
                        "type": "string",
                        "description": "Choose the submission state to monitor.",
                        "default": "all"
                    },
                    "programme": {
                        "title": "Programme",
                        "type": "string",
                        "description": "Filter by programme code such as HORIZON, DIGITAL, LIFE, ERASMUS, or a SEDIA programme ID."
                    },
                    "maxItems": {
                        "title": "Maximum opportunities",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Limit how many matching opportunity rows the run returns.",
                        "default": 800
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
