# EU Tender Opportunity Radar (`aieast/eu-tender-opportunity-radar`) Actor

Find, qualify, and monitor active EU public-procurement opportunities from the official TED API. Returns buyer, deadline, CPV, bid link, evidence, and a deterministic fit score.

- **URL**: https://apify.com/aieast/eu-tender-opportunity-radar.md
- **Developed by:** [Aden](https://apify.com/aieast) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 qualified tender 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Tender Opportunity Radar

Find qualified public-procurement opportunities across Europe without learning TED's expert-query language.

This Actor searches the **official Tenders Electronic Daily (TED) API**, filters active contract notices, normalizes multilingual fields, scores every opportunity against what you sell, and returns bid-ready evidence: buyer, country, deadline, CPV codes, estimated value, official notice, and submission links.

### Why use it?

Raw procurement search creates noise. A keyword can appear in a buyer name, a translated category label, or a long description without representing a realistic opportunity. This Actor adds a transparent qualification layer:

- title matches carry the most weight;
- description and buyer matches are scored separately;
- optional CPV prefixes act as a strong relevance gate;
- country and remaining bid time improve prioritization;
- exclusion terms remove known false positives;
- every score includes plain-English `whyMatched` evidence.

There is no hidden AI model and no invented summary. The score is deterministic and reproducible.

### Quick start

```json
{
  "keywords": [
    "artificial intelligence",
    "cloud software",
    "cybersecurity"
  ],
  "countries": ["DEU", "FRA", "NLD"],
  "cpvPrefixes": ["72", "48"],
  "daysBack": 7,
  "minFitScore": 12,
  "maxResults": 100,
  "deltaOnly": false
}
```

### Output

Each delivered row can include:

```json
{
  "noticeId": "123456-2026",
  "title": "Cloud platform and cybersecurity services",
  "buyer": "Example Public Authority",
  "buyerCountry": "DEU",
  "publishedAt": "2026-09-04+02:00",
  "deadline": "2026-09-30T00:00:00.000Z",
  "daysToDeadline": 25,
  "cpvCodes": ["72000000"],
  "estimatedValue": 250000,
  "currency": "EUR",
  "officialUrl": "https://ted.europa.eu/en/notice/-/detail/123456-2026",
  "submissionUrls": ["https://example.eu/bid"],
  "fitScore": 88,
  "fitBand": "high",
  "matchedKeywords": ["cloud software", "cybersecurity"],
  "matchedCpvPrefixes": ["72"],
  "whyMatched": [
    "Title contains \"cloud software\"",
    "Title contains \"cybersecurity\"",
    "CPV matches 72",
    "Buyer is in DEU",
    "25 days remain to bid"
  ],
  "changeStatus": "new",
  "source": "Official TED Search API v3"
}
```

### Recurring monitoring

Use the same `monitorId` on scheduled runs and turn on `deltaOnly`.

- The first run records the matching result set.
- Later runs deliver only new or materially changed matches.
- A changed deadline, value, description, CPV list, or bid link is detected.
- Unchanged matches are not delivered and therefore are not billed as qualified opportunities.

Use different monitor IDs for different products, territories, or sales teams.

### Pricing

**$0.003 per qualified opportunity delivered.**

- No start fee.
- Failed API calls are written as uncharged error rows.
- Notices rejected by your filters are not billed.
- Unchanged rows in `deltaOnly` mode are not billed.
- Apify platform usage is included in pay-per-event pricing according to the Store run limits shown before execution.

### Useful CPV starting points

- `48` — software packages and information systems
- `72` — IT services: consulting, software development, internet, and support
- `73` — research and development services
- `79` — business services
- `30` — office and computing machinery

Use a broader two-digit prefix first, inspect the returned CPV codes, then narrow the monitor.

### Data source and limitations

The source is the official European Union TED Search API v3. Published-notice search is anonymous and intended for data reuse. This Actor is an independent community product and is not endorsed by the European Union.

Procurement notices are supplied by public buyers. Values, time zones, translations, eligibility, and submission rules can be incomplete or corrected later. Always open the official notice and procurement documents before deciding to bid. A high fit score indicates textual/category relevance; it is not legal, eligibility, or win-probability advice.

### Automation ideas

- Schedule a daily run and send only new high-fit opportunities to Slack or email.
- Feed the dataset into Make, Zapier, n8n, a CRM, or an AI agent.
- Create separate monitors by country, CPV family, or product line.
- Export CSV for a bid/no-bid review meeting.

### Responsible use

The Actor reads public procurement notices through the official API. Do not use contact fields for spam. Follow the procurement portal's rules, the notice's eligibility requirements, applicable privacy law, and your organization's bid-approval process.

# Actor input Schema

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

Use specific phrases such as cloud migration, cybersecurity, data platform, or artificial intelligence.

## `negativeKeywords` (type: `array`):

Optional words or phrases that indicate an irrelevant notice.

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

Optional ISO 3166-1 alpha-3 codes, for example DEU, FRA, ESP, NLD. Leave empty for all TED countries.

## `cpvPrefixes` (type: `array`):

Optional 2-8 digit CPV prefixes. Example: 72 for IT services or 48 for software packages.

## `daysBack` (type: `integer`):

Limit the search to recently published notices, from 1 to 30 days.

## `minFitScore` (type: `integer`):

Only deliver opportunities at or above this transparent 0-100 score.

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

Hard cap on qualified opportunities delivered in this run.

## `matchAllKeywords` (type: `boolean`):

Off means any keyword can match. Turn on for a narrow search.

## `monitorId` (type: `string`):

Optional stable name for recurring runs. It keeps a private snapshot so changes can be detected.

## `deltaOnly` (type: `boolean`):

Best for scheduled runs. The first run establishes the initial result set; later runs deliver only new or changed matches.

## Actor input object example

```json
{
  "keywords": [
    "artificial intelligence",
    "cloud software",
    "cybersecurity"
  ],
  "negativeKeywords": [],
  "countries": [],
  "cpvPrefixes": [],
  "daysBack": 7,
  "minFitScore": 12,
  "maxResults": 100,
  "matchAllKeywords": false,
  "monitorId": "default",
  "deltaOnly": false
}
```

# Actor output Schema

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

No description

## `dataset` (type: `string`):

No description

## `summary` (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 = {
    "keywords": [
        "artificial intelligence",
        "cloud software",
        "cybersecurity"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aieast/eu-tender-opportunity-radar").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": [
        "artificial intelligence",
        "cloud software",
        "cybersecurity",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("aieast/eu-tender-opportunity-radar").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": [
    "artificial intelligence",
    "cloud software",
    "cybersecurity"
  ]
}' |
apify call aieast/eu-tender-opportunity-radar --silent --output-dataset

```

## MCP server setup

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

```

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/uBLKisnacL2O9S2dS/builds/UrggyTUEg5vP7oFAf/openapi.json
