EU TED Tender Lots & Award Outcomes Collector avatar

EU TED Tender Lots & Award Outcomes Collector

Pricing

from $1.00 / 1,000 procurement records

Go to Apify Store
EU TED Tender Lots & Award Outcomes Collector

EU TED Tender Lots & Award Outcomes Collector

Collect EU procurement opportunities and award outcomes from the official TED Search API and TED Open Data. Get one typed row per explicitly linked tender lot or award outcome, plus exact notice versions, winners, no-award reasons, change relationships, and coverage receipts. No login or API key.

Pricing

from $1.00 / 1,000 procurement records

Rating

0.0

(0)

Developer

Hunter M.

Hunter M.

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

EU TED Tender Lots & Award Outcomes Collector

Collect procurement notice versions, tender opportunities by lot, award and no-award outcomes, and corrigenda from official European Union sources. The Actor is keyless, deterministic, bounded, and designed for search, AI-agent, MCP, spreadsheet, and automated-data use.

Independent software: This Actor is not affiliated with, sponsored by, or endorsed by TED, the Publications Office of the European Union, or any EU institution. TED and other names and marks belong to their respective owners.

It uses two official sources for two different jobs:

  • TED Search API v3 selects notice versions with date, type, buyer-country, CPV, and full-text filters.
  • TED Open Data supplies the exact eProcurement Ontology (ePO) relationships between procedures, lots, award outcomes, tenders, and winner organizations.

Search's parallel field arrays are never zipped or treated as relational data. A lot or award row is emitted only from an explicit path in the official RDF graph.

Source attribution and reuse

Source: European Union, Publications Office of the European Union, Tenders Electronic Daily (TED). Every data row retains an official notice URL and relational rows retain the official Open Data graph URI.

TED's legal notice says that, unless otherwise noted, procurement notices published in the Supplement to the Official Journal of the European Union may be reused for commercial or non-commercial purposes. SIMAP metadata is dedicated to the public domain under CC0 1.0. SIMAP website editorial content is licensed under CC BY 4.0, which requires appropriate credit and an indication of changes.

This Actor selects, normalizes, groups, validates, and may truncate source data under documented bounds. Its output is therefore a processed representation, not an unchanged official notice or an authentic legal text. The source links, receipts, and issue records identify those transformations and omissions. The reuse notice does not grant rights in third-party works, trademarks, logos, names, or identifiable-person data; additional rights or a lawful basis may be required for a user's specific purpose.

TED and SIMAP names are used only to identify the data source. This Actor does not use a TED, SIMAP, Publications Office, or EU logo, seal, or emblem. It remains independent software and is not affiliated with or endorsed by an EU institution.

What you get

  • notice_version: one source-linked metadata row per selected TED notice version.
  • opportunity_lot: one row per exact Procedure → hasProcurementScopeDividedIntoLot → Lot relation, with title, main CPV, estimated value, currency, and tender deadline when present.
  • award_outcome: one row per exact LotAwardOutcome → concernsLot relation. Related tenders and winner organizations follow comprisesTenderAwardOutcome → concernsTender → isSubmitedBy → playedBy. Outcomes with clos-nw and a non-award justification are retained even when no tender exists.
  • notice_change: self-contained change identifiers, section identifiers, reasons, and document-change flags.
  • source_issue: machine-readable missing-graph, invalid-value, relationship-conflict, timeout, retry-exhaustion, or cap qualification.
  • page_receipt, collection_summary, and run_meta: free evidence for pagination, successful or failed RDF batches, completeness, request/byte totals, billing reconciliation, and execution safeguards.

The four business record kinds (notice_version, opportunity_lot, award_outcome, and notice_change) form the leading Dataset prefix. Free evidence follows that paid balance: collection_summary, then any issues and receipts, with run_meta last. This order makes the delivered business prefix directly auditable against pay-per-event charges.

Pricing and restart safety

The Actor costs $1 per 1,000 delivered procurement records ($0.001 each), plus a $0.00005 Actor-start event. One procurement-record event is charged for each delivered business row of the four kinds above. Summary, source-issue, page-receipt, and run-metadata rows have no custom result-event fee. The live Monetization panel says User pays platform usage costs: No, so normal run platform usage is included in these event prices. The minimum maximum-charge setting is $0.002. The platform's synthetic apify-default-dataset-item event must have a zero price; the Actor fails before writing data if that event has a nonzero price, because otherwise evidence rows would incur an additional Dataset-item event fee. Post-run Dataset access can still incur normal storage-operation charges under Apify's Store billing rules.

Before publication, the complete bounded result is committed as an immutable, fingerprinted, chunked plan in the run's default key-value store. The Actor writes only the affordable exact business-record prefix to the default Dataset, reads it back, then charges that stored prefix through the run API with a deterministic idempotency key. It confirms the live run charge count before appending free evidence. On restart, an exact stored-but-uncharged prefix is charged without being published twice; a charged-but-missing prefix from an older charge-before-store build can be repaired without charging twice. Any fingerprint, Dataset-prefix, run-identity, storage-identity, or live-count mismatch fails closed.

