---
title: "EU public tenders (TED) by country and CPV, open notices sorted by submission deadline — $0.02"
method: GET
path: "/v1/data/tenders/eu/{country}/{cpv}"
tags: ["data"]
---

# EU public tenders (TED) by country and CPV, open notices sorted by submission deadline — $0.02

`GET /v1/data/tenders/eu/{country}/{cpv}`

## Request

- Base URL: `https://x402.asterpay.io`
- URL: `https://x402.asterpay.io/v1/data/tenders/eu/{country}/{cpv}`
- Auth: one of:
  - API key in header `PAYMENT-SIGNATURE`
  - HTTP payment

Contract notices published on TED in the last 90 days (or since ?since=YYYY-MM-DD; the response returns next_since so a daily poll pays only for new notices) for one country (or all of the EU/EEA) and one CPV code prefix, newest 50, sorted by submission deadline with days_to_deadline, buyer, estimated value, procedure and the notice link. Counts open notices and those closing within 14 days. Covers notices above the EU thresholds only; national below-threshold portals are not included. Source: TED — Tenders Electronic Daily (Publications Office of the EU) (free reuse with attribution (EU reuse policy)). Cadence: daily; observed_at in the response is the upstream timestamp.

## Path parameters

- `country` string, required
- `cpv` string, required

## Query parameters

- `since` string

## Response `200`

EU public tenders (TED) by country and CPV, open notices sorted by submission deadline

- object
  - `success` boolean, required
  - `data` object, required: Door-specific payload; see the door description and GET /v1/data for an example URL
  - `source` object, required
    - `name` string, required
    - `url` string, required
    - `license` string, required
  - `observed_at` string, nullable, required: Upstream publication/observation time (ISO 8601). Never the AsterPay fetch time.
  - `fetched_at` string, required: When AsterPay last fetched from the upstream
  - `cadence` 'live' | '5m' | '15m' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly', required
  - `next_expected` string, nullable: Earliest time a newer upstream value is expected
  - `cache_expires_at` string
  - `stale` boolean, required: true when the upstream failed and a cached copy under 24h old was served
  - `timestamp` string, required

## Other responses

- `402`: Payment Required — pay via x402 or MPP (USDC on Base, Ethereum, Polygon, Arbitrum, Optimism or SKALE), then retry. See the WWW-Authenticate and Payment-Required response headers, or the `accepts` array below. The example is the exact body the runtime returns (minus per-request extras such as example_response and extensions.bazaar).

---

[API](https://skmtc.dev/asterpay/apis/asterpay-data-api.md) · [All operations](https://skmtc.dev/asterpay/apis/asterpay-data-api/llms.txt) · [OpenAPI document](https://skmtc.dev/asterpay/apis/asterpay-data-api/revisions/97b4ab464b3b?raw)
