iNaturalist API
Free iNaturalist API with no key: millions of citizen-science species observations with photos, coordinates, identifications and quality grades. Tested example.
Endpoint tested and returned HTTP 200 on 2026-08-19
What is the iNaturalist API?
The iNaturalist API is a free, key-free API providing access to hundreds of millions of citizen-science wildlife observations, each with photographs, coordinates, community identifications and a data quality grade.
iNaturalist is the largest citizen science biodiversity platform, and its API exposes the whole observation corpus — photographs, locations, dates and the community identification process behind each record.
The `quality_grade` field is essential and frequently ignored. Only observations marked `research` have community-verified identifications; `needs_id` and `casual` records may be misidentified. Filtering to research grade is almost always the right default for any analytical use.
Quick facts
- Base URL
https://api.inaturalist.org/v1- Authentication
- No API key for public reads. Writing observations requires OAuth.
- Rate limit
- About 100 requests per minute, and the maintainers ask for no more than 10,000 per day.
- Pricing
- Free. Observation photos carry per-user licences — check before reuse.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the iNaturalist API
Every request below was executed against the live API on 2026-08-19, and the response shown is the real body it returned — not an illustration.
1. Fetch recent species observations
GET https://api.inaturalist.org/v1/observations?per_page=1
curl 'https://api.inaturalist.org/v1/observations?per_page=1'const res = await fetch("https://api.inaturalist.org/v1/observations?per_page=1");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://api.inaturalist.org/v1/observations?per_page=1", timeout=20)
res.raise_for_status()
print(res.json()){
"total_results": 378721193,
"page": 1,
"per_page": 1,
"results": [
{
"quality_grade": "needs_id",
"time_observed_at": "2026-08-17T13:50:46-04:00",
"taxon_geoprivacy": null,
"annotations": [],
"uuid": "16f73012-9d1f-4ddb-89ba-b464edb94569",
"observed_on_details": {
"date": "2026-08-17",
"day": 17,
"month": 8,
"year": 2026,
"hour": 13,
"week": 34
},
"id": 392741421,
"cached_votes_total": 0,
"identifications_most_agree": false,
"created_at_details": {
"date": "2026-08-19",
"day": 19,
"month": 8,
"year": 2026,
"hour": 15,
"week": 34
},
"species_guess": null,
"identifications_most_disagree": false,
"tags": [],
"positional_accuracy": 10,
"comments_count": 0,
"site_id": 1,
"created_time_zone": "America/New_York",
"license_code": "cc-by-nc",
"observed_time_zone": "America/New_York",
"quality_metrics": [],
"public_positional_accuracy": 10,
"reviewed_by": [
6211994
],
"oauth_application_id": 843,
"flags": [],
"created_at": "2026-08-19T15:51:05-04:00",
"description": null,
"time_zone_offset": "-05:00",
"project_ids_with_curator_id": [],
"observed_on": "2026-08-17",
"observed_on_string": "2026-08-17 13:50:46",
"updated_at": "2026-08-19T15:51:06-04:00",
"sounds": [],
"place_ids": [
1,
39,
9853,
48819,
50853,
518Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
per_page | integer | Optional | Results per page, max 200. 30 |
taxon_name | string | Optional | Filter by species or taxon name. Danaus plexippus |
lat / lng / radius | float | Optional | Geographic filter — centre point and radius in km. 31.52 |
quality_grade | string | Optional | research, needs_id or casual. research |
d1 / d2 | string | Optional | Observation date range. 2026-01-01 |
Response fields
total_resultsinteger- Total observations matching the query.
results[].species_guessstring- The observer's initial identification.
results[].taxonobject- Resolved taxon with scientific name and rank.
results[].quality_gradestring- research, needs_id or casual — filter on this.
results[].photosarray- Photo URLs with per-photo licence codes.
results[].geojsonobject- Observation coordinates, sometimes obscured for sensitive species.
results[].observed_onstring- Date of observation.
What you can build with the iNaturalist API
- Show local wildlife sightings on a nature or park website
- Build a species identification learning tool with real photos
- Analyse seasonal migration and phenology patterns
- Support ecological research with citizen science data
Common errors and how to fix them
Misidentified species in results
You included non-research-grade observations.
Fix: Filter with quality_grade=research for community-verified identifications only.
Coordinates are vague or missing
Locations for threatened species are deliberately obscured.
Fix: Check the geoprivacy fields; do not assume coordinates are precise.
429
Rate limit exceeded.
Fix: Stay under about 100 requests per minute and cache aggressively.
iNaturalist API — frequently asked questions
Is the iNaturalist API free?
Yes, free with no API key for public reads. Writing observations requires OAuth authentication.
What does quality_grade mean?
It indicates identification confidence. `research` means the community has verified the identification; `needs_id` and `casual` may be wrong. Filter to research grade for any serious use.
Can I use the observation photos?
Only within their licence. Each photo carries its own licence code set by the photographer — many are Creative Commons but some are all rights reserved. Check per photo.
Why are some coordinates imprecise?
iNaturalist deliberately obscures locations for threatened and sensitive species to prevent poaching and disturbance. That is by design, not a data error.
Tools that pair with this API
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
Image Cropper
Crop images online to an exact rectangle with pixel-precise x, y, width and height inputs or aspect-ratio presets. Free, private and browser-based.
iNaturalist is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-19; always check the official documentation before relying on this API in production, as terms and limits can change.