# EU TED Tenders Scraper (Licitações da UE) (`kman-br/eu-ted-tenders`) Actor

Public procurement notices from the official EU TED Search API v3, normalized: English title, buyer organisation, country, CPV, value, publication date, deadline and notice link. No personal contacts and no supplier names.

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

## Pricing

from $2.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 TED Tenders

Public procurement notices from **TED (Tenders Electronic Daily)**, the EU's official journal for public tenders, through the official TED Search API v3. Each notice comes back in one flat, normalized record: English title when available, buying organisation, country, CPV code, value, publication date, deadline and a link to the notice.

No login, no API key, no proxy. Personal contacts (names, e-mails, phones) and supplier or winner names are never requested from the API and never returned.

### What you get

| Field | Meaning |
|---|---|
| `fonte` | Always `ted`. Same field name across the other procurement Actors of this family. |
| `id` | TED publication number, for example `736642-2026`. |
| `titulo`, `titulo_idioma` | Title in English when the notice has one; otherwise the original-language title and its language code. |
| `orgao` | Buying organisation (a public body or company, never a person). |
| `pais` | Buyer country, ISO 3166-1 alpha-3. |
| `cpv`, `cpv_adicionais` | Main CPV code and any additional CPV codes. |
| `valor`, `moeda`, `valor_tipo` | Estimated value of the procedure (`estimado`) or total awarded value (`adjudicado`) and its currency. `null` when the notice has no value. Buyers sometimes publish placeholder values such as 0.01. |
| `publicado_em` | Publication date, `YYYY-MM-DD`. |
| `prazo_em` | Earliest deadline for tenders (or, if absent, for requests to participate). `null` when there is none. |
| `status`, `tipo_aviso`, `procedimento` | TED form type (`competition`, `result`, ...), notice type (`cn-standard`, ...) and procedure type. |
| `source_url` | Page of the notice on ted.europa.eu. |
| `retrieved_at` | When the record was fetched. |

Example:

```json
{
  "fonte": "ted",
  "id": "736642-2026",
  "titulo": "France – Software supply services – Fourniture, mise en place, hébergement ...",
  "titulo_idioma": "eng",
  "orgao": "Bordeaux Métropole",
  "pais": "FRA",
  "cpv": "72268000",
  "cpv_adicionais": [],
  "valor": 800000,
  "moeda": "EUR",
  "valor_tipo": "estimado",
  "publicado_em": "2026-10-23",
  "prazo_em": "2026-12-01",
  "status": "competition",
  "tipo_aviso": "cn-standard",
  "procedimento": "open",
  "source_url": "https://ted.europa.eu/en/notice/-/detail/736642-2026",
  "retrieved_at": "2026-10-23T08:58:20.347Z"
}
```

The dataset only ever contains notices. How the run ended (status, reason, pages fetched, events charged) is in the `OUTPUT` record of the key-value store.

### Input

| Field | Description |
|---|---|
| `keywords` | Up to 10 words or phrases searched in the full text; a notice matches if it contains any of them. |
| `countries` | Buyer countries as ISO alpha-3 codes (`DEU`, `FRA`, ...). |
| `cpvCodes` | 8-digit CPV codes. A division code such as `72000000` also matches its subcategories. |
| `publishedFrom`, `publishedTo` | Publication period, `YYYY-MM-DD`. Default: the last 7 days. The period cannot exceed 31 days. |
| `noticeTypes` | `competition` (default), `result`, `planning`, `dir-awa-pre`, `cont-modif`, `consultation`. |
| `maxItems` | Default 50, hard limit 200. |

### Price

Pay per event: **US$ 0.002 per notice** (the standard `apify-default-dataset-item` event) plus the standard `apify-actor-start` event at US$ 0.0003 per run. Nothing else is charged. Runs that find nothing write nothing to the dataset.

### Limits

