# EU Funding & Tenders Scraper: Horizon Europe Grants and Calls (`nightwave-owner/eu-funding-tenders-calls`) Actor

Returns open and forthcoming EU grant calls from the European Commission Funding & Tenders Portal, one row per call with programme, deadlines, budget in EUR, status and link. Horizon Europe, LIFE, Digital Europe, CERV, EDF and more. Optional tenders and cascade funding. onlyNew for alerts.

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

## Pricing

$20.00 / 1,000 calls

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

## EU Funding & Tenders Scraper: Horizon Europe Grants and Calls

Returns open and forthcoming EU grant calls from the European Commission's Funding & Tenders Portal, one row per call with programme, all deadlines, budget in EUR, status, a short description and a link to the call. It covers Horizon Europe, LIFE, Digital Europe, CERV, the European Defence Fund, Creative Europe, CEF and the other EU programmes on the portal, plus cascade funding calls (open calls by EU funded projects) and, on request, tenders of the EU institutions.

Use it to watch new EU funding in your field every morning, to build a pipeline of calls for clients, or to feed a CRM, spreadsheet or newsletter with structured data instead of reading the portal by hand.

### What is covered

Everything the portal lists as a call for proposals (grant topics and calls outside the topic system), a cascade funding call or a call for tenders.

- Default: open and forthcoming grants and cascade funding calls with a deadline today or later, earliest deadline first. An empty input gives the 50 calls that close soonest, most of them Horizon Europe topics.
- Filters: keywords, programme, type, status and a deadline range.
- The portal keeps many calls marked open or forthcoming after their last deadline (on 4 October 2026 about half of them). The actor asks only for calls with a deadline today or later unless you include `closed`, and a row's `status` is `closed` when every deadline has passed.
- One search request per 100 calls. A run of 50 rows takes about 5 seconds.

### Example from a real run

This is the input and one row of a run on the Apify platform on 4 October 2026 (run `86uLAqDlESfI6f2Dy`, 8 rows in total). The `descriptionSnippet` is shown as the actor returns it.

Input:

```json
{
  "keywords": ["hydrogen", "artificial intelligence"],
  "programmes": ["HORIZON", "LIFE"],
  "maxResults": 20
}
```

Output (excerpt):

```json
[
  {
    "callId": "HORIZON-MISS-2027-04",
    "topicId": "HORIZON-MISS-2027-04-CIT-02",
    "projectAcronym": null,
    "title": "Hydrogen cities",
    "callTitle": "Supporting the implementation of the Climate-Neutral and Smart Cities Mission",
    "programme": "HORIZON",
    "programmeName": "Horizon Europe",
    "type": "grant",
    "status": "forthcoming",
    "publicationDate": "2025-12-12",
    "openingDate": "2027-02-09",
    "deadline": ["2027-10-07"],
    "nextDeadline": "2027-10-07",
    "deadlineModel": "single-stage",
    "budgetEur": 5000000,
    "fundingRate": null,
    "typesOfAction": ["HORIZON Coordination and Support Actions"],
    "descriptionSnippet": "Expected Outcome: A growing number of cities across Europe is developing hydrogen strategies, either for mobility applications or for decarbonising their local and peri-urban industries and hard-to-abate sectors. By acting as experimentation and innovation hubs, these cities can be testbeds for the energy transition, balancing decarbonisation with competitiveness and social cohesion. Project results are expected to contribute to the following expected outcomes: Investments in - and...",
    "url": "https://ec.europa.eu/info/funding-tenders/opportunities/portal/screen/opportunities/topic-details/HORIZON-MISS-2027-04-CIT-02",
    "source": "EU Funding & Tenders Portal, European Commission",
    "license": "© European Union. Reuse authorised under Commission Decision 2011/833/EU and CC BY 4.0, with the source acknowledged. Not endorsed by the European Commission.",
    "retrievedAt": "2026-10-04T06:31:15.360Z"
  }
]
```

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `keywords` | list of text | all | Words or phrases searched in the call text. Calls matching any of them are returned; a phrase with spaces is searched as a phrase. Example: `["hydrogen", "artificial intelligence"]`. |
| `programmes` | list of text | all | Programme abbreviations as the portal shows them, for example `HORIZON`, `LIFE`, `DIGITAL`, `EDF`, `CERV`, `CEF`, `ERASMUS`, `CREA`, `SMP`, `EU4H`, `EURATOM`, `INNOVFUND`, `EMFAF`. The input form lists all of them. |
| `types` | list | `grants`, `cascadeFunding` | `grants` (calls for proposals), `tenders` (procurement by EU institutions and agencies) and `cascadeFunding` (open calls by EU funded projects, also called financial support to third parties). |
| `status` | list | `open`, `forthcoming` | `open`, `forthcoming` and `closed`. |
| `deadlineFrom` | date | today | Only calls with a deadline on or after this date, `YYYY-MM-DD`. |
| `deadlineTo` | date | none | Only calls with a deadline on or before this date, `YYYY-MM-DD`. |
| `maxResults` | number | 50 | Maximum number of rows, 1 to 2 000. |
| `onlyNew` | true or false | false | Only calls that earlier runs with the same input did not deliver. See "Monitoring and scheduling". |

