BYTETOOLS

iNaturalist API

Free iNaturalist API with no key: millions of citizen-science species observations with photos, coordinates, identifications and quality grades. Tested example.

No API key requiredCORS enabledHTTPSFree tier

Endpoint tested and returned HTTP 200 on 19 Aug 2026

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 19 Aug 2026, 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
curl 'https://api.inaturalist.org/v1/observations?per_page=1'
JavaScript (fetch)
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);
Python (requests)
import requests

res = requests.get("https://api.inaturalist.org/v1/observations?per_page=1", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "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,
        518

Parameters

ParameterTypeRequiredDescription
per_pageintegerOptionalResults per page, max 200. 30
taxon_namestringOptionalFilter by species or taxon name. Danaus plexippus
lat / lng / radiusfloatOptionalGeographic filter — centre point and radius in km. 31.52
quality_gradestringOptionalresearch, needs_id or casual. research
d1 / d2stringOptionalObservation 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

Alternatives to iNaturalist API

If iNaturalist does not fit, these environment apis cover similar ground. Every one was called before publishing, and each links to its own reference page with a working curl command and the response it returned.

APIWhat it doesAuthCORSLast verified
UK Carbon IntensityFree National Grid carbon intensity API with no key: current and forecast grid carbon per half hour, by region, with generation mix. Tested curl example.No keyYes19 Aug 2026
GBIFFree GBIF API with no key: 2 billion+ species occurrence records, taxonomic data and distribution maps from museums and research institutions worldwide. Tested.No keyNo19 Aug 2026
USGS Water ServicesFree USGS Water Services API with no key: real-time river discharge, gauge height, water temperature and groundwater levels from thousands of US sites. Tested.No keyYes19 Aug 2026
EPA EnvirofactsFree US EPA Envirofacts API with no key: toxic release inventory, facility permits, air and water compliance data across US environmental programmes. Tested.No keyYes19 Aug 2026
KanariFree wildfire API with no key: clustered satellite fire detections worldwide from VIIRS, GOES and MTG, with radiative power and a confidence grade. Tested example included.No keyYes21 Aug 2026
LuchtmeetnetFree Dutch air quality API with no key: the official national monitoring network's stations and their measured and forecast pollutant concentrations. Tested example included.No keyYes21 Aug 2026
All Environment APIs

iNaturalist is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 19 Aug 2026; always check the official documentation before relying on this API in production, as terms and limits can change.