Open Hive Data Standard

OHDS v1.0

A universal interchange format for beekeeping citizen science data. One privacy-first export format that maps cleanly to BIP, COLOSS, HoneyBeeNet, and any future program.

OHDS v1.0 Builds on VODS v1.0 CC-BY-4.0 STABLE
§ 1

Overview

OHDS is a domain specialization of VODS (Veydrin Open Data Standard). Every OHDS document is also a valid VODS document. OHDS adds the ohds_version field and the domain payload — inspections and apiary_summary arrays — on top of the VODS envelope. Refer to the VODS v1.0 specification for the full definition of envelope fields, the anonymization model, the extensions system, and the versioning contract. This document specifies only what OHDS adds.

VODS dependency. OHDS v1.0 requires VODS v1.0. The four VODS envelope fields (vods_version, export_id, export_date, export_mode) are required in every OHDS document by virtue of the VODS dependency. They are described here for reference; their authoritative definition is in the VODS spec.

An OHDS file is a single .ohds.json file. Applications export it; converters transform it into program-specific formats. No SDK or library is required. Any developer who can write JSON can implement the standard in an afternoon.

§ 2

Document Envelope

Every OHDS document begins with the VODS envelope (inherited) followed by the OHDS domain version field. Together these five fields identify the document and its conformance claims.

FieldTypeSourceReq?Description
vods_versionstringVODSreq VODS version this document conforms to. Must be "1.0" for documents conforming to VODS v1.0.
export_idstring (UUID)VODSreq Random UUID v4, generated fresh per export. Never reused.
export_datestring (ISO 8601)VODSreq Full datetime with timezone. Example: "2026-03-09T14:22:00Z".
export_modeenumVODSreq "anonymous" — randomized refs per export. "tracked" — stable per-program pseudonymous refs. See VODS §3.
ohds_versionstringOHDSreq OHDS specification version. Currently "1.0". Consumers must accept any version with a matching major number.
extensionsobjectVODSopt Namespaced org-specific fields. Consumers ignore unrecognized namespaces. See VODS §4.

Minimum content rule

An OHDS document must contain at least one of inspections or apiary_summary, and whichever arrays are present must be non-empty. A document with neither array, or with both arrays empty, is not valid OHDS.

§ 3

Inspection Record

One record per hive visit. The inspections array contains these records. Fields marked optional may be omitted entirely — do not include a field with a null value.

FieldTypeReq?Description
inspection_datestring (ISO 8601 date)reqDate of inspection. "2026-03-01".
apiary_refstringreqPseudonymous apiary identifier. Groups hives by apiary. Links to apiary_summary records.
hive_refstringreqPseudonymous hive identifier. Generated per the active export_mode. Never the internal database ID.
colony_statusenumreqalive · dead · absconded · lost_queen · split · merged
hive_typeenumoptlangstroth · top_bar · warre · flow · long · skep · other
bee_raceenumoptitalian · carniolan · russian · buckfast · caucasian · local_mutt · africanized · unknown · other
brood_patternenumoptsolid · spotty · none
queen_seenbooleanoptWhether the queen was directly observed.
queen_statusenumoptpresent · missing · replaced · supercedure · unknown
frames_of_beesnumberoptEstimated population in standard frames of bees.
frames_of_broodnumberoptNumber of frames containing brood.
frames_of_honeynumberoptNumber of frames of capped honey stores.
varroa_countnumberoptMite count per 100 bees (or per the method below).
varroa_methodenumoptalcohol_wash · sugar_roll · sticky_board · drone_uncapping
treatmentsarrayoptTreatments applied during or since last inspection. See §3.1.
feedingobjectoptFeed provided. See §3.2.
weight_kgnumberoptHive weight in kilograms (scale hives).
temperature_cnumberoptAmbient temperature in Celsius at time of inspection.
weatherenumoptsunny · partly_cloudy · overcast · rain · wind
notesstringoptFree-text notes. Omitted in anonymous exports if the app strips notes as a privacy measure.
coordinatesobjectoptOpt-in only. {"lat": 30.2, "lon": -97.7} WGS 84. Coarsened to ±0.1° minimum in anonymous mode.

3.1 Treatment record

FieldTypeReq?Description
productstringreqProduct or compound name (e.g., "oxalic acid", "ApiVar").
methodenumreqvaporization · strip · drizzle · drench · dusting · fogger · feed_additive · other
date_startstring (date)optTreatment start date.
date_endstring (date)optTreatment end date.

3.2 Feeding record

FieldTypeReq?Description
typeenumreqsugar_syrup_1:1 · sugar_syrup_2:1 · dry_sugar · candy · pollen_sub · other
quantity_kgnumberreqAmount fed in kilograms.
§ 4

Apiary Summary Record

One record per apiary per season. Used for loss surveys (BIP, COLOSS). The apiary_summary array contains these records.

