A curated list of open technology projects to sustain a stable climate, energy supply, biodiversity and natural resources.

pyinaturalist

Python client for iNaturalist, a community science platform that helps people get involved in the natural world by observing and identifying the living things around them.
https://github.com/pyinat/pyinaturalist

Category: Biosphere
Sub Category: Biodiversity Citizen Science

Keywords

api api-client biodiversity biodiversity-data biodiversity-informatics citizen-science inaturalist python

Keywords from Contributors

birding archive measur transforms projection contribution optimize ecology generic control

Last synced: about 12 hours ago
JSON representation

Repository metadata

Python client for iNaturalist

README.md

pyinaturalist

Build
Codecov
Documentation

PyPI
Conda
PyPI - Python Versions

Run with Binder
Open in VSCode

Introduction

iNaturalist is a community science platform that helps people
get involved in the natural world by observing and identifying the living things around them.
Collectively, the community produces a rich source of global biodiversity data that can be valuable
to anyone from hobbyists to scientists.

pyinaturalist is a client for the iNaturalist API that makes
these data easily accessible in the python programming language.

Features

  • ➑️ Easier requests: Simplified request formats, easy pagination, and complete request
    parameter type annotations for better IDE integration
  • ⬅️ Convenient responses: Type conversions to the things you would expect in python, and an
    optional object-oriented interface for response data
  • πŸ”’ Security: Keyring integration for secure credential storage
  • πŸ“— Docs: Example requests, responses, scripts, and Jupyter notebooks to help get you started
  • πŸ’š Responsible use: Follows the
    API Recommended Practices
    by default, so you can be nice to the iNaturalist servers and not worry about rate-limiting errors
  • πŸ§ͺ Testing: A dry-run testing mode to preview your requests before potentially modifying data

Supported Endpoints

Many of the most relevant API endpoints are supported, including:

  • πŸ“ Annotations and observation fields
  • πŸ†” Identifications
  • πŸ’¬ Messages
  • πŸ‘€ Observations (multiple formats)
  • πŸ“· Observation photos + sounds
  • πŸ“Š Observation histograms, observers, identifiers, life lists, and species counts
  • πŸ“ Places
  • πŸ‘₯ Projects
  • 🐦 Species
  • πŸ‘€ Users

Quickstart

Here are usage examples for some of the most commonly used features.

First, install with pip:

pip install pyinaturalist

Then, import the main API functions:

from pyinaturalist import *

Search observations

Let's start by searching for all your own observations. There are
numerous fields you can search on, but we'll just use user_id for now:

>>> observations = get_observations(user_id='my_username')

The full response will be in JSON format, but we can use pyinaturalist.pprint() to print out a summary:

>>> for obs in observations['results']:
>>>    pprint(obs)
ID         Taxon                               Observed on   User     Location
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
117585709  Genus: Hyoscyamus (henbanes)        May 18, 2022  niconoe  Calvi, France
117464920  Genus: Omophlus                     May 17, 2022  niconoe  GalΓ©ria, France
117464393  Genus: Briza (Rattlesnake Grasses)  May 17, 2022  niconoe  GalΓ©ria, France
...

You can also get
observation counts by species.
On iNaturalist.org, this information can be found on the 'Species' tab of search results.
For example, to get species counts of all your own research-grade observations:

>>> counts = get_observation_species_counts(user_id='my_username', quality_grade='research')
>>> pprint(counts)
 ID     Rank      Scientific name               Common name             Count
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
47934   species   πŸ› Libellula luctuosa         Widow Skimmer           7
48627   species   🌻 Echinacea purpurea         Purple Coneflower       6
504060  species   πŸ„ Pleurotus citrinopileatus  Golden Oyster Mushroom  6
...

Another useful format is the
observation histogram,
which shows the number of observations over a given interval. The default is month_of_year:

>>> histogram = get_observation_histogram(user_id='my_username')
>>> print(histogram)
{
    1: 8,  # January
    2: 1,  # February
    3: 19, # March
    ...,   # etc.
}

Create and update observations

To create or modify observations, you will first need to log in.
This requires creating an iNaturalist app,
which will be used to get an access token.

token = get_access_token(
    username='my_username',
    password='my_password',
    app_id='my_app_id',
    app_secret='my_app_secret',
)

See Authentication
for more options including environment variables, keyrings, and password managers.

Now we can create a new observation:

from datetime import datetime

