EU TED Award Integrity Feed — Winners & Normalized Values avatar

EU TED Award Integrity Feed — Winners & Normalized Values

Pricing

$4.00 / 1,000 award rows

Go to Apify Store
EU TED Award Integrity Feed — Winners & Normalized Values

EU TED Award Integrity Feed — Winners & Normalized Values

Convert official EU TED notices into stable contract-award winner rows with original values, optional provenance-backed EUR amounts, direct notice links, and missing-data integrity flags.

Pricing

$4.00 / 1,000 award rows

Rating

0.0

(0)

Developer

Travis Berman

Travis Berman

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 days ago

Last modified

Share

EU TED Award Integrity Feed

Turn official EU procurement notices into deterministic award/winner rows that are easier to validate and join.

This Actor queries the public, unauthenticated TED Search API, emits one row per winner, preserves notice provenance, and flags missing or suspect winner/amount/currency data. It does not guess values or claim legal completeness.

Why use it?

Generic tender exports can be awkward for supplier analytics: winners may be absent, currencies are not directly comparable, and one notice may contain multiple winners. This feed provides:

  • stable rowId values for repeatable joins and deduplication;
  • one normalized row per notice/lot/winner;
  • original award amount and currency without destructive conversion;
  • optional EUR conversion only from a rate, date, and source URL you supply;
  • integrityStatus and machine-readable integrityFlags;
  • direct TED notice and API provenance;
  • bounded official-source access: no login, cookies, browser scraping, or proxy.

Input

For a live run, provide an inclusive publication range of at most 31 days:

{
"dataSource": "live",
"dateFrom": "2026-07-01",
"dateTo": "2026-07-07",
"countries": ["DE", "FR"],
"cpvCodes": ["72"],
"maxNotices": 50,
"maxRows": 100,
"exchangeRatesToEur": []
}

Optional filters are country, CPV prefix, and buyer text. Hard caps are 500 notices and 2,000 rows. Set dataSource to sample to run the bundled synthetic demonstration without network access.

Currency rates

exchangeRatesToEur is a list of source-currency rates, each expressing the EUR value of one currency unit:

[
{
"currency": "PLN",
"rate": 0.232,
"rateDate": "2026-07-09",
"sourceUrl": "https://data-api.ecb.europa.eu/"
}
]

The Actor does not fetch or infer rates. EUR uses an identity rate of 1. A non-EUR amount without complete supplied provenance remains amountEur: null and is flagged FX_RATE_MISSING.

Output

{
"rowId": "90c8bba603de49b529f90046",
"noticeId": "123457-2026",
"lotId": "LOT-0002",
"publicationDate": "2026-07-09",
"awardDate": "2026-07-07",
"title": "Municipal fleet maintenance",
"buyerName": "Example City",
"winnerName": "Warsaw Fleet Sp. z o.o.",
"winnerCountry": "PL",
"cpvCodes": ["50110000"],
"amountOriginal": 2500000,
"currencyOriginal": "PLN",
"amountAllocation": "sole-winner",
"amountEur": 580000,
"fxProvenance": {
"rate": 0.232,
"rateDate": "2026-07-09",
"sourceUrl": "https://data-api.ecb.europa.eu/",
"method": "user-supplied"
},
"integrityFlags": [],
"integrityStatus": "OK",
"noticeUrl": "https://ted.europa.eu/en/notice/-/detail/123457-2026",
"source": {
"name": "TED Search API",
"url": "https://api.ted.europa.eu/v3/notices/search"
}
}

The repository fixture and examples are synthetic and are not represented as real procurement awards.

Integrity flags

  • MISSING_NOTICE_ID
  • MISSING_WINNER
  • MISSING_AMOUNT
  • INVALID_AMOUNT
  • MISSING_CURRENCY
  • FX_RATE_MISSING
  • AMOUNT_SHARED_ACROSS_MULTIPLE_WINNERS — the notice/lot amount is repeated only for provenance and must not be summed across winner rows; inspect amountAllocation.
  • LOT_WINNER_ALIGNMENT_UNRESOLVED — TED returned multiple lot identifiers but its flattened search fields did not provide a safe one-to-one mapping to winners; lotId is MULTIPLE_OR_UNRESOLVED rather than a guessed lot.

REVIEW means at least one flag exists; it does not mean the underlying legal notice is wrong.

Local development

npm install
npm test
npm run validate

For deterministic Actor storage, pre-seed storage/key_value_stores/default/INPUT.json with examples/input.sample.json, unset APIFY_TOKEN and APIFY_IS_AT_HOME, set CRAWLEE_PURGE_ON_START=0, then run npm start or apify run.

Pricing and support

The proposed model is $0.004 per emitted award-row, with no start event. Pricing is not active until deployment/Store configuration. See docs/PRICING.md and docs/SUPPORT.md.

Important limitations

This is an analytics aid, not legal advice or a legally authoritative archive. TED source fields can be absent, multilingual, or revised. Always inspect noticeUrl before acting. Live compatibility must be sampled against the current TED response before release; local build completion alone is not a publication claim.