Extract biodiversity and species occurrence data from iNaturalist at scale — filter by species, taxon, place or free-text keyword and pull research-grade wildlife observations with GPS coordinates, photos, observer, quality grade and Creative Commons license, in clean structured JSON. No API key, no login, no registration required. A single run can collect thousands of georeferenced records across any group of life — birds, mammals, insects, plants, fungi and more.
This is a turnkey iNaturalist data export tool for ecologists, conservation teams and biodiversity informatics. Point it at a taxon (Panthera leo), a place, or a keyword, choose your quality grade, and export thousands of species occurrence records to JSON, CSV or Excel — ready for distribution modeling, habitat analysis, GIS pipelines or a species checklist app.
This repository is documentation only. The scraper itself runs on the Apify platform — there is no source code here.
▶️ Run it on Apify »
Every run returns one row per observation (or taxon) with clean, structured fields, exportable to JSON, CSV, Excel, JSONL or XML.
- 🔑 Completely keyless — no registration, account or API key required.
- 🧭 Three modes — search observations, browse the taxa / species catalog, or fetch a single observation by ID.
- 🦅 Any group of life — mammals, birds, reptiles, amphibians, fish, molluscs, arachnids, insects, plants, fungi and more.
- 🌍 Geographic filtering — restrict to a country or region with a place ID, and get GPS latitude/longitude plus positional accuracy per record.
- ✅ Quality grades — filter to research-grade (verified), needs-ID or casual observations.
- 🖼️ Photos & attribution — first-photo URL, observer username and the Creative Commons license code for every record.
- 📦 Bulk pagination — pull up to 10,000 records per run with automatic paging.
- Species distribution mapping — download all research-grade lion (Panthera leo) observations across a region to map current range and density hotspots.
- Protected-area checklists — extract observations by place ID for a national park to power a visitor species checklist app.
- Taxonomy lookups — search the taxa catalog for all Panthera species to get scientific names, ranks, photos and observation counts.
- Pollinator & invasion monitoring — pull recent insect observations by keyword to track pollinator activity or invasion fronts.
- Biodiversity ML datasets — assemble georeferenced species occurrence data for machine learning, phylogenetics or ecological modeling.
- Species galleries & alerts — fetch individual observation details, including photos, for a curated gallery or a species-alert system.
- Conservation reporting — capture new research-grade submissions on a schedule for ongoing species monitoring.
Run this Actor from the Apify Console, the CLI, the API, or the official JavaScript / Python clients. Leave everything empty to get the most recent research-grade observations.
- Open the iNaturalist Scraper on Apify.
- Click Try for free. Leave the input empty for recent research-grade observations, or set a
taxonName/queryand pick amode. - Click Start, then open the Output tab and download as CSV, JSON or Excel.
npm install -g apify-cli
apify login
apify call logiover/inaturalist-scraper --input '{
"mode": "observations",
"taxonName": "Panthera leo",
"qualityGrade": "research",
"maxResults": 500
}'curl -X POST "https://api.apify.com/v2/acts/logiover~inaturalist-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"mode": "observations",
"taxonName": "Aquila chrysaetos",
"qualityGrade": "research",
"maxResults": 500
}'import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('logiover/inaturalist-scraper').call({
mode: 'observations',
taxonName: 'Panthera leo',
qualityGrade: 'research',
maxResults: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("logiover/inaturalist-scraper").call(run_input={
"mode": "observations",
"taxonName": "Panthera leo",
"qualityGrade": "research",
"maxResults": 500,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)More detailed, copy-pasteable recipes live in examples/.
All fields are optional — leave everything empty for the most recent research-grade observations.
| Field | Type | Description |
|---|---|---|
mode |
string (dropdown) | observations (search observations), taxa (search the species catalog), or observationDetail (single observation by ID). Default observations. |
query |
string | Free-text search term (e.g. lion, eagle). Used in observations and taxa modes. |
iconicTaxon |
string (dropdown) | Restrict to a major group of life — Mammalia, Aves, Reptilia, Amphibia, Actinopterygii, Mollusca, Arachnida, Insecta, Plantae, Fungi, and more. |
taxonName |
string | Scientific or common name at ANY rank — species (Panthera leo), genus (Panthera), family, order, or class (Mammalia). |
placeId |
integer | Place ID to filter observations geographically (e.g. 1 = USA, 6986 = Kenya, 7082 = Germany). |
qualityGrade |
string (dropdown) | research (verified), needs_id, casual, or empty for all. Default research. |
observationId |
integer | For observationDetail mode — the specific observation ID to fetch. |
maxResults |
integer | Maximum records to scrape (1–10,000). Default 200. |
proxyConfig |
object | Optional proxy configuration. |
{
"mode": "observations",
"taxonName": "Aquila chrysaetos",
"placeId": 1,
"qualityGrade": "research",
"maxResults": 1000
}{
"mode": "taxa",
"query": "Panthera",
"maxResults": 50
}One row per observation (or taxon). Here is a sample record:
{
"id": 987654321,
"speciesGuess": "Golden Eagle",
"commonName": "Golden Eagle",
"taxonName": "Aquila chrysaetos",
"taxonId": 5305,
"taxonRank": "species",
"iconicTaxon": "Aves",
"observedOn": "2024-06-01",
"placeGuess": "Rocky Mountain National Park, Colorado, USA",
"latitude": 40.3428,
"longitude": -105.6836,
"positionalAccuracy": 25,
"user": "raptor_watcher",
"qualityGrade": "research",
"numIdentificationAgreements": 3,
"photoUrl": "https://…/photos/99887/medium.jpg",
"uri": "https://www.inaturalist.org/observations/987654321",
"license": "cc-by-nc"
}| Field | Description |
|---|---|
id |
Observation (or taxon) numeric ID |
speciesGuess |
Observer's species guess |
commonName |
Preferred common name of the taxon |
taxonName |
Scientific name of the identified taxon |
taxonId |
Taxon numeric ID |
taxonRank |
Taxonomic rank (species, genus, family, etc.) |
iconicTaxon |
Major group (Mammalia, Aves, Plantae, …) |
observedOn |
Date the organism was observed |
placeGuess |
Human-readable place description |
latitude / longitude |
Decimal GPS coordinates |
positionalAccuracy |
Coordinate accuracy in metres |
user |
Observer's username |
qualityGrade |
research / needs_id / casual |
numIdentificationAgreements |
Number of agreeing identifications (or total observation count in taxa mode) |
photoUrl |
URL of the first photo |
uri |
Canonical observation URL |
license |
Content license code (e.g. cc-by-nc) |
- Schedules — capture newly submitted research-grade observations daily or weekly with the Apify Scheduler.
- Webhooks — post new observation counts to Slack or trigger a downstream call when a run completes.
- Google Sheets — export datasets straight into a biodiversity tracking spreadsheet.
- Amazon S3 / storage — archive raw occurrence data for later GIS analysis.
- Zapier, Make, n8n & Pipedream — trigger email alerts, database inserts or GIS updates when the run finishes.
- Apify API — pull datasets programmatically from any language.
Download every run's dataset as CSV, JSON, JSONL, Excel (XLSX) or XML from the Console, or fetch it via the Apify API with a format query parameter.
Open the iNaturalist Scraper on Apify, set a taxonName or query (or leave the input empty), choose a mode and qualityGrade, and click Start. Each observation comes back as structured data you can export to CSV or JSON.
No. The scraper reads publicly available iNaturalist data — no account, login, registration or API key is needed, only an Apify account.
Each run can pull up to 10,000 records (set via maxResults). For larger datasets, schedule multiple runs with different place IDs or taxon filters.
Research grade is iNaturalist's highest quality tier — the observation has a photo, a date, coordinates and at least two community identifications agreeing on the species. Set qualityGrade: research to get only these verified records.
Yes — use the placeId parameter. Find the numeric ID by visiting the country or region page on iNaturalist.org and reading it from the URL (for example, Kenya = 6986, USA = 1, Germany = 7082).
Use taxa mode with query set to the genus name (e.g. Panthera) to return matching species and higher ranks from the iNaturalist taxonomy, along with photos and observation counts.
iNaturalist allows observers to obscure their GPS location for sensitive or endangered species. When geoprivacy is obscured, coordinates come back null; the placeGuess text may still be populated.
Every dataset can be downloaded as CSV, JSON, JSONL, Excel or XML from the Console or via the Apify API — a clean iNaturalist data export for spreadsheets, GIS tools or BI.
Most research-grade observations include at least one photo (the medium-size URL is returned). Some records are sound-only or text-only, in which case photoUrl is null.
iNaturalist observations are published under Creative Commons licenses (primarily CC BY-NC) by the contributors who upload them, and this Actor retrieves only publicly available data. Always respect the license field in each record — some are non-commercial only. Review iNaturalist's Terms of Service and the applicable license before commercial use.
Building a wider open-data or geospatial dataset? Pair the iNaturalist Scraper with:
👉 Browse all logiover scrapers on Apify Store.
📄 Documentation only — the Actor runs on the Apify platform; no source code is included in this repository.
Licensed under the MIT License · © 2026 logiover