# EU Tenders & Funding Calls Monitor (TED + EU Funding Portal) (`gabriel_cr/eu-tenders`) Actor

Public tenders from TED plus EU grant and funding calls in one clean feed, via official EU APIs. Filter by country, CPV, keyword and value; track deadlines; get only new items on a schedule. No login, no personal data.

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

## Pricing

Pay per event

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 Tenders + EU Funding Calls Monitor

One feed for public money in Europe: **public tenders from TED** (Tenders Electronic Daily) and **grant and funding calls from the EU Funding & Tenders Portal**, both pulled from the official EU APIs. No login and no API key are needed.

### Why use it

- **Tenders and grants together** in one schema, so you don't need two tools.
- **Deadline tracking**: `next_deadline`, `days_to_deadline`, `all_deadlines`. `onlyOpen` drops anything already closed.
- **New-since-last-run**: every item gets `is_new`. Schedule it daily with `onlyNew` on and you only get (and pay for) fresh opportunities.
- **Filters**: buyer country, CPV codes or prefixes (`72*` = IT services), keywords, notice type, minimum value.
- **DACH-ready defaults** (Austria + Germany), with German titles kept when there's no English version.
- **No personal data**: buyer contact names, e-mails and phones aren't collected.

### Output fields

`source` (ted / eu_funding), `id`, `programme_code`, `item_type`, `title`, `title_language`, `buyer_or_programme`, `country`, `city`, `cpv_codes`, `contract_nature`, `procedure_type`, `estimated_value` + `value_basis` (total or sum_of_lots) + `currency`, `budget` (funding calls), `status`, `published_date`, `next_deadline`, `deadline_kind` (tender_submission, request_to_participate or submission), `deadline_time`, `days_to_deadline`, `all_deadlines`, `url`, `is_new`, `scraped_at`, `attribution`.
Anything the source does not state is `null`, never estimated. Most TED notices don't publish a value.

### Input

`sources`, `countries` (ISO-3, e.g. AUT, DEU), `cpvCodes`, `keywords`, `noticeTypes` (default open contract notices), `publishedLastDays` (default 3), `minValue`, `onlyOpen`, `fundingStatus` (open/forthcoming), `onlyNew` (memory is per filter set), `maxItems` (default 200 per source; the run log warns when results are cut off).

### Pricing

Pay per event: `opportunity` per row, plus `new-opportunity` for rows not seen before.

### Data and licence

© European Union. TED notices and EU Funding & Tenders Portal data are reused under Commission Decision 2011/833/EU, which allows commercial and non-commercial reuse with attribution. Only the official notice is legally authentic, so always check the linked notice before bidding.

### Legal note

Not affiliated with the EU Publications Office or the European Commission. Informational only; the published notice is the legally authentic version.

# Actor input Schema

## `sources` (type: `array`):

ted = public procurement notices; eu_funding = EU Funding & Tenders Portal grant topics, grant calls and cascade funding calls.

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

ISO 3-letter codes, e.g. AUT, DEU, CHE. Empty = all.

## `cpvCodes` (type: `array`):

Full codes (72000000) or prefixes with \* (72\*).

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

Full-text search terms (any match). Used for both sources.

## `noticeTypes` (type: `array`):

e.g. cn-standard (contract notice), cn-social, pin-only, can-standard (award). Default: open calls for tender.

## `publishedLastDays` (type: `integer`):

Look-back window.

## `minValue` (type: `integer`):

Drops TED notices whose stated value is lower. Notices without a stated value are kept (value is null).

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

Drop items whose deadlines have all passed.

## `fundingStatus` (type: `array`):

EU Funding portal status.

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

Output only items not seen in earlier runs with the same filters (memory is kept per filter set in the named key-value store 'eu-tenders-state').

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

Cap per source (TED max 15,000 per query). A week of Austria + Germany is 2,000+ notices; the run log warns when the cap is hit.

## Actor input object example

```json
{
  "sources": [
    "ted",
    "eu_funding"
  ],
  "countries": [
    "AUT"
  ],
  "cpvCodes": [],
  "keywords": [],
  "noticeTypes": [
    "cn-standard",
    "cn-social"
  ],
  "publishedLastDays": 3,
  "minValue": 0,
  "onlyOpen": true,
  "fundingStatus": [
    "open",
    "forthcoming"
  ],
  "onlyNew": false,
  "maxItems": 200
}
```

# Actor output Schema

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

Tender and funding-call opportunities in the default dataset.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("gabriel_cr/eu-tenders").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("gabriel_cr/eu-tenders").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 '{}' |
apify call gabriel_cr/eu-tenders --silent --output-dataset

```

## MCP server setup

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

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/T5t1kLa2eG0iPtbxE/builds/eWGAGv5cHkseRMF9Y/openapi.json
