# EU TED Tenders Scraper (`foxk1996/eu-ted-tenders`) Actor

Search EU TED procurement notices by CPV code, buyer country, and tender deadline using the official TED Search API. Exports structured tender records with buyer, CPV, dates, and notice links for bid consultants.

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

## Pricing

$30.00 / 1,000 tender scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## EU TED Tenders Scraper

### EU TED procurement search for bid consultants

EU TED Tenders Scraper is a focused Apify actor for consultants, sales teams, capture managers, and procurement analysts who need a fast export of public European tender notices. It uses the official TED Search API at `api.ted.europa.eu/v3/notices/search`, so it does not require logins, browser automation, residential proxies, or scraping of protected pages. The actor sends the API's required POST request with a JSON body containing `query`, `fields`, and `limit`; this is important because the TED search endpoint returns 405 for GET requests.

### What you get

Each scraped tender record is normalized into a flat dataset row with the publication number, tender title, buyer name, buyer countries, CPV codes, submission deadline, publication date, notice type, place of performance, description text when TED provides it, and direct TED notice/PDF/XML links. The output is designed for spreadsheet review, CRM import, lead qualification, and automated monitoring workflows.

### Search by CPV code, country, and deadline

Most users can fill in `cpvCodes`, `countries`, `deadlineFrom`, `publicationDateFrom`, and `maxResults`. CPV codes should be entered as numeric strings such as `45000000` for construction or `72000000` for IT services. Buyer countries use TED ISO-3 codes such as `DEU`, `FRA`, `ESP`, `ITA`, `NLD`, `POL`, or `SWE`; common ISO-2 entries like `DE` are normalized automatically. Deadline and publication date filters accept `YYYY-MM-DD` or TED's compact `YYYYMMDD` format. Advanced users may provide a raw TED expert-search `query`, which overrides the form filters.

### Use cases

Use this actor to build daily tender watchlists, find newly published opportunities in a target CPV family, audit public-sector demand by country, feed bid/no-bid triage sheets, or give researchers a quick sample of TED opportunities without teaching them the TED expert-search syntax. Bid consultants can run separate tasks by sector and buyer country, then merge the Apify datasets downstream.

### Pricing

This actor is intended for Apify pay-per-event monetization. Configure one paid event in Apify Console: `tender-scraped` at $0.03 per exported tender. Local runs, free runs, or non-PPE pricing-model runs are capped by the built-in free-run gate to avoid unlimited uncharged extraction.

### FAQ

#### Does it scrape private data?

No. It only calls public TED procurement API endpoints and exports public tender notice data.

#### Why are there no browser actions?

The official API is more stable and polite than browser scraping. It also avoids Cloudflare or login issues.

#### Why did my country filter fail?

TED expects its own ISO-3 style values in expert search. Try `DEU` instead of Germany, `FRA` instead of France, or use the actor's ISO-2 normalization for common European country codes.

#### Can I write a custom query?

Yes. Put a TED expert-search expression in `query`; the actor sends it as-is with the requested fields and limit.

# Actor input Schema

## `query` (type: `string`):

Optional raw TED expert-search query. When provided, it is sent as-is to api.ted.europa.eu/v3/notices/search and overrides the CPV, country, and deadline filters.
## `cpvCodes` (type: `array`):

CPV codes to filter by, such as 45000000 for construction. TED returns matching notices whose classification CPV is in this set.
## `countries` (type: `array`):

Buyer country codes in TED ISO-3 format, such as DEU, FRA, ESP, ITA, NLD, POL, or SWE. Common ISO-2 codes like DE are normalized where possible.
## `deadlineFrom` (type: `string`):

Optional tender submission deadline lower bound. Use YYYY-MM-DD or TED format YYYYMMDD; it becomes deadline-receipt-request >= YYYYMMDD.
## `publicationDateFrom` (type: `string`):

Optional publication date lower bound in YYYY-MM-DD or YYYYMMDD. The prefill keeps the default run small and recent enough for a quick smoke test.
## `maxResults` (type: `integer`):

Maximum number of tender records to export. The actor asks TED for this limit and also truncates client-side if the API over-serves.

## Actor input object example

```json
{
  "cpvCodes": [
    "45000000"
  ],
  "countries": [
    "DEU"
  ],
  "deadlineFrom": "",
  "publicationDateFrom": "2026-07-01",
  "maxResults": 10
}
````

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

// Run the Actor and wait for it to finish
const run = await client.actor("foxk1996/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 = {
    "cpvCodes": ["45000000"],
    "countries": ["DEU"],
}

# Run the Actor and wait for it to finish
run = client.actor("foxk1996/eu-ted-tenders").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "cpvCodes": [
    "45000000"
  ],
  "countries": [
    "DEU"
  ]
}' |
apify call foxk1996/eu-ted-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=foxk1996/eu-ted-tenders",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "EU TED Tenders Scraper",
        "description": "Search EU TED procurement notices by CPV code, buyer country, and tender deadline using the official TED Search API. Exports structured tender records with buyer, CPV, dates, and notice links for bid consultants.",
        "version": "0.1",
        "x-build-id": "KdT9VWybgDnzQgkuU"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/foxk1996~eu-ted-tenders/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-foxk1996-eu-ted-tenders",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/foxk1996~eu-ted-tenders/runs": {
            "post": {
                "operationId": "runs-sync-foxk1996-eu-ted-tenders",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/foxk1996~eu-ted-tenders/run-sync": {
            "post": {
                "operationId": "run-sync-foxk1996-eu-ted-tenders",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "maxResults"
                ],
                "properties": {
                    "query": {
                        "title": "Raw TED expert query",
                        "type": "string",
                        "description": "Optional raw TED expert-search query. When provided, it is sent as-is to api.ted.europa.eu/v3/notices/search and overrides the CPV, country, and deadline filters."
                    },
                    "cpvCodes": {
                        "title": "CPV codes",
                        "type": "array",
                        "description": "CPV codes to filter by, such as 45000000 for construction. TED returns matching notices whose classification CPV is in this set.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "countries": {
                        "title": "Buyer countries",
                        "type": "array",
                        "description": "Buyer country codes in TED ISO-3 format, such as DEU, FRA, ESP, ITA, NLD, POL, or SWE. Common ISO-2 codes like DE are normalized where possible.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "deadlineFrom": {
                        "title": "Deadline from",
                        "type": "string",
                        "description": "Optional tender submission deadline lower bound. Use YYYY-MM-DD or TED format YYYYMMDD; it becomes deadline-receipt-request >= YYYYMMDD.",
                        "default": ""
                    },
                    "publicationDateFrom": {
                        "title": "Publication date from",
                        "type": "string",
                        "description": "Optional publication date lower bound in YYYY-MM-DD or YYYYMMDD. The prefill keeps the default run small and recent enough for a quick smoke test.",
                        "default": "2026-07-01"
                    },
                    "maxResults": {
                        "title": "Maximum results",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum number of tender records to export. The actor asks TED for this limit and also truncates client-side if the API over-serves.",
                        "default": 10
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
