ted-tender-change-monitor avatar

ted-tender-change-monitor

Pricing

from $2.00 / 1,000 results

Go to Apify Store
ted-tender-change-monitor

ted-tender-change-monitor

Monitor TED public procurement notices, normalize tender data, and detect NEW, UPDATED, and CORRIGENDUM changes.

Pricing

from $2.00 / 1,000 results

Rating

0.0

(0)

Developer

DataDelta

DataDelta

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

TED Tender Change Monitor

Monitors official EU TED (Tenders Electronic Daily) procurement notices and reports what changed since the previous run.

Instead of re-emitting a raw tender feed, this Actor answers one question: which notices are new, which were updated, and which are corrections?

Source: TED Search API v3 — POST https://api.ted.europa.eu/v3/notices/search. The API is official, public and keyless. No credential, account or proxy is used.


What it does

  1. Queries TED for a bounded publication-date window.
  2. Projects a fixed set of organisation-level fields.
  3. Computes a deterministic SHA-256 fingerprint per notice.
  4. Compares against a stored snapshot from earlier runs.
  5. Emits one dataset row per changed notice, tagged NEW, UPDATED or CORRIGENDUM.

Output

One row per emitted notice:

FieldMeaning
deltaStatusNEW, UPDATED, CORRIGENDUM or UNCHANGED
publicationNumberTED publication number (stable notice identifier)
publicationDatePublication date
noticeTypeTED notice type
formTypeTED form type (corrections are detected from this)
procedureTypeProcedure type
buyerNameContracting authority (organisation-level)
buyerCountryBuyer country code
legalBasisLegal basis
noticeIdentifierNotice identifier
tedNoticeUrlLink to the notice on TED
contentFingerprintSHA-256 over the sorted organisation-level fields, so the change decision can be verified independently
firstSeenAt / lastSeenAtWhen the notice was first and most recently observed
changeDetectedAtWhen the current state was detected
sourceAttributionRequired attribution for reused TED content

The auto-attached TED links block is deliberately dropped: it is not stable, so including it would produce false UPDATED results.

Change semantics

Precedence is fixed and deterministic:

SituationState
Never seen before, and it is a correctionCORRIGENDUM
Never seen before, otherwiseNEW
Seen before and content changed, and it is a correctionCORRIGENDUM
Seen before and content changed, otherwiseUPDATED
Seen before and content identicalUNCHANGED

A correction takes precedence over NEW/UPDATED because that is the more useful fact about it.

Input

Every input is optional. With no input the Actor monitors the last 7 days, which keeps a default run small and cheap.

InputDefaultNotes
dateFrom7 days before dateToYYYY-MM-DD
dateTotoday (UTC)YYYY-MM-DD
countriesallBuyer country codes, e.g. DEU, FRA, LTU
noticeTypesallTED notice-type codes
includeUnchangedfalseSee billing below
maxNotices200Bounds runtime and platform cost (hard ceiling 5000)
snapshotKeydefaultNamespace for the stored snapshot, to keep independent pipelines apart
resetSnapshotfalseDiscards the snapshot first, so everything is reported again

The maximum publication-date window is 366 days.

Billing

You are charged per dataset item, and this Actor writes exactly one item per emitted notice.

With includeUnchanged: false (the default) only NEW, UPDATED and CORRIGENDUM notices are written, so you are charged only for results that carry information. An unchanged re-run produces no rows and no charge.

This Actor defines no custom charge events and never calls Actor.charge(). Monetisation uses only the platform's synthetic per-item event.

resetSnapshot: true deliberately makes previously reported notices billable again. Use it only when you intend to re-read a window from scratch.

Personal data

Only organisation-level fields are requested. The field list is an allowlist, and it is not user-configurable: because contact fields are never requested, TED never returns them and they cannot reach the output. The TED field enum does contain contact fields (for example organisation-email-tenderer, touchpoint-fax-buyer, ubo-email); none of them are used, and a start-up guard refuses to run if a personal-data field name is ever added to the configuration.

As a second line of defence, every projected value is scanned before output and any email address — or phone-shaped value in a field where digit runs are not legitimate — is redacted and reported in the run summary. Fields such as legalBasis are exempt from phone-shaped matching so that a value like 32014L0024 is preserved.

Resilience

TED explicitly excludes the field list from its API versioning, so a field name can be added, removed or renamed inside v3 without a version change. This Actor therefore validates its field list against the live API at run time and fails soft: if a field is rejected, the offending name is identified, dropped, and the run continues with the remaining fields. Country and notice-type filters are always re-applied locally, so results stay correct even when the query has to be degraded to a plain date range.

Any degradation is recorded in the run's SUMMARY record rather than being silently ignored.

Attribution

TED procurement notices may be reused commercially. Editorial content is licensed CC BY 4.0, which requires credit and an indication of changes — deltaStatus is that indication, and sourceAttribution carries the credit on every row.

Development

The rules live in dependency-free modules (src/normalize.py, src/ted_client.py, src/snapshot.py, src/pipeline.py, src/runparams.py, src/filtering.py). Only src/main.py and src/http_transport.py touch the Apify SDK and HTTP.

$python -m pytest tests -q

The test suite runs fully offline: the HTTP transport is injected, so no network access or credential is required.

Known limitations

  • Country and notice-type query predicates are not verified against the live TED API. They are attempted first and degraded away on HTTP 400; the filter is then applied locally, which is correct but may fetch more notices than strictly necessary.
  • The format of TED's buyer-country values is not verified, so an unrecognised code yields no matches rather than an error.
  • Corrigendum detection relies on returned form-type/notice-type values, not on a TED query filter: the documented form-type=corrigendum filter returned HTTP 400 when last tested.
  • UNCHANGED notices are still recorded in the snapshot so they cannot age out and be re-billed as NEW. The snapshot is pruned after 180 days.
  • The Actor reports a failed run if TED returns no notices and reported errors, rather than reporting a clean empty run. A silent "success" would be indistinguishable from "nothing matched" and would hide a broken integration.