# Changelog of iNaturalist Scraper — Observations, Taxa & Species (`logiover/inaturalist-scraper`) Actor

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

## Changelog

### 2026-10-15

- Every request now has a hard time limit, so a proxy connection that stalls can no longer hold up the run or push it past its timeout.
- A run that reaches its maximum cost per run now stops cleanly with its results saved and a status message, instead of ending as aborted.
- A proxy group your account cannot use no longer stops the run at start-up; it falls back to the default Apify Proxy.
- Runs with a short timeout (API and AI-agent calls) now finish inside it with what they collected, instead of being cut off.
- Memory is managed within the run's own limit, which removes a rare out-of-memory crash on large pages.
- The prefilled example for `maxResults` is now 333 (was 500).
- The default used when the field is left out for `maxResults` is now 6,666 (was 200).

### 2026-09-23

- Fleet-wide quality audit. Verified end to end against live data and re-checked the input schema, the output columns and the run configuration.
- Output verified on a live run: 18 columns returned, 98.7% of cells populated.
- Run reliability reviewed: 100.0% of public runs succeeded in the last 30 days.
- Input schema, output schema and pricing configuration reviewed.

### 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.
- Preserved taxon-filter semantics: an unresolved taxon no longer falls back to unrelated unfiltered observations, first-page API failures now fail explicitly, and invalid mode-specific inputs are rejected instead of succeeding empty.
- Documented that taxonName and iconicTaxon are intersected, and refreshed the contradictory Aves + Panthera health-check input to the officially verified productive Aves + Corvus combination.
- Aligned README output documentation with the actual 18-field numeric contract, including integer IDs, numeric coordinates, positional accuracy and identification-agreement counts.

### 2026-07-18

- Maintenance & reliability pass — re-verified end-to-end against live data via the Apify API; confirmed the Actor completes successfully and returns non-empty, well-formed results within the 5-minute quality window on its default input.
- Refreshed build so the latest version is current; no change to inputs, output fields or scraping logic.

### 2026-07-12

- **Fixed empty-input run returning 0 rows.** Removed the `taxonName: "Mammalia"` prefill. The observations API `taxon_name` param only matches exact species, so a class name returned nothing. Empty input now pulls the most recent research-grade observations (hundreds of millions available).
- **Higher taxa now work.** `taxonName` is resolved to a taxon id via `/taxa?q=<name>` and passed as `taxon_id`, so any rank works (species, genus, family, order, class, or a common name).
- **New `iconicTaxon` dropdown** (Mammalia, Aves, Reptilia, Amphibia, Actinopterygii, Mollusca, Arachnida, Insecta, Plantae, Fungi, Chromista, Protozoa, Animalia) — the fastest way to filter to a major group.
- **All filters optional** — nothing is required; empty input `{}` returns data.
- **Numbers stored as real numbers**: `id`, `taxonId`, `latitude`, `longitude`, `positionalAccuracy`, `numIdentificationAgreements` (previously strings/absent).
- **Added fields**: `commonName`, `taxonId`, `positionalAccuracy`, `numIdentificationAgreements`.
- **Proxy**: uses Apify automatic proxy, **rotates to a fresh IP on every request/retry**, validates the response shape (rejects soft-empty bodies from bad proxy IPs and retries), and falls back to a direct connection on the final attempt. This fixes intermittent 0-row runs caused by an occasional bad proxy IP returning an empty body.
- **Graceful & bounded**: ~4-minute pagination time budget; top level logs errors instead of hard-failing.
- Dataset/output schemas updated with a `fields` JSON-schema and numeric display formats; `select` editors on finite-domain inputs.