FieldTypeReq?Description
apiary_refstringreqPseudonymous apiary identifier. Same value as used in inspection records for this apiary.
seasonenumreqwinter · spring · summer · fall · annual
yearstringreqReporting year or range. "2025" or "2025-2026" for winter seasons.
season_startstring (date)optStart date of the reporting season. Programs define their own boundaries; include when known.
season_endstring (date)optEnd date of the reporting season.
colonies_startintegerreqColonies at the start of the season.
colonies_endintegerreqColonies surviving at the end of the season.
lost_deadintegeroptColonies lost — colony died.
lost_queenintegeroptColonies lost — queen failure.
lost_disasterintegeroptColonies lost — external event (weather, vandalism, etc.).
new_purchasedintegeroptNew colonies acquired by purchase.
new_splitsintegeroptNew colonies created by split.
colonies_soldintegeroptColonies sold or given away during the season.
perceived_loss_causesstring[]optBeekeeper's attributed causes. Suggested values: varroa · nosema · pesticides · starvation · weather · ccd · weak_fall · unknown
operation_sizeenumoptbackyard (1–24) · sideline (25–299) · commercial (300+)
migratorybooleanoptWhether hives were moved for pollination or honey production.
regionstringoptISO 3166-2 region code. Example: "US-TX", "DE-BY".
BIP loss rate. BIP calculates loss rate as total_lost / colonies_at_risk, where at-risk = colonies_start + new_purchased + new_splits. Include these fields when targeting BIP format.
§ 5

Full Example

Anonymous export
Tracked export
{
  // VODS envelope
  "vods_version":  "1.0",
  "export_id":    "a3f8c2e1-04b7-4d9e-b221-7f3a09cc1d82",
  "export_date":  "2026-03-09T14:22:00Z",
  "export_mode":  "anonymous",

  // OHDS domain fields
  "ohds_version":  "1.0",

  "inspections": [
    {
      "inspection_date": "2026-03-01",
      "apiary_ref":      "A-9f4c",   // randomized this export
      "hive_ref":        "H-2a71",   // randomized this export
      "colony_status":   "alive",
      "hive_type":       "langstroth",
      "bee_race":        "italian",
      "frames_of_bees":  8,
      "varroa_count":    1.4,
      "varroa_method":   "alcohol_wash",
      "treatments": [
        {
          "product":    "oxalic acid",
          "method":     "vaporization",
          "date_start": "2026-02-15"
        }
      ]
    }
  ],

  "apiary_summary": [
    {
      "apiary_ref":      "A-9f4c",
      "season":          "winter",
      "year":            "2025-2026",
      "season_start":    "2025-10-01",
      "season_end":      "2026-04-01",
      "colonies_start":  12,
      "colonies_end":    10,
      "lost_dead":       1,
      "lost_queen":      1,
      "new_splits":      2,
      "operation_size":  "backyard",
      "region":          "US-TX"
    }
  ]
}
{
  // VODS envelope — tracked mode for longitudinal program
  "vods_version":  "1.0",
  "export_id":    "d91cc3f4-88ab-4e02-a301-0f2b17dc5e41",
  "export_date":  "2026-03-09T14:22:00Z",
  "export_mode":  "tracked",

  "ohds_version":  "1.0",

  "inspections": [
    {
      "inspection_date": "2026-03-01",
      "apiary_ref":      "A-bip-7c3d",  // stable for BIP program
      "hive_ref":        "H-bip-4f19",  // stable for BIP program
      "colony_status":   "alive",
      "frames_of_bees":  9,
      "varroa_count":    0.8,
      "varroa_method":   "alcohol_wash"
    }
  ],

  "extensions": {
    "hfh": {
      "program_cohort": "Spring 2026",
      "mentor_id":      "M-42"
    }
  }
}
§ 6

Reference Converters

These snippets transform an OHDS document into the format expected by major citizen science programs. They are reference implementations — not the only valid approach.

BIP format (Python)

def ohds_to_bip(ohds: dict) -> list[dict]:
    """Convert OHDS apiary_summary records to BIP loss survey rows."""
    rows = []
    for s in ohds.get("apiary_summary", []):
        start     = s["colonies_start"]
        purchased = s.get("new_purchased", 0)
        splits    = s.get("new_splits", 0)
        at_risk   = start + purchased + splits
        lost      = start - s["colonies_end"]

        rows.append({
            "apiary_id":      s["apiary_ref"],
            "season":         s["season"],
            "year":           s["year"],
            "colonies_oct1":  start,
            "colonies_april": s["colonies_end"],
            "total_lost":     lost,
            "loss_rate":      round(lost / at_risk, 4) if at_risk else None,
            "operation_size": s.get("operation_size"),
            "region":         s.get("region"),
        })
    return rows

COLOSS format (Python)

def ohds_to_coloss(ohds: dict) -> list[dict]:
    """Convert OHDS apiary_summary to COLOSS questionnaire rows."""
    rows = []
    for s in ohds.get("apiary_summary", []):
        rows.append({
            "apiary_ref":         s["apiary_ref"],
            "country_region":     s.get("region", ""),
            "season":             s.get("season"),
            "year":               s["year"],
            "season_start":       s.get("season_start"),
            "season_end":         s.get("season_end"),
            "colonies_managed":   s["colonies_start"],
            "colonies_lost":      s["colonies_start"] - s["colonies_end"],
            "colonies_survived":  s["colonies_end"],
            "loss_causes":        ",".join(s.get("perceived_loss_causes", [])),
            "operation_type":     s.get("operation_size"),
            "migratory":          s.get("migratory"),
        })
    return rows
§ 7

Conformance Rules

An application claims OHDS v1.0 conformance by satisfying all VODS v1.0 conformance rules (see VODS spec §6) and the following OHDS-specific rules.