### Output

One row per call. The dataset view "Calls" shows the most used fields as a table.

| Field | Description |
|---|---|
| `callId` | Call identifier, for example `HORIZON-MISS-2027-04`. For tenders the procedure reference, for cascade funding calls the portal's numeric id of the call. |
| `topicId` | Topic identifier as the portal shows it, for example `HORIZON-MISS-2027-04-CIT-02`. For cascade funding calls the EU topic that funds the project. |
| `projectAcronym` | For cascade funding calls the acronym of the EU funded project that runs the call, otherwise `null`. |
| `title` | Title of the topic, call or tender. |
| `callTitle` | Title of the call the topic belongs to. For cascade funding calls the title of the funding topic. |
| `programme` | Programme abbreviation, for example `HORIZON`. `null` for tenders. |
| `programmeName` | Programme name, for example `Horizon Europe`. |
| `type` | `grant`, `tender` or `cascadeFunding`. |
| `status` | `open`, `forthcoming` or `closed`. |
| `publicationDate` | Date the call was first listed on the portal (for tenders the publication date of the notice), `YYYY-MM-DD`. |
| `openingDate` | Date the call opens for submission. |
| `deadline` | All deadlines as a list of dates, oldest first. Multi cut-off and two-stage calls have several. |
| `nextDeadline` | The first deadline today or later, or `null` when all have passed. |
| `deadlineModel` | `single-stage`, `two-stage` or `multiple cut-off`. |
| `budgetEur` | Budget in EUR. For grant topics the sum of the topic's budget lines over the years; for tenders the estimated contract value. `null` when the portal gives none or gives another currency. |
| `fundingRate` | Funding rate in percent when the call text states one, otherwise `null`. |
| `typesOfAction` | Types of action, for example `HORIZON Research and Innovation Actions`. |
| `descriptionSnippet` | The start of the description as plain text, at most 500 characters, without e-mail addresses and phone numbers. |
| `url` | Link to the call on the Funding & Tenders Portal (or on PROSPECT for some external action calls). |
| `source` | `EU Funding & Tenders Portal, European Commission`. |
| `license` | Reuse notice for the data. |
| `retrievedAt` | Time of the run, UTC. |

### Monitoring and scheduling

Set `onlyNew` to `true` to use the actor as a daily funding alert. The actor then remembers which calls it has delivered for the same input, in a named key-value store in your Apify account (`nightwave-state-eu-funding-tenders-calls`, one record per input). Each run returns and charges only calls that earlier runs did not deliver. A forthcoming call is delivered again when it opens for submission, so you see when it opens. The first run returns everything in the selection. A run without news finishes successfully with 0 rows.

`onlyNew` and `maxResults` are not part of the remembered input, so you can change them without starting over. Changing any other field starts a fresh state. To start over with the same input, delete the record in the key-value store.

Example: every morning at 07:00 Swedish time, new Horizon Europe and LIFE calls about hydrogen or batteries. In Apify Console, open **Schedules**, create a schedule with the cron expression `0 7 * * *` and add this actor with the input below.

```json
{
  "keywords": ["hydrogen", "battery"],
  "programmes": ["HORIZON", "LIFE"],
  "onlyNew": true,
  "maxResults": 200
}
```

The same schedule through the Apify API:

```sh
curl -X POST "https://api.apify.com/v2/schedules?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"name": "daily-eu-funding", "cronExpression": "0 7 * * *", "timezone": "Europe/Stockholm", "isEnabled": true, "isExclusive": true,
       "actions": [{"type": "RUN_ACTOR", "actorId": "nightwave-owner~eu-funding-tenders-calls",
                    "runInput": {"contentType": "application/json; charset=utf-8", "body": "<the input above as a JSON string>"}}]}'
```

Connect a webhook or an integration (Slack, e-mail, Google Sheets, HubSpot) to the actor in Apify Console if you want the new rows sent somewhere when the run finishes.

### Use cases