If the run's maximum charge is too low for the full plan, the Dataset contains the affordable business prefix followed by free evidence. collection_summary reports paid_records_planned, paid_records_delivered, paid_records_charged, paid_records_omitted, and spending_limit_reached; its per-kind emitted counts reflect only rows actually delivered. output_truncated=true and collection_complete=false when the spending limit omits records. Once evidence has begun, a resurrected run never inserts additional paid rows ahead of it, even if the later spending allowance is higher.

Quick start

The empty input is useful: it collects up to five opportunity notices from the seven publication days ending yesterday. Ending yesterday gives the Open Data publication process time to expose the corresponding named graphs while keeping the daily run comfortably bounded.

On a busy publication day, TED will report more than five matching notices. The saved default then emits a truthful notice_cap_reached issue and sets source_truncated=true and collection_complete=false; enrichment_complete can still be true for every notice in the selected five-notice prefix. Increase max_notices when prefix completeness is insufficient.

{}

Collect recent award and no-award outcomes in Germany and France:

{
"search_mode": "awards",
"lookback_days": 14,
"countries": ["DEU", "FRA"],
"max_notices": 25,
"max_award_records": 1000
}

Search an explicit historical window for medical procurement:

{
"search_mode": "both",
"published_after": "2026-08-01",
"published_before": "2026-08-03",
"cpv_codes": ["33190000"],
"keywords": ["medical equipment"],
"preferred_language": "en"
}

Explicit dates may include today. If Search has published a notice but its Open Data graph is not available yet, the Actor still emits notice_version plus sparql_graph_missing_or_no_rows; it does not manufacture lot or winner links.

Example opportunity lot

{
"record_kind": "opportunity_lot",
"publication_number": "754133-2025",
"procedure_identifier": "533ff290-6341-4582-aeaf-17f57a6afe36",
"lot_identifier": "LOT-0001",
"main_cpv_code": "33190000",
"estimated_value": "420036",
"estimated_value_currency": "EUR",
"deadline_receipt_tender": "2025-12-19T17:00:00+01:00",
"relationship_coverage_status": "complete"
}

Example no-award outcome

{
"record_kind": "award_outcome",
"publication_number": "449250-2026",
"lot_identifier": "LOT-0001",
"award_status_code": "clos-nw",
"non_award_justification_codes": ["no-rece"],
"tenders": [],
"has_awarded_tender": false,
"relationship_coverage_status": "complete"
}

Completeness and limits

  • Initial release covers eForms named graphs. Older legacy TED notices can produce metadata without relational enrichment.
  • Search uses bounded PAGE_NUMBER pagination and the public input stays below TED's documented 15,000-result limit.
  • Depending on search_mode, one or two Open Data enrichment families are queried. Each family uses strict batches of at most five zero-padded graph IRIs. Every batch uses explicit constant GRAPH blocks joined by UNION; variable-graph scans are not used.
  • Every dataset array is deterministically capped at its documented schema maximum. A semantic cap emits nested_array_cap_reached; RDF tender, winner, or no-award caps also set relationship_coverage_status=partial, and collection completeness becomes false.
  • The run Dataset is capped before billing. A pay-per-event spending limit may shorten only its immutable business-record prefix; all free evidence is retained after the paid balance reconciles.
  • Requests are serialized, paced, retried at most three times for 429/5xx/transport failures, and limited to 25 attempts. Retry-After above 30 seconds is refused.
  • Each body is bounded to 5 MB compressed and 10 MB decompressed; aggregate source bytes are bounded to 50 MB.
  • A SPARQL binding cap withholds the terminal group because it might be incomplete. Earlier exact groups remain usable and the summary is marked incomplete.
  • Negative money values such as sentinel -1, non-finite JSON, invalid official identities, conflicting lot relations, and multi-valued scalar relations are withheld and surfaced as issues.
  • No HTML fallback, browser automation, arbitrary SPARQL, arbitrary expert query, inferred join, popularity ranking, contact enrichment, or personal-data profiling is performed.
  • Exact publication-number retrieval is planned for a later version; this release selects notices through bounded date and procurement filters.

Run locally

python -m venv .venv
.venv/bin/pip install -r requirements-dev.txt
.venv/bin/python -m pytest

Set RUN_LIVE_SMOKE=1 to run opt-in tests against the two official endpoints. Network tests are skipped by default.

Permissions and privacy

The Actor requires LIMITED_PERMISSIONS, uses only public procurement data, and needs no API token. It writes the immutable delivery plan to the run's default key-value store and the reconciled result to the run's default Dataset; it does not access unrelated account storage. Buyer or winner organization names can identify a sole trader or natural person in some notices even though this Actor does not collect contact details. Users must establish a lawful purpose and appropriate access, retention, deletion, and rights-request handling for both run storages and their exports. See SECURITY.md for the trust boundary, source-rights limits, and reporting guidance.