inaturalist-mcp-server
이 MCP로 할 수 있는 일
Searches iNaturalist observations, taxa, identification threads, species distributions, phenology, conservation data, and observer activity.
도구
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'q': {'type': 'string', 'maxLength': 100, 'minLength': 1, 'description': 'Place-name prefix to search. Matches the start of a name, not words inside it. Mutually exclusive with the bounding box.'}, 'nelat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'North-east corner latitude of the map area, at or north of swlat. All four corners or none.'}, 'nelng': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'North-east corner longitude of the map area. All four corners or none. West of swlng is accepted: it describes a box crossing the antimeridian.'}, 'swlat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'South-west corner latitude of the map area. All four corners or none.'}, 'swlng': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'South-west corner longitude of the map area. All four corners or none.'}, 'per_page': {'type': 'integer', 'default': 10, 'maximum': 30, 'minimum': 1, 'description': 'Maximum places per list. Honoured on the bounding-box arm only, where it bounds the standard and community lists separately, so up to twice this many places come back. The name-prefix endpoint publishes no page size and returns a fixed page.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['totalCount', 'truncated', 'shown', 'cap']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The most places this response could carry â\x80\x94 per_page Ã\x97 2 on the bounding-box arm, where per_page bounds each list separately; the fixed page upstream served on the name-prefix arm.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_geography'], 'description': 'Machine-readable failure mode. Declared by this tool: `invalid_geography`: Neither q nor a complete bounding box was given, both were, or the box has nelat south of swlat. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'How many places this response carries.'}, 'notice': {'type': 'string', 'description': 'Guidance when nothing matched, or when the page capped the result set.'}, 'places': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'display_name', 'place_type', 'admin_level', 'bbox', 'ancestor_place_ids', 'location', 'slug'], 'properties': {'id': {'type': 'number', 'description': 'Place id â\x80\x94 pass it as place_id to any area-scoped tool.'}, 'bbox': {'anyOf': [{'type': 'object', 'required': ['swlat', 'swlng', 'nelat', 'nelng'], 'properties': {'nelat': {'type': 'number', 'description': 'North-east corner latitude.'}, 'nelng': {'type': 'number', 'description': 'North-east corner longitude.'}, 'swlat': {'type': 'number', 'description': 'South-west corner latitude.'}, 'swlng': {'type': 'number', 'description': 'South-west corner longitude.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Corner pair computed from the placeâ\x80\x99s bounding polygon, ready to pass as a bounding box. Relayed as computed: a place crossing the antimeridian genuinely has a degenerate box upstream and it is not repaired here.'}, 'name': {'type': ['string', 'null'], 'description': 'Place name as iNaturalist records it.'}, 'slug': {'type': ['string', 'null'], 'description': 'URL slug. The place record publishes no URL of its own.'}, 'location': {'anyOf': [{'type': 'object', 'required': ['lat', 'lng'], 'properties': {'lat': {'type': 'number', 'description': 'Centre latitude.'}, 'lng': {'type': 'number', 'description': 'Centre longitude.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Centre point of the place.'}, 'place_type': {'type': ['number', 'null'], 'description': 'Raw place-type integer. iNaturalist publishes no code table for it, so no label is invented â\x80\x94 display_name carries the meaning.'}, 'admin_level': {'type': ['number', 'null'], 'description': 'Raw administrative-level integer. No published code table; often null.'}, 'display_name': {'type': ['string', 'null'], 'description': 'Place name with its administrative context, e.g. "Seattle CCD, US, WA".'}, 'ancestor_place_ids': {'type': 'array', 'items': {'type': 'number'}, 'description': 'Containment chain, outermost first. Empty when upstream records none.'}}, 'description': 'One place, with the bounding box and containment chain an area search needs.', 'additionalProperties': False}, 'description': 'Name-prefix matches. Present on the q arm.'}, 'standard': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'display_name', 'place_type', 'admin_level', 'bbox', 'ancestor_place_ids', 'location', 'slug'], 'properties': {'id': {'type': 'number', 'description': 'Place id â\x80\x94 pass it as place_id to any area-scoped tool.'}, 'bbox': {'anyOf': [{'type': 'object', 'required': ['swlat', 'swlng', 'nelat', 'nelng'], 'properties': {'nelat': {'type': 'number', 'description': 'North-east corner latitude.'}, 'nelng': {'type': 'number', 'description': 'North-east corner longitude.'}, 'swlat': {'type': 'number', 'description': 'South-west corner latitude.'}, 'swlng': {'type': 'number', 'description': 'South-west corner longitude.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Corner pair computed from the placeâ\x80\x99s bounding polygon, ready to pass as a bounding box. Relayed as computed: a place crossing the antimeridian genuinely has a degenerate box upstream and it is not repaired here.'}, 'name': {'type': ['string', 'null'], 'description': 'Place name as iNaturalist records it.'}, 'slug': {'type': ['string', 'null'], 'description': 'URL slug. The place record publishes no URL of its own.'}, 'location': {'anyOf': [{'type': 'object', 'required': ['lat', 'lng'], 'properties': {'lat': {'type': 'number', 'description': 'Centre latitude.'}, 'lng': {'type': 'number', 'description': 'Centre longitude.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Centre point of the place.'}, 'place_type': {'type': ['number', 'null'], 'description': 'Raw place-type integer. iNaturalist publishes no code table for it, so no label is invented â\x80\x94 display_name carries the meaning.'}, 'admin_level': {'type': ['number', 'null'], 'description': 'Raw administrative-level integer. No published code table; often null.'}, 'display_name': {'type': ['string', 'null'], 'description': 'Place name with its administrative context, e.g. "Seattle CCD, US, WA".'}, 'ancestor_place_ids': {'type': 'array', 'items': {'type': 'number'}, 'description': 'Containment chain, outermost first. Empty when upstream records none.'}}, 'description': 'One place, with the bounding box and containment chain an area search needs.', 'additionalProperties': False}, 'description': 'Curated administrative places covering the area. Present on the bounding-box arm.'}, 'community': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'display_name', 'place_type', 'admin_level', 'bbox', 'ancestor_place_ids', 'location', 'slug'], 'properties': {'id': {'type': 'number', 'description': 'Place id â\x80\x94 pass it as place_id to any area-scoped tool.'}, 'bbox': {'anyOf': [{'type': 'object', 'required': ['swlat', 'swlng', 'nelat', 'nelng'], 'properties': {'nelat': {'type': 'number', 'description': 'North-east corner latitude.'}, 'nelng': {'type': 'number', 'description': 'North-east corner longitude.'}, 'swlat': {'type': 'number', 'description': 'South-west corner latitude.'}, 'swlng': {'type': 'number', 'description': 'South-west corner longitude.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Corner pair computed from the placeâ\x80\x99s bounding polygon, ready to pass as a bounding box. Relayed as computed: a place crossing the antimeridian genuinely has a degenerate box upstream and it is not repaired here.'}, 'name': {'type': ['string', 'null'], 'description': 'Place name as iNaturalist records it.'}, 'slug': {'type': ['string', 'null'], 'description': 'URL slug. The place record publishes no URL of its own.'}, 'location': {'anyOf': [{'type': 'object', 'required': ['lat', 'lng'], 'properties': {'lat': {'type': 'number', 'description': 'Centre latitude.'}, 'lng': {'type': 'number', 'description': 'Centre longitude.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Centre point of the place.'}, 'place_type': {'type': ['number', 'null'], 'description': 'Raw place-type integer. iNaturalist publishes no code table for it, so no label is invented â\x80\x94 display_name carries the meaning.'}, 'admin_level': {'type': ['number', 'null'], 'description': 'Raw administrative-level integer. No published code table; often null.'}, 'display_name': {'type': ['string', 'null'], 'description': 'Place name with its administrative context, e.g. "Seattle CCD, US, WA".'}, 'ancestor_place_ids': {'type': 'array', 'items': {'type': 'number'}, 'description': 'Containment chain, outermost first. Empty when upstream records none.'}}, 'description': 'One place, with the bounding box and containment chain an area search needs.', 'additionalProperties': False}, 'description': 'Member-created places covering the area. Present on the bounding-box arm.'}, 'truncated': {'type': 'boolean', 'description': 'True when more places may exist than were returned â\x80\x94 on the bounding-box arm, when the standard or community list reached per_page.'}, 'totalCount': {'type': 'number', 'description': 'Places upstream reports. On the name-prefix arm, every match before the fixed page; on the bounding-box arm, only the places returned (standard plus community), so it is bounded by the page size rather than a full count.'}}, 'additionalProperties': False}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'d1': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Earliest observation date, YYYY-MM-DD. Inclusive. Must be on or before d2. With interval set to day or hour, a wide range can exceed the 800-bucket cap â\x80\x94 narrow d1/d2 to reach buckets past it.'}, 'd2': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Latest observation date, YYYY-MM-DD. Inclusive.'}, 'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude of the search centre, in decimal degrees. Requires lng and radius.'}, 'lng': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude of the search centre, in decimal degrees. Requires lat and radius.'}, 'nelat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'North-east corner latitude of the bounding box, at or north of swlat. All four corners or none.'}, 'nelng': {'type': 'number', 'maximum': 180, 'minimum': -180, '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.'}, 'swlat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'South-west corner latitude of the bounding box. All four corners or none.'}, 'swlng': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'South-west corner longitude of the bounding box. All four corners or none.'}, 'radius': {'type': 'number', 'maximum': 500, '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.'}, 'captive': {'type': 'boolean', 'default': False, 'description': 'Whether to include captive and cultivated records â\x80\x94 zoo animals, garden plantings. Defaults to wild organisms only.'}, 'term_id': {'type': 'array', 'items': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1}, 'description': 'Annotation attribute ids, from inaturalist_list_reference topic controlled_terms â\x80\x94 e.g. 1 for Life Stage.'}, 'interval': {'enum': ['year', 'month', 'week', 'day', 'hour', 'month_of_year', 'week_of_year'], 'type': 'string', 'default': 'month_of_year', 'description': 'Bucketing. month_of_year and week_of_year fold every year together into a seasonal curve; the rest bucket absolute dates. day and hour over a wide date range can generate thousands of buckets â\x80\x94 the response is capped at 800, kept from the start of the range; narrow d1/d2 or use a coarser interval to see the rest.'}, 'place_id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, '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.'}, 'taxon_id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Restrict to this taxon and its descendants. Omit to chart every taxon in the area. Resolve a name to an id with inaturalist_resolve_name.'}, 'date_field': {'enum': ['observed', 'created'], 'type': 'string', 'default': 'observed', 'description': 'Which date to bucket by: when the organism was observed, or when the record was uploaded.'}, 'iconic_taxa': {'type': 'array', 'items': {'enum': ['Actinopterygii', 'Amphibia', 'Animalia', 'Arachnida', 'Aves', 'Chromista', 'Fungi', 'Insecta', 'Mammalia', 'Mollusca', 'Plantae', 'Protozoa', 'Reptilia', 'unknown'], 'type': 'string'}, '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.'}, 'quality_grade': {'type': 'array', 'items': {'enum': ['research', 'needs_id', 'casual'], 'type': 'string'}, 'default': ['research'], 'minItems': 1, 'description': 'Identification confidence tiers to include. Defaults to research-grade only; adding "needs_id" roughly doubles the corpus and lowers identification confidence.'}, 'term_value_id': {'type': 'array', 'items': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1}, 'description': 'Annotation value ids, from the same attribute listing â\x80\x94 e.g. 6 for Larva. Requires term_id; sent alone it is ignored upstream and the unfiltered corpus comes back.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['interval', 'buckets', 'total', 'applied_filters', 'truncated', 'shown', 'cap']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The bucket cap that was applied.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_geography', 'inverted_date_range', 'unpaired_annotation_value', 'unknown_taxon_id'], 'description': 'Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially, in two forms at once, with a radius of 0 or less, or with nelat south of swlat. `inverted_date_range`: d1 is after d2. `unpaired_annotation_value`: term_value_id was supplied without term_id. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'How many buckets this response carries.'}, 'total': {'type': 'number', 'description': 'Sum of every bucket count upstream returned, including buckets past the cap that are not in the buckets array.'}, 'notice': {'type': 'string', 'description': 'Guidance when every bucket came back zero, or when the cap was reached.'}, 'buckets': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'count'], 'properties': {'key': {'type': 'string', 'description': 'Bucket label, in upstream order â\x80\x94 "1"â\x80¦"12" for month_of_year, a date for the absolute intervals.'}, 'count': {'type': 'number', 'description': 'Matching observations in this bucket.'}}, 'description': 'One histogram bucket.', 'additionalProperties': False}, 'description': 'Every bucket upstream returned, in order, including the zero ones â\x80\x94 up to 800, the first in upstream key order. See the truncated/shown/cap enrichment when more exist.'}, 'interval': {'enum': ['year', 'month', 'week', 'day', 'hour', 'month_of_year', 'week_of_year'], 'type': 'string', 'description': 'The bucketing that was applied.'}, 'truncated': {'type': 'boolean', 'description': 'True when upstream returned more than 800 buckets.'}, 'applied_filters': {'type': 'object', 'required': ['quality_grade', 'captive', 'date_field'], 'properties': {'captive': {'type': 'boolean', 'description': 'Whether captive and cultivated records were included.'}, 'date_field': {'type': 'string', 'description': 'Which date the buckets were built from.'}, 'quality_grade': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Identification tiers actually searched.'}}, 'description': 'The server-applied defaults that determine what this answer means.', 'additionalProperties': False}}, 'additionalProperties': False}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['kind'], 'properties': {'d1': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Earliest observation date, YYYY-MM-DD. Inclusive. Must be on or before d2.'}, 'd2': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Latest observation date, YYYY-MM-DD. Inclusive.'}, 'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude of the search centre, in decimal degrees. Requires lng and radius.'}, 'lng': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude of the search centre, in decimal degrees. Requires lat and radius.'}, 'kind': {'enum': ['observers', 'identifiers'], 'type': 'string', 'description': 'Which leaderboard: "observers" ranks by observations recorded, "identifiers" by identifications made.'}, 'page': {'type': 'integer', 'default': 1, 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Page number. Defaults to 1.'}, 'nelat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'North-east corner latitude of the bounding box, at or north of swlat. All four corners or none.'}, 'nelng': {'type': 'number', 'maximum': 180, 'minimum': -180, '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.'}, 'swlat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'South-west corner latitude of the bounding box. All four corners or none.'}, 'swlng': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'South-west corner longitude of the bounding box. All four corners or none.'}, 'radius': {'type': 'number', 'maximum': 500, '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.'}, 'per_page': {'type': 'integer', 'default': 25, 'maximum': 250, 'minimum': 1, 'description': 'Entries per page, maximum 250. An entry costs roughly 140 bytes across structuredContent and the rendered text together, so 250 is a full page near 34 KB â\x80\x94 and two such pages cover the whole 500-entry window these endpoints rank.'}, 'place_id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, '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.'}, 'taxon_id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Restrict to this taxon and its descendants. Resolve a name to an id with inaturalist_resolve_name.'}, 'quality_grade': {'type': 'array', 'items': {'enum': ['research', 'needs_id', 'casual'], 'type': 'string'}, 'default': ['research'], 'minItems': 1, 'description': 'Identification confidence tiers to include. Defaults to research-grade only; adding "needs_id" roughly doubles the corpus and lowers identification confidence.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['kind', 'count_metric', 'total_results', 'entries', 'applied_filters', 'truncated', 'shown', 'cap']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The per_page that was applied.'}, 'kind': {'enum': ['observers', 'identifiers'], 'type': 'string', 'description': 'Which leaderboard was ranked.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_geography', 'inverted_date_range', 'leaderboard_window_exceeded', 'unknown_taxon_id'], 'description': 'Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially, in two forms at once, with a radius of 0 or less, or with nelat south of swlat. `inverted_date_range`: d1 is after d2. `leaderboard_window_exceeded`: page multiplied by per_page would reach past the 500 entries these endpoints rank. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'How many entries this page carries.'}, 'notice': {'type': 'string', 'description': 'Guidance when nobody matched, when the page is past the last one holding entries, or how to reach further down the ranking.'}, 'entries': {'type': 'array', 'items': {'type': 'object', 'required': ['rank', 'login', 'count'], 'properties': {'rank': {'type': 'number', 'description': 'Absolute rank across the leaderboard, counted from page 1.'}, 'count': {'type': 'number', 'description': 'Observations recorded, or identifications made â\x80\x94 see count_metric.'}, 'login': {'type': ['string', 'null'], 'description': 'The memberâ\x80\x99s login. No other profile field is relayed.'}, 'species_count': {'type': 'number', 'description': 'Distinct species this observer recorded. Present on the observers arm only; the identifiers endpoint publishes none.'}}, 'description': 'One ranked member.', 'additionalProperties': False}, 'description': 'The ranked members, most active first.'}, 'truncated': {'type': 'boolean', 'description': 'True when the page filled per_page and more entries follow.'}, 'count_metric': {'enum': ['observations', 'identifications'], 'type': 'string', 'description': 'What the count on each entry measures.'}, 'total_results': {'type': 'number', 'description': 'How many people upstream reports as matching. Far larger than the 500 this leaderboard can actually address.'}, 'applied_filters': {'type': 'object', 'required': ['quality_grade'], 'properties': {'quality_grade': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Identification tiers actually searched.'}}, 'description': 'The server-applied default that determines what this answer means.', 'additionalProperties': False}}, 'additionalProperties': False}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['observation_id'], 'properties': {'include': {'type': 'array', 'items': {'enum': ['identifications', 'comments', 'photos', 'annotations', 'sounds'], 'type': 'string'}, 'default': ['identifications'], 'description': 'Embedded arrays to expand per record. identifications is the default and is what carries the thread; the others cost context, so check photo_count and sound_count first. identifications and comments â\x80\x94 like the observation_fields every record carries â\x80\x94 share a 40-entry budget across the batch: each record keeps at most 40 ÷ records returned entries per array (never fewer than 4), and reports identifications_total, comments_total, and observation_fields_total beside what it kept â\x80\x94 request one id alone for the 40-entry view.'}, 'observation_id': {'type': 'array', 'items': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1}, 'maxItems': 10, 'minItems': 1, 'description': 'Observation ids to fetch, 1 to 10. Find current ids for an area with inaturalist_search_observations.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['observations', 'unresolved']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['not_found'], 'description': 'Machine-readable failure mode. Declared by this tool: `not_found`: None of the requested ids resolved to an observation. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'notice': {'type': 'string', 'description': 'Guidance when part of the batch did not resolve, or when a thread or observation-field list was cut to fit the response.'}, 'unresolved': {'type': 'array', 'items': {'type': 'object', 'required': ['observation_id'], 'properties': {'observation_id': {'type': 'number', 'description': 'A requested id upstream returned no record for.'}}, 'description': 'One id that did not resolve.', 'additionalProperties': False}, 'description': 'Requested ids upstream returned nothing for. They may have been deleted, or never existed.'}, 'observations': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'uuid', 'url', 'observed_on', 'observed_at', 'taxon', 'place_guess', 'coordinate', 'obscured', 'geoprivacy', 'taxon_geoprivacy', 'quality_grade', 'license_code', 'captive', 'photo', 'photo_count', 'sound_count', 'observer', 'identifications_count', 'agreements', 'disagreements', 'community_taxon_id'], 'properties': {'id': {'type': 'number', 'description': 'Observation id. Also the cursor value for deep pagination.'}, 'url': {'type': ['string', 'null'], 'description': 'Canonical iNaturalist page for the record.'}, 'uuid': {'type': ['string', 'null'], 'description': 'Stable UUID, independent of the id sequence.'}, 'photo': {'anyOf': [{'type': 'object', 'required': ['square_url', 'attribution', 'license_code', 'open'], 'properties': {'open': {'type': 'boolean', 'description': 'True when the photo is served from the host the upstream reserves for open licences. A photo can move hosts when its licence changes, so this reflects fetch time.'}, 'medium_url': {'type': 'string', 'description': 'Medium variant. Supplied by upstream where it publishes every size, otherwise derived by substituting the size qualifier in the path. Absent when the path did not match the documented shape.'}, 'square_url': {'type': ['string', 'null'], 'description': '75px square variant, exactly as upstream published it. Null when absent.'}, 'attribution': {'type': ['string', 'null'], 'description': 'Attribution string, verbatim and never reformatted. Reproduce it with any use of the image.'}, 'license_code': {'type': ['string', 'null'], 'description': 'Photo licence code. Null means all rights reserved, independent of the record.'}}, 'description': 'A photo with the attribution and licence that must travel with it.', 'additionalProperties': False}, {'type': 'null'}], 'description': 'First photo on the record. Null when there are none.'}, 'taxon': {'anyOf': [{'type': 'object', 'required': ['id', 'name', 'rank', 'common_name', 'iconic_taxon_name'], 'properties': {'id': {'type': 'number', 'description': 'Taxon id â\x80\x94 the identifier every taxon-scoped filter takes.'}, 'name': {'type': ['string', 'null'], 'description': 'Scientific name.'}, 'rank': {'type': ['string', 'null'], 'description': 'Taxonomic rank, e.g. "species".'}, 'common_name': {'type': ['string', 'null'], 'description': 'Preferred common name, when one is recorded.'}, 'iconic_taxon_name': {'type': ['string', 'null'], 'description': 'Broad organism group, e.g. "Insecta". Usable as an iconic_taxa filter value.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Current identification. Null when nobody has identified the record.'}, 'photos': {'type': 'array', 'items': {'type': 'object', 'required': ['square_url', 'attribution', 'license_code', 'open'], 'properties': {'open': {'type': 'boolean', 'description': 'True when the photo is served from the host the upstream reserves for open licences. A photo can move hosts when its licence changes, so this reflects fetch time.'}, 'medium_url': {'type': 'string', 'description': 'Medium variant. Supplied by upstream where it publishes every size, otherwise derived by substituting the size qualifier in the path. Absent when the path did not match the documented shape.'}, 'square_url': {'type': ['string', 'null'], 'description': '75px square variant, exactly as upstream published it. Null when absent.'}, 'attribution': {'type': ['string', 'null'], 'description': 'Attribution string, verbatim and never reformatted. Reproduce it with any use of the image.'}, 'license_code': {'type': ['string', 'null'], 'description': 'Photo licence code. Null means all rights reserved, independent of the record.'}}, 'description': 'A photo with the attribution and licence that must travel with it.', 'additionalProperties': False}, 'description': 'Every photo on the record. Present when "photos" was included.'}, 'sounds': {'type': 'array', 'items': {'type': 'object', 'required': ['url', 'attribution', 'license_code'], 'properties': {'url': {'type': ['string', 'null'], 'description': 'Audio file URL. Null when upstream published none.'}, 'attribution': {'type': ['string', 'null'], 'description': 'Attribution string, verbatim.'}, 'license_code': {'type': ['string', 'null'], 'description': 'Sound licence code. Null means all rights reserved.'}}, 'description': 'An audio recording with its attribution and licence.', 'additionalProperties': False}, 'description': 'Audio recordings. Present when "sounds" was included.'}, 'captive': {'type': 'boolean', 'description': 'True for a zoo animal, a garden planting, or other cultivation.'}, 'comments': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'by', 'body', 'created_at'], 'properties': {'by': {'type': ['string', 'null'], 'description': 'Login of the commenter.'}, 'id': {'type': 'number', 'description': 'Comment id.'}, 'body': {'type': ['string', 'null'], 'description': 'Free-text comment body.'}, 'created_at': {'type': ['string', 'null'], 'description': 'When the comment was posted, ISO 8601.'}}, 'description': 'One discussion comment on the record.', 'additionalProperties': False}, 'description': 'Discussion comments, cut to their first entries in upstream order (not strictly chronological) when they exceed the per-record share of a 40-entry budget. Present when "comments" was included.'}, 'obscured': {'type': 'boolean', 'description': 'True when the true coordinate is withheld, typically for a threatened taxon. The point is never resolved or approximated.'}, 'observer': {'type': ['string', 'null'], 'description': 'Login of the observer. The rest of the upstream profile is not relayed.'}, 'agreements': {'type': 'number', 'description': 'How many identifications currently agree with the community taxon.'}, 'coordinate': {'anyOf': [{'type': 'object', 'required': ['lat', 'lng', 'accuracy_m'], 'properties': {'lat': {'type': 'number', 'description': 'Latitude in decimal degrees.'}, 'lng': {'type': 'number', 'description': 'Longitude in decimal degrees.'}, 'accuracy_m': {'type': ['number', 'null'], 'description': 'Public positional accuracy radius in metres. On an obscured record this is tens of kilometres and the point is a locality, not a sighting position.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Public coordinate. Null when the record carries none.'}, 'geoprivacy': {'type': ['string', 'null'], 'description': 'Observer-set coordinate privacy: obscured, obscured_private, open, or private.'}, 'annotations': {'type': 'array', 'items': {'type': 'object', 'required': ['attribute', 'value', 'attribute_id', 'value_id', 'by'], 'properties': {'by': {'type': ['string', 'null'], 'description': 'Login of the member who added the annotation.'}, 'value': {'type': ['string', 'null'], 'description': 'Decoded value label, e.g. "Larva". Null when the id is not in the vocabulary.'}, 'value_id': {'type': 'number', 'description': 'Value id, usable as term_value_id on the search tools.'}, 'attribute': {'type': ['string', 'null'], 'description': 'Decoded attribute label, e.g. "Life Stage". Null when the id is not in the vocabulary.'}, 'attribute_id': {'type': 'number', 'description': 'Attribute id, usable as term_id on the search tools.'}}, 'description': 'One decoded annotation on the record.', 'additionalProperties': False}, 'description': 'Decoded annotations. Present when "annotations" was included.'}, 'description': {'type': ['string', 'null'], 'description': 'The observerâ\x80\x99s own note on the sighting â\x80\x94 host plant, behaviour, habitat, count. Third-party free text. Present on the by-id tool; null when the observer wrote none.'}, 'observed_at': {'type': ['string', 'null'], 'description': 'Observation timestamp with offset, ISO 8601.'}, 'observed_on': {'type': ['string', 'null'], 'description': 'Observation date, YYYY-MM-DD. Null when the observer recorded no date.'}, 'photo_count': {'type': 'number', 'description': 'How many photos the record carries, so include "photos" can be spent knowingly.'}, 'place_guess': {'type': ['string', 'null'], 'description': 'Locality text written by the observer. Third-party free text.'}, 'sound_count': {'type': 'number', 'description': 'How many audio recordings the record carries.'}, 'license_code': {'type': ['string', 'null'], 'description': 'Licence of the observation record itself. Null means all rights reserved.'}, 'disagreements': {'type': 'number', 'description': 'How many identifications currently disagree with the community taxon.'}, 'quality_grade': {'enum': ['research', 'needs_id', 'casual'], 'type': 'string', 'description': 'Identification confidence tier: research, needs_id, or casual.'}, 'comments_shown': {'type': 'number', 'description': 'How many of them comments carries. Below comments_total when the thread was cut. Present when "comments" was included.'}, 'comments_total': {'type': 'number', 'description': 'How many comments upstream holds on the record. Present when "comments" was included.'}, 'community_taxon': {'anyOf': [{'type': 'object', 'required': ['id', 'name', 'rank', 'common_name', 'iconic_taxon_name'], 'properties': {'id': {'type': 'number', 'description': 'Taxon id â\x80\x94 the identifier every taxon-scoped filter takes.'}, 'name': {'type': ['string', 'null'], 'description': 'Scientific name.'}, 'rank': {'type': ['string', 'null'], 'description': 'Taxonomic rank, e.g. "species".'}, 'common_name': {'type': ['string', 'null'], 'description': 'Preferred common name, when one is recorded.'}, 'iconic_taxon_name': {'type': ['string', 'null'], 'description': 'Broad organism group, e.g. "Insecta". Usable as an iconic_taxa filter value.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Consensus taxon, resolved. Present on the by-id tool; null when the thread has reached none.'}, 'identifications': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'taxon', 'by', 'current', 'category', 'disagreement', 'from_vision', 'body', 'created_at'], 'properties': {'by': {'type': ['string', 'null'], 'description': 'Login of the identifier.'}, 'id': {'type': 'number', 'description': 'Identification id.'}, 'body': {'type': ['string', 'null'], 'description': 'Free-text note written by the identifier.'}, 'taxon': {'anyOf': [{'type': 'object', 'required': ['id', 'name', 'rank', 'common_name', 'iconic_taxon_name'], 'properties': {'id': {'type': 'number', 'description': 'Taxon id â\x80\x94 the identifier every taxon-scoped filter takes.'}, 'name': {'type': ['string', 'null'], 'description': 'Scientific name.'}, 'rank': {'type': ['string', 'null'], 'description': 'Taxonomic rank, e.g. "species".'}, 'common_name': {'type': ['string', 'null'], 'description': 'Preferred common name, when one is recorded.'}, 'iconic_taxon_name': {'type': ['string', 'null'], 'description': 'Broad organism group, e.g. "Insecta". Usable as an iconic_taxa filter value.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Taxon this identification proposes.'}, 'current': {'type': 'boolean', 'description': 'True when this is the identifierâ\x80\x99s current identification on the record.'}, 'category': {'type': ['string', 'null'], 'description': 'How this identification moved the thread: improving, supporting, leading, or maverick.'}, 'created_at': {'type': ['string', 'null'], 'description': 'When the identification was added, ISO 8601.'}, 'from_vision': {'type': 'boolean', 'description': 'True when the identification came from the upstream image classifier.'}, 'disagreement': {'type': ['boolean', 'null'], 'description': 'True when the identifier explicitly disagreed with the preceding taxon.'}}, 'description': 'One identification in the community thread.', 'additionalProperties': False}, 'description': 'The identification thread, cut to its first entries in upstream order (roughly but not strictly chronological) when it exceeds the per-record share of a 40-entry budget. Present when "identifications" was included.'}, 'taxon_geoprivacy': {'type': ['string', 'null'], 'description': 'Coordinate privacy applied automatically for a threatened taxon. Same vocabulary.'}, 'community_taxon_id': {'type': ['number', 'null'], 'description': 'Consensus taxon id. Differs from taxon.id while a thread is contested.'}, 'observation_fields': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'value'], 'properties': {'name': {'type': ['string', 'null'], 'description': 'Field name, as its creator wrote it, e.g. "Habitat_Description".'}, 'value': {'type': 'string', 'description': 'The value filled in, verbatim.'}}, 'description': 'One filled observation field.', 'additionalProperties': False}, 'description': 'Observation-field values filled in on the record, usually by a project; fields left blank are dropped. Cut to the first filled fields in upstream order when they exceed the per-record share of a 40-entry budget. Present on the by-id tool.'}, 'identifications_count': {'type': 'number', 'description': 'Upstreamâ\x80\x99s tally of identifications currently agreeing or disagreeing with the community taxon â\x80\x94 agreements + disagreements. Not the thread size: it leaves out the observerâ\x80\x99s own identification and any that neither agrees nor disagrees, such as a coarser or withdrawn one. The thread size is identifications_total, on inaturalist_get_observation.'}, 'identifications_shown': {'type': 'number', 'description': 'How many of them identifications carries. Below identifications_total when the thread was cut. Present when "identifications" was included.'}, 'identifications_total': {'type': 'number', 'description': 'How many identifications upstream holds on the record â\x80\x94 the thread size. Present when "identifications" was included.'}, 'observation_fields_shown': {'type': 'number', 'description': 'How many of them observation_fields carries. Below observation_fields_total when the list was cut. Present on the by-id tool.'}, 'observation_fields_total': {'type': 'number', 'description': 'How many filled observation fields the record carries. Present on the by-id tool.'}, 'identification_disagreements_count': {'type': 'number', 'description': 'Count of disagreeing identifications as upstream tallies it. Present on the by-id tool.'}}, 'description': 'One projected observation record.', 'additionalProperties': False}, 'description': 'The observations that resolved, in the requested order with unresolved ids left out, carrying the expansions that were requested.'}}, 'additionalProperties': False}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['taxon_id'], 'properties': {'d1': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Earliest observation date, YYYY-MM-DD. Inclusive. Must be on or before d2.'}, 'd2': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Latest observation date, YYYY-MM-DD. Inclusive.'}, 'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude of the search centre, in decimal degrees. Requires lng and radius.'}, 'lng': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude of the search centre, in decimal degrees. Requires lat and radius.'}, 'limit': {'type': 'integer', 'default': 20, 'maximum': 50, 'minimum': 1, 'description': 'Maximum look-alikes to return. Applied in-process â\x80\x94 the upstream endpoint publishes no page size and returns its whole confusion set.'}, 'nelat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'North-east corner latitude of the bounding box, at or north of swlat. All four corners or none.'}, 'nelng': {'type': 'number', 'maximum': 180, 'minimum': -180, '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.'}, 'swlat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'South-west corner latitude of the bounding box. All four corners or none.'}, 'swlng': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'South-west corner longitude of the bounding box. All four corners or none.'}, 'radius': {'type': 'number', 'maximum': 500, '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.'}, 'captive': {'type': 'boolean', 'default': False, 'description': 'Whether to include captive and cultivated records â\x80\x94 zoo animals, garden plantings. Defaults to wild organisms only.'}, 'place_id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, '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.'}, 'taxon_id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Numeric taxon id to find look-alikes for, at genus or finer â\x80\x94 a genus, species, or subspecies; a family or anything coarser is refused. Resolve a name to an id with inaturalist_resolve_name.'}, 'quality_grade': {'type': 'array', 'items': {'enum': ['research', 'needs_id', 'casual'], 'type': 'string'}, 'default': ['research'], 'minItems': 1, 'description': 'Identification confidence tiers to include. Defaults to research-grade only; adding "needs_id" roughly doubles the corpus and lowers identification confidence.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['taxon_id', 'similar_species', 'totalCount', 'truncated', 'shown', 'cap']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The limit that was applied.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_geography', 'inverted_date_range', 'unknown_taxon_id', 'taxon_rank_too_coarse'], 'description': 'Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially, in two forms at once, with a radius of 0 or less, or with nelat south of swlat. `inverted_date_range`: d1 is after d2. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. `taxon_rank_too_coarse`: iNaturalist answered 422 because the taxon is coarser than genus, such as a family, order, or class. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'How many look-alikes this response carries.'}, 'notice': {'type': 'string', 'description': 'Guidance when no look-alikes are recorded, or when the limit cut the set.'}, 'taxon_id': {'type': 'number', 'description': 'The taxon the look-alikes were found for.'}, 'truncated': {'type': 'boolean', 'description': 'True when the limit cut the confusion set.'}, 'totalCount': {'type': 'number', 'description': 'How many look-alikes upstream returned, before the limit was applied.'}, 'similar_species': {'type': 'array', 'items': {'type': 'object', 'required': ['taxon_id', 'name', 'common_name', 'rank', 'observations_count', 'misidentification_count'], 'properties': {'name': {'type': ['string', 'null'], 'description': 'Scientific name.'}, 'rank': {'type': ['string', 'null'], 'description': 'Taxonomic rank, e.g. "species".'}, 'photo': {'type': 'object', 'required': ['square_url', 'attribution', 'license_code', 'open'], 'properties': {'open': {'type': 'boolean', 'description': 'True when the photo is served from the host the upstream reserves for open licences. A photo can move hosts when its licence changes, so this reflects fetch time.'}, 'medium_url': {'type': 'string', 'description': 'Medium variant. Supplied by upstream where it publishes every size, otherwise derived by substituting the size qualifier in the path. Absent when the path did not match the documented shape.'}, 'square_url': {'type': ['string', 'null'], 'description': '75px square variant, exactly as upstream published it. Null when absent.'}, 'attribution': {'type': ['string', 'null'], 'description': 'Attribution string, verbatim and never reformatted. Reproduce it with any use of the image.'}, 'license_code': {'type': ['string', 'null'], 'description': 'Photo licence code. Null means all rights reserved, independent of the record.'}}, 'description': 'Representative photo, when the taxon carries one.', 'additionalProperties': False}, 'taxon_id': {'type': 'number', 'description': 'Taxon id of the look-alike â\x80\x94 pass it to inaturalist_get_taxon for its profile.'}, 'common_name': {'type': ['string', 'null'], 'description': 'Preferred common name, when one is recorded.'}, 'observations_count': {'type': ['number', 'null'], 'description': 'How many observations this look-alike has overall. Null when upstream published none.'}, 'misidentification_count': {'type': 'number', 'description': 'How many times identifiers corrected this taxon to the queried one. The ranking key.'}}, 'description': 'One look-alike and how often it is confused with the queried taxon.', 'additionalProperties': False}, 'description': 'Look-alikes ranked by misidentification_count, most-confused first.'}, 'truncationCeiling': {'type': 'number', 'description': 'Misidentification count of the last look-alike shown. The ranking is descending, so no omitted look-alike exceeds it.'}}, 'additionalProperties': False}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'d1': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Earliest observation date, YYYY-MM-DD. Inclusive. Must be on or before d2.'}, 'd2': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Latest observation date, YYYY-MM-DD. Inclusive.'}, 'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude of the search centre, in decimal degrees. Requires lng and radius.'}, 'lng': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude of the search centre, in decimal degrees. Requires lat and radius.'}, 'page': {'type': 'integer', 'default': 1, 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Page number. Defaults to 1.'}, 'nelat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'North-east corner latitude of the bounding box, at or north of swlat. All four corners or none.'}, 'nelng': {'type': 'number', 'maximum': 180, 'minimum': -180, '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.'}, 'swlat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'South-west corner latitude of the bounding box. All four corners or none.'}, 'swlng': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'South-west corner longitude of the bounding box. All four corners or none.'}, 'radius': {'type': 'number', 'maximum': 500, '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.'}, 'captive': {'type': 'boolean', 'default': False, 'description': 'Whether to include captive and cultivated records â\x80\x94 zoo animals, garden plantings. Defaults to wild organisms only.'}, 'term_id': {'type': 'array', 'items': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1}, 'description': 'Annotation attribute ids, from inaturalist_list_reference topic controlled_terms â\x80\x94 e.g. 1 for Life Stage.'}, 'user_id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Restrict to one observer, by numeric user id from inaturalist_resolve_name type user. Mutually exclusive with user_login.'}, 'per_page': {'type': 'integer', 'default': 25, 'maximum': 50, 'minimum': 1, 'description': 'Species per page, maximum 50. A ranked species costs roughly 860 bytes across structuredContent and the rendered text together, so 50 is a full page near 43 KB. Upstream would serve 500 in one page â\x80\x94 raise page rather than asking for it.'}, 'place_id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, '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.'}, 'taxon_id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Restrict to this taxon and its descendants. Resolve a name to an id with inaturalist_resolve_name.'}, 'project_id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Restrict to observations in one project, by numeric project id from inaturalist_resolve_name type project.'}, 'user_login': {'type': 'string', 'minLength': 1, 'description': 'Restrict to one observer, by login â\x80\x94 the login on an inaturalist_resolve_name user candidate, a leaderboard entry, or an observationâ\x80\x99s observer. Mutually exclusive with user_id.'}, 'iconic_taxa': {'type': 'array', 'items': {'enum': ['Actinopterygii', 'Amphibia', 'Animalia', 'Arachnida', 'Aves', 'Chromista', 'Fungi', 'Insecta', 'Mammalia', 'Mollusca', 'Plantae', 'Protozoa', 'Reptilia', 'unknown'], 'type': 'string'}, '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.'}, 'quality_grade': {'type': 'array', 'items': {'enum': ['research', 'needs_id', 'casual'], 'type': 'string'}, 'default': ['research'], 'minItems': 1, 'description': 'Identification confidence tiers to include. Defaults to research-grade only; adding "needs_id" roughly doubles the corpus and lowers identification confidence.'}, 'term_value_id': {'type': 'array', 'items': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1}, 'description': 'Annotation value ids, from the same attribute listing â\x80\x94 e.g. 6 for Larva. Requires term_id; sent alone it is ignored upstream and the unfiltered corpus comes back.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['total_results', 'species', 'applied_filters', 'truncated', 'shown', 'cap']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The per_page that was applied.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_geography', 'inverted_date_range', 'unpaired_annotation_value', 'conflicting_observer', 'unknown_taxon_id', 'unknown_user', 'unknown_project_id'], 'description': 'Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially, in two forms at once, with a radius of 0 or less, or with nelat south of swlat. `inverted_date_range`: d1 is after d2. `unpaired_annotation_value`: term_value_id was supplied without term_id. `conflicting_observer`: user_id and user_login were both supplied. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. `unknown_user`: iNaturalist answered 422 because the user_id or user_login names no observer. `unknown_project_id`: iNaturalist answered 422 because the project_id does not exist. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'How many species this page carries.'}, 'notice': {'type': 'string', 'description': 'Guidance when nothing matched, when the page is past the last one holding species, or how to reach the species beyond this page.'}, 'species': {'type': 'array', 'items': {'type': 'object', 'required': ['position', 'taxon_id', 'name', 'common_name', 'rank', 'iconic_taxon_name', 'observation_count'], 'properties': {'name': {'type': ['string', 'null'], 'description': 'Scientific name.'}, 'rank': {'type': ['string', 'null'], 'description': 'Taxonomic rank, e.g. "species".'}, 'photo': {'type': 'object', 'required': ['square_url', 'attribution', 'license_code', 'open'], 'properties': {'open': {'type': 'boolean', 'description': 'True when the photo is served from the host the upstream reserves for open licences. A photo can move hosts when its licence changes, so this reflects fetch time.'}, 'medium_url': {'type': 'string', 'description': 'Medium variant. Supplied by upstream where it publishes every size, otherwise derived by substituting the size qualifier in the path. Absent when the path did not match the documented shape.'}, 'square_url': {'type': ['string', 'null'], 'description': '75px square variant, exactly as upstream published it. Null when absent.'}, 'attribution': {'type': ['string', 'null'], 'description': 'Attribution string, verbatim and never reformatted. Reproduce it with any use of the image.'}, 'license_code': {'type': ['string', 'null'], 'description': 'Photo licence code. Null means all rights reserved, independent of the record.'}}, 'description': 'Representative photo, when the taxon carries one.', 'additionalProperties': False}, 'position': {'type': 'number', 'description': 'Absolute place in this ranking, counted from page 1 â\x80\x94 7 is the seventh most-observed species. Not the taxonomic rank, which is rank.'}, 'taxon_id': {'type': 'number', 'description': 'Taxon id â\x80\x94 pass it as taxon_id to any taxon-scoped tool or to inaturalist_get_taxon.'}, 'common_name': {'type': ['string', 'null'], 'description': 'Preferred common name, when one is recorded.'}, 'iconic_taxon_name': {'type': ['string', 'null'], 'description': 'Broad organism group, e.g. "Aves". Usable as an iconic_taxa filter value.'}, 'observation_count': {'type': 'number', 'description': 'How many matching observations record this taxon. The ranking key.'}}, 'description': 'One species and how often it was recorded in the requested area and period.', 'additionalProperties': False}, 'description': 'The species, ranked by observation_count, most-observed first, each at its absolute position.'}, 'truncated': {'type': 'boolean', 'description': 'True when the page filled per_page and more species follow.'}, 'total_results': {'type': 'number', 'description': 'How many distinct species match. An estimate over a live index â\x80\x94 it drifts between calls seconds apart.'}, 'applied_filters': {'type': 'object', 'required': ['quality_grade', 'captive'], 'properties': {'captive': {'type': 'boolean', 'description': 'Whether captive and cultivated records were included.'}, 'quality_grade': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Identification tiers actually searched.'}}, 'description': 'The server-applied defaults that determine what this answer means.', 'additionalProperties': False}, 'truncationCeiling': {'type': 'number', 'description': 'Observation count of the last species shown. The ranking is descending, so no species left off this page exceeds it.'}}, 'additionalProperties': False}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['taxon_id'], 'properties': {'sections': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'description': 'Sections to return: summary, taxonomy, children, conservation, photos, encyclopedia. Omit for the whole profile, or an outline of it when it overflows. A selection returns whatever it names, at whatever size, so sum the byte sizes from the outline before asking for several.'}, 'taxon_id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Numeric taxon id. A non-numeric value answers HTTP 422 with an empty message upstream, so the integer is enforced here. Resolve a name to an id with inaturalist_resolve_name.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['kind', 'sections_applied']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'id': {'type': 'number', 'description': 'Taxon id.'}, 'kind': {'enum': ['full', 'outline'], 'type': 'string', 'description': '"full" when the profile itself is returned, "outline" when it overflowed and only the section list came back.'}, 'name': {'type': ['string', 'null'], 'description': 'Scientific name.'}, 'rank': {'type': ['string', 'null'], 'description': 'Taxonomic rank, e.g. "species".'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['not_found', 'unknown_section'], 'description': 'Machine-readable failure mode. Declared by this tool: `not_found`: iNaturalist answered with an empty results array for that taxon id. `unknown_section`: sections named a key the projected document does not carry. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'notice': {'type': 'string', 'description': 'How to re-call for specific sections. Present on the outline.'}, 'photos': {'type': 'array', 'items': {'type': 'object', 'required': ['square_url', 'attribution', 'license_code', 'open'], 'properties': {'open': {'type': 'boolean', 'description': 'True when the photo is served from the host the upstream reserves for open licences. A photo can move hosts when its licence changes, so this reflects fetch time.'}, 'large_url': {'type': 'string', 'description': 'Large variant, as the taxon endpoint publishes it. Absent when upstream carried none; never derived here.'}, 'medium_url': {'type': 'string', 'description': 'Medium variant. Supplied by upstream where it publishes every size, otherwise derived by substituting the size qualifier in the path. Absent when the path did not match the documented shape.'}, 'square_url': {'type': ['string', 'null'], 'description': '75px square variant, exactly as upstream published it. Null when absent.'}, 'attribution': {'type': ['string', 'null'], 'description': 'Attribution string, verbatim and never reformatted. Reproduce it with any use of the image.'}, 'license_code': {'type': ['string', 'null'], 'description': 'Photo licence code. Null means all rights reserved, independent of the record.'}}, 'description': 'A taxon gallery photo with the attribution and licence that must travel with it.', 'additionalProperties': False}, 'description': 'Gallery photos, each with its own licence.'}, 'vision': {'type': 'boolean', 'description': 'True when the taxon is covered by the upstream image classifier.'}, 'extinct': {'type': 'boolean', 'description': 'True when the taxon is recorded as extinct.'}, 'children': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'rank', 'common_name', 'observations_count'], 'properties': {'id': {'type': 'number', 'description': 'Taxon id of this ancestor â\x80\x94 usable as taxon_id on any tool.'}, 'name': {'type': ['string', 'null'], 'description': 'Scientific name.'}, 'rank': {'type': ['string', 'null'], 'description': 'Taxonomic rank, e.g. "family".'}, 'common_name': {'type': ['string', 'null'], 'description': 'Preferred common name, when one is recorded.'}, 'observations_count': {'type': ['number', 'null'], 'description': 'How many observations this child taxon has. Null when upstream published none.'}}, 'description': 'One immediate child taxon.', 'additionalProperties': False}, 'description': 'Immediate children of this taxon.'}, 'sections': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'bytes'], 'properties': {'name': {'type': 'string', 'description': 'Section identifier â\x80\x94 pass in `sections` to retrieve it'}, 'bytes': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Serialized byte size of the section'}}, 'description': 'One section that can be named in a re-call, and what it costs.', 'additionalProperties': False}, 'description': 'Available sections and their byte sizes, largest first. Present on the outline.'}, 'taxonomy': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'rank', 'common_name'], 'properties': {'id': {'type': 'number', 'description': 'Taxon id of this ancestor â\x80\x94 usable as taxon_id on any tool.'}, 'name': {'type': ['string', 'null'], 'description': 'Scientific name.'}, 'rank': {'type': ['string', 'null'], 'description': 'Taxonomic rank, e.g. "family".'}, 'common_name': {'type': ['string', 'null'], 'description': 'Preferred common name, when one is recorded.'}}, 'description': 'One rung of the taxonomic path, outermost first.', 'additionalProperties': False}, 'description': 'Ancestors from the root of the tree down to the taxonâ\x80\x99s parent.'}, 'is_active': {'type': 'boolean', 'description': 'False for a taxon superseded by a taxonomic change; its id still resolves.'}, 'rank_level': {'type': ['number', 'null'], 'description': 'Numeric rank level â\x80\x94 70 kingdom, 30 family, 10 species, 5 subspecies.'}, 'common_name': {'type': ['string', 'null'], 'description': 'Preferred common name, when one is recorded.'}, 'conservation': {'type': 'object', 'required': ['statuses', 'global_status'], 'properties': {'statuses': {'type': 'array', 'items': {'type': 'object', 'required': ['status', 'authority', 'iucn', 'place', 'url'], 'properties': {'url': {'type': ['string', 'null'], 'description': 'Source page for the listing, when published.'}, 'iucn': {'type': ['number', 'null'], 'description': 'IUCN-normalised level upstream assigns this listing, on its own numeric scale.'}, 'place': {'type': ['string', 'null'], 'description': 'Place the listing applies to. Null for a listing with global scope.'}, 'status': {'type': ['string', 'null'], 'description': 'The authorityâ\x80\x99s own status text â\x80\x94 "Special Concern", "G4", "Sujeta a protección especial" are all real values. Not the normalised csi filter vocabulary.'}, 'authority': {'type': ['string', 'null'], 'description': 'The body that published this listing.'}}, 'description': 'One conservation listing, by authority and place.', 'additionalProperties': False}, 'description': 'Every listing upstream records, one per authority and place.'}, 'global_status': {'anyOf': [{'type': 'object', 'required': ['status', 'authority', 'iucn', 'place', 'url'], 'properties': {'url': {'type': ['string', 'null'], 'description': 'Source page for the listing, when published.'}, 'iucn': {'type': ['number', 'null'], 'description': 'IUCN-normalised level upstream assigns this listing, on its own numeric scale.'}, 'place': {'type': ['string', 'null'], 'description': 'Place the listing applies to. Null for a listing with global scope.'}, 'status': {'type': ['string', 'null'], 'description': 'The authorityâ\x80\x99s own status text â\x80\x94 "Special Concern", "G4", "Sujeta a protección especial" are all real values. Not the normalised csi filter vocabulary.'}, 'authority': {'type': ['string', 'null'], 'description': 'The body that published this listing.'}}, 'description': 'One conservation listing, by authority and place.', 'additionalProperties': False}, {'type': 'null'}], 'description': 'The listing upstream marks as the taxonâ\x80\x99s global status. Null when it records none.'}}, 'description': 'Conservation listings for the taxon.', 'additionalProperties': False}, 'encyclopedia': {'type': 'object', 'required': ['wikipedia_summary', 'wikipedia_url'], 'properties': {'wikipedia_url': {'type': ['string', 'null'], 'description': 'Wikipedia page for the taxon.'}, 'wikipedia_summary': {'type': ['string', 'null'], 'description': 'Encyclopedia summary, verbatim and containing inline HTML tags. Third-party free text.'}}, 'description': 'The encyclopedia text and link upstream carries for the taxon.', 'additionalProperties': False}, 'sections_applied': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Sections this response carries. Empty when the whole profile came back, so an absent section means the taxon has none rather than that it was never asked for.'}, 'iconic_taxon_name': {'type': ['string', 'null'], 'description': 'Broad organism group, e.g. "Insecta". Usable as an iconic_taxa filter value.'}, 'listed_taxa_count': {'type': ['number', 'null'], 'description': 'How many place checklists include this taxon. The checklist entries themselves are not relayed.'}, 'observations_count': {'type': ['number', 'null'], 'description': 'How many observations carry this taxon or a descendant of it.'}}, 'additionalProperties': False}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['topic'], 'properties': {'topic': {'enum': ['controlled_terms', 'quality_grades', 'licenses', 'ranks', 'iconic_taxa', 'conservation_status_codes'], 'type': 'string', 'description': 'Which vocabulary to decode. controlled_terms is fetched live and cached; the rest are spec-derived static tables.'}, 'taxon_id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Add observed annotation usage for this taxon, ranked by how often each attribute/value pair has been recorded. Valid only with topic controlled_terms. Resolve a name to an id with inaturalist_resolve_name.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['topic', 'source', 'entries']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['taxon_id_not_applicable', 'unknown_taxon_id'], 'description': 'Machine-readable failure mode. Declared by this tool: `taxon_id_not_applicable`: taxon_id was supplied with a topic other than controlled_terms. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'topic': {'enum': ['controlled_terms', 'quality_grades', 'licenses', 'ranks', 'iconic_taxa', 'conservation_status_codes'], 'type': 'string', 'description': 'The vocabulary that was decoded.'}, 'notice': {'type': 'string', 'description': 'Guidance when the requested taxon has no recorded annotations yet.'}, 'source': {'enum': ['upstream', 'static'], 'type': 'string', 'description': '"upstream" when the table was fetched from iNaturalist, "static" when spec-derived.'}, 'entries': {'type': 'array', 'items': {'type': 'object', 'required': ['label'], 'properties': {'id': {'type': 'number', 'description': 'Numeric attribute id, on the controlled_terms topic. Pass it as term_id.'}, 'code': {'type': 'string', 'description': 'The literal filter value to pass, on the static topics â\x80\x94 e.g. "needs_id", "cc0", "Aves".'}, 'label': {'type': ['string', 'null'], 'description': 'Human-readable name for the entry.'}, 'notes': {'type': 'string', 'description': 'What the entry means, or how it is used, when it needs saying.'}, 'values': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'label', 'blocking'], 'properties': {'id': {'type': 'number', 'description': 'Value id. Pass it as term_value_id alongside the attribute id.'}, 'label': {'type': ['string', 'null'], 'description': 'Human-readable value name, e.g. "Larva".'}, 'blocking': {'type': 'boolean', 'description': 'True when this value blocks other values of the same attribute.'}}, 'description': 'One value of an annotation attribute.', 'additionalProperties': False}, 'description': 'Values this annotation attribute accepts, on the controlled_terms topic.'}, 'multivalued': {'type': 'boolean', 'description': 'True when one observation may carry several values of this attribute.'}}, 'description': 'One vocabulary entry â\x80\x94 an annotation attribute, or a static filter code.', 'additionalProperties': False}, 'description': 'The vocabulary, one entry per code or attribute.'}, 'observed_usage': {'type': 'array', 'items': {'type': 'object', 'required': ['attribute', 'term_id', 'value', 'term_value_id', 'count'], 'properties': {'count': {'type': 'number', 'description': 'How many observations of this taxon carry the pair.'}, 'value': {'type': ['string', 'null'], 'description': 'Annotation value label. Labels repeat across attributes, so filter by the ids rather than the label.'}, 'term_id': {'type': ['number', 'null'], 'description': 'Attribute id â\x80\x94 pass it as term_id to filter search, species counts, or the histogram. Null when upstream omitted it.'}, 'attribute': {'type': ['string', 'null'], 'description': 'Annotation attribute label.'}, 'term_value_id': {'type': ['number', 'null'], 'description': 'Value id â\x80\x94 pass it as term_value_id alongside term_id. Null when upstream omitted it.'}}, 'description': 'One attribute/value pair and how often it has been recorded.', 'additionalProperties': False}, 'description': 'Observed annotation usage for taxon_id, most-used first. Present only when taxon_id was given.'}}, 'additionalProperties': False}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['q'], 'properties': {'q': {'type': 'string', 'maxLength': 100, 'minLength': 1, 'description': 'The name to resolve. On type "taxon" this is a name prefix or an exact taxon id; on the other types it is matched across the record text.'}, 'rank': {'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'], 'type': 'string', 'description': 'Restrict taxon candidates to one rank. Honoured only on type "taxon" â\x80\x94 the cross-kind search has no rank filter.'}, 'type': {'enum': ['taxon', 'place', 'project', 'user', 'any'], 'type': 'string', 'default': 'taxon', 'description': 'Which kind of record to resolve. "taxon" uses the taxon autocomplete; the rest use the scored cross-kind search, and "any" searches every kind at once. For a placeâ\x80\x99s bounding box and containment chain rather than just its id, use inaturalist_find_places instead.'}, 'limit': {'type': 'integer', 'default': 10, 'maximum': 30, 'minimum': 1, 'description': 'Maximum candidates to return, applied to every type.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['found', 'candidates', 'totalCount']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['rank_not_applicable'], 'description': 'Machine-readable failure mode. Declared by this tool: `rank_not_applicable`: rank was supplied with a type other than taxon. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'found': {'type': 'boolean', 'description': 'True when at least one candidate matched.'}, 'guidance': {'type': 'string', 'description': 'Why nothing matched and what to try instead. Present only when found is false â\x80\x94 this is the primary result of a miss.'}, 'candidates': {'type': 'array', 'items': {'type': 'object', 'required': ['kind', 'id', 'name'], 'properties': {'id': {'type': 'number', 'description': 'The identifier to pass onward â\x80\x94 taxon_id, place_id, project id, or user id.'}, 'kind': {'enum': ['taxon', 'place', 'project', 'user'], 'type': 'string', 'description': 'Which record kind this candidate is.'}, 'name': {'type': ['string', 'null'], 'description': 'Scientific name on taxa, place name, project title, or an observerâ\x80\x99s display name â\x80\x94 which falls back to the login when the observer set none.'}, 'rank': {'type': 'string', 'description': 'Taxonomic rank, on taxa.'}, 'slug': {'type': 'string', 'description': 'URL slug, on places and projects.'}, 'login': {'type': 'string', 'description': 'Observer login, on users only â\x80\x94 the value inaturalist_get_leaderboard entries and an observationâ\x80\x99s observer carry.'}, 'photo': {'type': 'object', 'required': ['square_url', 'attribution', 'license_code', 'open'], 'properties': {'open': {'type': 'boolean', 'description': 'True when the photo is served from the host the upstream reserves for open licences. A photo can move hosts when its licence changes, so this reflects fetch time.'}, 'medium_url': {'type': 'string', 'description': 'Medium variant. Supplied by upstream where it publishes every size, otherwise derived by substituting the size qualifier in the path. Absent when the path did not match the documented shape.'}, 'square_url': {'type': ['string', 'null'], 'description': '75px square variant, exactly as upstream published it. Null when absent.'}, 'attribution': {'type': ['string', 'null'], 'description': 'Attribution string, verbatim and never reformatted. Reproduce it with any use of the image.'}, 'license_code': {'type': ['string', 'null'], 'description': 'Photo licence code. Null means all rights reserved, independent of the record.'}}, 'description': 'Representative photo, when the record carries one.', 'additionalProperties': False}, 'score': {'type': 'number', 'description': 'Relevance score, on the cross-kind search only. No fixed range â\x80\x94 meaningful only relative to other candidates in this response, which are already sorted best match first.'}, 'common_name': {'type': 'string', 'description': 'Preferred common name, on taxa.'}, 'display_name': {'type': 'string', 'description': 'Place name with its administrative context, on places.'}, 'matched_term': {'type': 'string', 'description': 'The name variant that actually matched the query.'}, 'observations_count': {'type': 'number', 'description': 'How many observations the record covers.'}}, 'description': 'One ranked candidate.', 'additionalProperties': False}, 'description': 'Ranked candidates, best match first.'}, 'totalCount': {'type': 'number', 'description': 'Total candidates upstream matched, before the limit was applied.'}}, 'additionalProperties': False}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'q': {'type': 'string', 'minLength': 1, 'description': 'Free text matched across observation properties.'}, 'd1': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Earliest observation date, YYYY-MM-DD. Inclusive. Must be on or before d2.'}, 'd2': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Latest observation date, YYYY-MM-DD. Inclusive.'}, 'csi': {'type': 'array', 'items': {'enum': ['LC', 'NT', 'VU', 'EN', 'CR', 'EW', 'EX'], 'type': 'string'}, 'description': 'IUCN-normalised conservation status codes to include, e.g. ["EN","CR"]. Decode them with inaturalist_list_reference topic conservation_status_codes.'}, 'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude of the search centre, in decimal degrees. Requires lng and radius.'}, 'lng': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude of the search centre, in decimal degrees. Requires lat and radius.'}, 'page': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Page number within the first 10,000 results, under any ordering. Defaults to 1. Mutually exclusive with cursor.'}, 'hrank': {'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'], 'type': 'string', 'description': 'Highest (coarsest) taxonomic rank of the identification to accept. Must be at or above lrank; ranks compare by rank level.'}, 'lrank': {'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'], 'type': 'string', 'description': 'Lowest (finest) taxonomic rank of the identification to accept. Equal to hrank for an exact-rank match.'}, 'nelat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'North-east corner latitude of the bounding box, at or north of swlat. All four corners or none.'}, 'nelng': {'type': 'number', 'maximum': 180, 'minimum': -180, '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.'}, 'order': {'enum': ['asc', 'desc'], 'type': 'string', 'default': 'desc', 'description': 'Sort direction.'}, 'swlat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'South-west corner latitude of the bounding box. All four corners or none.'}, 'swlng': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'South-west corner longitude of the bounding box. All four corners or none.'}, 'cursor': {'type': 'string', 'pattern': '^[1-9]\\d*$', 'description': 'next_cursor from a previous id-descending page, to continue past the 10,000-result window â\x80\x94 a positive integer observation id, sent upstream as id_below. Mutually exclusive with page, and forces order_by "id", order "desc".'}, 'native': {'type': 'boolean', 'description': 'Restrict to taxa native to the observation location.'}, 'radius': {'type': 'number', 'maximum': 500, '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.'}, 'captive': {'type': 'boolean', 'default': False, 'description': 'Whether to include captive and cultivated records â\x80\x94 zoo animals, garden plantings. Defaults to wild organisms only.'}, 'endemic': {'type': 'boolean', 'description': 'Restrict to taxa endemic to the observation location.'}, 'include': {'type': 'array', 'items': {'enum': ['photos', 'annotations', 'sounds'], 'type': 'string'}, 'description': 'Embedded arrays to expand per record. Check photo_count and sound_count first â\x80\x94 expanding costs context.'}, 'license': {'type': 'array', 'items': {'enum': ['cc-by', 'cc-by-nc', 'cc-by-nd', 'cc-by-sa', 'cc-by-nc-nd', 'cc-by-nc-sa', 'cc0'], 'type': 'string'}, '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.'}, 'term_id': {'type': 'array', 'items': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1}, 'description': 'Annotation attribute ids, from inaturalist_list_reference topic controlled_terms â\x80\x94 e.g. 1 for Life Stage.'}, 'user_id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Restrict to one observer, by numeric user id from inaturalist_resolve_name type user. Mutually exclusive with user_login.'}, 'licensed': {'type': 'boolean', 'description': 'Restrict to records whose own license_code is not null â\x80\x94 any licence, NonCommercial and NoDerivatives variants included. For specific licences, use license.'}, 'order_by': {'enum': ['created_at', 'geo_score', 'id', 'observed_on', 'random', 'species_guess', 'updated_at', 'votes'], 'type': 'string', '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.'}, 'per_page': {'type': 'integer', 'default': 10, 'maximum': 25, 'minimum': 1, '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.'}, 'place_id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, '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.'}, 'taxon_id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Restrict to this taxon and its descendants. Resolve a name to an id with inaturalist_resolve_name.'}, 'search_on': {'enum': ['names', 'tags', 'description', 'place'], 'type': 'string', 'description': 'Narrow what q matches against. Requires q.'}, 'introduced': {'type': 'boolean', 'description': 'Restrict to taxa introduced to the observation location.'}, 'project_id': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Restrict to observations in one project, by numeric project id from inaturalist_resolve_name type project.'}, 'threatened': {'type': 'boolean', 'description': 'Restrict to taxa considered threatened where observed.'}, 'user_login': {'type': 'string', 'minLength': 1, 'description': 'Restrict to one observer, by login â\x80\x94 the login on an inaturalist_resolve_name user candidate, a leaderboard entry, or an observationâ\x80\x99s observer. Mutually exclusive with user_id.'}, 'iconic_taxa': {'type': 'array', 'items': {'enum': ['Actinopterygii', 'Amphibia', 'Animalia', 'Arachnida', 'Aves', 'Chromista', 'Fungi', 'Insecta', 'Mammalia', 'Mollusca', 'Plantae', 'Protozoa', 'Reptilia', 'unknown'], 'type': 'string'}, '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.'}, 'photo_license': {'type': 'array', 'items': {'enum': ['cc-by', 'cc-by-nc', 'cc-by-nd', 'cc-by-sa', 'cc-by-nc-nd', 'cc-by-nc-sa', 'cc0'], 'type': 'string'}, 'description': 'Restrict to records carrying at least one photo under one of these licence codes. Matched independently of the recordâ\x80\x99s own license_code, so check each photoâ\x80\x99s license_code before reusing it.'}, 'quality_grade': {'type': 'array', 'items': {'enum': ['research', 'needs_id', 'casual'], 'type': 'string'}, 'default': ['research'], 'minItems': 1, 'description': 'Identification confidence tiers to include. Defaults to research-grade only; adding "needs_id" roughly doubles the corpus and lowers identification confidence.'}, 'term_value_id': {'type': 'array', 'items': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1}, 'description': 'Annotation value ids, from the same attribute listing â\x80\x94 e.g. 6 for Larva. Requires term_id; sent alone it is ignored upstream and the unfiltered corpus comes back.'}, 'photo_licensed': {'type': 'boolean', 'description': 'Restrict to records with at least one licensed photo, under any licence. For specific licences, use photo_license.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['total_results', 'observations', 'has_more', 'applied_filters', 'truncated', 'shown', 'cap']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The per_page that was applied.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_geography', 'inverted_date_range', 'inverted_rank_range', 'result_window_exceeded', 'conflicting_pagination', 'unpaired_annotation_value', 'search_on_without_query', 'conflicting_observer', 'unknown_taxon_id', 'unknown_user', 'unknown_project_id'], 'description': 'Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially, in two forms at once, with a radius of 0 or less, or with nelat south of swlat. `inverted_date_range`: d1 is after d2. `inverted_rank_range`: hrank is a finer rank than lrank. `result_window_exceeded`: page multiplied by per_page would reach past the upstream 10,000-result window. `conflicting_pagination`: Both page and cursor were supplied. `unpaired_annotation_value`: term_value_id was supplied without term_id. `search_on_without_query`: search_on was supplied without q. `conflicting_observer`: user_id and user_login were both supplied. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. `unknown_user`: iNaturalist answered 422 because the user_id or user_login names no observer. `unknown_project_id`: iNaturalist answered 422 because the project_id does not exist. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'How many records this page carries.'}, 'notice': {'type': 'string', 'description': 'Guidance when nothing matched, when the page is past the last one holding results, or how to continue past a full page.'}, 'has_more': {'type': 'boolean', 'description': 'True when this page filled per_page and more records follow. On the page path an exactly full final page is false; under a cursor, where the offset is unknown, every full page is true.'}, 'truncated': {'type': 'boolean', 'description': 'True when the page filled per_page and more records follow.'}, 'next_cursor': {'type': 'string', 'description': 'Pass back as cursor to continue past this page. Present only when has_more is true and the page was ordered by id descending; under any other ordering, raise page instead.'}, 'observations': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'uuid', 'url', 'observed_on', 'observed_at', 'taxon', 'place_guess', 'coordinate', 'obscured', 'geoprivacy', 'taxon_geoprivacy', 'quality_grade', 'license_code', 'captive', 'photo', 'photo_count', 'sound_count', 'observer', 'identifications_count', 'agreements', 'disagreements', 'community_taxon_id'], 'properties': {'id': {'type': 'number', 'description': 'Observation id. Also the cursor value for deep pagination.'}, 'url': {'type': ['string', 'null'], 'description': 'Canonical iNaturalist page for the record.'}, 'uuid': {'type': ['string', 'null'], 'description': 'Stable UUID, independent of the id sequence.'}, 'photo': {'anyOf': [{'type': 'object', 'required': ['square_url', 'attribution', 'license_code', 'open'], 'properties': {'open': {'type': 'boolean', 'description': 'True when the photo is served from the host the upstream reserves for open licences. A photo can move hosts when its licence changes, so this reflects fetch time.'}, 'medium_url': {'type': 'string', 'description': 'Medium variant. Supplied by upstream where it publishes every size, otherwise derived by substituting the size qualifier in the path. Absent when the path did not match the documented shape.'}, 'square_url': {'type': ['string', 'null'], 'description': '75px square variant, exactly as upstream published it. Null when absent.'}, 'attribution': {'type': ['string', 'null'], 'description': 'Attribution string, verbatim and never reformatted. Reproduce it with any use of the image.'}, 'license_code': {'type': ['string', 'null'], 'description': 'Photo licence code. Null means all rights reserved, independent of the record.'}}, 'description': 'A photo with the attribution and licence that must travel with it.', 'additionalProperties': False}, {'type': 'null'}], 'description': 'First photo on the record. Null when there are none.'}, 'taxon': {'anyOf': [{'type': 'object', 'required': ['id', 'name', 'rank', 'common_name', 'iconic_taxon_name'], 'properties': {'id': {'type': 'number', 'description': 'Taxon id â\x80\x94 the identifier every taxon-scoped filter takes.'}, 'name': {'type': ['string', 'null'], 'description': 'Scientific name.'}, 'rank': {'type': ['string', 'null'], 'description': 'Taxonomic rank, e.g. "species".'}, 'common_name': {'type': ['string', 'null'], 'description': 'Preferred common name, when one is recorded.'}, 'iconic_taxon_name': {'type': ['string', 'null'], 'description': 'Broad organism group, e.g. "Insecta". Usable as an iconic_taxa filter value.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Current identification. Null when nobody has identified the record.'}, 'photos': {'type': 'array', 'items': {'type': 'object', 'required': ['square_url', 'attribution', 'license_code', 'open'], 'properties': {'open': {'type': 'boolean', 'description': 'True when the photo is served from the host the upstream reserves for open licences. A photo can move hosts when its licence changes, so this reflects fetch time.'}, 'medium_url': {'type': 'string', 'description': 'Medium variant. Supplied by upstream where it publishes every size, otherwise derived by substituting the size qualifier in the path. Absent when the path did not match the documented shape.'}, 'square_url': {'type': ['string', 'null'], 'description': '75px square variant, exactly as upstream published it. Null when absent.'}, 'attribution': {'type': ['string', 'null'], 'description': 'Attribution string, verbatim and never reformatted. Reproduce it with any use of the image.'}, 'license_code': {'type': ['string', 'null'], 'description': 'Photo licence code. Null means all rights reserved, independent of the record.'}}, 'description': 'A photo with the attribution and licence that must travel with it.', 'additionalProperties': False}, 'description': 'Every photo on the record. Present when "photos" was included.'}, 'sounds': {'type': 'array', 'items': {'type': 'object', 'required': ['url', 'attribution', 'license_code'], 'properties': {'url': {'type': ['string', 'null'], 'description': 'Audio file URL. Null when upstream published none.'}, 'attribution': {'type': ['string', 'null'], 'description': 'Attribution string, verbatim.'}, 'license_code': {'type': ['string', 'null'], 'description': 'Sound licence code. Null means all rights reserved.'}}, 'description': 'An audio recording with its attribution and licence.', 'additionalProperties': False}, 'description': 'Audio recordings. Present when "sounds" was included.'}, 'captive': {'type': 'boolean', 'description': 'True for a zoo animal, a garden planting, or other cultivation.'}, 'comments': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'by', 'body', 'created_at'], 'properties': {'by': {'type': ['string', 'null'], 'description': 'Login of the commenter.'}, 'id': {'type': 'number', 'description': 'Comment id.'}, 'body': {'type': ['string', 'null'], 'description': 'Free-text comment body.'}, 'created_at': {'type': ['string', 'null'], 'description': 'When the comment was posted, ISO 8601.'}}, 'description': 'One discussion comment on the record.', 'additionalProperties': False}, 'description': 'Discussion comments, cut to their first entries in upstream order (not strictly chronological) when they exceed the per-record share of a 40-entry budget. Present when "comments" was included.'}, 'obscured': {'type': 'boolean', 'description': 'True when the true coordinate is withheld, typically for a threatened taxon. The point is never resolved or approximated.'}, 'observer': {'type': ['string', 'null'], 'description': 'Login of the observer. The rest of the upstream profile is not relayed.'}, 'agreements': {'type': 'number', 'description': 'How many identifications currently agree with the community taxon.'}, 'coordinate': {'anyOf': [{'type': 'object', 'required': ['lat', 'lng', 'accuracy_m'], 'properties': {'lat': {'type': 'number', 'description': 'Latitude in decimal degrees.'}, 'lng': {'type': 'number', 'description': 'Longitude in decimal degrees.'}, 'accuracy_m': {'type': ['number', 'null'], 'description': 'Public positional accuracy radius in metres. On an obscured record this is tens of kilometres and the point is a locality, not a sighting position.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Public coordinate. Null when the record carries none.'}, 'geoprivacy': {'type': ['string', 'null'], 'description': 'Observer-set coordinate privacy: obscured, obscured_private, open, or private.'}, 'annotations': {'type': 'array', 'items': {'type': 'object', 'required': ['attribute', 'value', 'attribute_id', 'value_id', 'by'], 'properties': {'by': {'type': ['string', 'null'], 'description': 'Login of the member who added the annotation.'}, 'value': {'type': ['string', 'null'], 'description': 'Decoded value label, e.g. "Larva". Null when the id is not in the vocabulary.'}, 'value_id': {'type': 'number', 'description': 'Value id, usable as term_value_id on the search tools.'}, 'attribute': {'type': ['string', 'null'], 'description': 'Decoded attribute label, e.g. "Life Stage". Null when the id is not in the vocabulary.'}, 'attribute_id': {'type': 'number', 'description': 'Attribute id, usable as term_id on the search tools.'}}, 'description': 'One decoded annotation on the record.', 'additionalProperties': False}, 'description': 'Decoded annotations. Present when "annotations" was included.'}, 'description': {'type': ['string', 'null'], 'description': 'The observerâ\x80\x99s own note on the sighting â\x80\x94 host plant, behaviour, habitat, count. Third-party free text. Present on the by-id tool; null when the observer wrote none.'}, 'observed_at': {'type': ['string', 'null'], 'description': 'Observation timestamp with offset, ISO 8601.'}, 'observed_on': {'type': ['string', 'null'], 'description': 'Observation date, YYYY-MM-DD. Null when the observer recorded no date.'}, 'photo_count': {'type': 'number', 'description': 'How many photos the record carries, so include "photos" can be spent knowingly.'}, 'place_guess': {'type': ['string', 'null'], 'description': 'Locality text written by the observer. Third-party free text.'}, 'sound_count': {'type': 'number', 'description': 'How many audio recordings the record carries.'}, 'license_code': {'type': ['string', 'null'], 'description': 'Licence of the observation record itself. Null means all rights reserved.'}, 'disagreements': {'type': 'number', 'description': 'How many identifications currently disagree with the community taxon.'}, 'quality_grade': {'enum': ['research', 'needs_id', 'casual'], 'type': 'string', 'description': 'Identification confidence tier: research, needs_id, or casual.'}, 'comments_shown': {'type': 'number', 'description': 'How many of them comments carries. Below comments_total when the thread was cut. Present when "comments" was included.'}, 'comments_total': {'type': 'number', 'description': 'How many comments upstream holds on the record. Present when "comments" was included.'}, 'community_taxon': {'anyOf': [{'type': 'object', 'required': ['id', 'name', 'rank', 'common_name', 'iconic_taxon_name'], 'properties': {'id': {'type': 'number', 'description': 'Taxon id â\x80\x94 the identifier every taxon-scoped filter takes.'}, 'name': {'type': ['string', 'null'], 'description': 'Scientific name.'}, 'rank': {'type': ['string', 'null'], 'description': 'Taxonomic rank, e.g. "species".'}, 'common_name': {'type': ['string', 'null'], 'description': 'Preferred common name, when one is recorded.'}, 'iconic_taxon_name': {'type': ['string', 'null'], 'description': 'Broad organism group, e.g. "Insecta". Usable as an iconic_taxa filter value.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Consensus taxon, resolved. Present on the by-id tool; null when the thread has reached none.'}, 'identifications': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'taxon', 'by', 'current', 'category', 'disagreement', 'from_vision', 'body', 'created_at'], 'properties': {'by': {'type': ['string', 'null'], 'description': 'Login of the identifier.'}, 'id': {'type': 'number', 'description': 'Identification id.'}, 'body': {'type': ['string', 'null'], 'description': 'Free-text note written by the identifier.'}, 'taxon': {'anyOf': [{'type': 'object', 'required': ['id', 'name', 'rank', 'common_name', 'iconic_taxon_name'], 'properties': {'id': {'type': 'number', 'description': 'Taxon id â\x80\x94 the identifier every taxon-scoped filter takes.'}, 'name': {'type': ['string', 'null'], 'description': 'Scientific name.'}, 'rank': {'type': ['string', 'null'], 'description': 'Taxonomic rank, e.g. "species".'}, 'common_name': {'type': ['string', 'null'], 'description': 'Preferred common name, when one is recorded.'}, 'iconic_taxon_name': {'type': ['string', 'null'], 'description': 'Broad organism group, e.g. "Insecta". Usable as an iconic_taxa filter value.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Taxon this identification proposes.'}, 'current': {'type': 'boolean', 'description': 'True when this is the identifierâ\x80\x99s current identification on the record.'}, 'category': {'type': ['string', 'null'], 'description': 'How this identification moved the thread: improving, supporting, leading, or maverick.'}, 'created_at': {'type': ['string', 'null'], 'description': 'When the identification was added, ISO 8601.'}, 'from_vision': {'type': 'boolean', 'description': 'True when the identification came from the upstream image classifier.'}, 'disagreement': {'type': ['boolean', 'null'], 'description': 'True when the identifier explicitly disagreed with the preceding taxon.'}}, 'description': 'One identification in the community thread.', 'additionalProperties': False}, 'description': 'The identification thread, cut to its first entries in upstream order (roughly but not strictly chronological) when it exceeds the per-record share of a 40-entry budget. Present when "identifications" was included.'}, 'taxon_geoprivacy': {'type': ['string', 'null'], 'description': 'Coordinate privacy applied automatically for a threatened taxon. Same vocabulary.'}, 'community_taxon_id': {'type': ['number', 'null'], 'description': 'Consensus taxon id. Differs from taxon.id while a thread is contested.'}, 'observation_fields': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'value'], 'properties': {'name': {'type': ['string', 'null'], 'description': 'Field name, as its creator wrote it, e.g. "Habitat_Description".'}, 'value': {'type': 'string', 'description': 'The value filled in, verbatim.'}}, 'description': 'One filled observation field.', 'additionalProperties': False}, 'description': 'Observation-field values filled in on the record, usually by a project; fields left blank are dropped. Cut to the first filled fields in upstream order when they exceed the per-record share of a 40-entry budget. Present on the by-id tool.'}, 'identifications_count': {'type': 'number', 'description': 'Upstreamâ\x80\x99s tally of identifications currently agreeing or disagreeing with the community taxon â\x80\x94 agreements + disagreements. Not the thread size: it leaves out the observerâ\x80\x99s own identification and any that neither agrees nor disagrees, such as a coarser or withdrawn one. The thread size is identifications_total, on inaturalist_get_observation.'}, 'identifications_shown': {'type': 'number', 'description': 'How many of them identifications carries. Below identifications_total when the thread was cut. Present when "identifications" was included.'}, 'identifications_total': {'type': 'number', 'description': 'How many identifications upstream holds on the record â\x80\x94 the thread size. Present when "identifications" was included.'}, 'observation_fields_shown': {'type': 'number', 'description': 'How many of them observation_fields carries. Below observation_fields_total when the list was cut. Present on the by-id tool.'}, 'observation_fields_total': {'type': 'number', 'description': 'How many filled observation fields the record carries. Present on the by-id tool.'}, 'identification_disagreements_count': {'type': 'number', 'description': 'Count of disagreeing identifications as upstream tallies it. Present on the by-id tool.'}}, 'description': 'One projected observation record.', 'additionalProperties': False}, 'description': 'The matching sightings, projected.'}, 'total_results': {'type': 'number', 'description': 'How many records upstream reports as matching. An estimate over a live index â\x80\x94 it drifts between calls seconds apart.'}, 'applied_filters': {'type': 'object', 'required': ['quality_grade', 'captive', 'order_by', 'order', 'ordering_forced_by_cursor'], 'properties': {'order': {'type': 'string', 'description': 'Sort direction actually sent upstream.'}, 'captive': {'type': 'boolean', 'description': 'Whether captive and cultivated records were included.'}, 'order_by': {'type': 'string', 'description': 'Sort field actually sent upstream.'}, 'quality_grade': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Identification tiers actually searched.'}, 'ordering_forced_by_cursor': {'type': 'boolean', 'description': 'True when a cursor overrode the requested ordering.'}}, 'description': 'The server-applied defaults and overrides that determine what this answer means.', 'additionalProperties': False}}, 'additionalProperties': False}
최근 도구 변경
유사한 MCP 서버
osint
Provides source-cited US data and schemas for power systems, AI infrastructure, semiconductor production and trade, robotics, and…
Pubmed
Provides PubMed biomedical literature search and retrieval, including abstracts, full text where available, citation metadata, re…
Europepmc
Searches and retrieves biomedical literature from Europe PMC, including abstracts, full records, citations, publication metadata,…
Nasa
Provides NASA data and imagery for astronomy, asteroids, Mars rover photos, solar flares, coronal mass ejections, geomagnetic sto…
Nih Reporter
Searches and analyzes NIH-funded research projects, awards, publications, funding trends, expirations, investigators, organizatio…
Catalogueoflife
Provides taxonomic search and classification for species and higher taxa using the Catalogue of Life.
Chembl
Queries the ChEMBL drug-discovery database for molecules, mechanisms of action, indications, targets, and small-molecule bioactiv…
Biorxiv
Provides bioRxiv and medRxiv preprint metadata, publication status, and publisher lookups, alongside broader structured research …