# AI Tender & RFQ Opportunity Radar (`icekurt/ai-tender-rfq-opportunity-radar`) Actor

Find active EU tenders that match the products and services your business actually sells. Search official TED public procurement by product, keywords, CPV codes, target countries, and negative keywords. Explore supplier and bid opportunities with source links and explainable scores.

- **URL**: https://apify.com/icekurt/ai-tender-rfq-opportunity-radar.md
- **Developed by:** [hasan kurt](https://apify.com/icekurt) (community)
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.05 / actor start

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

## AI Tender & RFQ Opportunity Radar

Find active EU tenders that match the products and services your business actually sells. This tender finder searches **official EU public procurement opportunities from TED (Tenders Electronic Daily)**. It does not search private, worldwide RFQ marketplaces.

### What it does

Enter your product or service, related keywords, optional official CPV codes, buyer countries, and phrases to exclude. The Actor searches TED tenders, keeps notices with a known active tender submission deadline within your chosen window, and returns distinct notices ranked by a deterministic matchScore. Product, keyword, and CPV relevance carry the main weight; country and deadline alone do not establish a strong match.

You can use it to explore procurement opportunities, supplier opportunities, bid opportunities, and other business opportunities in sectors such as software development, cybersecurity, medical equipment, industrial components, packaging, construction materials, professional services, energy equipment, and office equipment. A CNC machined parts supplier can exclude notices seeking machine tools or lathes.

### Inputs

| Field | What to enter |
| --- | --- |
| `product` | Required. A specific product or service you sell, for example `software development` or `medical equipment`. |
| `keywords` | Optional related buyer terms. Up to five phrases are used. |
| `negativeKeywords` | Optional unwanted phrases, such as `lathe` when you sell machined parts rather than machines. Up to 30. |
| `targetCountries` | Optional buyer country names (for example `Germany`) or three-letter ISO codes (`DEU`). Empty means no country filter. |
| `cpvCodes` | Optional official eight-digit Common Procurement Vocabulary codes. Broad parent codes can match narrower TED classifications. Up to ten. |
| `opportunityType` | `All`, `Tender`, `Procurement`, or `RFQ`. RFQ requires explicit RFQ wording in a TED notice. |
| `deadlineDays` | Look ahead this many days for an unexpired tender deadline (default 60; 1–365). |
| `maxResults` | Maximum distinct notices to return (default 20; 1–100). |

Example:

```json
{
  "product": "software development",
  "keywords": ["web application", "custom software"],
  "negativeKeywords": ["hardware supply"],
  "targetCountries": ["Germany"],
  "cpvCodes": ["72000000"],
  "opportunityType": "All",
  "deadlineDays": 60,
  "maxResults": 10
}
```

### Results and verification

Each result includes a TED title, buyer organization, country, publication date, actual tender deadline date, official `sourceUrl` and `tenderUrl`, `cpvCodes` and available `cpvLabels`, plus `matchScore` and `matchReasons`. Reasons indicate observed product phrase, keyword, CPV, country, or active deadline matches. The score is a repeatable relevance ranking, **not a guarantee of commercial fit, eligibility, or ability to win**. Open the official TED link and review the full notice and lot documents before bidding.

The output is based on real TED records. Missing source fields such as `estimatedValue` or `contactUrl` may be `null`; the Actor does not invent them or a deadline. Notices without a known active tender deadline are omitted, as are expired notices. Repeated records are deduplicated by the TED publication number. Some TED notices contain multiple lots; inspect the official notice to confirm the exact lot and CPV relevant to your offer. A narrow search can legitimately return zero results.

This first version covers official TED public procurement, not all EU purchasing channels or private RFQs. Text and CPV matching can surface broad category matches, so use negative keywords and inspect the procurement scope.

# Actor input Schema

## `product` (type: `string`):

Describe what your business offers, such as software development, medical equipment, or precision components. Use a specific phrase for better matches.

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

Optional words or phrases buyers might use for your product or service. Add up to five, such as 'web application' or 'custom software'.

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

Optional phrases that describe purchases you do not want. For example, a parts supplier may exclude 'lathe' and 'machine tool'. Add up to 30.

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

Optional official eight-digit EU procurement category codes, such as 72000000 for IT services. A broad code can include narrower categories. Add up to 10.

## `targetCountries` (type: `array`):

Optional countries where the public buyer is located. Enter country names such as Germany or ISO three-letter codes such as DEU. Leave blank for all countries in TED.

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

Choose All for the widest search, or narrow to Tender, Procurement, or RFQ. RFQ requires explicit RFQ wording in the notice.

## `deadlineDays` (type: `integer`):

Show only notices whose actual tender submission deadline is still open and falls within this many days. Default: 60.

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

Stop after this many distinct matching TED notices. Default: 20; maximum: 100.

## Actor input object example

```json
{
  "opportunityType": "All",
  "deadlineDays": 60,
  "maxResults": 20
}
```

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

// Run the Actor and wait for it to finish
const run = await client.actor("icekurt/ai-tender-rfq-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("icekurt/ai-tender-rfq-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 '{}' |
apify call icekurt/ai-tender-rfq-opportunity-radar --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,icekurt/ai-tender-rfq-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/sHrfd160bw9bbJnJZ/builds/KdPHh7mWPZwNzwRwS/openapi.json
