# Changelog of UK Tenders Monitor: Government Contracts & Find a Tender Alerts (`lindenwerk/uk-tender-matcher`) Actor

- **URL**: https://apify.com/lindenwerk/uk-tender-matcher/changelog.md
- **Full Actor documentation**: https://apify.com/lindenwerk/uk-tender-matcher.md

## Changelog

### README: cross-links and examples, no code or price change (2026-10-08, build 0.1.5)

- Product name in the README now matches the Store title ("UK Tenders Monitor: Government Contracts & Find a Tender Alerts").
- New Examples section linking the published example task "IT and software tenders in the UK - last 7 days".
- "Other Lindenwerk Data Actors" lists all six sibling Actors by their current Store titles and Store URLs.
- No change to code, input schema, pricing, events, defaults or output.

All notable changes to the UK Public Tenders Monitor (Find a Tender, Bid Alerts) by Lindenwerk Data.

### Reliability update: long backfills keep finished days (2026-10-06, before the first public release)

- Fixed: the source time budget was a fixed 210 s and a timeout threw away every day that had already finished
  (the whole run failed). Long backfills with Find a Tender rate-limit pauses (120 s each) could hit this.
- A source that runs out of time or breaks now keeps what it delivered (finished Find a Tender days). The run
  says so: status message starting with **PARTIAL DATA**, a `PARTIAL SOURCE` log line with the missing days, and new
  `RUN_SUMMARY` fields `sourceStatus`, `partialSources`, `missingDays`, `sourceTimeBudgetSeconds`. Only delivered rows
  are charged.
- Time budget: 210 s for short monitor windows (unchanged), 60 s + 25 s per day for backfills (31 days: 835 s), always
  leaving at least 300 s before the run timeout.
- No change to prices, events, input fields, defaults or output fields.

### Listing quality update (2026-10-06, before the first public release)

- README: starts with an H2 "What is ...?" (Apify Store shows the Actor name as the page H1), new step-by-step
  "How to ..." section (first run, own profile, schedule, integrations, API) and a list of the other Lindenwerk Data Actors.
- Input form: fields grouped into sections (Competitor tracking, Date range and notice types, Output, Advanced) and a "Quickest try" hint in the form description.
- No change to the code, prices, events, output fields or defaults.

### 0.1 (2026-10-05)

First public release.

- Source: the Find a Tender OCDS release package API (UK central digital platform, Open Government Licence v3.0),
  one publication day at a time with cursor pagination, at most two days in parallel.
- Polite by design: on HTTP 429/503 the Actor waits the full `Retry-After` time before *any* further request (all
  parallel requests pause), retries the same page and never skips ahead. Identifying User-Agent, no proxies, no login.
- Procurement Act 2023 aware: above- and below-threshold notices, `legalBasis` (Procurement Act 2023 or PCR 2015 …),
  UK notice codes (`UK4` …), `aboveThreshold`, `suitableForSme` and `suitableForVcse` per lot, as output fields and
  filters (`thresholdLevels`, `smeSuitableOnly`, `vcseSuitableOnly`).
- One row per procurement: tender and planning updates in the same window are merged into the newest version, older
  ids in `relatedNoticeIds`. In monitor mode a later update of an already delivered procurement is not re-sent or
  re-charged.
- Matching: CPV prefixes (main CPV weighs more), keywords in title (full weight) and description (half weight) with
  rare-word weighting, `excludeKeywords`, UK regions by name or ITL/NUTS code (delivery location first, else buyer
  address), contract type, value range, `onlyOpen`, `competitorNames` (awards). `relevanceScore` 0–100 with
  plain-English `matchReasons`.
- Modes: `monitor` (only new since last run, per `stateKey`, named store `uk-tender-matcher-state`), `backfill` (up
  to 31 days) and `awards` (winning suppliers and awarded values).
- Store-test-proof defaults: the input form prefill is a stateless 7-day `backfill` with `maxResults` 25, so Apify's
  daily Store test gets rows on any day. API, task and schedule defaults stay `monitor`, `lookbackDays` 1,
  `maxResults` 200. `firstRunBackfillDays` (default 7, 0 = off): a first monitor run with an empty window looks back
  7 days once.
- Robust against outages: failed days give warnings, a hang is given up after 210 s, and a total outage ends the run
  *Failed* with a clear message, no charge and no state change. `RUN_SUMMARY` reports fetch, merge, filter and charge
  statistics.
- GDPR: contact-person names, personal e-mail addresses and phone numbers are removed from contact fields and free
  text; only functional buyer contacts and organisation names are output.
- Pay-per-event charging (`scored-match` USD 0.008, `notice` USD 0.003) with `maxResults` and maximum-total-charge stop.
- 89 offline pytest tests (synthetic Find a Tender fixture), including pre-publish checks of the Actor definition,
  pricing, brand rules, Store-test prefill and the Retry-After pause.