- At most 200 notices and 5 API pages per run. Inputs and environment variables can only lower these limits.
- Publication period of at most 31 days.
- The run stops by itself 90 seconds after it starts (or 15 seconds before the platform timeout, whichever comes first) and saves a partial summary with the reason `prazo_interno`.
- If nothing has been found 10 seconds after the start, the run stops early (reason `teto_margem`), so an empty search costs you only the US$ 0.0003 start event.
- It also stops when your maximum charge per run is reached.
- Memory is fixed at 256 MB.

### Data source and attribution

Source: TED – Tenders Electronic Daily, © European Union, https://ted.europa.eu

Data comes from the TED Search API v3 (`https://api.ted.europa.eu/v3/notices/search`). According to the TED legal notice, procurement notices published in the Supplement to the Official Journal of the European Union can be freely reused, for commercial or non-commercial purposes (Commission Decision of 12 December 2011). This Actor normalizes the fields of the original notices (for example the title language, the main CPV code, the value and the deadline), so the records are not the original notices; the original is always at `source_url`. This Actor is not affiliated with or endorsed by the European Union, and it does not use the TED logo.

Notices may describe identifiable private individuals in their full text. This Actor does not request or return contact points, personal names, e-mails, phones, or supplier and winner names; if you combine the data with other sources, clearing additional rights is your responsibility.

### Related Actors

More Actors from the same publisher:

- [Brazil Public Tenders & Procurement (Licitações BR)](https://apify.com/kman-br/licitacoes-br): Brazilian public tenders and procurement from the PNCP portal, with a source link on every record.
- [Brazil Expiring Gov Contracts PNCP (Contratos a Vencer)](https://apify.com/kman-br/contratos-a-vencer): PNCP public contracts ending within a chosen window of days, with the current supplier (company CNPJ) and value.
- [Brazil Framework Agreements PNCP (Atas para Carona)](https://apify.com/kman-br/atas-carona-pncp): Active PNCP price registration agreements (Atas de Registro de Preço) open to adhesion, with items, prices and validity.
- [PDF to Text & Markdown Converter (PDF para Texto)](https://apify.com/kman-br/pdf-to-text-markdown): Extracts the text layer of PDFs from public URLs as plain text and simple Markdown, with the page count.

Browse the full catalog: [kman-br.github.io](https://kman-br.github.io/) ([Português](https://kman-br.github.io/pt/)).

# Actor input Schema

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

Words or phrases searched in the full text of the notice (up to 10). A notice matches if it contains any of them. Empty means no text filter.

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

Country of the buying organisation as ISO 3166-1 alpha-3 codes, for example DEU, FRA, ITA (up to 30). Empty means all countries.

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

Common Procurement Vocabulary codes with 8 digits, for example 72000000 for IT services (up to 20). A division code also matches its subcategories. Empty means all sectors.

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

First publication date, YYYY-MM-DD. Default: 7 days before the end date.

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

Last publication date, YYYY-MM-DD. Default: today. The period between the two dates cannot exceed 31 days.

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

Kinds of notice to return. Default: competition (open calls for tenders).

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

Maximum number of notices charged in the run. The hard limit is 200 and is enforced in the code.

## Actor input object example

```json
{
  "keywords": [
    "software"
  ],
  "noticeTypes": [
    "competition"
  ],
  "maxItems": 50
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

OUTPUT: status, reason for stopping (maxItems, prazo_interno, teto_margem, teto_cobranca, fonte_429), pages fetched and events charged.

# 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": [
        "software"
    ],
    "noticeTypes": [
        "competition"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kman-br/eu-ted-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 = {
    "keywords": ["software"],
    "noticeTypes": ["competition"],
}

# Run the Actor and wait for it to finish
run = client.actor("kman-br/eu-ted-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 '{
  "keywords": [
    "software"
  ],
  "noticeTypes": [
    "competition"
  ]
}' |
apify call kman-br/eu-ted-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kman-br/eu-ted-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/6yE6zhUzWwXB4YDbM/builds/GUlPgIKKI1eD3NEV8/openapi.json
