{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://seminars.databio.org/schema.json",
  "title": "Seminar",
  "description": "One seminar/defense/colloquium record in seminars.databio.org. The curated file data/seminars.yaml (repo root) is { \"seminars\": [ <this> ] }. zoom_url and source_email_id are stripped from every record before it is published here.",
  "type": "object",
  "additionalProperties": true,
  "required": [
    "date"
  ],
  "anyOf": [
    {
      "required": [
        "title"
      ]
    },
    {
      "required": [
        "speaker"
      ]
    }
  ],
  "properties": {
    "title": {
      "type": "string",
      "description": "Event title, as extracted from the announcement. Omitted when the announcement gave no talk title; a client should fall back to displaying speaker."
    },
    "speaker": {
      "type": "string"
    },
    "affiliation": {
      "type": "string"
    },
    "date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "ISO YYYY-MM-DD."
    },
    "time": {
      "type": "string",
      "pattern": "^\\d{2}:\\d{2}$",
      "description": "24-hour HH:MM, local (America/New_York)."
    },
    "location": {
      "type": "string"
    },
    "type": {
      "type": "string",
      "enum": [
        "seminar",
        "defense",
        "colloquium",
        "rip"
      ],
      "description": "Event kind. rip = 'research in progress'."
    },
    "program": {
      "type": "string",
      "description": "Sponsoring program/department, e.g. BME, MIC, BIMS, BMG, CIC."
    },
    "extracted": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "Date the seminar-extractor subagent added this record."
    },
    "abstract": {
      "type": "string",
      "maxLength": 2000,
      "description": "Talk abstract, copied as plain text from the announcement email. Paragraphs are separated by a blank line (\"\\n\\n\"). Absent when the announcement had none; records extracted before this field existed never have it. Never generated or summarized."
    },
    "id": {
      "type": "string",
      "description": "Stable id derived by the API from date + speaker; not present in the source file."
    }
  }
}