registerwho keeps it, where, and under what terms
id: eu-ted-notices
name: TED (Tenders Electronic Daily), notices since 2026-09-15
publisher: Publications Office of the European Union
homepage: https://ted.europa.eu/
store: true
terms:
text: >-
TED data may be reused under the Commission's reuse policy (Decision 2011/833/EU) per the TED legal notice;
the API is open at developer.ted.europa.eu.
url: https://ted.europa.eu/en/legal-notice
read_on: "2026-10-04"sourcethe file, its shape and how it pages
subjectwhat one row is and what names it
kind: eu_tender_notice
one_row_is: subject
key:
from: identifier
scheme: ted_publication_number
display_name:
- "{notice-title.eng}"
- "{publication-number}"identifiersthe keeper's own ids and their shape
namesthe columns a search lands on
- column: notice-title.eng
role: display
why: "The notice title in English; TED translates every title, so the English member is always present (100 of 100 sampled)."
- column: buyer-name.*
role: display
why: >-
The buyer's name as the notice prints it, in the buyer's own language (4 of 100 sampled notices carry an
English member, so the whole map is read); the search "who is buying" lands here.
- column: winner-name.*
role: display
why: >-
The awardee's name as printed, in every language the notice carries, on award notices (41 of 100 sampled);
the search "who won" lands here, and it is the join to the company registers.datesthe keeper's dates, as printed
attributesevery other column kept, with the reason
wallswhat the terms forbid: never stored
dropcolumns left out
searchwhich ids and names answer a query
recordthe fields a record page shows, in order
holdingshow the count and the as-of are read
refreshhow often and how change is detected
connector_specthe grammar version
Read the whole page, 259 lines
connector_spec: "0.2"
# THE CONTRACTS SEARCH, source 4 (owner 2026-10-04). TED, the EU's Tenders Electronic Daily, through its Search API v3:
# contract notices, social-regime notices, award notices and prior information notices published since 2026-09-15
# (3,625 notices on a weekday, 1,869 of them contract notices, measured 2026-10-02). POST with a typed body (query,
# limit, fields, paginationMode ITERATION) and the next page's token read back from the body. Titles and names are
# language maps; the English member is declared beside the whole map. The read date is the header Date: TED's own
# publication date is on every notice (`publication-date`, printed as YYYY-MM-DD+HH:MM, kept as an attribute).
register:
id: eu-ted-notices
name: TED (Tenders Electronic Daily), notices since 2026-09-15
publisher: Publications Office of the European Union
homepage: https://ted.europa.eu/
store: true
terms:
text: >-
TED data may be reused under the Commission's reuse policy (Decision 2011/833/EU) per the TED legal notice;
the API is open at developer.ted.europa.eu.
url: https://ted.europa.eu/en/legal-notice
read_on: "2026-10-04"
source:
kind: api
url: https://api.ted.europa.eu/v3/notices/search
format: json
encoding: utf8
header: false
columns:
- publication-number
- publication-date
- notice-type
- notice-title
- notice-title.eng
- buyer-name
- buyer-name.*
- buyer-country
- organisation-country-buyer
- classification-cpv
- contract-nature
- procedure-type
- deadline-receipt-tender-date-lot
- estimated-value-glo
- estimated-value-cur-glo
- place-of-performance
- winner-name
- winner-name.*
- winner-country
- tender-value
- tender-value-cur
- links
compression: none
published_at:
from: header
header: Date
json:
rows: "notices[]"
api:
protocol: rest
method: POST
query: {}
body:
query: "PD>=20260915 AND notice-type IN (cn-standard cn-social can-standard pin-cfc-standard)"
limit: 100
paginationMode: ITERATION
fields:
- publication-number
- publication-date
- notice-type
- notice-title
- buyer-name
- buyer-country
- organisation-country-buyer
- classification-cpv
- contract-nature
- procedure-type
- deadline-receipt-tender-date-lot
- estimated-value-glo
- estimated-value-cur-glo
- place-of-performance
- winner-name
- winner-country
- tender-value
- tender-value-cur
auth: none
paging:
mode: cursor
cursor_param: iterationNextToken
next_cursor_path: iterationNextToken
subject:
kind: eu_tender_notice
one_row_is: subject
key:
from: identifier
scheme: ted_publication_number
display_name:
- "{notice-title.eng}"
- "{publication-number}"
identifiers:
- scheme: ted_publication_number
column: publication-number
shape: '^\d+-\d{4}$'
unique: true
why: "TED's own publication number, one per notice: the key."
names:
- column: notice-title.eng
role: display
why: "The notice title in English; TED translates every title, so the English member is always present (100 of 100 sampled)."
- column: buyer-name.*
role: display
why: >-
The buyer's name as the notice prints it, in the buyer's own language (4 of 100 sampled notices carry an
English member, so the whole map is read); the search "who is buying" lands here.
- column: winner-name.*
role: display
why: >-
The awardee's name as printed, in every language the notice carries, on award notices (41 of 100 sampled);
the search "who won" lands here, and it is the join to the company registers.
dates: []
attributes:
- column: publication-date
as: published
type: string
why: "TED's publication date as printed (YYYY-MM-DD with an offset)."
- column: notice-type
as: notice_type
type: string
why: "cn-standard, cn-social, can-standard, pin-cfc-standard: contract, social-regime, award, prior information."
- column: notice-title
as: title_by_language
type: string
why: "The title in every language TED prints (JSON map)."
- column: buyer-name
as: buyer_by_language
type: string
why: "The buyer name by language (JSON map)."
- column: buyer-country
as: buyer_country
type: string
why: "The buyer's country code(s)."
- column: organisation-country-buyer
as: buyer_organisation_country
type: string
why: "The buyer organisation's country code(s)."
- column: classification-cpv
as: cpv
type: string
why: "The CPV codes (JSON list)."
- column: contract-nature
as: contract_nature
type: string
why: "works, supplies or services (JSON list)."
- column: procedure-type
as: procedure_type
type: string
why: "open, restricted, negotiated and the rest as coded."
- column: deadline-receipt-tender-date-lot
as: deadline_by_lot
type: string
why: "The tender receipt deadline per lot (JSON list)."
- column: estimated-value-glo
as: estimated_value
type: string
why: "The estimated value, as printed."
- column: estimated-value-cur-glo
as: estimated_value_currency
type: string
why: "The estimated value's currency."
- column: place-of-performance
as: place_of_performance
type: string
why: "NUTS and country codes of the place of performance (JSON list)."
- column: winner-name
as: winner_by_language
type: string
why: "The winner name by language (JSON map), on an award notice: the incumbent."
- column: winner-country
as: winner_country
type: string
why: "The winner's country code(s)."
- column: tender-value
as: award_value
type: string
why: "The awarded value, as printed."
- column: tender-value-cur
as: award_value_currency
type: string
why: "The awarded value's currency."
- column: links
as: links
type: string
why: "TED's own links to the notice as XML and PDF per language (JSON map): the receipt's pointer to the keeper."
drop: []
walls:
never_stored: []
forbidden_shapes: []
search:
identifiers:
- ted_publication_number
# The title is the display name and already leads the search fold; listing it again doubled the fold and pushed
# the buyer and winner past the byte cap on 71% of notices (measured 2026-10-04).
names:
- buyer-name.*
- winner-name.*
native_script: true
min_chars: 3
# A title register (lesson #1033): the fuzzy stage is full-text over the fold, not trigram similarity.
text: true
record:
fields:
- from: "name:notice-title.eng"
label: Title
- from: "attribute:notice_type"
label: Notice type
- from: "name:buyer-name.*"
label: Buyer
- from: "attribute:buyer_country"
label: Buyer country
- from: "attribute:published"
label: Published
- from: "attribute:deadline_by_lot"
label: Deadline by lot
- from: "attribute:cpv"
label: CPV
- from: "attribute:contract_nature"
label: Nature
- from: "attribute:procedure_type"
label: Procedure
- from: "attribute:estimated_value"
label: Estimated value
- from: "attribute:estimated_value_currency"
label: Currency
- from: "attribute:place_of_performance"
label: Place of performance
- from: "name:winner-name.*"
label: Winner
- from: "attribute:award_value"
label: Awarded value
- from: "identifier:ted_publication_number"
label: TED publication number
holdings:
count: subjects
updated_at: provenance
refresh:
cadence: daily
mode: append
detect: both
connector_spec 0.2: the fourteen parameters above are the whole grammar.