# Changelog of GDELT News Scraper — Articles, Timeline & Images (`logiover/gdelt-news-scraper`) Actor

- **URL**: https://apify.com/logiover/gdelt-news-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/logiover/gdelt-news-scraper.md

## Changelog

### 2026-09-01

- Fleet-wide health check. Verified against this Actor's real run history: 30-day success rate, output row counts, per-field fill rates, and peak memory against the configured memory limit.
- Reviewed for the failure patterns that have cost this fleet runs — unguarded proxy setup, retry loops that can outlast the run's own time budget, and full-page HTML parsing that can exhaust a small container.
- No change to input, output fields or scraping logic.

### 2026-08-11

- Maintenance release: refreshed the build and dependencies.
- Re-verified live execution, non-empty structured output and dataset field/type integrity.
- Reviewed reliability (retries, pagination) and output quality as part of a full-fleet QA pass.

### 2026-08-01

- Completed the August 2026 full health check: verified empty/programmatic default, Console UI default, and two source-informed alternative inputs on Apify.
- Confirmed successful live execution, non-empty structured output, dataset-field/type integrity, and logical sample quality within the 5-minute quality window.
- Added a bounded official GKG-export fallback for sustained Document API throttling, with retrieval provenance and nullable feed-specific metadata in the dataset contract.
- Made fallback query evaluation honor phrases, parentheses, OR/AND/NOT and minus exclusions; excluded PAGE\_LINKS navigation noise that produced unrelated matches; field-filtered requests are never broadened silently.
- Aligned sort options with the official Document API, validates title/URL/timestamp/image fields before output, and made total upstream/fallback unavailability fail explicitly instead of returning a misleading successful empty dataset.
- Upgraded adm-zip to 0.6.0 and bounded archive download, entry count, and declared expansion size before processing GDELT's network-delivered export ZIPs.

### 2026-07-18

- Fixed empty results on common queries. The Actor now queries GDELT's native time-window directly (the previous explicit date-window pagination returned nothing from GDELT), so ordinary searches like ‘renewable energy’ or ‘electric vehicles’ across any timespan return articles again.
- Added a language-filter fallback so a strict source-language filter can never silently blank a run. No change to output fields.

### 2026-07-12

- **Fixed rate-limit timeout bug.** GDELT throttles per-IP and returns a plaintext notice (HTTP 200) instead of JSON. The previous code fetched one proxy URL once and reused it, so on a rate-limit it slept 30s and retried the *same dead IP* forever until the run timed out with 0 items. Now every request/retry pulls a **fresh Apify Proxy IP**, rate-limit responses are detected explicitly and trigger IP rotation, retries are **capped at 3** per window, and the final attempt falls back to a direct connection.
- **Added a ~4-minute time budget.** Long paginations stop gracefully, push whatever was collected, and exit successfully instead of hanging.
- **Proxy defaults to Apify AUTO** (`useApifyProxy: true`) instead of a dead datacenter group; added a prefill so the field is populated in the UI.
- **All inputs are now optional** (`required: []`). Empty input `{}` returns recent worldwide "artificial intelligence" news.
- **User-friendly dropdowns** for `timespan`, `language`, and `country` (comprehensive option lists with human labels). `query` stays free-text.
- **Numeric output as real numbers**: `tone` and timeline `value` are now numbers (were strings); dataset view formats `tone` as a number.
- Added a `fields` JSON-schema (title + description per field) to the dataset schema.
- Top-level errors are logged, not hard-thrown, so a partial run still finishes as success.
