# EU Tender Company Fit (`coppered_swamphen/eu-tender-company-fit`) Actor

Match EU TED tenders to your company profile with deterministic fit scores, CPV matches, reasons, risks, deadlines, and evidence.

- **URL**: https://apify.com/coppered\_swamphen/eu-tender-company-fit.md
- **Developed by:** [LEMAIRE ANTOINE](https://apify.com/coppered_swamphen) (community)
- **Categories:** Lead generation
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$20.00 / 1,000 company fit results

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 Tender Company Fit

> **Explainable company-to-tender qualification for EU TED opportunities.**\
> Match public procurement notices against your company profile and return only opportunities that meet your Company Fit threshold.

***

### At a glance

| | |
|---|---|
| **Data source** | Official TED Search API v3 |
| **Mode** | Company Fit filtering only |
| **Score** | Deterministic `0â€“100` fit score |
| **Evidence** | Matched capabilities, CPVs, reasons, risks, deadline signals |
| **Default threshold** | `40` |
| **Pricing** | **$0.020 per delivered Company Fit result** |
| **1,000 results** | **$20.00** |

> Company Fit is deterministic and explainable. It is **not** a win probability, legal advice, procurement advice, or a semantic-AI prediction.

***

### What this Actor does

EU Tender Company Fit searches official TED notices and evaluates each opportunity against the company profile you provide.

It can qualify opportunities using:

- **Company capabilities** and profile terms
- **CPV codes**
- **Buyer countries**
- **Minimum / maximum contract value**
- **Deadline policy**
- **Hard exclusion terms**

Only results that meet the configured Company Fit threshold are delivered.

The standalone product always operates in **Company Fit filtering mode**.

***

### Quick start

Example profile for an IT / software company:

```json
{
  "sector": "it",
  "lookbackDays": 30,
  "noticeKind": "competition",
  "keywords": [
    "software",
    "data",
    "cybersecurity"
  ],
  "matchingMode": "words",
  "minKeywordMatches": 1,
  "preferredLanguage": "en",
  "limit": 100,
  "maxPages": 2,
  "maxResults": 10,
  "maxRuntimeSeconds": 60,
  "historyMode": "off",
  "companyProfileTerms": [
    "software",
    "data",
    "cybersecurity"
  ],
  "companyCpvCodes": [
    "48*",
    "72*"
  ],
  "companyCountries": [],
  "companyExcludeTerms": [],
  "companyValueCurrency": "EUR",
  "companyDeadlinePolicy": "preferFuture",
  "minCompanyFitScore": 40
}
```

**Required:** `companyProfileTerms`

***

### Company profile inputs

#### `companyProfileTerms`

Terms that describe what your company actually sells or delivers.

```json
[
  "software",
  "data platform",
  "cybersecurity",
  "cloud"
]
```

#### `companyCpvCodes`

CPV codes or supported CPV prefixes relevant to your business.

```json
[
  "48*",
  "72*"
]
```

#### `companyCountries`

Optional country restrictions for the company profile.

Use an empty array when you do not want to restrict Company Fit by country.

#### `companyExcludeTerms`

Terms that should make an opportunity ineligible for your company profile.

#### `companyValueMin` / `companyValueMax`

Optional minimum and maximum estimated contract values.

#### `companyValueCurrency`

Currency used for the configured company value range.

> The Actor does not invent exchange rates when the source data does not support a direct comparison.

#### `companyDeadlinePolicy`

Controls how tender deadlines participate in Company Fit.

| Value | Behavior |
|---|---|
| `ignore` | Deadline does not affect Company Fit |
| `preferFuture` | Future deadlines are preferred |
| `requireFutureKnown` | Requires a known future deadline |

Missing deadline data remains missing.

#### `minCompanyFitScore`

Minimum score required for a tender to be delivered.

**Default:** `40`

***

### Company Fit output

A qualified result includes fields such as:

```json
{
  "companyFitMode": "filter",
  "companyFitStatus": "qualified",
  "companyFitScore": 58,
  "companyFitMatchedTerms": [
    "software",
    "data"
  ],
  "companyFitMatchedCpvs": [
    "72"
  ]
}
```

Depending on the TED notice, the output can also include:

- Publication number and date
- Tender title
- Buyer and buyer country
- CPV codes
- Notice type
- Estimated value and currency
- Tender deadline
- TED URL
- Matched keywords
- Company Fit reasons
- Company Fit risks
- Matching evidence

***

### How to read the score

`companyFitScore` is a deterministic `0â€“100` fit score based on:

1. The company profile you provide
2. The available data in the TED notice
3. The configured Company Fit rules

A higher score means more of the configured criteria are satisfied.

#### The score is for

- Opportunity qualification
- Prioritization
- Lead triage
- Reducing manual TED review

#### The score is not

- A probability of winning
- A legal conclusion
- A procurement compliance decision
- A semantic-AI confidence score
- A substitute for reviewing the official tender documents

Always review the original TED notice before making a commercial, legal, or bidding decision.

***

### Matching behavior

Matching is **literal and deterministic**.

The Actor does **not**:

- Translate missing content
- Infer hidden intent
- Generate semantic matches
- Invent values
- Invent deadlines
- Invent currencies
- Invent CPV codes

Missing or ambiguous TED values remain missing and may appear in Company Fit risks.

***

### Data source

Tender data comes from the official **TED Search API v3**.

The original TED source context remains available so you can verify the underlying notice.

***

### Pricing

EU Tender Company Fit uses **Pay Per Event** pricing.

| Usage | Price |
|---:|---:|
| 1 result | **$0.020** |
| 10 results | **$0.20** |
| 100 results | **$2.00** |
| 1,000 results | **$20.00** |

**Billable event:** `company-fit-result`

There is **no additional paid default-dataset-item event** in this standalone product.

The `maxResults` value you configure controls the maximum number of Company Fit rows the Actor can deliver in a run.

***

### Recommended profile setup

For stronger qualification:

1. Use **specific company capabilities** instead of generic terms.
2. Use **CPV families** that genuinely match your offer.
3. Add **exclusions** for work your company does not perform.
4. Use a realistic **contract value range** when relevant.
5. Keep the threshold conservative when you want fewer, stronger opportunities.
6. Review **reasons and risks** instead of relying on the score alone.

***

### Example workflow

```text
Company profile
      â†“
TED search scope
      â†“
Company Fit scoring
      â†“
Threshold filter
      â†“
Qualified opportunities
      â†“
Review evidence + original TED notice
```

1. Define your company profile.
2. Select the TED search scope.
3. Run the Actor.
4. Receive only qualified Company Fit results.
5. Review matched terms, CPVs, reasons, risks, deadlines, and evidence.
6. Open the original TED notice for final review.

***

### Important limitations

EU Tender Company Fit does not:

- Submit bids
- Contact buyers
- Make procurement decisions
- Guarantee eligibility
- Guarantee contract award

TED notices can contain incomplete, multilingual, nested, or ambiguous data.

When a value cannot be established reliably, the Actor keeps it missing instead of guessing.

A successful run can return fewer results than `maxResults` when not enough opportunities satisfy both the TED search and Company Fit criteria.

***

### Product scope

This Actor is **EU Tender Company Fit**, the standalone Company Fit product.

It is dedicated to deterministic company-to-tender qualification and does not expose the general-purpose standard-only product as a separate mode inside this Actor.

# Actor input Schema

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

FR/FRA, BE/BEL, DE/DEU etc. Empty means all. Ignored when tedQuery is supplied.

## `sector` (type: `string`):

Presets use CPV families: IT = 48\*/72\*, construction = 45\*, engineering = 71\*. Ignored in expert mode.

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

Eight digits or prefixes such as 72\*. OR-combined with the sector codes. Ignored in expert mode.

## `lookbackDays` (type: `integer`):

Includes today in UTC. Used only in simple mode; range is rolling, not a fixed historical date.

## `noticeKind` (type: `string`):

Competition is a notice category, NOT a guarantee the deadline is open. Ignored in expert mode.

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

Literal terms or phrases. No semantic AI. Empty means no keyword filter or score.

## `excludeKeywords` (type: `array`):

Any matching excluded term removes the notice. No regular expressions.

## `matchingMode` (type: `string`):

Words: accents normalized, complete tokens/phrases in titles/descriptions. Legacy: substring matching in every returned field.

## `minKeywordMatches` (type: `integer`):

Threshold over distinct keywords. Ignored with an empty keyword list.

## `companyProfileTerms` (type: `array`):

Required. Add the products, services, or capabilities your company sells, for example cybersecurity, penetration testing, data platform, or ISO 27001.

## `companyCpvCodes` (type: `array`):

Exact CPV codes or prefixes such as 72\*. Independent from search CPV filters.

## `companyCountries` (type: `array`):

Optional FR/FRA, BE/BEL, DE/DEU etc. Adds fit points on buyer-country match.

## `companyExcludeTerms` (type: `array`):

Literal terms that make an opportunity unsuitable. Filter mode removes them; score mode returns score 0 with evidence.

## `companyMinValue` (type: `number`):

Optional non-negative value. Scored only when TED supplies a unique value in companyValueCurrency.

## `companyMaxValue` (type: `number`):

Optional non-negative value. Must be greater than or equal to companyMinValue.

## `companyValueCurrency` (type: `string`):

Three-letter currency for the Company Fit value range. No FX conversion is invented.

## `companyDeadlinePolicy` (type: `string`):

Ignore, prefer a known future deadline, or require a known future deadline in filter mode.

## `minCompanyFitScore` (type: `integer`):

Minimum deterministic fit score (0-100). Only qualified opportunities are delivered.

## `preferredLanguage` (type: `string`):

FR, EN, DE or a TED three-letter code. Uses available translations; never translates with an LLM.

## `limit` (type: `integer`):

Old limit input preserved: page size, 1-250. Total inspection is bounded by limit multiplied by maxPages.

## `maxPages` (type: `integer`):

One page by default. Up to 10 pages; stops earlier at result or charge limits. Ranking is per page.

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

Hard cap on dataset items in a run.

## `maxRuntimeSeconds` (type: `integer`):

Local timeout around collection, retries, locks and writes. Platform initialization/cleanup may add time.

## `historyMode` (type: `string`):

Off: no cross-run history. New only: ignore seen publication IDs. New or changed: also emit changed content for the same ID.

## `watchName` (type: `string`):

Required when history is enabled. 1-60 letters, digits, \_ or -. Each account and selection gets its own history.

## `historyDays` (type: `integer`):

Delivered IDs expire after this many days. A historical query may re-emit an expired ID. Hard cap: 20,000 IDs.

## `tedQuery` (type: `string`):

When non-empty, overrides countries/sector/cpvCodes/lookbackDays/noticeKind. Existing API inputs remain accepted.

## `fields` (type: `array`):

Empty uses defaults. Providing fields replaces the default field set. publication-number is always added. Missing fields are not invented.

## Actor input object example

```json
{
  "countries": [],
  "sector": "all",
  "cpvCodes": [],
  "lookbackDays": 7,
  "noticeKind": "competition",
  "keywords": [],
  "excludeKeywords": [],
  "minKeywordMatches": 1,
  "companyCpvCodes": [],
  "companyCountries": [],
  "companyExcludeTerms": [],
  "companyValueCurrency": "EUR",
  "companyDeadlinePolicy": "preferFuture",
  "minCompanyFitScore": 40,
  "preferredLanguage": "fr",
  "limit": 100,
  "maxPages": 1,
  "maxResults": 50,
  "maxRuntimeSeconds": 90,
  "historyMode": "off",
  "historyDays": 90,
  "fields": []
}
```

# 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("coppered_swamphen/eu-tender-company-fit").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("coppered_swamphen/eu-tender-company-fit").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 coppered_swamphen/eu-tender-company-fit --silent --output-dataset

```

## MCP server setup

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

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/OV4N5XgrTYORYoADj/builds/QV2Myp9S45MeUgmg5/openapi.json
