{
  "$schema": "https://datapackage.org/profiles/2.0/datapackage.json",
  "name": "springtail-wiki",
  "title": "Springtail Wiki open data",
  "description": "The species, hobby cultures, trade names, taxa, sources and claims of Springtail Wiki. Every statement has an evidence level and its sources, and the tables keep that link.",
  "version": "2026.10.23+76b1850c12464746",
  "homepage": "https://springtails.wiki/open-data/",
  "licenses": [
    {
      "name": "CC-BY-4.0",
      "title": "Creative Commons Attribution 4.0 International",
      "path": "https://creativecommons.org/licenses/by/4.0/"
    }
  ],
  "contributors": [
    {
      "title": "Springtail Wiki contributors",
      "path": "https://springtails.wiki/credits/",
      "roles": [
        "author"
      ]
    }
  ],
  "keywords": [
    "springtails",
    "Collembola",
    "husbandry",
    "taxonomy",
    "evidence"
  ],
  "resources": [
    {
      "name": "species",
      "type": "table",
      "path": "species.csv",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "title": "Species",
      "description": "One row for each species page. Hobby cultures are in cultures.csv, and the claims behind each value are in species_claims.csv.",
      "bytes": 27868,
      "hash": "sha256:4ade54895b6e089285a77ca02f3c1f3b1cde43c351889ea9851095c3b4f79cdc",
      "dialect": {
        "delimiter": ",",
        "lineTerminator": "\n",
        "quoteChar": "\"",
        "header": true
      },
      "schema": {
        "fields": [
          {
            "name": "id",
            "type": "string",
            "description": "The species identifier. It is the same in every table and in the page address.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "scientific",
            "type": "string",
            "description": "The working identification as the site shows it, with its qualifier. Some species carry only a genus and a hobby name.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "working_rank",
            "type": "string",
            "description": "The lowest rank the identification reaches. One of species, genus, tribe, subfamily, family.",
            "constraints": {
              "required": true,
              "enum": [
                "species",
                "genus",
                "tribe",
                "subfamily",
                "family"
              ]
            }
          },
          {
            "name": "qualifier",
            "type": "string",
            "description": "How firmly the name is attached. exact is a confirmed name. cf. and aff. mean a comparison. One of exact, cf., aff., sp., species-group, family-only, unresolved.",
            "constraints": {
              "required": true,
              "enum": [
                "exact",
                "cf.",
                "aff.",
                "sp.",
                "species-group",
                "family-only",
                "unresolved"
              ]
            }
          },
          {
            "name": "working_name",
            "type": "string",
            "description": "The hobby name that tells apart species that share one scientific name."
          },
          {
            "name": "compared_with",
            "type": "string",
            "description": "For cf. and aff. names, the name being compared against."
          },
          {
            "name": "taxon",
            "type": "string",
            "description": "The taxon the species sits under, in taxa.csv.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "family",
            "type": "string",
            "description": "The family the species belongs to, in taxa.csv."
          },
          {
            "name": "order",
            "type": "string",
            "description": "The order the species belongs to. One of poduromorpha, entomobryomorpha, symphypleona, neelipleona.",
            "constraints": {
              "enum": [
                "poduromorpha",
                "entomobryomorpha",
                "symphypleona",
                "neelipleona"
              ]
            }
          },
          {
            "name": "id_confidence",
            "type": "string",
            "description": "How sure the identification is. One of verified, strongly-supported, probable, tentative, unresolved.",
            "constraints": {
              "required": true,
              "enum": [
                "verified",
                "strongly-supported",
                "probable",
                "tentative",
                "unresolved"
              ]
            }
          },
          {
            "name": "id_evidence",
            "type": "string",
            "description": "What the identification rests on. One of morphology, morphology+expert, dna, morphology+dna, type-comparison, trade-label-only.",
            "constraints": {
              "required": true,
              "enum": [
                "morphology",
                "morphology+expert",
                "dna",
                "morphology+dna",
                "type-comparison",
                "trade-label-only"
              ]
            }
          },
          {
            "name": "id_stability",
            "type": "string",
            "description": "How settled the classification of the group is. One of stable, recently-revised, conflicting-classifications, active-research.",
            "constraints": {
              "required": true,
              "enum": [
                "stable",
                "recently-revised",
                "conflicting-classifications",
                "active-research"
              ]
            }
          },
          {
            "name": "id_review",
            "type": "string",
            "description": "Who has reviewed the identification. One of imported, machine-matched, curator-reviewed, specialist-reviewed.",
            "constraints": {
              "required": true,
              "enum": [
                "imported",
                "machine-matched",
                "curator-reviewed",
                "specialist-reviewed"
              ]
            }
          },
          {
            "name": "completeness",
            "type": "string",
            "description": "How much of the species page is written. A stub has a name and little else. One of full, partial, stub.",
            "constraints": {
              "required": true,
              "enum": [
                "full",
                "partial",
                "stub"
              ]
            }
          },
          {
            "name": "tagline_claim",
            "type": "string",
            "description": "The claim that is the one sentence under the page title.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "length_min_mm",
            "type": "number",
            "description": "The lowest adult length. Unit, millimetres."
          },
          {
            "name": "length_typical_mm",
            "type": "number",
            "description": "The typical adult length, where a source gives one. Unit, millimetres."
          },
          {
            "name": "length_max_mm",
            "type": "number",
            "description": "The highest adult length. Unit, millimetres."
          },
          {
            "name": "length_reading",
            "type": "string",
            "description": "How to read the length. range is a measured spread. about, at-most and average are one figure from a source. One of range, about, at-most, average.",
            "constraints": {
              "enum": [
                "range",
                "about",
                "at-most",
                "average"
              ]
            }
          },
          {
            "name": "length_stage",
            "type": "string",
            "description": "The life stage that was measured. One of egg, juvenile, subadult, adult, unknown.",
            "constraints": {
              "enum": [
                "egg",
                "juvenile",
                "subadult",
                "adult",
                "unknown"
              ]
            }
          },
          {
            "name": "length_method",
            "type": "string",
            "description": "How the length was measured."
          },
          {
            "name": "difficulty",
            "type": "string",
            "description": "How hard the species is to keep. One of easy, moderate, hard, expert, unknown.",
            "constraints": {
              "enum": [
                "easy",
                "moderate",
                "hard",
                "expert",
                "unknown"
              ]
            }
          },
          {
            "name": "growth",
            "type": "string",
            "description": "How fast a culture grows. One of slow, moderate, fast, very-fast, unknown.",
            "constraints": {
              "enum": [
                "slow",
                "moderate",
                "fast",
                "very-fast",
                "unknown"
              ]
            }
          },
          {
            "name": "yield",
            "type": "string",
            "description": "How many animals a culture gives. One of low, moderate, high, very-high, unknown.",
            "constraints": {
              "enum": [
                "low",
                "moderate",
                "high",
                "very-high",
                "unknown"
              ]
            }
          },
          {
            "name": "temp_optimal_min_c",
            "type": "number",
            "description": "The lowest temperature of the best range. Unit, degrees Celsius."
          },
          {
            "name": "temp_optimal_typical_c",
            "type": "number",
            "description": "The typical temperature of the best range, where a source gives one. Unit, degrees Celsius."
          },
          {
            "name": "temp_optimal_max_c",
            "type": "number",
            "description": "The highest temperature of the best range. Unit, degrees Celsius."
          },
          {
            "name": "temp_tolerable_min_c",
            "type": "number",
            "description": "The lowest temperature the species survives. Unit, degrees Celsius."
          },
          {
            "name": "temp_tolerable_max_c",
            "type": "number",
            "description": "The highest temperature the species survives. Unit, degrees Celsius."
          },
          {
            "name": "humidity_optimal_min_pct",
            "type": "number",
            "description": "The lowest relative humidity of the best range, in the container. Unit, percent."
          },
          {
            "name": "humidity_optimal_typical_pct",
            "type": "number",
            "description": "The typical relative humidity of the best range, in the container, where a source gives one. Unit, percent."
          },
          {
            "name": "humidity_optimal_max_pct",
            "type": "number",
            "description": "The highest relative humidity of the best range, in the container. Unit, percent."
          },
          {
            "name": "humidity_tolerable_min_pct",
            "type": "number",
            "description": "The lowest relative humidity the species survives, in the container. Unit, percent."
          },
          {
            "name": "humidity_tolerable_max_pct",
            "type": "number",
            "description": "The highest relative humidity the species survives, in the container. Unit, percent."
          },
          {
            "name": "moisture_optimal_min_index",
            "type": "number",
            "description": "The lowest substrate wetness of the best range, from 0 dry to 1 waterlogged. A model scale, not a measurement. Unit, index from 0 to 1."
          },
          {
            "name": "moisture_optimal_typical_index",
            "type": "number",
            "description": "The typical substrate wetness of the best range, from 0 dry to 1 waterlogged. A model scale, not a measurement, where a source gives one. Unit, index from 0 to 1."
          },
          {
            "name": "moisture_optimal_max_index",
            "type": "number",
            "description": "The highest substrate wetness of the best range, from 0 dry to 1 waterlogged. A model scale, not a measurement. Unit, index from 0 to 1."
          },
          {
            "name": "moisture_tolerable_min_index",
            "type": "number",
            "description": "The lowest substrate wetness the species survives, from 0 dry to 1 waterlogged. Unit, index from 0 to 1."
          },
          {
            "name": "moisture_tolerable_max_index",
            "type": "number",
            "description": "The highest substrate wetness the species survives, from 0 dry to 1 waterlogged. Unit, index from 0 to 1."
          },
          {
            "name": "dry_share_pct",
            "type": "number",
            "description": "For species kept on a moisture gradient, the share of the substrate kept dry. Unit, percent."
          },
          {
            "name": "ventilation",
            "type": "string",
            "description": "The airflow the culture container needs. One of low, medium, high.",
            "constraints": {
              "enum": [
                "low",
                "medium",
                "high"
              ]
            }
          },
          {
            "name": "reproduction",
            "type": "string",
            "description": "How the species reproduces. One of sexual, parthenogenetic, mixed, unknown.",
            "constraints": {
              "enum": [
                "sexual",
                "parthenogenetic",
                "mixed",
                "unknown"
              ]
            }
          },
          {
            "name": "life_reference_temp_c",
            "type": "number",
            "description": "The temperature at which the life history figures were measured. Unit, degrees Celsius."
          },
          {
            "name": "egg_time_min_days",
            "type": "number",
            "description": "The lowest time from laying to hatching. Unit, days."
          },
          {
            "name": "egg_time_typical_days",
            "type": "number",
            "description": "The typical time from laying to hatching, where a source gives one. Unit, days."
          },
          {
            "name": "egg_time_max_days",
            "type": "number",
            "description": "The highest time from laying to hatching. Unit, days."
          },
          {
            "name": "maturity_min_days",
            "type": "number",
            "description": "The lowest time from hatching to the first egg batch. Unit, days."
          },
          {
            "name": "maturity_typical_days",
            "type": "number",
            "description": "The typical time from hatching to the first egg batch, where a source gives one. Unit, days."
          },
          {
            "name": "maturity_max_days",
            "type": "number",
            "description": "The highest time from hatching to the first egg batch. Unit, days."
          },
          {
            "name": "eggs_per_batch_min_n",
            "type": "number",
            "description": "The lowest number of eggs in a batch. Unit, eggs."
          },
          {
            "name": "eggs_per_batch_typical_n",
            "type": "number",
            "description": "The typical number of eggs in a batch, where a source gives one. Unit, eggs."
          },
          {
            "name": "eggs_per_batch_max_n",
            "type": "number",
            "description": "The highest number of eggs in a batch. Unit, eggs."
          },
          {
            "name": "lifespan_min_days",
            "type": "number",
            "description": "The lowest life span. Unit, days."
          },
          {
            "name": "lifespan_typical_days",
            "type": "number",
            "description": "The typical life span, where a source gives one. Unit, days."
          },
          {
            "name": "lifespan_max_days",
            "type": "number",
            "description": "The highest life span. Unit, days."
          },
          {
            "name": "foods_staple",
            "type": "string",
            "description": "Foods rated staple for the species. Several values are separated by a semicolon (;). Each value is one of dry-yeast, rolled-oats, fish-flakes, wheat-bran, leaf-litter, rotting-wood, algae, fungal-biofilm, slime-mold, fresh-vegetable, mushroom, pollen-granules, commercial-mix."
          },
          {
            "name": "foods_good",
            "type": "string",
            "description": "Foods rated good for the species. Several values are separated by a semicolon (;). Each value is one of dry-yeast, rolled-oats, fish-flakes, wheat-bran, leaf-litter, rotting-wood, algae, fungal-biofilm, slime-mold, fresh-vegetable, mushroom, pollen-granules, commercial-mix."
          },
          {
            "name": "foods_occasional",
            "type": "string",
            "description": "Foods rated occasional for the species. Several values are separated by a semicolon (;). Each value is one of dry-yeast, rolled-oats, fish-flakes, wheat-bran, leaf-litter, rotting-wood, algae, fungal-biofilm, slime-mold, fresh-vegetable, mushroom, pollen-granules, commercial-mix."
          },
          {
            "name": "foods_avoid",
            "type": "string",
            "description": "Foods rated avoid for the species. Several values are separated by a semicolon (;). Each value is one of dry-yeast, rolled-oats, fish-flakes, wheat-bran, leaf-litter, rotting-wood, algae, fungal-biofilm, slime-mold, fresh-vegetable, mushroom, pollen-granules, commercial-mix."
          },
          {
            "name": "substrates_excellent",
            "type": "string",
            "description": "Substrates rated excellent for the species. Several values are separated by a semicolon (;). Each value is one of charcoal-plaster, calcium-clay, plain-plaster, coco-coir, peat-based-soil, sphagnum, leaf-litter-soil, bark-mulch, vermiculite, agar."
          },
          {
            "name": "substrates_good",
            "type": "string",
            "description": "Substrates rated good for the species. Several values are separated by a semicolon (;). Each value is one of charcoal-plaster, calcium-clay, plain-plaster, coco-coir, peat-based-soil, sphagnum, leaf-litter-soil, bark-mulch, vermiculite, agar."
          },
          {
            "name": "substrates_workable",
            "type": "string",
            "description": "Substrates rated workable for the species. Several values are separated by a semicolon (;). Each value is one of charcoal-plaster, calcium-clay, plain-plaster, coco-coir, peat-based-soil, sphagnum, leaf-litter-soil, bark-mulch, vermiculite, agar."
          },
          {
            "name": "substrates_poor",
            "type": "string",
            "description": "Substrates rated poor for the species. Several values are separated by a semicolon (;). Each value is one of charcoal-plaster, calcium-clay, plain-plaster, coco-coir, peat-based-soil, sphagnum, leaf-litter-soil, bark-mulch, vermiculite, agar."
          },
          {
            "name": "habit",
            "type": "string",
            "description": "Where in the habitat the species lives. One of surface-litter, soil, deep-soil, vegetation, rotting-wood, cave, water-edge, unknown.",
            "constraints": {
              "enum": [
                "surface-litter",
                "soil",
                "deep-soil",
                "vegetation",
                "rotting-wood",
                "cave",
                "water-edge",
                "unknown"
              ]
            }
          },
          {
            "name": "surface_activity",
            "type": "string",
            "description": "How much of the time the species is seen on the surface. One of high, medium, low, unknown.",
            "constraints": {
              "enum": [
                "high",
                "medium",
                "low",
                "unknown"
              ]
            }
          },
          {
            "name": "escape",
            "type": "string",
            "description": "How the species behaves at the edge of a container. One of climbs-glass, jumps-readily, stays-in-substrate, unknown.",
            "constraints": {
              "enum": [
                "climbs-glass",
                "jumps-readily",
                "stays-in-substrate",
                "unknown"
              ]
            }
          },
          {
            "name": "establishes",
            "type": "string",
            "description": "Whether the species can hold a population in a bioactive enclosure. One of readily, with-help, unlikely, unknown.",
            "constraints": {
              "enum": [
                "readily",
                "with-help",
                "unlikely",
                "unknown"
              ]
            }
          },
          {
            "name": "roles",
            "type": "string",
            "description": "The jobs the species can do in a keeper's setup. Several values are separated by a semicolon (;). Each value is one of cleanup-crew, feeder-culture, display, research-model."
          },
          {
            "name": "range_status",
            "type": "string",
            "description": "Whether the species is native, introduced or of unknown origin where it is found. One of native, introduced, cryptogenic, captive-only, unknown.",
            "constraints": {
              "required": true,
              "enum": [
                "native",
                "introduced",
                "cryptogenic",
                "captive-only",
                "unknown"
              ]
            }
          },
          {
            "name": "regions",
            "type": "string",
            "description": "The regions where the species is found. Several values are separated by a semicolon (;). Each value is one of north-america, europe, uk-ireland, latin-america, asia, oceania, africa, global."
          },
          {
            "name": "found_in",
            "type": "string",
            "description": "The places the species is found, such as caves, gardens and bought cultures. Several values are separated by a semicolon (;)."
          },
          {
            "name": "availability",
            "type": "string",
            "description": "How easily a keeper can buy the species. One of common, regular, occasional, rare, not-in-trade, unknown.",
            "constraints": {
              "enum": [
                "common",
                "regular",
                "occasional",
                "rare",
                "not-in-trade",
                "unknown"
              ]
            }
          },
          {
            "name": "availability_as_of",
            "type": "date",
            "description": "The date the availability was recorded."
          },
          {
            "name": "market_regions",
            "type": "string",
            "description": "The regions the availability applies to. Several values are separated by a semicolon (;). Each value is one of north-america, europe, uk-ireland, latin-america, asia, oceania, africa, global."
          },
          {
            "name": "questions",
            "type": "string",
            "description": "The open questions about the species, in questions.csv. Several values are separated by a semicolon (;). Each value is a id in questions.csv."
          },
          {
            "name": "reviewed",
            "type": "date",
            "description": "The date the species record was last reviewed.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "review_by",
            "type": "string",
            "description": "Who reviewed the record as a specialist."
          },
          {
            "name": "review_date",
            "type": "date",
            "description": "The date of the specialist review."
          },
          {
            "name": "review_scope",
            "type": "string",
            "description": "What the specialist review covered. Several values are separated by a semicolon (;)."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "id"
        ],
        "foreignKeys": [
          {
            "fields": "taxon",
            "reference": {
              "resource": "taxa",
              "fields": "id"
            }
          },
          {
            "fields": "family",
            "reference": {
              "resource": "taxa",
              "fields": "id"
            }
          },
          {
            "fields": "tagline_claim",
            "reference": {
              "resource": "claims",
              "fields": "id"
            }
          }
        ]
      }
    },
    {
      "name": "species_claims",
      "type": "table",
      "path": "species_claims.csv",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "title": "Claims behind each species value",
      "description": "One row for each claim that a part of a species record rests on. Join it to species.csv by species_id and to claims.csv by claim_id.",
      "bytes": 59309,
      "hash": "sha256:2f6da7652d1f51d094de35bb0ff93deb87c4fc70cbf86ed959f5028e4c334f54",
      "dialect": {
        "delimiter": ",",
        "lineTerminator": "\n",
        "quoteChar": "\"",
        "header": true
      },
      "schema": {
        "fields": [
          {
            "name": "species_id",
            "type": "string",
            "description": "The species whose record holds the fact.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "fact",
            "type": "string",
            "description": "The part of the species record the claim supports, as a path into species.json, such as husbandry.temperatureC or compat.escape.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "claim_id",
            "type": "string",
            "description": "The claim, in claims.csv.",
            "constraints": {
              "required": true
            }
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "species_id",
          "fact",
          "claim_id"
        ],
        "foreignKeys": [
          {
            "fields": "species_id",
            "reference": {
              "resource": "species",
              "fields": "id"
            }
          },
          {
            "fields": "claim_id",
            "reference": {
              "resource": "claims",
              "fields": "id"
            }
          }
        ]
      }
    },
    {
      "name": "life_tables",
      "type": "table",
      "path": "life_tables.csv",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "title": "Life history at several temperatures",
      "description": "One row for each temperature at which a species was measured. The claims behind the table are in species_claims.csv under husbandry.lifeTable.",
      "bytes": 194,
      "hash": "sha256:7154b151448eda6d98d613cdf93722250fc736413812e8d16d20336e83722048",
      "dialect": {
        "delimiter": ",",
        "lineTerminator": "\n",
        "quoteChar": "\"",
        "header": true
      },
      "schema": {
        "fields": [
          {
            "name": "species_id",
            "type": "string",
            "description": "The species that was measured.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "temp_c",
            "type": "number",
            "description": "The temperature of the measurement. Unit, degrees Celsius.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "maturity_days",
            "type": "number",
            "description": "Mean days from hatching to the first egg batch. Unit, days.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "lifespan_days",
            "type": "number",
            "description": "Mean days from hatching to death. Unit, days.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "lifetime_eggs",
            "type": "number",
            "description": "Mean eggs laid by one female over her life. Unit, eggs.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "hatch_share",
            "type": "number",
            "description": "The share of eggs that hatched, from 0 to 1, averaged over the batches. Unit, share from 0 to 1."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "species_id",
          "temp_c"
        ],
        "foreignKeys": [
          {
            "fields": "species_id",
            "reference": {
              "resource": "species",
              "fields": "id"
            }
          }
        ]
      }
    },
    {
      "name": "cultures",
      "type": "table",
      "path": "cultures.csv",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "title": "Hobby cultures",
      "description": "One row for each hobby culture. A culture is a line of animals under a hobby name. It is placed under a species page with a stated confidence, and the name does not make it a species.",
      "bytes": 11805,
      "hash": "sha256:7b4d2d67a0cdf7c76976c07b912d83e1751b24967b9598d2796e90983568c463",
      "dialect": {
        "delimiter": ",",
        "lineTerminator": "\n",
        "quoteChar": "\"",
        "header": true
      },
      "schema": {
        "fields": [
          {
            "name": "id",
            "type": "string",
            "description": "The culture identifier.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "name",
            "type": "string",
            "description": "The name keepers use for the culture.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "aliases",
            "type": "string",
            "description": "Other names for the same culture. Several values are separated by a semicolon (;)."
          },
          {
            "name": "name_type",
            "type": "string",
            "description": "What kind of name it is. A hobby name is a label for a line of animals and is not a species. One of common-name, trade-name, breeder-line, locality-line, phenotype-line, historical-label.",
            "constraints": {
              "required": true,
              "enum": [
                "common-name",
                "trade-name",
                "breeder-line",
                "locality-line",
                "phenotype-line",
                "historical-label"
              ]
            }
          },
          {
            "name": "species",
            "type": "string",
            "description": "The species page the culture is placed under.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "qualifier",
            "type": "string",
            "description": "How firmly the culture is attached to that species. One of exact, cf., aff., sp., species-group, family-only, unresolved.",
            "constraints": {
              "required": true,
              "enum": [
                "exact",
                "cf.",
                "aff.",
                "sp.",
                "species-group",
                "family-only",
                "unresolved"
              ]
            }
          },
          {
            "name": "id_confidence",
            "type": "string",
            "description": "How sure the placement is. One of verified, strongly-supported, probable, tentative, unresolved.",
            "constraints": {
              "required": true,
              "enum": [
                "verified",
                "strongly-supported",
                "probable",
                "tentative",
                "unresolved"
              ]
            }
          },
          {
            "name": "id_evidence",
            "type": "string",
            "description": "What the placement rests on. One of morphology, morphology+expert, dna, morphology+dna, type-comparison, trade-label-only.",
            "constraints": {
              "required": true,
              "enum": [
                "morphology",
                "morphology+expert",
                "dna",
                "morphology+dna",
                "type-comparison",
                "trade-label-only"
              ]
            }
          },
          {
            "name": "id_review",
            "type": "string",
            "description": "Who has reviewed the placement. One of imported, machine-matched, curator-reviewed, specialist-reviewed.",
            "constraints": {
              "required": true,
              "enum": [
                "imported",
                "machine-matched",
                "curator-reviewed",
                "specialist-reviewed"
              ]
            }
          },
          {
            "name": "flags",
            "type": "string",
            "description": "The warnings the site shows beside the culture, such as that a colour form is not a taxon. Several values are separated by a semicolon (;). Each value is one of color-morph-not-taxon, cf-not-confirmed, trade-misid-not-synonym, unpublished-variety, locality-label, provenance-needed, species-complex, sexual-dimorphism, classification-badge, working-id-only."
          },
          {
            "name": "vendor",
            "type": "string",
            "description": "The seller the lineage came from, where a record says."
          },
          {
            "name": "acquired",
            "type": "date",
            "description": "The date the lineage was acquired."
          },
          {
            "name": "origin",
            "type": "string",
            "description": "Where the lineage is said to come from."
          },
          {
            "name": "lineage",
            "type": "string",
            "description": "What is known of the line of descent."
          },
          {
            "name": "popularity_tier",
            "type": "string",
            "description": "How sought after the culture is in the hobby, from S, the most, to C. It says nothing about how easy the culture is to keep. One of S, A, B, C.",
            "constraints": {
              "enum": [
                "S",
                "A",
                "B",
                "C"
              ]
            }
          },
          {
            "name": "popularity_rank",
            "type": "integer",
            "description": "The place in the source's own order of popularity, where 1 is the most sought."
          },
          {
            "name": "appearance",
            "type": "string",
            "description": "What a source says the animals look like."
          },
          {
            "name": "questions",
            "type": "string",
            "description": "The open questions about the culture, in questions.csv. Several values are separated by a semicolon (;). Each value is a id in questions.csv."
          },
          {
            "name": "reviewed",
            "type": "date",
            "description": "The date the record was last reviewed.",
            "constraints": {
              "required": true
            }
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "id"
        ],
        "foreignKeys": [
          {
            "fields": "species",
            "reference": {
              "resource": "species",
              "fields": "id"
            }
          }
        ]
      }
    },
    {
      "name": "trade_names",
      "type": "table",
      "path": "trade_names.csv",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "title": "Trade names",
      "description": "One row for each name a label or a listing might use. The species a name might mean are in trade_name_candidates.csv.",
      "bytes": 9357,
      "hash": "sha256:9d4ed33490693f7b0de6cbfe76f4d34c568b39b5351dc47835a6aa81a1766016",
      "dialect": {
        "delimiter": ",",
        "lineTerminator": "\n",
        "quoteChar": "\"",
        "header": true
      },
      "schema": {
        "fields": [
          {
            "name": "id",
            "type": "string",
            "description": "The trade name identifier.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "name",
            "type": "string",
            "description": "The name as it appears on labels and listings.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "name_type",
            "type": "string",
            "description": "What kind of name it is. One of common-name, trade-name, breeder-line, locality-line, phenotype-line, historical-label.",
            "constraints": {
              "required": true,
              "enum": [
                "common-name",
                "trade-name",
                "breeder-line",
                "locality-line",
                "phenotype-line",
                "historical-label"
              ]
            }
          },
          {
            "name": "aliases",
            "type": "string",
            "description": "Other names for the same thing. Several values are separated by a semicolon (;)."
          },
          {
            "name": "misspellings",
            "type": "string",
            "description": "Spellings that appear in listings and mean the same thing. Several values are separated by a semicolon (;)."
          },
          {
            "name": "regions",
            "type": "string",
            "description": "The regions where the name is used. Several values are separated by a semicolon (;). Each value is one of north-america, europe, uk-ireland, latin-america, asia, oceania, africa, global."
          },
          {
            "name": "questions",
            "type": "string",
            "description": "The open questions about the name, in questions.csv. Several values are separated by a semicolon (;). Each value is a id in questions.csv."
          },
          {
            "name": "reviewed",
            "type": "date",
            "description": "The date the record was last reviewed.",
            "constraints": {
              "required": true
            }
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "id"
        ]
      }
    },
    {
      "name": "trade_name_candidates",
      "type": "table",
      "path": "trade_name_candidates.csv",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "title": "What a trade name might mean",
      "description": "One row for each species or taxon a trade name might stand for, with how likely that is. Exactly one of species and taxon is filled.",
      "bytes": 5651,
      "hash": "sha256:2876eabb828fc95acf5ff1a113e758397399cf6ab13243425c251849075481ab",
      "dialect": {
        "delimiter": ",",
        "lineTerminator": "\n",
        "quoteChar": "\"",
        "header": true
      },
      "schema": {
        "fields": [
          {
            "name": "trade_name_id",
            "type": "string",
            "description": "The trade name the candidate belongs to.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "position",
            "type": "integer",
            "description": "The place of the candidate in the list for that name.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "species",
            "type": "string",
            "description": "The species the name might mean."
          },
          {
            "name": "taxon",
            "type": "string",
            "description": "The taxon the name might mean, where no species page exists."
          },
          {
            "name": "culture",
            "type": "string",
            "description": "The culture the name might mean."
          },
          {
            "name": "likelihood",
            "type": "string",
            "description": "How likely the candidate is. One of likely, possible, unlikely.",
            "constraints": {
              "required": true,
              "enum": [
                "likely",
                "possible",
                "unlikely"
              ]
            }
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "trade_name_id",
          "position"
        ],
        "foreignKeys": [
          {
            "fields": "trade_name_id",
            "reference": {
              "resource": "trade_names",
              "fields": "id"
            }
          },
          {
            "fields": "species",
            "reference": {
              "resource": "species",
              "fields": "id"
            }
          },
          {
            "fields": "taxon",
            "reference": {
              "resource": "taxa",
              "fields": "id"
            }
          },
          {
            "fields": "culture",
            "reference": {
              "resource": "cultures",
              "fields": "id"
            }
          }
        ]
      }
    },
    {
      "name": "taxa",
      "type": "table",
      "path": "taxa.csv",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "title": "Taxa above species",
      "description": "One row for each node of the classification above species. A taxon is a concept under a named classification, not a timeless fact.",
      "bytes": 17627,
      "hash": "sha256:15df840a4bfa56dd4836a401256d7bf7a97288197cd040adb25aa7d005a94f3b",
      "dialect": {
        "delimiter": ",",
        "lineTerminator": "\n",
        "quoteChar": "\"",
        "header": true
      },
      "schema": {
        "fields": [
          {
            "name": "id",
            "type": "string",
            "description": "The taxon identifier.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "rank",
            "type": "string",
            "description": "The rank. One of class, order, family, subfamily, tribe, genus, species.",
            "constraints": {
              "required": true,
              "enum": [
                "class",
                "order",
                "family",
                "subfamily",
                "tribe",
                "genus",
                "species"
              ]
            }
          },
          {
            "name": "name",
            "type": "string",
            "description": "The scientific name, without the author.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "parent",
            "type": "string",
            "description": "The taxon above this one."
          },
          {
            "name": "status",
            "type": "string",
            "description": "Whether the name is accepted. One of accepted, synonym, unresolved, doubtful, misapplied, unavailable-or-informal.",
            "constraints": {
              "required": true,
              "enum": [
                "accepted",
                "synonym",
                "unresolved",
                "doubtful",
                "misapplied",
                "unavailable-or-informal"
              ]
            }
          },
          {
            "name": "classification_source",
            "type": "string",
            "description": "The classification that places the taxon here, in sources.csv.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "stability",
            "type": "string",
            "description": "How settled the classification of the group is. One of stable, recently-revised, conflicting-classifications, active-research.",
            "constraints": {
              "required": true,
              "enum": [
                "stable",
                "recently-revised",
                "conflicting-classifications",
                "active-research"
              ]
            }
          },
          {
            "name": "authorship",
            "type": "string",
            "description": "Who described the name, and when."
          },
          {
            "name": "gbif",
            "type": "integer",
            "description": "The taxon key in GBIF, the Global Biodiversity Information Facility."
          },
          {
            "name": "col",
            "type": "string",
            "description": "The identifier in the Catalogue of Life."
          },
          {
            "name": "itis",
            "type": "integer",
            "description": "The ITIS taxonomic serial number."
          },
          {
            "name": "worms",
            "type": "integer",
            "description": "The AphiaID in WoRMS, the World Register of Marine Species."
          },
          {
            "name": "ncbi",
            "type": "integer",
            "description": "The NCBI taxonomy identifier."
          },
          {
            "name": "inaturalist",
            "type": "integer",
            "description": "The taxon identifier in iNaturalist."
          },
          {
            "name": "collembola_org",
            "type": "string",
            "description": "The page for the taxon on collembola.org."
          },
          {
            "name": "reviewed",
            "type": "date",
            "description": "The date the record was last reviewed.",
            "constraints": {
              "required": true
            }
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "id"
        ],
        "foreignKeys": [
          {
            "fields": "parent",
            "reference": {
              "fields": "id"
            }
          },
          {
            "fields": "classification_source",
            "reference": {
              "resource": "sources",
              "fields": "id"
            }
          }
        ]
      }
    },
    {
      "name": "sources",
      "type": "table",
      "path": "sources.csv",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "title": "Sources",
      "description": "One row for each work the statements cite. The standing says how far the entry has been checked against a registry or a stored copy.",
      "bytes": 26010,
      "hash": "sha256:a114232303c686b71018e15a5df01f7dfe9e94ac1678ca7f9781d12e1f7f59a0",
      "dialect": {
        "delimiter": ",",
        "lineTerminator": "\n",
        "quoteChar": "\"",
        "header": true
      },
      "schema": {
        "fields": [
          {
            "name": "id",
            "type": "string",
            "description": "The source identifier.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "kind",
            "type": "string",
            "description": "What sort of work it is. One of journal-article, book, book-chapter, checklist, database, standard, web-page, retailer-page, thesis, dataset.",
            "constraints": {
              "required": true,
              "enum": [
                "journal-article",
                "book",
                "book-chapter",
                "checklist",
                "database",
                "standard",
                "web-page",
                "retailer-page",
                "thesis",
                "dataset"
              ]
            }
          },
          {
            "name": "quality",
            "type": "string",
            "description": "What the source is, from a peer reviewed paper to a seller page. It says how the source was made, not whether it is right. One of peer-reviewed-primary, specialist-monograph, authoritative-database, peer-reviewed-secondary, official-standard, expert-observation, retailer, hobby-observation.",
            "constraints": {
              "required": true,
              "enum": [
                "peer-reviewed-primary",
                "specialist-monograph",
                "authoritative-database",
                "peer-reviewed-secondary",
                "official-standard",
                "expert-observation",
                "retailer",
                "hobby-observation"
              ]
            }
          },
          {
            "name": "title",
            "type": "string",
            "description": "The title of the work.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "authors",
            "type": "string",
            "description": "The authors, in the order the work gives them. Several values are separated by a semicolon (;)."
          },
          {
            "name": "year",
            "type": "integer",
            "description": "The year of publication."
          },
          {
            "name": "container",
            "type": "string",
            "description": "The journal, book or site the work appears in."
          },
          {
            "name": "volume",
            "type": "string",
            "description": "The volume of the journal or book."
          },
          {
            "name": "issue",
            "type": "string",
            "description": "The issue of the journal."
          },
          {
            "name": "pages",
            "type": "string",
            "description": "The pages of the work, such as the range of an article."
          },
          {
            "name": "publisher",
            "type": "string",
            "description": "The publisher of the work."
          },
          {
            "name": "origin",
            "type": "string",
            "description": "Who stands behind the source. Two pages from one seller share an origin and count as one voice.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "edition",
            "type": "string",
            "description": "The edition of the book."
          },
          {
            "name": "doi",
            "type": "string",
            "description": "The DOI of the work, as 10.xxxx/yyyy with no link in front of it."
          },
          {
            "name": "url",
            "type": "string",
            "description": "A web address where the work or its record can be read."
          },
          {
            "name": "isbn",
            "type": "string",
            "description": "The ISBN of the book."
          },
          {
            "name": "language",
            "type": "string",
            "description": "The language of the work, as a language code.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "standing",
            "type": "string",
            "description": "How far the entry has been checked. verified was matched in a registry. attested is a stored copy that matches its checksum. link-ok is a web address that answered. unchecked has not been checked. failed did not match. One of verified, attested, link-ok, unchecked, failed.",
            "constraints": {
              "required": true,
              "enum": [
                "verified",
                "attested",
                "link-ok",
                "unchecked",
                "failed"
              ]
            }
          },
          {
            "name": "checked_on",
            "type": "date",
            "description": "The date of the last check."
          },
          {
            "name": "check_method",
            "type": "string",
            "description": "How the entry was checked. One of crossref, datacite, openlibrary, googlebooks, http, file, manual.",
            "constraints": {
              "enum": [
                "crossref",
                "datacite",
                "openlibrary",
                "googlebooks",
                "http",
                "file",
                "manual"
              ]
            }
          },
          {
            "name": "accessed",
            "type": "date",
            "description": "The date the source was last read for the site."
          },
          {
            "name": "note",
            "type": "string",
            "description": "A note on the source."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "id"
        ]
      }
    },
    {
      "name": "claims",
      "type": "table",
      "path": "claims.csv",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "title": "Claims",
      "description": "One row for each statement on the site. Every claim names its subject, its evidence level and its sources, which are in claim_sources.csv. The text has no markup.",
      "bytes": 354918,
      "hash": "sha256:8fe59391a7ce2bbca2de0a5ad31f7ecf8a502495124b12dd23d9daa65bbc1ea1",
      "dialect": {
        "delimiter": ",",
        "lineTerminator": "\n",
        "quoteChar": "\"",
        "header": true
      },
      "schema": {
        "fields": [
          {
            "name": "id",
            "type": "string",
            "description": "The claim identifier. It begins with the subject it was written under.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "about_type",
            "type": "string",
            "description": "What kind of thing the claim is about. One of species, culture, trade-name, taxon, guide, troubleshooting, glossary, enclosure, inhabitant, model, site.",
            "constraints": {
              "required": true,
              "enum": [
                "species",
                "culture",
                "trade-name",
                "taxon",
                "guide",
                "troubleshooting",
                "glossary",
                "enclosure",
                "inhabitant",
                "model",
                "site"
              ]
            }
          },
          {
            "name": "about_id",
            "type": "string",
            "description": "The identifier of the thing the claim is about, in the table for its type.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "topic",
            "type": "string",
            "description": "The part of a page the claim belongs to. One of glance, identification, husbandry, compatibility, natural-history, taxonomy.",
            "constraints": {
              "enum": [
                "glance",
                "identification",
                "husbandry",
                "compatibility",
                "natural-history",
                "taxonomy"
              ]
            }
          },
          {
            "name": "kind",
            "type": "string",
            "description": "What kind of statement it is. One of fact, observation, method, warning, tip, model-assumption, definition, history.",
            "constraints": {
              "required": true,
              "enum": [
                "fact",
                "observation",
                "method",
                "warning",
                "tip",
                "model-assumption",
                "definition",
                "history"
              ]
            }
          },
          {
            "name": "evidence",
            "type": "string",
            "description": "How the claim is supported. peer-reviewed is reported in the published literature. expert-source is from a specialist checklist, an official guideline or a named expert. hobby-consensus is agreed by two or more independent keepers or sellers. anecdotal is one keeper or seller. unknown means nobody has tested it, and the open question is in the question column. One of peer-reviewed, expert-source, hobby-consensus, anecdotal, unknown.",
            "constraints": {
              "required": true,
              "enum": [
                "peer-reviewed",
                "expert-source",
                "hobby-consensus",
                "anecdotal",
                "unknown"
              ]
            }
          },
          {
            "name": "text",
            "type": "string",
            "description": "The statement, at the keeper reading level.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "text_beginner",
            "type": "string",
            "description": "The statement in plain words, where the page has a shorter version."
          },
          {
            "name": "text_specialist",
            "type": "string",
            "description": "The statement with technical terms, where the page has a fuller version."
          },
          {
            "name": "levels",
            "type": "string",
            "description": "The reading levels that show the claim. Several values are separated by a semicolon (;). Each value is one of beginner, keeper, specialist."
          },
          {
            "name": "source_count",
            "type": "integer",
            "description": "How many sources the claim cites.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "question",
            "type": "string",
            "description": "For an unknown claim, the open question that tracks it, in questions.csv."
          },
          {
            "name": "verification",
            "type": "string",
            "description": "checked means a person compared the statement with the place in the source. unchecked is a draft, and the reader should read the source if the statement matters. One of checked, unchecked.",
            "constraints": {
              "required": true,
              "enum": [
                "checked",
                "unchecked"
              ]
            }
          },
          {
            "name": "tags",
            "type": "string",
            "description": "Free tags. Several values are separated by a semicolon (;)."
          },
          {
            "name": "reviewed",
            "type": "date",
            "description": "The date the claim was last reviewed.",
            "constraints": {
              "required": true
            }
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "id"
        ],
        "foreignKeys": [
          {
            "fields": "question",
            "reference": {
              "resource": "questions",
              "fields": "id"
            }
          }
        ]
      }
    },
    {
      "name": "claim_sources",
      "type": "table",
      "path": "claim_sources.csv",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "title": "Sources behind each claim",
      "description": "One row for each source a claim cites, in the order the claim gives them, with the place in the source.",
      "bytes": 119285,
      "hash": "sha256:891c0b69fd1e3760d9e77ba888ff3c40ae35ee228c9560fc67484f004f04ba34",
      "dialect": {
        "delimiter": ",",
        "lineTerminator": "\n",
        "quoteChar": "\"",
        "header": true
      },
      "schema": {
        "fields": [
          {
            "name": "claim_id",
            "type": "string",
            "description": "The claim that cites the source.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "position",
            "type": "integer",
            "description": "The place of the source in the claim's list.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "source_id",
            "type": "string",
            "description": "The source the claim cites.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "locator",
            "type": "string",
            "description": "The place in the source, such as a page or a section."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "claim_id",
          "position"
        ],
        "foreignKeys": [
          {
            "fields": "claim_id",
            "reference": {
              "resource": "claims",
              "fields": "id"
            }
          },
          {
            "fields": "source_id",
            "reference": {
              "resource": "sources",
              "fields": "id"
            }
          }
        ]
      }
    },
    {
      "name": "questions",
      "type": "table",
      "path": "questions.csv",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "title": "Open questions",
      "description": "One row for each thing that science or the hobby does not yet know, with what would help.",
      "bytes": 19708,
      "hash": "sha256:27bd0b5dbe2ebd94513af3d1f2cdbe589a1c2919365797a20c7b1d646dd1f209",
      "dialect": {
        "delimiter": ",",
        "lineTerminator": "\n",
        "quoteChar": "\"",
        "header": true
      },
      "schema": {
        "fields": [
          {
            "name": "id",
            "type": "string",
            "description": "The question identifier.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "title",
            "type": "string",
            "description": "The question.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "category",
            "type": "string",
            "description": "The kind of question. One of identification, husbandry, taxonomy, trade-name, distribution, molecular, model.",
            "constraints": {
              "required": true,
              "enum": [
                "identification",
                "husbandry",
                "taxonomy",
                "trade-name",
                "distribution",
                "molecular",
                "model"
              ]
            }
          },
          {
            "name": "status",
            "type": "string",
            "description": "Where the question stands. One of open, needs-voucher, needs-specialist, answered-pending-review.",
            "constraints": {
              "required": true,
              "enum": [
                "open",
                "needs-voucher",
                "needs-specialist",
                "answered-pending-review"
              ]
            }
          },
          {
            "name": "species",
            "type": "string",
            "description": "The species the question is about. Several values are separated by a semicolon (;). Each value is a id in species.csv."
          },
          {
            "name": "why_it_matters",
            "type": "string",
            "description": "Why the answer matters.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "what_would_help",
            "type": "string",
            "description": "What would settle it.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "raised",
            "type": "date",
            "description": "The date the question was raised.",
            "constraints": {
              "required": true
            }
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "id"
        ]
      }
    }
  ]
}
