# EU Public Tenders & Contract Winners (TED, Nordic-ready) (`interconnected_seaport/eu-tenders-contract-awards`) Actor

Search EU public procurement notices on TED: open tenders with deadlines and values, and contract awards with winner names and org numbers. Nordic, EU27 or any country; CPV and keyword filters; scheduled new-only mode. Official API, no proxies.

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

## Pricing

from $3.00 / 1,000 notice returneds

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 Public Tenders & Contract Winners (TED, Nordic-ready)

Search the official EU public-procurement database **TED** (Tenders Electronic Daily) and get clean, structured rows: **open tenders** with bid deadlines, values, buyers and CPV codes, and **contract awards** with **winner names, organisation numbers (e.g. Swedish org.nr), awarded values and number of bids**. Filter by country (ISO code, name, or the groups `NORDIC`, `BALTIC`, `EU27`), CPV code, keyword, contract type, procedure, value range, buyer or winner name.

The actor reads the public **TED Search API v3** (no key required). It does not scrape websites, use proxies or bypass anything, so it is cheap, fast and stable (typically a few seconds per run on 256 MB).

### Use cases

- **Bid and sales teams:** every morning, list new open tenders in your CPV codes (e.g. 72 = IT services, 48 = software, 45 = construction, 79 = business services) across the Nordics or EU27, with deadline, estimated value and a link to the documents.
- **Competitor and market intelligence:** see who wins contracts, for how much, with how many competing bids. Search awards by `winnerNameContains` to track a company, or by buyer to see what a public body spends on.
- **Lead generation for B2B suppliers:** buyers and winning companies come with website, e-mail (buyers, as published), organisation number and country.
- **Researchers, journalists, civic tech:** public-spending analysis, framework agreements, procurement by region, with consistent field names.
- **Scheduled alerts:** turn on `onlyNewSinceLastRun`, schedule the actor daily and connect it to Slack, e-mail or a webhook; you only get (and pay for) notices you have not received before.

### Input

| Field | Meaning |
|---|---|
| `mode` | `open_tenders` (default), `contract_awards`, or `all_notices` |
| `countries` | Buyer country: `SE`, `SWE`, `Sweden`, or groups `NORDIC`, `BALTIC`, `EU27`. Empty = all |
| `cpvCodes` | CPV codes or prefixes (`72`, `72000000`, `45*`) incl. all sub-codes |
| `keywords` | Full-text search in any language; any keyword matches; multi-word entries are phrases |
| `publishedWithinDays` / `publishedFrom` / `publishedTo` | Publication window (default last 14 days) |
| `openOnly` | Open tenders: drop notices whose deadline has passed (default on) |
| `contractNature`, `procedureType` | supplies / services / works; open / restricted / negotiated / competitive dialogue / innovation / other |
| `minValue`, `maxValue`, `valueCurrency` | Value filters in the notice currency (e.g. SEK) |
| `buyerNameContains`, `winnerNameContains` | Name filters |
| `preferredLanguages`, `descriptionMaxChars` | Language order for title and description; truncation (0 = omit) |
| `onlyNewSinceLastRun` | Return only notices not delivered earlier for this filter set |
| `maxItems` | Cap on notices returned and charged (default 50, max 10,000) |

Example (new Nordic IT tenders, last two weeks):

```json
{
  "mode": "open_tenders",
  "countries": ["NORDIC"],
  "cpvCodes": ["72", "48"],
  "publishedWithinDays": 14,
  "minValue": 500000,
  "maxItems": 100
}
```

Example (who won Swedish IT contracts, with org numbers):

```json
{ "mode": "contract_awards", "countries": ["SE"], "cpvCodes": ["72"], "publishedWithinDays": 30, "maxItems": 200 }
```

### Sample output (real, 16 Oct 2026, shortened)

```json
{
  "noticeId": "718432-2026",
  "url": "https://ted.europa.eu/en/notice/-/detail/718432-2026",
  "kind": "award",
  "publishedDate": "2026-10-16",
  "title": "Specifik upphandling Förstudie till gemensam ärendehantering",
  "category": "IT services: consulting, software development, Internet and support",
  "buyer": { "name": "Region Stockholm - Serviceförvaltningen", "country": "SE", "legalTypeLabel": "Regional authority", "identifier": "2321000016" },
  "cpvMain": "72000000",
  "contractNature": "services",
  "estimatedValue": { "amount": 988000, "currency": "SEK" },
  "awardedValue": { "amount": 874500, "currency": "SEK" },
  "tendersReceived": 8,
  "winners": [ { "name": "Tech Relations AB", "identifier": "5591898464", "country": "SWE" } ],
  "contractConclusionDate": "2026-10-14",
  "source": "TED, Publications Office of the European Union"
}
```

