# EU TED Tenders & Procurement Leads (`arclay-tn/eu-ted-procurement-intelligence`) Actor

Official TED API data for EU tenders and public procurement leads. Export CRM-ready buyer, CPV, value, stage, dates, source links, quality reports, and optional Parquet files.

- **URL**: https://apify.com/arclay-tn/eu-ted-procurement-intelligence.md
- **Developed by:** [Arclay Suarl](https://apify.com/arclay-tn) (community)
- **Categories:**
- **Stats:** 1 total users, 0 monthly users, 60.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.90 / 1,000 results

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 Tenders & Procurement Leads

Get clean EU TED tenders, public procurement notices, and procurement lead data
without building your own Tenders Electronic Daily connector, normalization
layer, privacy filter, quality gate, or Parquet pipeline.

This Actor queries the official TED Search API, converts tenders and award
notices into a canonical procurement schema, suppresses personal-contact data,
validates the batch, and returns CRM-ready records in the default dataset.
Optional Parquet artifacts with SHA-256 checksums are written to the run
key-value store for analytical workflows.

### Why buyers use it

- Official-source TED data via documented API access, not rendered-page scraping.
- One normalized row per EU tender or award notice, with buyer, country, CPV,
  value, stage, dates, amendment flags, and official-source links.
- Privacy-safe commercial output: personal-contact fields are suppressed before
  publication.
- Quality report included with every run, so buyers can inspect validation
  status before using the data.
- Optional deterministic ZSTD Parquet bundle for DuckDB, Polars, pandas, and
  data-warehouse ingestion.

### Common use cases

- Find active sales opportunities by buyer country and CPV segment.
- Discover EU tender leads for software, construction, healthcare, services,
  and other CPV-defined markets.
- Monitor competitors, buyers, suppliers, frameworks, and amendments.
- Feed procurement leads into CRM, enrichment, BI, and market-sizing workflows.
- Build country or sector watchlists without maintaining TED ingestion code.

### Examples and integrations

Public API examples, pandas and DuckDB notebooks, and a CRM import mapping are
available at
https://github.com/AnasCharfi/eu-ted-procurement-examples.

### Input

- `dateFrom`, `dateTo`: publication date range, max 31 days.
- `country`: optional ISO alpha-3 buyer country code, e.g. `FRA`.
- `cpv`: optional CPV code or wildcard prefix, e.g. `30*`.
- `maxResults`: hard row cap, max 1,000.
- `includeParquet`: also produce Parquet files and checksums.

### Output

The default dataset contains normalized notice rows. The key-value store contains
`OUTPUT`, `QUALITY.json`, `QUALITY.md`, and optional `PARQUET_*` files.

Every output includes attribution to EU Tenders Electronic Daily (TED) and a
clear notice that this is an independent transformed dataset, not an official EU
or Publications Office product.

### What you get in each row

Each dataset item is one normalized procurement notice designed for search,
lead scoring, CRM import, and analytics. Common fields include:

- `record_id`, `source_notice_id`, and `source_url` for traceability back to TED.
- `publication_date`, deadline fields, and procurement stage.
- `buyer_name`, `buyer_country_code`, and normalized buyer identifiers where available.
- Notice title, description summary, CPV code, and procurement category.
- `estimated_value` and `estimated_value_currency` when TED publishes value data.
- Amendment and lot-count indicators for workflow triage.
- Retrieval and quality metadata for audit-friendly pipelines.

Personal-contact data is suppressed before records are written to the paid
dataset.

### Example output

```json
{
  "record_id": "ted:2025/S-150-512345",
  "source_notice_id": "512345-2025",
  "publication_date": "2025-08-04T00:00:00Z",
  "buyer_country_code": "FRA",
  "buyer_name": "Example public buyer",
  "title": "Software development and support services",
  "main_cpv_code": "72000000",
  "estimated_value": "250000",
  "estimated_value_currency": "EUR",
  "procurement_stage": "competition",
  "source_url": "https://ted.europa.eu/..."
}
```

Field availability depends on what the official TED notice contains. The Actor
keeps the schema stable and leaves unavailable values empty instead of inventing
data.

### Pricing examples

Current launch pricing is pay per result:

- 100 results: about `$0.19`.
- 1,000 results: `$1.90`.
- 5,000 results across multiple runs: about `$9.50`.

The small Actor Start event remains at Apify's default `$0.00005`, and platform
usage is included in the event price.

### CRM and BI use cases

- Sales teams can import tender leads into HubSpot, Salesforce, Pipedrive, or a
  spreadsheet by mapping buyer, country, CPV, deadline, value, and source URL.
- Market-intelligence teams can track demand by country, buyer, and CPV segment.
- RevOps teams can enrich notice rows with account ownership, territory rules,
  and competitor tags.
- Data teams can load Parquet artifacts into DuckDB, Polars, pandas, BigQuery,
  Snowflake, or a lakehouse pipeline.

### Why official TED API data beats scraping

- More stable than HTML scraping because it uses TED's documented Search API.
- Cleaner provenance: every record links back to the official source.
- Lower operational risk: no browser rendering, CAPTCHA handling, or fragile CSS
  selectors.
- Better for repeat workflows: deterministic date windows, bounded result caps,
  quality reports, and optional Parquet outputs.
- Easier compliance review: source attribution and legal boundary are included
  in every run.

### Source and legal boundary

Data is sourced from EU Tenders Electronic Daily (TED), https://ted.europa.eu,
and reused under Commission Decision 2011/833/EU on the reuse of Commission
documents. This Actor does not use EU or TED logos and does not claim official
status, endorsement, or affiliation.

Official notices can be corrected, amended, withdrawn, or updated after
publication. This Actor provides transformed data for lead generation,
analytics, and workflow triage. It is not legal, procurement, financial, or
compliance advice. Always verify current tender and award details at the
official TED source before making business, legal, or compliance decisions.

# Actor input Schema

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

Required. Inclusive TED publication date in YYYY-MM-DD format, for example 2026-08-01.

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

Required. Inclusive TED publication date in YYYY-MM-DD format, for example 2026-08-07. Maximum span is 31 days.

## `country` (type: `string`):

Optional ISO 3166 alpha-3 buyer country code. Use FRA for France, DEU for Germany, POL for Poland. Leave empty for all countries.

## `cpv` (type: `string`):

Optional CPV exact code or prefix. Examples: 72 for IT services, 300 for office/computer equipment, 45 for construction, or 45000000 for exact construction work. Short numeric prefixes are automatically treated as wildcards.

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

Hard cap on dataset rows. Keeps runs predictable and prevents accidental large charges.

## `procurementStage` (type: `string`):

Optional TED stage. Leave empty for all stages. Use competition for open tenders, result for awards, planning for upcoming notices, dir-awa-pre for direct awards, cont-modif for contract modifications.

## `minEstimatedValue` (type: `number`):

Optional minimum notice value. Matches estimated or awarded value in the source currency. Decimals allowed.

## `includeParquet` (type: `boolean`):

Also write deterministic ZSTD Parquet files and checksums to the run key-value store.

## `includeLots` (type: `boolean`):

Keep lot-related summary fields in notice rows. Full lot-table export is available in Parquet.

## Actor input object example

```json
{
  "country": "FRA",
  "cpv": "72",
  "maxResults": 100,
  "includeParquet": true,
  "includeLots": true
}
```

# Actor output Schema

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

Privacy-safe canonical notice rows.

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

Counts, attribution, disclaimer, and artifact inventory.

## `qualityReport` (type: `string`):

Machine-readable release gate report.

## `files` (type: `string`):

Parquet files, SHA-256 sidecars, and Markdown quality report.

# 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 = {
    "country": "FRA",
    "cpv": "72"
};

// Run the Actor and wait for it to finish
const run = await client.actor("arclay-tn/eu-ted-procurement-intelligence").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 = {
    "country": "FRA",
    "cpv": "72",
}

# Run the Actor and wait for it to finish
run = client.actor("arclay-tn/eu-ted-procurement-intelligence").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 '{
  "country": "FRA",
  "cpv": "72"
}' |
apify call arclay-tn/eu-ted-procurement-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,arclay-tn/eu-ted-procurement-intelligence"
        }
    }
}

```

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/sDKm2ZTRNnWaWvjFJ/builds/QfnOeLYbMsWx0dzVH/openapi.json
