# EU public tenders (TED) to JSON (`fixandfocus/licitaciones-ue`) Actor

Public procurement notices from TED (Supplement to the Official Journal of the EU) as clean JSON, filtered by country, CPV, value, keywords and deadline. Official API, no scraping.

- **URL**: https://apify.com/fixandfocus/licitaciones-ue.md
- **Developed by:** [Santiago Alfonso Ramírez](https://apify.com/fixandfocus) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 tender notices

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 (TED) to JSON

Turns the **official TED API** (Tenders Electronic Daily, the Supplement to the Official Journal of the European Union) into clean JSON you can feed to a CRM, a spreadsheet, a dashboard or an AI agent.

No scraping and no HTML parsing: this Actor calls the public Search API that the Publications Office of the EU provides for data reusers, so the data is exactly what was published.

### What you get

One dataset item per notice, with:

- `publicationNumber`, `noticeId`, `noticeType` (contract notice, award notice, prior information…)
- `title` and `description` in the language you choose, falling back to English
- `buyer`: name, country, city and NUTS region
- `cpv` codes, `contractNature` (works, supplies, services) and `procedureType`
- `estimatedValue` and `totalValue`, each with its currency
- `placeOfPerformance`: countries, NUTS regions and cities
- `tenderDeadline` and `publicationDate`
- `winnerName` on award notices
- `url`, `xmlUrl` and `pdfUrl` of the official notice

No e-mail addresses and no contact persons are collected.

#### Example item

```json
{
  "publicationNumber": "629156-2026",
  "title": "Service for publishing job offers for people with disabilities",
  "noticeType": "cn-standard",
  "publicationDate": "2026-09-14",
  "tenderDeadline": "2026-10-13",
  "buyer": { "name": "ASOCIACIÓN INSERTA EMPLEO", "country": "ESP", "city": "Madrid", "region": "ES300" },
  "cpv": ["79000000"],
  "totalValue": { "amount": 888770, "currency": "EUR" },
  "placeOfPerformance": { "countries": ["ESP"], "regions": ["ES300"], "cities": ["Territorio nacional español"] },
  "url": "https://ted.europa.eu/en/notice/-/detail/629156-2026",
  "source": "© European Union, https://ted.europa.eu, 1998-2026. Reuse authorised (Commission Decision 2011/833/EU)."
}
```

### Filters

| Input | What it does |
|---|---|
| `paises` | Buyer countries as ISO alpha-3 codes: `ESP`, `DEU`, `FRA`… Empty = all |
| `cpv` | CPV codes; a parent such as `72000000` also matches `722xxxxx` |
| `palabrasClave` | Free-text words; a notice matches if it contains any of them |
| `tiposAnuncio` | TED notice types, e.g. `cn-standard`, `can-standard`, `pin-only` |
| `diasAtras` | How many days back to search (1–365) |
| `soloAbiertas` | Keep only notices whose tender deadline has not passed |
| `importeMinimo` / `importeMaximo` | Value range of the notice |
| `idioma` | Preferred language for title and description |
| `consultaExperta` | Extra TED expert-search expression, combined with the rest |
| `maxResultados` | Stop after this many saved notices |

Country, CPV, notice type, keywords and dates are pushed into the TED query itself, so the Actor downloads only what you asked for. Value and deadline are applied to the result.

### Typical uses

- **Sales pipeline**: watch new contract notices in your sector and country, and push them to your CRM.
- **Market research**: award notices tell you who won, for how much and where.
- **AI agents**: a stable JSON contract with an output schema, so an agent can chain this Actor with others.
- **Monitoring**: run it daily on a schedule and keep only what is still open.

### Pricing

Pay per event: you are charged for each notice saved to the dataset. A run that finds nothing costs nothing beyond platform usage.

### Notes and limits

- TED covers procurement above the EU thresholds and whatever else member states choose to publish there. For all Spanish contracts, including the smaller ones, use the PLACSP Actor instead.
- The API returns at most 250 notices per request; the Actor paginates for you.
- Values come as published. Some notices carry no value at all, and a few carry it only inside the lots; those come back as `null`.
- Only notices signed and published in the Supplement to the Official Journal are authentic. This Actor is a convenience layer on top of them.

### Source and licence

Data: TED, Publications Office of the European Union. TED's legal notice states that procurement notices published in the Supplement to the Official Journal can be freely reused for commercial or non-commercial purposes, under the Commission Decision of 12 December 2011 (2011/833/EU). Every item carries the attribution in its `source` field.

# Actor input Schema

## `paises` (type: `array`):

Three-letter country codes of the buyer, e.g. ESP (Spain), DEU (Germany), FRA (France), ITA (Italy). Empty = all EU countries.

## `cpv` (type: `array`):

CPV codes of the business sector, e.g. 72000000 (IT services), 45000000 (construction), 85000000 (health). Parent codes also match their children. Empty = all sectors.

## `palabrasClave` (type: `array`):

Free-text words searched in the whole notice; a notice matches if it contains any of them. Empty = no keyword filter.

## `tiposAnuncio` (type: `array`):

TED notice type codes, e.g. cn-standard (contract notice), can-standard (contract award notice), pin-only (prior information notice). Empty = all types.

## `diasAtras` (type: `integer`):

How far back to search, counted from today. Between 1 and 365.

## `soloAbiertas` (type: `boolean`):

Keep only notices whose deadline for receipt of tenders has not passed. Notices without a deadline (e.g. award notices) are dropped when this is on.

## `importeMinimo` (type: `integer`):

Keep only notices whose estimated or awarded value is at least this amount. Leave empty for no minimum.

## `importeMaximo` (type: `integer`):

Keep only notices whose estimated or awarded value is at most this amount. Leave empty for no maximum.

## `idioma` (type: `string`):

Three-letter language code used to pick the title and description when the notice is multilingual. Falls back to English, then to whatever the notice has.

## `consultaExperta` (type: `string`):

Optional TED expert-search expression combined with the other filters, e.g. procedure-type=open. See docs.ted.europa.eu. Max 500 characters.

## `maxResultados` (type: `integer`):

Stops after saving this many notices. Between 1 and 5000. You are charged per saved notice.

## `porPagina` (type: `integer`):

How many notices to request from TED per call. Between 1 and 250. Higher is faster and cheaper in platform usage.

## Actor input object example

```json
{
  "paises": [
    "ESP"
  ],
  "cpv": [
    "72000000"
  ],
  "palabrasClave": [],
  "tiposAnuncio": [],
  "diasAtras": 7,
  "soloAbiertas": true,
  "idioma": "eng",
  "maxResultados": 50,
  "porPagina": 100
}
```

# Actor output Schema

## `tenders` (type: `string`):

Items of the default dataset in JSON: one procurement notice per item, with buyer, values, CPV, place of performance, deadline and links to the official notice.

# 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 = {
    "paises": [
        "ESP"
    ],
    "cpv": [
        "72000000"
    ],
    "palabrasClave": [],
    "tiposAnuncio": [],
    "diasAtras": 7,
    "soloAbiertas": true,
    "idioma": "eng",
    "consultaExperta": "",
    "maxResultados": 50,
    "porPagina": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("fixandfocus/licitaciones-ue").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 = {
    "paises": ["ESP"],
    "cpv": ["72000000"],
    "palabrasClave": [],
    "tiposAnuncio": [],
    "diasAtras": 7,
    "soloAbiertas": True,
    "idioma": "eng",
    "consultaExperta": "",
    "maxResultados": 50,
    "porPagina": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("fixandfocus/licitaciones-ue").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 '{
  "paises": [
    "ESP"
  ],
  "cpv": [
    "72000000"
  ],
  "palabrasClave": [],
  "tiposAnuncio": [],
  "diasAtras": 7,
  "soloAbiertas": true,
  "idioma": "eng",
  "consultaExperta": "",
  "maxResultados": 50,
  "porPagina": 100
}' |
apify call fixandfocus/licitaciones-ue --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fixandfocus/licitaciones-ue"
        }
    }
}
```

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/Xb8LTnhJUlkr43AIg/builds/WphXRjtozbrRTNBTT/openapi.json