- Consultants and grant writers: a morning list of new calls per client, by programme and deadline.
- Universities and research offices: Horizon Europe and Euratom topics with budget and deadlines in a spreadsheet or CRM.
- Companies and SMEs: Digital Europe, LIFE and Single Market Programme calls, and cascade funding calls (smaller grants paid out by EU funded projects).
- Cities, NGOs and cultural organisations: CERV, Creative Europe, Erasmus+ and European Solidarity Corps calls.
- Suppliers to the EU institutions: tenders with deadline and estimated value (`"types": ["tenders"]`).

### Limits

- **No contact persons.** The actor does not return contact names, e-mail addresses or phone numbers, and it removes e-mail addresses and phone numbers from the description text. Open `url` to see who to contact.
- **The funding rate is often missing.** Most calls state it in the call document or the programme's general conditions, not in the topic text. `fundingRate` is `null` then.
- **Budgets are what the portal gives.** A budget line shared by several topics is shown under each of them, so adding up `budgetEur` across topics can count the same money twice. Cascade funding budgets are as the funded project entered them. Several cascade calls funded by the same topic share `topicId` and `url`; tell them apart by `callId` and `projectAcronym`.
- **About 5 external action calls had no deadline** on 4 October 2026 and are left out of the default search. Add `closed` to `status` and a deadline range to see everything.
- **Keyword search is the portal's own**, with its own matching rules. Results are sorted by the earliest deadline in each call's list, so a multi cut-off call with an old first cut-off can come early.
- **Text changes.** Titles and snippets are converted from HTML to plain text, extra spaces are removed and long dashes between words become a colon or comma. The content is not changed otherwise.
- **Polite use.** At most 2 requests per second, a declared User-Agent (`Nightwave AB kontakt@nightwave.se`), and three attempts with back-off on network errors, rate limits (429) and server errors. A response in an unexpected format stops the run with a clear message.
- The data describes calls announced by the EU. Always read the full call on the portal before you apply; the official documents decide.

### Pricing

Pay per result: 0.02 USD per call returned (event `call`), which is 20 USD per 1 000 calls. Platform usage is included, so you pay only per result. `maxResults` caps how many rows a run returns, so you always know the highest possible cost.

Rows are delivered only after they have been charged. If you set a maximum cost per run (maxTotalChargeUsd), the run stops there and its status message says how many rows were delivered.

### Source and license

