Raw schema
{
"type": "object",
"properties": {
"place_id": {
"description": "Numeric iNaturalist place id from inaturalist_find_places. Mutually exclusive with the lat/lng/radius triple and the bounding box. A non-numeric value answers HTTP 500 upstream.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"lat": {
"description": "Latitude of the search centre, in decimal degrees. Requires lng and radius.",
"type": "number",
"minimum": -90,
"maximum": 90
},
"lng": {
"description": "Longitude of the search centre, in decimal degrees. Requires lat and radius.",
"type": "number",
"minimum": -180,
"maximum": 180
},
"radius": {
"description": "Search radius around lat/lng, in KILOMETRES, greater than 0. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes.",
"type": "number",
"maximum": 500
},
"nelat": {
"description": "North-east corner latitude of the bounding box, at or north of swlat. All four corners or none.",
"type": "number",
"minimum": -90,
"maximum": 90
},
"nelng": {
"description": "North-east corner longitude of the bounding box. All four corners or none. West of swlng is accepted: it describes a box crossing the antimeridian.",
"type": "number",
"minimum": -180,
"maximum": 180
},
"swlat": {
"description": "South-west corner latitude of the bounding box. All four corners or none.",
"type": "number",
"minimum": -90,
"maximum": 90
},
"swlng": {
"description": "South-west corner longitude of the bounding box. All four corners or none.",
"type": "number",
"minimum": -180,
"maximum": 180
},
"taxon_id": {
"description": "Restrict to this taxon and its descendants. Resolve a name to an id with inaturalist_resolve_name.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"d1": {
"description": "Earliest observation date, YYYY-MM-DD. Inclusive. Must be on or before d2.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"d2": {
"description": "Latest observation date, YYYY-MM-DD. Inclusive.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"quality_grade": {
"default": [
"research"
],
"description": "Identification confidence tiers to include. Defaults to research-grade only; adding \"needs_id\" roughly doubles the corpus and lowers identification confidence.",
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"enum": [
"research",
"needs_id",
"casual"
]
}
},
"captive": {
"default": false,
"description": "Whether to include captive and cultivated records — zoo animals, garden plantings. Defaults to wild organisms only.",
"type": "boolean"
},
"term_id": {
"description": "Annotation attribute ids, from inaturalist_list_reference topic controlled_terms — e.g. 1 for Life Stage.",
"type": "array",
"items": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"term_value_id": {
"description": "Annotation value ids, from the same attribute listing — e.g. 6 for Larva. Requires term_id; sent alone it is ignored upstream and the unfiltered corpus comes back.",
"type": "array",
"items": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"iconic_taxa": {
"description": "Broad organism groups, by their scientific iconic-taxon name. A common-name value such as \"Birds\" matches nothing upstream, so only the listed values are accepted.",
"type": "array",
"items": {
"type": "string",
"enum": [
"Actinopterygii",
"Amphibia",
"Animalia",
"Arachnida",
"Aves",
"Chromista",
"Fungi",
"Insecta",
"Mammalia",
"Mollusca",
"Plantae",
"Protozoa",
"Reptilia",
"unknown"
]
}
},
"user_id": {
"description": "Restrict to one observer, by numeric user id from inaturalist_resolve_name type user. Mutually exclusive with user_login.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"user_login": {
"description": "Restrict to one observer, by login — the login on an inaturalist_resolve_name user candidate, a leaderboard entry, or an observation’s observer. Mutually exclusive with user_id.",
"type": "string",
"minLength": 1
},
"project_id": {
"description": "Restrict to observations in one project, by numeric project id from inaturalist_resolve_name type project.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"hrank": {
"description": "Highest (coarsest) taxonomic rank of the identification to accept. Must be at or above lrank; ranks compare by rank level.",
"type": "string",
"enum": [
"stateofmatter",
"kingdom",
"phylum",
"subphylum",
"superclass",
"class",
"subclass",
"superorder",
"order",
"suborder",
"infraorder",
"superfamily",
"epifamily",
"family",
"subfamily",
"supertribe",
"tribe",
"subtribe",
"genus",
"genushybrid",
"species",
"hybrid",
"subspecies",
"variety",
"form"
]
},
"lrank": {
"description": "Lowest (finest) taxonomic rank of the identification to accept. Equal to hrank for an exact-rank match.",
"type": "string",
"enum": [
"stateofmatter",
"kingdom",
"phylum",
"subphylum",
"superclass",
"class",
"subclass",
"superorder",
"order",
"suborder",
"infraorder",
"superfamily",
"epifamily",
"family",
"subfamily",
"supertribe",
"tribe",
"subtribe",
"genus",
"genushybrid",
"species",
"hybrid",
"subspecies",
"variety",
"form"
]
},
"csi": {
"description": "IUCN-normalised conservation status codes to include, e.g. [\"EN\",\"CR\"]. Decode them with inaturalist_list_reference topic conservation_status_codes.",
"type": "array",
"items": {
"type": "string",
"enum": [
"LC",
"NT",
"VU",
"EN",
"CR",
"EW",
"EX"
]
}
},
"threatened": {
"description": "Restrict to taxa considered threatened where observed.",
"type": "boolean"
},
"native": {
"description": "Restrict to taxa native to the observation location.",
"type": "boolean"
},
"introduced": {
"description": "Restrict to taxa introduced to the observation location.",
"type": "boolean"
},
"endemic": {
"description": "Restrict to taxa endemic to the observation location.",
"type": "boolean"
},
"licensed": {
"description": "Restrict to records whose own license_code is not null — any licence, NonCommercial and NoDerivatives variants included. For specific licences, use license.",
"type": "boolean"
},
"photo_licensed": {
"description": "Restrict to records with at least one licensed photo, under any licence. For specific licences, use photo_license.",
"type": "boolean"
},
"license": {
"description": "Restrict to records whose own license_code is one of these, e.g. [\"cc-by\",\"cc0\"] for reuse with attribution only. Decode the codes with inaturalist_list_reference topic licenses; all-rights-reserved records have no code to pass.",
"type": "array",
"items": {
"type": "string",
"enum": [
"cc-by",
"cc-by-nc",
"cc-by-nd",
"cc-by-sa",
"cc-by-nc-nd",
"cc-by-nc-sa",
"cc0"
]
}
},
"photo_license": {
"description": "Restrict to records carrying at least one photo under one of these licence codes. Matched independently of the record’s own license_code, so check each photo’s license_code before reusing it.",
"type": "array",
"items": {
"type": "string",
"enum": [
"cc-by",
"cc-by-nc",
"cc-by-nd",
"cc-by-sa",
"cc-by-nc-nd",
"cc-by-nc-sa",
"cc0"
]
}
},
"q": {
"description": "Free text matched across observation properties.",
"type": "string",
"minLength": 1
},
"search_on": {
"description": "Narrow what q matches against. Requires q.",
"type": "string",
"enum": [
"names",
"tags",
"description",
"place"
]
},
"order_by": {
"default": "observed_on",
"description": "Sort field. Set \"id\" with order \"desc\" to walk past 10,000 results: that is the one ordering next_cursor continues, so it is the only one that issues a next_cursor. A cursor forces it.",
"type": "string",
"enum": [
"created_at",
"geo_score",
"id",
"observed_on",
"random",
"species_guess",
"updated_at",
"votes"
]
},
"order": {
"default": "desc",
"description": "Sort direction.",
"type": "string",
"enum": [
"asc",
"desc"
]
},
"page": {
"description": "Page number within the first 10,000 results, under any ordering. Defaults to 1. Mutually exclusive with cursor.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"cursor": {
"description": "next_cursor from a previous id-descending page, to continue past the 10,000-result window — a positive integer observation id, sent upstream as id_below. Mutually exclusive with page, and forces order_by \"id\", order \"desc\".",
"type": "string",
"pattern": "^[1-9]\\d*$"
},
"per_page": {
"default": 10,
"description": "Records per page, maximum 25. A projected record costs roughly 1.9 KB across structuredContent and the rendered text together, so 25 is a full page near 49 KB and the default of 10 near 20 KB. Walk further with page or cursor rather than a larger page.",
"type": "integer",
"minimum": 1,
"maximum": 25
},
"include": {
"description": "Embedded arrays to expand per record. Check photo_count and sound_count first — expanding costs context.",
"type": "array",
"items": {
"type": "string",
"enum": [
"photos",
"annotations",
"sounds"
]
}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}