{"id":"releases/2026-11-13/schemas/catalogue-1.json","kind":"schema","format":"schema/1.0","provenance":{"release":"2026-11-13","sources":["inaturalist-observations-v2","gbif-occurrence-v2","species-names","inaturalist-photos","usgs-gap-ranges-conus-2001v1","noaa-nclimgrid-daily","us-riis-l48-v2","oh-oda-invasive-plants","oh-odnr-aquatic-invasive","inaturalist-checklist","government-species-lists","census-tiger-2026","census-cartographic-boundaries-2025","resolve-ecoregions-2017","usgs-wbd","census-urban-areas-2020","natural-earth-countries","usgs-annual-nlcd-c1v2-2025","usgs-3dep-1as","usgs-padus-4-1","odnr-lands","census-zcta-county-2020","census-places-2020"],"licences":["CC-BY-4.0","CC-BY-NC-4.0","CC0-1.0"],"gbif_download_dois":["10.15468/dl.8m7c3d","10.15468/dl.y2jkt8"],"method":"seasonal-5","taxonomy":"col-xr-2026-06-19/match-2026-10-20","boundaries":"tiger-2026; census-cb-2025-500k; census-zcta-county-2020; census-places-2020; resolve-ecoregions-2017; usgs-annual-nlcd-c1v2-2025; usgs-3dep-1as; PAD-US 4.1 073747bf4d9b, ODNR Lands 8f5985bbd476, parks list 1.2; WBD HU8 04 1a78c5142bde, 05 d59adb45cc28; census-uac20 dbd0e5786258","ranges":["gap/conus-2001v1"],"protection":{"usfws":"2026-11-03T15:25:11.428Z","ohio":"2026-10"},"code":"414181dce188c3b7397c29608556900ed4e75a41","run":"43333827288"},"data":{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"OpenPhenology catalogue/1","description":"Species with a result or a mapped range, by scientific name. May be split into shards.","type":"object","required":["id","kind","format","provenance","data"],"properties":{"id":{"description":"The file's path from the API root.","type":"string","pattern":"^releases/\\d{4}-\\d{2}-\\d{2}/catalogue(/\\d+)?\\.json$"},"kind":{"description":"The format's name, such as `county-weekly`.","const":"catalogue"},"format":{"description":"Format name and version, for example `county-weekly/1.0`.","type":"string","pattern":"^catalogue/1\\.\\d+$"},"provenance":{"description":"Where the content came from.","type":"object","required":["release","sources","licences","gbif_download_dois","method","taxonomy","boundaries","ranges","protection","code","run"],"properties":{"release":{"description":"The release the file belongs to, such as `2026-10-19`.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"sources":{"description":"Source IDs, as listed in `sources.json`.","type":"array","items":{"type":"string"}},"licences":{"description":"The licences of those sources.","type":"array","items":{"type":"string"}},"gbif_download_dois":{"description":"The GBIF downloads the records came from, as DOIs.","type":"array","items":{"type":"string"}},"method":{"description":"The method version, such as `seasonal-3`.","anyOf":[{"type":"string"},{"type":"null"}]},"taxonomy":{"description":"The taxonomy version species keys come from.","anyOf":[{"type":"string"},{"type":"null"}]},"boundaries":{"description":"The boundary version areas come from.","anyOf":[{"type":"string"},{"type":"null"}]},"ranges":{"description":"Each mapped range edition used.","anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"protection":{"description":"The version of each sensitive-species list applied, by list.","anyOf":[{"type":"object","additionalProperties":{"type":"string"}},{"type":"null"}]},"code":{"description":"The commit of the code that produced the file.","anyOf":[{"type":"string"},{"type":"null"}]},"run":{"description":"The run that produced the file.","anyOf":[{"type":"string"},{"type":"null"}]}}},"data":{"description":"The content, as the format sets out.","type":"object","required":["species"],"properties":{"species":{"description":"The species, by scientific name.","type":"array","items":{"type":"object","required":["species_key","scientific_name","common_name","rank","kingdom","phylum","class","order","family","genus","group","slug","states"],"properties":{"species_key":{"description":"The species key in the shared taxonomy.","type":"string","pattern":"^[A-Za-z0-9._-]+$"},"scientific_name":{"description":"The scientific name, without authorship.","type":"string","minLength":1},"common_name":{"description":"The display name, or `null` when there is none.","anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"rank":{"description":"The taxonomic rank, such as `species`.","type":"string","minLength":1},"kingdom":{"description":"The kingdom.","anyOf":[{"type":"string"},{"type":"null"}]},"phylum":{"description":"The phylum.","anyOf":[{"type":"string"},{"type":"null"}]},"class":{"description":"The class.","anyOf":[{"type":"string"},{"type":"null"}]},"order":{"description":"The order.","anyOf":[{"type":"string"},{"type":"null"}]},"family":{"description":"The family.","anyOf":[{"type":"string"},{"type":"null"}]},"genus":{"description":"The genus.","anyOf":[{"type":"string"},{"type":"null"}]},"group":{"description":"The browse group, such as `birds`.","anyOf":[{"type":"string","pattern":"^[a-z]+(-[a-z]+)*$"},{"type":"null"}]},"slug":{"description":"The page slug.","anyOf":[{"type":"string","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"},{"type":"null"}]},"states":{"description":"States with a result for this species.","type":"array","items":{"type":"string","pattern":"^[a-z]{2}-[a-z0-9]{1,3}$"}},"photo":{"description":"The species' photo, exactly as its species file gives it, or `null`.\nAdded in `catalogue/1.2`, so absent from earlier files.","anyOf":[{"type":"object","required":["id","source","sizes","credit","licence","licence_url","url"],"properties":{"id":{"description":"`inat-` and the iNaturalist photo ID.","type":"string","pattern":"^inat-\\d+$"},"source":{"description":"Where it was chosen from: the default photo, a taxon photo, or an observation photo.","enum":["default","taxon","observation"]},"sizes":{"description":"Per role the photo was cut to, the widths made, smallest first.","type":"object","propertyNames":{"enum":["hero","feature","species","card","thumb","social"]},"additionalProperties":{"type":"array","items":{"type":"integer","minimum":1},"minItems":1}},"credit":{"description":"The credit iNaturalist gives, word for word; show it with the photo.","type":"string","minLength":1},"licence":{"description":"The licence's SPDX identifier, such as `CC-BY-NC-4.0`, or `CC0-1.0` or `PDM`.","type":"string","minLength":1},"licence_url":{"description":"The licence's address.","type":"string","minLength":1},"url":{"description":"The photo's page on iNaturalist.","type":"string","minLength":1}}},{"type":"null"}]},"sensitive_in":{"description":"The states where the species' records are sensitive because of the\nspecies itself (a government list or iNaturalist's location protection).\nDescribes the species, never a location. From `catalogue/1.6`, every\nstate the release covers, whether or not the species has a result there;\nearlier, only states in `states`. A page treats a species as protected in\na state when this or `listed_in` names it. Added in `catalogue/1.3`, so\nabsent from earlier files.","type":"array","items":{"type":"string","pattern":"^[a-z]{2}-[a-z0-9]{1,3}$"}},"protection_unconfirmed_in":{"description":"The states in `sensitive_in` where the species is sensitive only because\nits iNaturalist protection could not be confirmed (no single iNaturalist\nmatch) and no government list applies. Its records are withheld there\nexactly as in any other state in `sensitive_in`; pages report it as\nprotection unconfirmed, not as protected. From `catalogue/1.6`, whether\nor not the species has a result there. Added in `catalogue/1.5`, so\nabsent from earlier files.","type":"array","items":{"type":"string","pattern":"^[a-z]{2}-[a-z0-9]{1,3}$"}},"listed_in":{"description":"The states where one of the species' `statuses` listings applies: every\nstate the release covers for a federal listing, its own state for a\nstate listing. From `catalogue/1.6`, whether or not the species has a\nresult there; earlier, only states in `states`. Added in `catalogue/1.3`,\nso absent from earlier files.","type":"array","items":{"type":"string","pattern":"^[a-z]{2}-[a-z0-9]{1,3}$"}},"introduced_in":{"description":"The states in `states` where one of the species' `introductions`\nlistings applies (the lower 48). Not being listed never means native.\nAdded in `catalogue/1.3`, so absent from earlier files.","type":"array","items":{"type":"string","pattern":"^[a-z]{2}-[a-z0-9]{1,3}$"}},"invasive_in":{"description":"The states in `introduced_in` where a listing with status `invasive`\napplies. Added in `catalogue/1.4`, so absent from earlier files.","type":"array","items":{"type":"string","pattern":"^[a-z]{2}-[a-z0-9]{1,3}$"}},"stage_seasons":{"description":"Each state in `states` with its stage seasons, exactly as the species\nfile gives them (ODR-2026-037). Added in `catalogue/1.4`, so absent from\nearlier files.","type":"object","propertyNames":{"type":"string","pattern":"^[a-z]{2}-[a-z0-9]{1,3}$"},"additionalProperties":{"type":"object","properties":{"flowering":{"type":"array","items":{"type":"integer","minimum":1,"maximum":53},"maxItems":3,"anyOf":[{"type":"array","maxItems":0},{"type":"array","minItems":3}]},"fruiting":{"type":"array","items":{"type":"integer","minimum":1,"maximum":53},"maxItems":3,"anyOf":[{"type":"array","maxItems":0},{"type":"array","minItems":3}]},"adult":{"type":"array","items":{"type":"integer","minimum":1,"maximum":53},"maxItems":3,"anyOf":[{"type":"array","maxItems":0},{"type":"array","minItems":3}]},"larva":{"type":"array","items":{"type":"integer","minimum":1,"maximum":53},"maxItems":3,"anyOf":[{"type":"array","maxItems":0},{"type":"array","minItems":3}]}},"additionalProperties":false}},"windows":{"description":"Each state in `states` mapped to the state result's two windows, exactly\nas the species file gives them: `null` unless its season is withheld as\n`two-seasons`. Added in `catalogue/1.7`, so absent from earlier files.","type":"object","propertyNames":{"type":"string","pattern":"^[a-z]{2}-[a-z0-9]{1,3}$"},"additionalProperties":{"anyOf":[{"type":"array","items":{"type":"object","required":["records","season","season_withheld"],"properties":{"records":{"type":"integer","minimum":0},"season":{"type":"array","items":{"type":"integer","minimum":1,"maximum":53},"maxItems":3},"season_withheld":{"anyOf":[{"enum":["too-few-records","year-round","two-seasons","one-year","precision"]},{"type":"null"}]}},"allOf":[{"anyOf":[{"type":"object","properties":{"season":{"type":"array","minItems":3},"season_withheld":{"type":"null"}}},{"type":"object","properties":{"season":{"type":"array","maxItems":0},"season_withheld":{"enum":["too-few-records","year-round","two-seasons","one-year","precision"]}}}]}]},"minItems":2,"maxItems":2},{"type":"null"}]}},"conditions":{"description":"Each state in `states` mapped to the state result's conditions on its\nrecord days, exactly as the species file gives them. Added in\n`catalogue/1.7`, so absent from earlier files.","type":"object","propertyNames":{"type":"string","pattern":"^[a-z]{2}-[a-z0-9]{1,3}$"},"additionalProperties":{"type":"object","required":["sunrise","sunset","high","low","midpoint"],"properties":{"sunrise":{"anyOf":[{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},{"type":"null"}]},"sunset":{"anyOf":[{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},{"type":"null"}]},"high":{"anyOf":[{"type":"number"},{"type":"null"}]},"low":{"anyOf":[{"type":"number"},{"type":"null"}]},"midpoint":{"anyOf":[{"type":"number"},{"type":"null"}]}}}},"seasons":{"description":"Each state in `states` with its season weeks, exactly as the species file\ngives them; empty when the species file has none or withholds them.\nAdded in `catalogue/1.1`, so absent from `catalogue/1.0` files.","type":"object","propertyNames":{"type":"string","pattern":"^[a-z]{2}-[a-z0-9]{1,3}$"},"additionalProperties":{"type":"array","items":{"type":"integer","minimum":1,"maximum":53},"maxItems":3,"anyOf":[{"type":"array","maxItems":0},{"type":"array","minItems":3}]}}}}}}}},"allOf":[{"if":{"type":"object","properties":{"format":{"enum":["catalogue/1.0"]}}},"else":{"type":"object","properties":{"data":{"type":"object","properties":{"species":{"type":"array","items":{"type":"object","properties":{"seasons":true},"required":["seasons"]}}}}}}},{"if":{"type":"object","properties":{"format":{"enum":["catalogue/1.0","catalogue/1.1"]}}},"else":{"type":"object","properties":{"data":{"type":"object","properties":{"species":{"type":"array","items":{"type":"object","properties":{"photo":true},"required":["photo"]}}}}}}},{"if":{"type":"object","properties":{"format":{"enum":["catalogue/1.0","catalogue/1.1","catalogue/1.2"]}}},"else":{"type":"object","properties":{"data":{"type":"object","properties":{"species":{"type":"array","items":{"type":"object","properties":{"sensitive_in":true,"listed_in":true,"introduced_in":true},"required":["sensitive_in","listed_in","introduced_in"]}}}}}}},{"if":{"type":"object","properties":{"format":{"enum":["catalogue/1.0","catalogue/1.1","catalogue/1.2","catalogue/1.3"]}}},"else":{"type":"object","properties":{"data":{"type":"object","properties":{"species":{"type":"array","items":{"type":"object","properties":{"stage_seasons":true,"invasive_in":true},"required":["stage_seasons","invasive_in"]}}}}}}},{"if":{"type":"object","properties":{"format":{"enum":["catalogue/1.0","catalogue/1.1","catalogue/1.2","catalogue/1.3","catalogue/1.4"]}}},"else":{"type":"object","properties":{"data":{"type":"object","properties":{"species":{"type":"array","items":{"type":"object","properties":{"protection_unconfirmed_in":true},"required":["protection_unconfirmed_in"]}}}}}}},{"if":{"type":"object","properties":{"format":{"enum":["catalogue/1.0","catalogue/1.1","catalogue/1.2","catalogue/1.3","catalogue/1.4","catalogue/1.5","catalogue/1.6"]}}},"else":{"type":"object","properties":{"data":{"type":"object","properties":{"species":{"type":"array","items":{"type":"object","properties":{"windows":true,"conditions":true},"required":["windows","conditions"]}}}}}}}]}}