# Changelog of EU CORDIS API — Horizon Europe & H2020 Scraper (`devilscrapes/eu-cordis-grants`) Actor

- **URL**: https://apify.com/devilscrapes/eu-cordis-grants/changelog.md
- **Full Actor documentation**: https://apify.com/devilscrapes/eu-cordis-grants.md

## Changelog

All notable changes to this Actor will be documented in this file.

### \[0.3.0] — 2026-05-20

#### Fixed

- Add `prefill` to the discriminating input field so Apify's automated daily QA receives a runnable payload. Empty-input runs were tripping the Pydantic `model_validate` XOR/required-field check inside 100 ms, which after three consecutive days flagged the Actor "Under maintenance" and unlisted it from the Apify Store.

### \[0.2.0] — 2026-05-16

#### Added

- Regression test `test_proxy_session_id_matches_apify_regex` — verifies the
  Apify Proxy session_id template satisfies `^[\w._~]+$` (Gate 9).

### \[0.1.0] — 2026-05-16

#### Added

- Initial release: four input modes — `projectIds`, `searchQuery`, `programmeFilter`, `countryFilter`.
- Pydantic v2 XOR validator: exactly one input mode field required.
- Horizon Europe (HORIZON) and Horizon 2020 (H2020) framework programmes supported.
- 20-field `ResultRow` per project: funding amounts, coordinator + participants
  (organisations and countries), programme + display name + call ID + funding scheme,
  start/end dates, status (SIGNED / CLOSED / TERMINATED), objective text, keywords.
- Country filter implemented as post-filter on coordinator country.
- `includeFullAbstract` mode deep-fetches the project detail HTML page via parsel
  to surface the untruncated objective; charged as `result-row-detailed`.
- Single-hit anomaly handled: CORDIS returns `hits.hit` as a dict (not a list) when
  only one project matches; `_ensure_list()` normalises every nested array.
- Programme primary selection respects `@attributes.uniqueProgrammePart=true`.
- Exponential backoff with `Retry-After` for 429 / 503 responses; max 5 attempts.
- Three PPE events: `actor-start` ($0.05), `result-row` ($0.003), `result-row-detailed` ($0.005).
- `curl-cffi` with Chrome 131 TLS impersonation (ADR-0002 house default).
- Apify Proxy support via `BUYPROXIES94952` group (opt-in via `useProxy`).
