# TenderDelta EU – TED CPV Award & Rebid Monitor (`herodcraperdz/tenderdelta-eu-ted-cpv-award-rebid-monitor`) Actor

Monitor EU TED procurement notices by CPV code, country, buyer and notice type. Detect new awards, updates and rebid signals using persistent baselines, before-and-after comparisons, original notice links and concise run summaries for procurement teams.

- **URL**: https://apify.com/herodcraperdz/tenderdelta-eu-ted-cpv-award-rebid-monitor.md
- **Developed by:** [choayb ouaret](https://apify.com/herodcraperdz) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.001 / result

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

## EU TED CPV Award/Rebid Monitor

A commercial-grade Apify Actor package for procurement intelligence teams monitoring notices published through **Tenders Electronic Daily (TED)**. The monitor filters by CPV code, country, buyer, notice type and search terms, then emits structured deltas instead of forcing users to review raw notice downloads.

### Product promise

The Actor is designed for suppliers, procurement consultancies, CROs, systems integrators and public-sector market intelligence teams that need to identify new contract opportunities, awards, amendments, cancellations, reopening signals and rebid-like changes from the EU TED publication stream.

The monitor keeps a durable named baseline in `TED_CPV_AWARD_REBID_BASELINES`. Baselines are keyed by the effective query configuration so separate monitoring profiles do not overwrite each other. Each run emits only meaningful deltas and one `RUN_SUMMARY` record.

### Core events

| Event | Meaning |
|---|---|
| `NEW` | A notice is newly observed in the configured result set. |
| `UPDATED` | A previously observed notice changed; `changes`, `changedFields`, and `changeDetails` expose old and new values. |
| `NO_LONGER_MATCHES_QUERY` | A notice leaves the current result set after previously matching. |
| `RUN_SUMMARY` | Counts, query context, baseline key and monitoring metadata for the run. |

The monitor also derives a `signalType`: `AWARD`, `OPPORTUNITY`, `REBID_OR_AMENDMENT_SIGNAL`, or `REMOVED_FROM_RESULT_SET`. This is a triage signal, not a legal determination that a procurement has been re-tendered.

### API and data model

The default endpoint is `https://api.ted.europa.eu/v3/notices/search`. The official TED Search API provides anonymous access to published procurement notices through `POST /v3/notices/search` \[1]. CPV 2008 is the current classification used to describe procurement subjects and supports hierarchical filtering from divisions through detailed categories \[2].

The package tolerates common response envelopes (`notices`, `results`, or `data`) and preserves a normalized notice record with a compact `rawHash`. For production deployments, validate the exact fields returned by your selected TED API query and pin a tested API contract in your release process.

### Recommended starting input

```json
{
  "cpvCodes": ["33600000"],
  "countries": ["DE", "FR", "NL"],
  "noticeTypes": ["can-standard", "can-modification", "cn-standard"],
  "searchTerms": [],
  "lookbackDays": 30,
  "pageSize": 100,
  "maxPages": 5,
  "resetBaseline": false
}
```

Use `resetBaseline: true` only for an intentional re-baselining operation. Keep it false for scheduled monitoring. The Actor does not provide legal, bid/no-bid, or award certainty; users should review the official TED notice before relying on a signal.

### Deployment

The package is structured for Apify Web IDE or CLI deployment. Install dependencies, run `npm run typecheck`, build the Actor, configure the input schema, and schedule a daily or twice-daily run. Do not use hourly polling unless you have confirmed that the value justifies the increased API and platform activity.

### Commercial packaging

The recommended initial offer is **Early Access** for procurement intelligence teams. The commercial value is the normalized delta stream, durable baseline, and triage-oriented signal classification—not merely downloading TED records. If using Apify result-based monetization, disclose that cost varies with the number of emitted records. For a fixed per-run price, implement an Apify custom event and charge it once after a successful run instead of pricing every Dataset item.

### Official references

\[1] [TED Developer Docs — Search API](https://docs.ted.europa.eu/api/latest/search.html)\
\[2] [TED — Common Procurement Vocabulary (CPV)](https://ted.europa.eu/en/simap/cpv)\
\[3] [European Commission — Common Procurement Vocabulary](https://single-market-economy.ec.europa.eu/single-market/public-procurement/digital-procurement/common-procurement-vocabulary_en)

### License

Copyright © 2026. Commercial use requires a separate license or written permission from the package owner. TED data remains subject to the applicable Publications Office of the European Union terms and notice-level rights.

# Actor input Schema

## `expertQuery` (type: `string`):

Optional native TED Search API query. If omitted, a publication-date lookback query is used.

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

Main CPV prefixes or full CPV codes, for example 33600000 or 33600000-6.

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

ISO country codes used to filter buyer or performance country where available.

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

TED notice-type labels to monitor.

## `searchTerms` (type: `array`):

Optional words matched against normalized notice text.

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

Publication lookback when expertQuery is not supplied.

## `pageSize` (type: `integer`):

TED API page size.

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

Maximum API pages per run.

## `apiUrl` (type: `string`):

Advanced override; normally leave the production endpoint unchanged.

## `resetBaseline` (type: `boolean`):

Set true only for an intentional fresh baseline; keep false for recurring monitoring.

## Actor input object example

```json
{
  "cpvCodes": [],
  "countries": [],
  "noticeTypes": [
    "CONTRACT_AWARD",
    "CONTRACT_NOTICE",
    "CONTRACT_MODIFICATION"
  ],
  "searchTerms": [],
  "lookbackDays": 30,
  "pageSize": 100,
  "maxPages": 5,
  "apiUrl": "https://api.ted.europa.eu/v3/notices/search",
  "resetBaseline": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

Normalized notice deltas emitted by the monitor.

## `baseline` (type: `string`):

Current monitoring baseline in the named Key-Value Store.

# 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("herodcraperdz/tenderdelta-eu-ted-cpv-award-rebid-monitor").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("herodcraperdz/tenderdelta-eu-ted-cpv-award-rebid-monitor").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 herodcraperdz/tenderdelta-eu-ted-cpv-award-rebid-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,herodcraperdz/tenderdelta-eu-ted-cpv-award-rebid-monitor"
        }
    }
}

```

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/diF8vUeKch9c8lNSO/builds/oq767ev8zx8VlZRo5/openapi.json