response = create_observation(
    taxon_id=54327,  # Vespa Crabro
    observed_on_string=datetime.now(),
    time_zone='Brussels',
    description='This is a free text comment for the observation',
    tag_list='wasp, Belgium',
    latitude=50.647143,
    longitude=4.360216,
    positional_accuracy=50,  # GPS accuracy in meters
    access_token=token,
    photos=['~/observations/wasp1.jpg', '~/observations/wasp2.jpg'],
    sounds=['~/observations/recording.mp3'],
)

# Save the new observation ID
new_observation_id = response[0]['id']

We can then update the observation information, photos, or sounds:

update_observation(
    new_observation_id,
    access_token=token,
    description='updated description !',
    photos='~/observations/wasp_nest.jpg',
    sounds='~/observations/wasp_nest.mp3',
)

Search species

Let's say you partially remember either a genus or family name that started with 'vespi'-something.
The taxa endpoint
can be used to search by name, rank, and several other criteria

>>> response = get_taxa(q='vespi', rank=['genus', 'family'])

As with observations, there is a lot of information in the response, but we'll print just a few basic details:

>>> pprint(response)
[52747] Family: Vespidae (Hornets, Paper Wasps, Potter Wasps, and Allies)
[92786] Genus: Vespicula
[84737] Genus: Vespina
...

Next Steps

For more information, see:

  • User Guide:
    introduction and general features that apply to most endpoints
  • Endpoint Summary:
    a complete list of endpoints wrapped by pyinaturalist
  • Examples:
    data visualizations and other examples of things to do with iNaturalist data
  • Reference: Detailed API documentation
  • Contributing Guide:
    development details for anyone interested in contributing to pyinaturalist
  • History:
    details on past and current releases
  • Issues: planned & proposed features

Feedback

If you have any problems, suggestions, or questions about pyinaturalist, you are welcome to create an issue or discussion. Also, PRs are welcome!

Note: pyinaturalist is developed by members of the iNaturalist community, and is not endorsed by
iNaturalist.org or the California Academy of Sciences. If you have non-python-specific questions
about the iNaturalist API or iNaturalist in general, the
iNaturalist Community Forum is the best place to start.

Related Projects

Other python projects related to iNaturalist:

  • naturtag: A desktop application for tagging image files with iNaturalist taxonomy & observation metadata
  • pyinaturalist-convert: Tools to convert observation data to and from a variety of useful formats
  • pyinaturalist-notebook: Jupyter notebook Docker image for pyinaturalist
  • dronefly: A Discord bot with iNaturalist integration, used by the iNaturalist Discord server.

Owner metadata


GitHub Events

Total
Last Year

Committers metadata

Last synced: 7 days ago

Total Commits: 908
Total Committers: 12
Avg Commits per committer: 75.667
Development Distribution Score (DDS): 0.1

Commits in past year: 44
Committers in past year: 3
Avg Commits per committer in past year: 14.667
Development Distribution Score (DDS) in past year: 0.114

Name Email Commits
Jordan Cook j****k@p****m 817
Nicolas NoΓ© n****s@n****u 52
dependabot[bot] 4****] 17
Nicolas NoΓ© n****e@i****e 6
Will Kuhn k****l@g****m 4
Darren Kirby b****r@g****m 4
Peter Desmet p****k@g****m 3
Richard Littauer r****r@g****m 1
Eduardo RamΓ­rez e****0@g****m 1
Ben Armstrong s****g@d****g 1
Stijn Van Hoey s****y@i****e 1
Eduardo e****z@a****m 1

Committer domains:


Issue and Pull Request metadata

Last synced: 1 day ago

Total issues: 220
Total pull requests: 395
Average time to close issues: 3 months
Average time to close pull requests: 6 days
Total issue authors: 28
Total pull request authors: 8
Average comments per issue: 2.12
Average comments per pull request: 0.82
Merged pull request: 294
Bot issues: 0
Bot pull requests: 163

Past year issues: 13
Past year pull requests: 49
Past year average time to close issues: 3 days
Past year average time to close pull requests: 21 days
Past year issue authors: 8
Past year pull request authors: 4
Past year average comments per issue: 1.62
Past year average comments per pull request: 0.49
Past year merged pull request: 24
Past year bot issues: 0
Past year bot pull requests: 34

More stats: https://issues.ecosyste.ms/repositories/lookup?url=https://github.com/pyinat/pyinaturalist