Open-tender rows additionally carry `deadline` (UTC, latest lot), `deadlineDate`, `daysUntilDeadline`, `frameworkAgreement`, lots and `documentUrl` (usually the buyer's e-procurement system).

### Pricing

Pay per event, no subscription:

| Event | Price |
|---|---|
| Notice returned | **$0.003** (≈ $3 per 1,000 notices) |
| Actor start | $0.00005 per GB of memory (Apify default) |

Runs with no results, invalid input or API errors are not charged. Notices skipped by `onlyNewSinceLastRun` or by your value/name filters are not charged. The free Apify plan returns up to 25 notices per run. Example: 100 new Nordic IT tenders per month cost about $0.30.

### FAQ

**Which countries are covered?** All TED buyers: EU/EEA member states (including Sweden, Norway, Denmark, Finland, Iceland) plus other countries that publish on TED. National-only procurements below the EU thresholds are generally not on TED; for Sweden that means many small direct awards and local calls are missing.

**Why is a value, deadline or winner missing?** Buyers fill in different fields depending on notice type and age. Pre-2023 notices use older forms with fewer fields. We never invent values; missing means "not published in the notice".

**Are the winner organisation numbers reliable?** They come from the notice's tenderer data and are matched to winners by name. When TED data is ambiguous (different counts of names and identifiers) the identifier is `null` instead of guessing.

**How fresh is the data?** The TED API reflects notices as soon as they are published (new notices appear each working day).

**Does it download tender documents?** No, only the notice data and links (`url`, `pdfUrl`, `xmlUrl`, `documentUrl`).

### Data source, licence and responsible use

Data: [TED, Publications Office of the European Union](https://ted.europa.eu), obtained through the public TED Search API. TED data may be reused under the EU's open reuse policy; keep the attribution in the `source` field when you republish. Buyer contact e-mails are published in the notices as business contacts; comply with GDPR and e-privacy/marketing rules before using them for outreach. This actor is not affiliated with the European Union. Not legal advice.

### API example

```bash
curl -X POST "https://api.apify.com/v2/acts/interconnected_seaport~eu-tenders-contract-awards/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode":"open_tenders","countries":["SE"],"cpvCodes":["72"],"maxItems":20}'
```

# Actor input Schema

## `mode` (type: `string`):

Open tenders = contract notices and calls for competition. Contract awards = result notices with winners, winner organisation numbers and awarded values.

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

Country of the buying authority. ISO codes (SE, SWE), English names (Sweden) or groups NORDIC, BALTIC, EU27. Empty = all countries.

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

Common Procurement Vocabulary codes or prefixes, e.g. 72 (IT services), 48 (software), 45 (construction), 33 (medical), 79 (business services). Matches the code and all sub-codes.

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

Full-text search over notices in any language (matches any of the keywords). Multi-word entries are matched as a phrase, e.g. "cloud services".

## `publishedWithinDays` (type: `integer`):

Ignored when "Published from" is set.

## `publishedFrom` (type: `string`):

Optional start date, e.g. 2026-10-01.

## `publishedTo` (type: `string`):

Optional end date.

## `openOnly` (type: `boolean`):

Applies to "Open tenders" mode. Drops notices whose bid deadline is in the past.

## `contractNature` (type: `string`):

Restrict to supplies (goods), services or works (construction).

## `procedureType` (type: `string`):

Restrict to a procurement procedure type.

## `minValue` (type: `number`):

Estimated value (tenders) or awarded value (awards), in the notice currency. Notices without a stated value are dropped when this is set.

## `maxValue` (type: `number`):

Notices without a stated value are kept.

## `valueCurrency` (type: `string`):

Optional ISO currency, e.g. SEK, EUR, NOK. Needed to compare min/max values across countries.

## `buyerNameContains` (type: `string`):

e.g. "Region Stockholm" or "Trafikverket".

## `winnerNameContains` (type: `string`):

Find contracts won by a company, e.g. "Accenture". Works for contract-award notices.

## `preferredLanguages` (type: `array`):

Order of three-letter TED language codes for title and description (eng, swe, nob, nno, dan, fin, deu, fra ...). Falls back to the notice language.

## `descriptionMaxChars` (type: `integer`):

Maximum characters of the description (0 = omit).

## `onlyNewSinceLastRun` (type: `boolean`):

Remembers returned notice IDs per filter set in a named storage (ted-seen) so a daily schedule only delivers and charges new notices.

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

Upper bound on notices returned (and charged). The free Apify plan returns up to 25 per run.

## Actor input object example

```json
{
  "mode": "open_tenders",
  "countries": [
    "NORDIC"
  ],
  "cpvCodes": [
    "72"
  ],
  "keywords": [],
  "publishedWithinDays": 14,
  "openOnly": true,
  "contractNature": "any",
  "procedureType": "any",
  "preferredLanguages": [
    "eng",
    "swe",
    "nob",
    "nno",
    "dan",
    "fin"
  ],
  "descriptionMaxChars": 1200,
  "onlyNewSinceLastRun": false,
  "maxItems": 50
}
```

# Actor output Schema

## `notices` (type: `string`):

One row per TED notice: buyer, CPV, deadline, values, winners.

# 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 = {
    "countries": [
        "NORDIC"
    ],
    "cpvCodes": [
        "72"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("interconnected_seaport/eu-tenders-contract-awards").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 = {
    "countries": ["NORDIC"],
    "cpvCodes": ["72"],
}

# Run the Actor and wait for it to finish
run = client.actor("interconnected_seaport/eu-tenders-contract-awards").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 '{
  "countries": [
    "NORDIC"
  ],
  "cpvCodes": [
    "72"
  ]
}' |
apify call interconnected_seaport/eu-tenders-contract-awards --silent --output-dataset

```

## MCP server setup

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

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/VYuI1g1eyG3IWQ2Zb/builds/GODDDrJyJ9hA6MVj6/openapi.json
