# TED Tender Delta Feed (`longish_whistle/ted-tender-delta-feed`) Actor

Search the official TED API, normalize multilingual procurement records, and compare snapshots for new or changed notices. Evidence links, dates and missing-data warnings included.

- **URL**: https://apify.com/longish\_whistle/ted-tender-delta-feed.md
- **Developed by:** [Tender Delta](https://apify.com/longish_whistle) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 delivered 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## TED Tender Delta Feed

Turn published EU procurement notices into consistent records for spreadsheets, procurement software and automation workflows. Search by publication dates, CPV categories, buyer countries and notice type. Compare against a previous run to return only new or changed notices.

The underlying TED search API is free. This Actor charges for normalization, change comparison and delivery inside Apify. If you only need occasional manual searches, the official TED website may be sufficient.

### Output

Each delivered notice includes its publication number, title and available languages, buyer names, buyer countries, CPV categories, publication date, source deadline dates, estimated value candidates, currencies, original links and data-quality warnings. Export the dataset through Apify as JSON. For spreadsheets, download the `OUTPUT-CSV` record from the run's default key-value store: it quotes fields, preserves Unicode and escapes source text that could be interpreted as spreadsheet formulas. This protection applies to `OUTPUT-CSV`; it does not certify Apify's separate built-in dataset CSV export. The JSON dataset preserves the source text.

`CSV-INFO` reports the number of exported rows and whether collection finished and the source search was complete. If a later source page fails, previously delivered rows remain available in the partial CSV; the run still fails and does not create a successful snapshot. A retry can deliver and charge for previously delivered records again, so inspect a failed run's dataset before retrying it.

No email addresses, phone numbers or personal contact lists are collected. Buyer country is not necessarily the place of performance. Multiple lot dates are not mapped to individual lots. Amounts and currencies are preserved as candidates and never incorrectly paired or summed. A missing value remains missing.

### Example

```json
{
  "lookbackDays": 7,
  "cpvCodes": ["72000000"],
  "noticeTypes": ["cn-standard"],
  "maxResults": 100
}
```

Common starting categories include IT services (`72000000`), software packages (`48000000`) and translation services (`79530000`). TED defines classification search behavior. Check resulting CPV codes before using them in your downstream process.

### New and changed records

Each successful run writes `SNAPSHOT` and `SUMMARY` into its default key-value store. For the next run, pass your previous run's `defaultKeyValueStoreId` as `previousSnapshotStoreId`, and set `changesOnly` to `true`. Your workflow must pass that ID explicitly. Simply creating a daily schedule without passing the previous ID will not suppress previous notices.

Snapshots are isolated by each customer's own storage permissions and checked against the selected filters. The first comparison treats all records as new. A changed publication number is a separate notice. No record being absent from a search is ever described as deleted. Snapshots retain up to 10,000 identifiers; the summary discloses any dropped history.

### Limits and reliability

Maximum 1,000 delivered notices, 20 search pages and a 90-day date range per run. Search pages contain up to 50 records. The summary explicitly reports incomplete results, invalid source records, caps and the reason for stopping. No result set is advertised as a complete EU opportunity list.

Requests use the official API, one at a time, with bounded retries and cooldown handling. The Actor does not use residential proxies, logins or browser evasion. Source failures fail the run rather than masquerading as zero demand.

### Pricing

USD 0.006 per delivered notice ($6 per 1,000), plus USD 0.00005 per Actor start at the supported 256–512 MB memory sizes. Platform usage is included for the buyer. For example, 100 delivered notices in one run cost USD 0.60005; a run with no delivered notices still has the start fee. The live Pricing tab is authoritative.

The custom event is `qualified-notice`: here “qualified” means a valid structured record matching the search, **not supplier eligibility or a verified open tender**. Unchanged records in changes-only mode are not delivered or charged as notices. There is no separate default-dataset-item fee. Set a maximum cost per run to control your spending; the Actor stops delivering notices when the remaining amount cannot cover another record and reports `customer_budget`. Defaults are 100 notices, 256 MB, a 120-second timeout and a USD 1 maximum run cost. Callers can override run options. A timeout can leave partial results; inspect them before retrying.

### Source and use

Source: TED, Publications Office of the European Union. Output modifies the format of source data and includes original links. This is an independent tool, not an official EU product. The service does not submit bids, establish procurement eligibility, predict awards, or guarantee completeness, translation quality, value or deadlines. Consult the official notice and individual lots before acting.

Official source documentation: https://docs.ted.europa.eu/api/latest/search.html

### Support scope

Supported: reproducible defects in documented input, output or source retrieval. Unsupported: custom scraping sites, bespoke CRM integration, tender writing, legal procurement advice and individually tailored lead lists. Report the run ID and a description without private credentials. Standard Actor Contract applies when published; listing notes do not replace its obligations.

# Actor input Schema

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

UTC calendar days, inclusive of today.

## `dateFrom` (type: `string`):

YYYY-MM-DD. Overrides lookbackDays. Use a stable date window when comparing snapshots.

## `dateTo` (type: `string`):

YYYY-MM-DD; defaults to current UTC day.

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

Eight-digit CPV codes. TED applies its own classification search semantics. Empty searches all categories.

## `buyerCountries` (type: `array`):

TED three-letter country codes such as DEU, FRA, IRL. Buyer location, not necessarily place of performance.

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

Default contract notices. Empty includes awards and other notice types. A contract notice does not guarantee applications remain open.

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

Maximum number of delivered notices. Reaching the cap is reported as an incomplete search.

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

Limits resource use. A partial window is explicitly reported.

## `language` (type: `string`):

Three-letter language. Falls back to original available language; no machine translation.

## `changesOnly` (type: `boolean`):

Compare against the optional previous snapshot. On the first run, all are new. Omission never means deletion.

## `previousSnapshotStoreId` (type: `string`):

Optional store from your own previous run containing SNAPSHOT. Grants read-only access to this selected store under Limited permissions. Your workflow passes the prior run defaultKeyValueStoreId. No shared cross-customer state.

## Actor input object example

```json
{
  "lookbackDays": 7,
  "cpvCodes": [
    "72000000"
  ],
  "buyerCountries": [],
  "noticeTypes": [
    "cn-standard"
  ],
  "maxResults": 100,
  "maxPages": 5,
  "language": "eng",
  "changesOnly": false
}
```

# Actor output Schema

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

Delivered normalized notices with official source links, multilingual fields, change status and data-quality warnings. A bounded run may cover only part of the search.

## `spreadsheetCsv` (type: `string`):

UTF-8 CSV of delivered records with formula prefixes escaped. Check CSV-INFO and SUMMARY for completeness before use.

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

Counts, warnings and stop reason for a completed collection. Missing if collection failed; delivered partial rows can still exist.

## `supportingFiles` (type: `string`):

Run files including SNAPSHOT for a future comparison, CSV-INFO for delivery status, and the original input. Snapshot is created only on successful collection.

# 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("longish_whistle/ted-tender-delta-feed").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("longish_whistle/ted-tender-delta-feed").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 longish_whistle/ted-tender-delta-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,longish_whistle/ted-tender-delta-feed"
        }
    }
}
```

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/0vgvPSwY1ZFYAimWK/builds/TyRx3XlxwcyVemrTB/openapi.json