Top Issue Authors

  • JWCook (156)
  • arky (12)
  • synrg (9)
  • niconoe (9)
  • nigelcharman (6)
  • abubelinha (3)
  • svshepherd (3)
  • AugustT (2)
  • aubreymoore (1)
  • peterdesmet (1)
  • FelipeSBarros (1)
  • nleguillarme (1)
  • jhuus (1)
  • agrosh24 (1)
  • jwidness (1)

Top Pull Request Authors

  • JWCook (221)
  • dependabot[bot] (163)
  • DarrenKirby (4)
  • eduramirezh (2)
  • willkuhn (2)
  • LucaCappelletti94 (1)
  • synrg (1)
  • RichardLitt (1)

Top Issue Labels

  • enhancement (87)
  • new endpoint (42)
  • bug (34)
  • docs (27)
  • logistics (23)
  • question (14)
  • examples (11)
  • refactoring (2)
  • good first issue (2)
  • wontfix (2)
  • tests (1)

Top Pull Request Labels

  • enhancement (102)
  • dependencies (76)
  • python (66)
  • docs (39)
  • new endpoint (32)
  • bug (26)
  • logistics (24)
  • github_actions (10)
  • examples (7)
  • refactoring (6)
  • tests (3)

Package metadata

pypi.org: pyinaturalist

iNaturalist API client for python

  • Homepage:
  • Documentation: https://pyinaturalist.readthedocs.io/
  • Licenses: mit
  • Latest release: 0.20.1 (published 3 months ago)
  • Last Synced: 2025-04-25T14:02:03.186Z (1 day ago)
  • Versions: 68
  • Dependent Packages: 4
  • Dependent Repositories: 15
  • Downloads: 2,403 Last month
  • Rankings:
    • Dependent packages count: 1.611%
    • Dependent repos count: 3.79%
    • Stargazers count: 6.884%
    • Average: 7.278%
    • Forks count: 10.557%
    • Downloads: 13.549%
  • Maintainers (2)
conda-forge.org: pyinaturalist

  • Homepage: https://github.com/pyinat/pyinaturalist
  • Licenses: MIT
  • Latest release: 0.16.0 (published about 3 years ago)
  • Last Synced: 2025-04-25T14:02:17.103Z (1 day ago)
  • Versions: 6
  • Dependent Packages: 1
  • Dependent Repositories: 1
  • Rankings:
    • Dependent repos count: 24.348%
    • Dependent packages count: 28.978%
    • Average: 33.37%
    • Stargazers count: 35.211%
    • Forks count: 44.942%

Dependencies

poetry.lock pypi
  • 130 dependencies
pyproject.toml pypi
  • coverage >=6.3 develop
  • nox ^2022.1.7 develop
  • nox-poetry ^1.0.0 develop
  • pre-commit ^2.19 develop
  • pretty-errors ^1.2.23 develop
  • pytest ^7.0 develop
  • pytest-asyncio ^0.18.1 develop
  • pytest-cov >=3.0 develop
  • pytest-xdist >=2.2 develop
  • requests-mock ^1.8 develop
  • sphinx-autobuild >=2021.3.14 develop
  • attrs >=21.2
  • furo ^2022.2.14.1
  • ipython ^7.25.0
  • keyring >=22.3
  • linkify-it-py ^1.0.1
  • myst-parser ^0.17.0
  • nbsphinx ^0.8.5
  • platformdirs >=2.5
  • python ^3.7
  • python-dateutil >=2.0
  • python-forge >=18.6
  • requests >=2.22
  • requests-cache >=1.0.0a1
  • requests-ratelimiter >=0.3.2
  • rich >=10.9
  • sphinx ^4.2.0
  • sphinx-autodoc-typehints ^1.17
  • sphinx-automodapi ^0.14
  • sphinx-copybutton >=0.5
  • sphinx-inline-tabs ^2022.1.2b11
  • sphinx-panels ^0.6.0
  • sphinxcontrib-apidoc ^0.3
.github/workflows/build.yml actions
  • actions/cache v3 composite
  • actions/checkout v3 composite
  • actions/setup-python v4 composite
  • codecov/codecov-action v3 composite
  • pre-commit/action v3.0.0 composite
  • snok/install-poetry v1.3 composite
.github/workflows/deploy.yml actions
  • actions/checkout v3 composite
  • actions/setup-python v4 composite
  • snok/install-poetry v1.3 composite
Dockerfile docker
  • jxcook/pyinaturalist-notebook 0.14 build
docker-compose.yml docker
  • jxcook/pyinaturalist-notebook latest

Score: 15.36650207452438