The data comes from the European Commission's Funding & Tenders Portal through its public search API, `POST https://api.tech.ec.europa.eu/search-api/prod/rest/search?apiKey=SEDIA`, the same API the portal's own search page uses. The key `SEDIA` is public; no registration is needed. The portal describes the API on its APIs page ([ec.europa.eu/info/funding-tenders/opportunities/portal/screen/support/apis](https://ec.europa.eu/info/funding-tenders/opportunities/portal/screen/support/apis)).

The Commission's legal notice ([commission.europa.eu/legal-notice_en](https://commission.europa.eu/legal-notice_en)), read on 4 October 2026:

- "The Commission's reuse policy is implemented by the Commission Decision of 12 December 2011 on the reuse of Commission documents. Unless otherwise indicated (e.g. in individual copyright notices), content owned by the EU on this website is licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) licence. This means that reuse is allowed, provided appropriate credit is given and changes are indicated."

Commission Decision 2011/833/EU on the reuse of Commission documents ([eur-lex.europa.eu/eli/dec/2011/833/oj](https://eur-lex.europa.eu/eli/dec/2011/833/oj/eng)):

- Article 4: "All documents shall be available for reuse: (a) for commercial or non-commercial purposes under the conditions laid down in Article 6; (b) without charge, subject to the provisions laid down in Article 9; and (c) without the need to make an individual application, unless otherwise provided in Article 7."
- Article 6(2): the conditions may include "(a) the obligation for the reuser to acknowledge the source of the documents; (b) the obligation not to distort the original meaning or message of the documents; (c) the non-liability of the Commission for any consequence stemming from the reuse."

Every row names the source in `source` and carries the reuse notice in `license`. The changes the actor makes are listed under "Limits" (plain text, shortened descriptions, contact details removed). This actor is not made or endorsed by the European Commission.

### Contact

Built and maintained by Nightwave AB. Questions, bugs and feature requests: kontakt@nightwave.se

### På svenska

Actorn hämtar öppna och kommande EU-utlysningar från Europeiska kommissionens Funding & Tenders Portal, en rad per utlysning: program, alla sista ansökningsdagar, budget i euro, status, en kort beskrivning och länk. Den täcker Horisont Europa, LIFE, Digitala Europa, CERV, Europeiska försvarsfonden, Kreativa Europa, FSE (CEF) och övriga program på portalen, samt kaskadfinansiering (utlysningar från EU-finansierade projekt) och, om du vill, upphandlingar från EU:s institutioner.

- Källa: portalens öppna sök-API (samma som portalens egen sökning, med den publika nyckeln `SEDIA`).
- Standard är öppna och kommande bidragsutlysningar och kaskadfinansiering med sista dag i dag eller senare, den som stänger först överst. Portalen låter många utlysningar stå som öppna efter sista dagen; actorn sorterar bort dem.
- Filter: sökord, program (till exempel `HORIZON`, `LIFE`, `DIGITAL`), typ, status och datumintervall för sista ansökningsdag.
- Inga personuppgifter: kontaktpersoner, e-postadresser och telefonnummer tas aldrig med.
- Villkor: Kommissionens rättsliga meddelande och beslut 2011/833/EU tillåter vidareutnyttjande, även kommersiellt, under CC BY 4.0 med angiven källa och angivna ändringar (läst 4 oktober 2026). Källan och villkoret står i fälten `source` och `license` på varje rad.
- Med `onlyNew: true` levereras bara utlysningar som tidigare körningar med samma input inte har levererat, vilket passar för daglig bevakning för konsulter, universitet och företag (se "Monitoring and scheduling").
- Pris: 0,02 USD per utlysning (20 USD per 1 000). Plattformsanvändningen ingår.
- Kontakt: kontakt@nightwave.se

# Actor input Schema

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

Words or phrases to search for in the call text. Calls matching any of them are returned; a phrase with spaces is searched as a phrase. Example: \["hydrogen", "artificial intelligence"]. Leave empty for all calls.

## `programmes` (type: `array`):

Programme abbreviations as the portal shows them: HORIZON, DIGITAL, CEF, ERASMUS, EDF, LIFE, SMP, CREA, CERV, AGRIP, EU4H, EURATOM, EUAF, RFCS, ESF, EP, PPPA, EUBA, I3, INNOVFUND, ISF, EMFAF, JUST, UCPM, SOCPL, AMIF, ESC, PERICLES, IMCAP, BMVI, JTM, IMREG, RENEWFM, ERDF-TA, NDICI, RELEX-PROSPECT, RELEX2027, BCS, H2020, COSME. Example: \["HORIZON", "LIFE"]. Leave empty for all programmes.

## `types` (type: `array`):

Which kinds of calls to include. Defaults to grants and cascade funding. Example: \["grants"].

## `status` (type: `array`):

Which calls to include. Defaults to open and forthcoming. Without closed, only calls with a deadline today or later are returned. Example: \["open"].

## `deadlineFrom` (type: `string`):

Only calls with a deadline on or after this date, YYYY-MM-DD. Example: 2026-12-01. Leave empty for today.

## `deadlineTo` (type: `string`):

Only calls with a deadline on or before this date, YYYY-MM-DD. Example: 2027-03-31.

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

Maximum number of calls, earliest deadline first. 1 to 2 000. Example: 50.

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

Return only calls that earlier runs with the same input did not deliver, for daily monitoring. A forthcoming call is delivered again when it opens. Default false.

## Actor input object example

```json
{
  "keywords": [
    "hydrogen",
    "artificial intelligence"
  ],
  "programmes": [
    "HORIZON",
    "LIFE"
  ],
  "types": [
    "grants",
    "cascadeFunding"
  ],
  "status": [
    "open",
    "forthcoming"
  ],
  "deadlineFrom": "2026-12-01",
  "deadlineTo": "2027-03-31",
  "maxResults": 20,
  "onlyNew": false
}
```

# Actor output Schema

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

All rows produced by the run, as JSON. Open in Apify Console or download via the dataset API.

# 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 = {
    "keywords": [
        "hydrogen"
    ],
    "types": [
        "grants",
        "cascadeFunding"
    ],
    "status": [
        "open",
        "forthcoming"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("nightwave-owner/eu-funding-tenders-calls").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 = {
    "keywords": ["hydrogen"],
    "types": [
        "grants",
        "cascadeFunding",
    ],
    "status": [
        "open",
        "forthcoming",
    ],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("nightwave-owner/eu-funding-tenders-calls").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 '{
  "keywords": [
    "hydrogen"
  ],
  "types": [
    "grants",
    "cascadeFunding"
  ],
  "status": [
    "open",
    "forthcoming"
  ],
  "maxResults": 20
}' |
apify call nightwave-owner/eu-funding-tenders-calls --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nightwave-owner/eu-funding-tenders-calls"
        }
    }
}
```

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/l2aflOYIgnu8HmOcQ/builds/9CjCAjvEvrLTwMdGX/openapi.json
