# Changelog of DuckDuckGo Search Scraper — Organic SERP API (`datascraperes/duckduckgo-search-results-scraper`) Actor

- **URL**: https://apify.com/datascraperes/duckduckgo-search-results-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/datascraperes/duckduckgo-search-results-scraper.md

## Changelog

### 0.1

- Initial production-oriented Python Actor.
- Organic result extraction with token-aware pagination.
- Bounded retries, challenge detection, session rotation, and query deadlines.
- Result-level pay-per-event billing with preflight budget reservation.
- Production pricing of $0.60 per 1,000 delivered organic results, with no start fee.
- Store positioning as an organic SERP API with differentiated title and description.
- Fail-safe cloud pricing validation prevents accidental higher or duplicate per-item charges.
- Restart-safe result IDs prevent duplicate delivery and billing after migration or resurrection.
- Explicit input, dataset, and output schemas.
- Fixed internal concurrency of three workers; it is no longer user-configurable.
- Structural anti-bot detection avoids false positives when queries contain words such as `captcha`.
- Unexpected HTTP 200 pages are retried instead of being reported as legitimate empty searches.
- Runs with infrastructure failures and no delivered results now fail visibly after diagnostics are persisted.
- Higher-than-advertised runtime pricing fails safely; lower price drift is reported and the release gate enforces the exact price.
- Reduced default memory from 512 MB to 256 MB after live equivalence tests at 10 and 15 results.
- Removed duplicate final state writes by relying on the Apify SDK's awaited final `PERSIST_STATE` event.
- Added DataImpulse `sessid` sessions per query attempt, environment-proxy isolation, provider error classification,
  HTTP/2 protocol fallback, and a shared proxy circuit breaker.
- Added proxy failure counters to `SUMMARY` and `QUERY_STATUSES`, plus local tests for tiered billing and gateway
  recovery.
- Reduced Apify log noise: lifecycle and routine non-PPE SDK messages are suppressed while each completed query emits
  one user-facing progress line with query, results, and delivery totals.
- Simplified user-facing logs: transport and billing diagnostics are hidden, and every successful run ends with an
  explicit `Completed` message in both the log and terminal Actor status.
- Added live progress events while a query is running: search start, page fetch, accumulated result count, and query
  completion are logged before the final run status; retry and transport details remain internal diagnostics.
