# Changelog of EU Maritime & Port Opportunity Monitor (`gabichuuuuu/eu-maritime-port-opportunity-monitor`) Actor

- **URL**: https://apify.com/gabichuuuuu/eu-maritime-port-opportunity-monitor/changelog.md
- **Full Actor documentation**: https://apify.com/gabichuuuuu/eu-maritime-port-opportunity-monitor.md

## Changelog

All notable changes to this private Actor are documented here.

### 0.2.0 - 2026-10-11

#### Added

- `maxScannedRecords` input (default 500, 50–5,000): per-source scan budget, separate from
  `maxResults`.
- Incremental cursors for PLACSP and TED. Each run continues where the previous one stopped;
  changing any relevance filter resets them and restarts the lookback window. Funding & Tenders
  publishes no modification date, so it rescans its window newest first on every run.
- Maritime domain prefilter applied by every source (server-side in TED, locally in PLACSP and
  Funding & Tenders) before classification.
- Retries with backoff for HTTP 429/502/503/504 and transport errors, honoring `Retry-After`.
- Pagination for TED and Funding & Tenders.
- `RUN_SUMMARY` fields `deferredCount`, `chargeLimitReached` and `sourceCursors`.

#### Changed

- `monitorId` is optional. Without it each run is an independent snapshot that reports every
  qualified opportunity in the lookback window, which also keeps the Store's daily test with the
  default input meaningful.
- Apify Console prefills `maxResults` (20) and `maxScannedRecords` (100) for a quick first run;
  API defaults are unchanged.
- Pay-per-event prices: `monitor-scan` USD 0.50 and `qualified-opportunity` USD 0.10, with
  platform usage included and a USD 0.50 minimum for the run's maximum cost.
- README: FAQ for Apify Store and search visitors, and headings that name the covered tenders
  and official sources.
- Default run memory is 2048 MB (maximum 4096 MB). Feed parsing is CPU-bound, so the default
  scan finishes within the Store test limit at about the same compute cost as before.
- Filters share one semantics across sources: CPV codes and NUTS codes match their whole branch,
  keywords use OR and match the start of a word ignoring case and accents, and a record that does
  not publish a filtered field is kept.
- Classifier v2: a qualified opportunity needs a primary signal (a maritime CPV code or a strong
  maritime term in the title). Weak terms only add evidence, and known false-positive phrases are
  excluded.
- `maxResults` bounds emitted events. Events beyond it, or beyond the run's charge limit, are
  deferred to the next runs instead of being dropped.
- TED records are identified by procedure, keeping the latest notice with a known phase.
- Country aliases `EL` and `UK` are normalized to `GR` and `GB` in input and output.
- Dataset events use `schemaVersion` `"2.0"`; `qualifiedCount` counts every qualified event group of
  the run, including deferred ones.
- The monitor state stores only qualified records, with schema version 2 and the source cursors.
  Records without activity for 180 days (counted from their deadline when later) are pruned.

#### Removed

- Absence-based cancellation reconciliation. `CANCELLED` requires an explicit upstream state.

#### Migration

- A state written by 0.1 is kept. Its records are marked as legacy, and their first observation by
  0.2 is recorded as a baseline without emitting or billing an event, because TED identities and
  some normalizations changed. The first run has no cursors and scans the full lookback window.
- Rolling back to 0.1 discards the 0.2 state (0.1 requires classifier version 1) and re-emits the
  opportunities first seen by 0.2.
- PLACSP reads up to 12 feed pages (about three days) per run: schedule monitors at least daily.

### 0.1.0

- Initial private beta for PLACSP, TED and EU Funding & Tenders.
