{
 "$schema": "https://json-schema.org/draft/2020-12/schema",
 "type": "object",
 "properties": {
  "schemaVersion": {
   "type": "string",
   "const": "1.0"
  },
  "name": {
   "type": "string"
  },
  "language": {
   "type": "string",
   "const": "de"
  },
  "license": {
   "type": "object",
   "properties": {
    "name": {
     "type": "string"
    },
    "url": {
     "type": "string",
     "format": "uri"
    }
   },
   "required": [
    "name",
    "url"
   ],
   "additionalProperties": false
  },
  "citation": {
   "type": "string"
  },
  "definitions": {
   "type": "object",
   "properties": {
    "tri": {
     "type": "string"
    },
    "evidence": {
     "type": "string"
    }
   },
   "required": [
    "tri",
    "evidence"
   ],
   "additionalProperties": false
  },
  "providers": {
   "type": "array",
   "items": {
    "type": "object",
    "properties": {
     "slug": {
      "type": "string",
      "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
     },
     "tagline": {
      "type": "string",
      "minLength": 20,
      "maxLength": 180
     },
     "description": {
      "type": "string",
      "minLength": 80,
      "maxLength": 190
     },
     "summary": {
      "type": "string",
      "minLength": 120,
      "maxLength": 1200
     },
     "website": {
      "type": "string",
      "format": "uri"
     },
     "categories": {
      "minItems": 1,
      "type": "array",
      "items": {
       "type": "string",
       "enum": [
        "audio-transkription",
        "diktiersoftware",
        "medical-scribes",
        "medizinische-transkription",
        "meeting-scribes",
        "untertitel"
       ]
      },
      "description": "Kategorien des Anbieters. Kategoriekennung: audio-transkription = Audiotranskription, diktiersoftware = Diktiersoftware, medical-scribes = Medical Scribes, medizinische-transkription = Medizinische Spracherkennung, meeting-scribes = Meeting-Scribes, untertitel = Untertitel."
     },
     "mainTask": {
      "description": "Hauptaufgabe, deren Ergebnis Kurzfassung und Datenblatt anführt, etwa nursing-notes. Ohne Angabe oder ohne Ergebnis dieser Aufgabe gilt das Ergebnis der Standardaufgabe der ersten Kategorie. Fehlt auch dieses, gilt das erste Ergebnis in der Reihenfolge der Kategorien.",
      "type": "string",
      "enum": [
       "clinical-notes",
       "therapy-notes",
       "nursing-notes",
       "anamnesis-report",
       "general-dictation",
       "legal-dictation",
       "voice-writing",
       "file-subtitles",
       "live-subtitles"
      ]
     },
     "bestFor": {
      "type": "string",
      "minLength": 5
     },
     "input": {
      "type": "string",
      "minLength": 3
     },
     "output": {
      "type": "string",
      "minLength": 3
     },
     "languages": {
      "type": "object",
      "properties": {
       "codes": {
        "minItems": 1,
        "type": "array",
        "items": {
         "type": "string",
         "pattern": "^[a-z]{2,3}(-[A-Z]{2})?$"
        },
        "description": "Dokumentierte Sprachen: de (Deutsch ohne Regionsangabe), de-DE, de-AT, de-CH, gsw (Schweizer Mundart), weitere Sprachen ohne Region, etwa en, fr."
       },
       "total": {
        "description": "Gesamtzahl der Sprachen laut Anbieter, wenn mehr als aufgezählt.",
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
       },
       "atLeast": {
        "description": "total ist eine Mindestangabe wie „90+“ oder „mehr als 100“.",
        "type": "boolean"
       },
       "detail": {
        "description": "Angabe in Worten, etwa Einschränkungen je Funktion. Hat Vorrang vor der Liste aus codes.",
        "type": "string",
        "minLength": 10
       }
      },
      "required": [
       "codes"
      ],
      "additionalProperties": false
     },
     "deployment": {
      "type": "object",
      "properties": {
       "platforms": {
        "type": "array",
        "items": {
         "type": "string",
         "enum": [
          "web",
          "windows",
          "macos",
          "linux",
          "ios",
          "android",
          "desktop",
          "mobile",
          "browser-extension"
         ]
        },
        "description": "Oberflächen, auf denen der Dienst läuft. desktop und mobile: Desktop- bzw. Mobil-App, deren Betriebssystem der Anbieter nicht nennt. browser-extension: Erweiterung für Chrome, Edge und ähnliche."
       },
       "operation": {
        "minItems": 1,
        "type": "array",
        "items": {
         "type": "string",
         "enum": [
          "cloud",
          "on-premise",
          "local"
         ]
        },
        "description": "cloud: Verarbeitung beim Anbieter, on-premise: auf Servern des Kunden, local: auf dem Gerät des Anwenders."
       },
       "detail": {
        "description": "Angabe in Worten. Hat Vorrang vor platforms und operation.",
        "type": "string",
        "minLength": 10
       }
      },
      "required": [
       "platforms",
       "operation"
      ],
      "additionalProperties": false
     },
     "highlights": {
      "minItems": 2,
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "considerations": {
      "minItems": 2,
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "facts": {
      "minItems": 4,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "label": {
         "type": "string"
        },
        "value": {
         "type": "string"
        },
        "source": {
         "type": "string",
         "format": "uri"
        }
       },
       "required": [
        "label",
        "value",
        "source"
       ],
       "additionalProperties": false
      }
     },
     "sources": {
      "minItems": 2,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "title": {
         "type": "string",
         "minLength": 3
        },
        "url": {
         "type": "string",
         "format": "uri"
        },
        "checked": {
         "type": "string",
         "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        }
       },
       "required": [
        "title",
        "url",
        "checked"
       ],
       "additionalProperties": false
      }
     },
     "untested": {
      "description": "Testreihen, in denen der Dienst geführt wird, aber kein eigenes Ergebnis hat.",
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "category": {
         "type": "string",
         "enum": [
          "audio-transkription",
          "diktiersoftware",
          "medical-scribes",
          "medizinische-transkription",
          "meeting-scribes",
          "untertitel"
         ]
        },
        "task": {
         "description": "Nur in Kategorien mit Aufgaben, etwa clinical-notes.",
         "type": "string",
         "enum": [
          "clinical-notes",
          "therapy-notes",
          "nursing-notes",
          "anamnesis-report",
          "general-dictation",
          "legal-dictation",
          "voice-writing",
          "file-subtitles",
          "live-subtitles"
         ]
        },
        "cause": {
         "type": "string",
         "enum": [
          "no-access",
          "not-scheduled"
         ],
         "description": "no-access: kein regulärer Zugang und keine Einrichtung im Umfeld, die den Dienst einsetzt. not-scheduled: Zugang vorhanden, das Ergebnis steht noch aus."
        },
        "reason": {
         "type": "string",
         "minLength": 100,
         "maxLength": 300,
         "description": "Grund, warum für diese Testreihe kein Ergebnis vorliegt."
        }
       },
       "required": [
        "category",
        "cause",
        "reason"
       ],
       "additionalProperties": false
      }
     },
     "name": {
      "type": "string",
      "description": "Vollständiger Produktname."
     },
     "shortName": {
      "type": "string"
     },
     "url": {
      "type": "string",
      "format": "uri"
     },
     "dataUrl": {
      "type": "string",
      "format": "uri"
     },
     "checked": {
      "type": "string",
      "description": "Jüngste Recherche zu diesem Anbieter. Kommt ein neueres Testergebnis hinzu, gilt der Tag seiner Veröffentlichung. Quellen behalten ihr eigenes Abrufdatum."
     },
     "pricing": {
      "type": "object",
      "properties": {
       "plans": {
        "minItems": 1,
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "name": {
           "type": "string",
           "minLength": 2,
           "description": "Tarifname des Anbieters. Monats- und Jahresvariante desselben Tarifs sind zwei Einträge mit gleichem Namen."
          },
          "price": {
           "anyOf": [
            {
             "type": "number",
             "minimum": 0
            },
            {
             "type": "null"
            }
           ],
           "description": "Betrag je Abrechnung: Monatsbetrag (monthly), Jahresbetrag (annual), Einmalbetrag (one-time) oder Preis je Menge (usage). null nur bei quote."
          },
          "currency": {
           "type": "string",
           "enum": [
            "EUR",
            "USD",
            "CHF"
           ]
          },
          "unit": {
           "type": "string",
           "enum": [
            "user",
            "physician",
            "practice",
            "organization",
            "account",
            "license",
            "installation",
            "device",
            "session",
            "audio-hour",
            "audio-minute",
            "service-hour",
            "characters"
           ],
           "description": "Wofür der Preis gilt: user (Nutzer), physician (Arzt bzw. LANR), practice (Praxis), organization (Organisation), account (Konto ohne Nutzerbezug), license (Lizenz), installation, device (Gerät), session (Sitzung oder Vorgang), audio-hour, audio-minute, service-hour (aktive Dienststunde), characters (Zeichen)."
          },
          "quantity": {
           "description": "Menge je Preis, etwa 1000 bei Zeichen oder 2 bei einem Paket mit zwei Audiostunden. Ohne Angabe 1.",
           "type": "number",
           "exclusiveMinimum": 0
          },
          "billing": {
           "type": "string",
           "enum": [
            "monthly",
            "annual",
            "one-time",
            "usage",
            "quote"
           ],
           "description": "monthly: monatlich, annual: jährlich (price ist der Jahresbetrag), one-time: einmalig, usage: nach Verbrauch je Menge, quote: Preis auf Anfrage."
          },
          "months": {
           "description": "Nur bei one-time: Der Einmalbetrag gilt für so viele Monate, etwa ein Pass für drei Monate.",
           "type": "integer",
           "exclusiveMinimum": 0,
           "maximum": 9007199254740991
          },
          "tax": {
           "default": null,
           "description": "net: zuzüglich Umsatzsteuer, gross: einschließlich Umsatzsteuer, null: keine Angabe des Anbieters.",
           "anyOf": [
            {
             "type": "string",
             "enum": [
              "net",
              "gross"
             ]
            },
            {
             "type": "null"
            }
           ]
          },
          "note": {
           "description": "Kurzer Leistungsumfang oder eine Bedingung, ohne Betrag.",
           "type": "string",
           "minLength": 3,
           "maxLength": 140
          },
          "limits": {
           "default": [],
           "description": "Nutzungskontingente des Tarifs. Technische Eingabegrenzen stehen je Aufnahmeweg in classification.inputs[].limits.",
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "kind": {
              "type": "string",
              "enum": [
               "audio-minutes",
               "storage-minutes",
               "documents",
               "meetings",
               "sessions",
               "uploads",
               "credits",
               "words",
               "users"
              ],
              "description": "audio-minutes: Transkriptions- oder Aufnahmeminuten, storage-minutes: gespeicherte Minuten, documents: Notizen, Dokumente oder Berichte, meetings, sessions: KI-Sitzungen oder Vorgänge, uploads: Dateiimporte, credits, words, users: Zahl der Nutzer."
             },
             "amount": {
              "anyOf": [
               {
                "type": "number",
                "exclusiveMinimum": 0
               },
               {
                "type": "null"
               }
              ],
              "description": "Menge. null bedeutet unbegrenzt."
             },
             "per": {
              "type": "string",
              "enum": [
               "day",
               "week",
               "month",
               "year",
               "total"
              ],
              "description": "Bezug: je Tag, Woche, Monat, Jahr, insgesamt."
             }
            },
            "required": [
             "kind",
             "amount",
             "per"
            ],
            "additionalProperties": false
           }
          },
          "task": {
           "description": "Der Tarif gilt nur für diese Aufgabe, etwa ein eigener Preis für Anamneseberichte.",
           "type": "string",
           "enum": [
            "clinical-notes",
            "therapy-notes",
            "nursing-notes",
            "anamnesis-report",
            "general-dictation",
            "legal-dictation",
            "voice-writing",
            "file-subtitles",
            "live-subtitles"
           ]
          },
          "notFor": {
           "description": "Der Tarif deckt diese Aufgaben nicht ab, etwa ohne Untertitelexport oder mit zu kurzer Aufnahmedauer. Einstiegspreis und kostenloser Plan einer solchen Aufgabe beziehen sich dann auf die übrigen Tarife. Ohne Aufgabe zählt der Tarif weiter mit.",
           "minItems": 1,
           "type": "array",
           "items": {
            "type": "string",
            "enum": [
             "clinical-notes",
             "therapy-notes",
             "nursing-notes",
             "anamnesis-report",
             "general-dictation",
             "legal-dictation",
             "voice-writing",
             "file-subtitles",
             "live-subtitles"
            ]
           }
          }
         },
         "required": [
          "name",
          "price",
          "currency",
          "unit",
          "billing",
          "tax",
          "limits"
         ],
         "additionalProperties": false
        },
        "description": "Alle dokumentierten Tarife. Der erste Tarif ohne Aufgabenbezug mit einem Preis über 0 ist der Einstieg. Ein Tarif mit Preis 0 ist ein kostenloser Plan."
       },
       "extras": {
        "default": [],
        "description": "Zusatzkosten neben den Tarifen: Pflichtkosten, Optionen und Mehrverbrauch. Sie zählen nicht zum Einstiegspreis.",
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "name": {
           "type": "string",
           "minLength": 2,
           "description": "Bezeichnung, etwa „Einrichtung“, „Menschliche Transkription“ oder „Weitere Audiostunden“."
          },
          "price": {
           "anyOf": [
            {
             "type": "number",
             "minimum": 0
            },
            {
             "type": "null"
            }
           ],
           "description": "Betrag je Abrechnung: Monatsbetrag (monthly), Jahresbetrag (annual), Einmalbetrag (one-time) oder Preis je Menge (usage). null nur bei quote."
          },
          "currency": {
           "type": "string",
           "enum": [
            "EUR",
            "USD",
            "CHF"
           ]
          },
          "unit": {
           "type": "string",
           "enum": [
            "user",
            "physician",
            "practice",
            "organization",
            "account",
            "license",
            "installation",
            "device",
            "session",
            "audio-hour",
            "audio-minute",
            "service-hour",
            "characters"
           ],
           "description": "Wofür der Preis gilt: user (Nutzer), physician (Arzt bzw. LANR), practice (Praxis), organization (Organisation), account (Konto ohne Nutzerbezug), license (Lizenz), installation, device (Gerät), session (Sitzung oder Vorgang), audio-hour, audio-minute, service-hour (aktive Dienststunde), characters (Zeichen)."
          },
          "quantity": {
           "description": "Menge je Preis, etwa 1000 bei Zeichen oder 2 bei einem Paket mit zwei Audiostunden. Ohne Angabe 1.",
           "type": "number",
           "exclusiveMinimum": 0
          },
          "billing": {
           "type": "string",
           "enum": [
            "monthly",
            "annual",
            "one-time",
            "usage",
            "quote"
           ],
           "description": "monthly: monatlich, annual: jährlich (price ist der Jahresbetrag), one-time: einmalig, usage: nach Verbrauch je Menge, quote: Preis auf Anfrage."
          },
          "months": {
           "description": "Nur bei one-time: Der Einmalbetrag gilt für so viele Monate, etwa ein Pass für drei Monate.",
           "type": "integer",
           "exclusiveMinimum": 0,
           "maximum": 9007199254740991
          },
          "tax": {
           "default": null,
           "description": "net: zuzüglich Umsatzsteuer, gross: einschließlich Umsatzsteuer, null: keine Angabe des Anbieters.",
           "anyOf": [
            {
             "type": "string",
             "enum": [
              "net",
              "gross"
             ]
            },
            {
             "type": "null"
            }
           ]
          },
          "note": {
           "description": "Kurzer Leistungsumfang oder eine Bedingung, ohne Betrag.",
           "type": "string",
           "minLength": 3,
           "maxLength": 140
          },
          "type": {
           "type": "string",
           "enum": [
            "required",
            "optional",
            "overage"
           ],
           "description": "required: Pflichtkosten wie Einrichtung oder Grundlizenz, optional: zubuchbare Leistung, Modul oder Gerät, overage: Mehrverbrauch über das enthaltene Kontingent."
          },
          "from": {
           "description": "Der Anbieter nennt nur einen Ab-Preis.",
           "type": "boolean"
          },
          "plans": {
           "description": "Gilt nur für diese Tarife (Tarifnamen aus plans). Ohne Angabe für alle.",
           "type": "array",
           "items": {
            "type": "string"
           }
          }
         },
         "required": [
          "name",
          "price",
          "currency",
          "unit",
          "billing",
          "tax",
          "type"
         ],
         "additionalProperties": false
        }
       },
       "note": {
        "type": "string",
        "description": "Bedingungen wie Laufzeiten, Kündigungsfristen und Kontingentregeln. Preise stehen nur in plans und extras."
       },
       "source": {
        "type": "string",
        "format": "uri"
       },
       "freeTrial": {
        "description": "Kostenloser Test ohne Dauertarif: Testphase, Startguthaben oder Testzugang. true: dokumentiert, false: nur Demo oder Kauf, null: nicht dokumentiert.",
        "type": "object",
        "properties": {
         "value": {
          "type": [
           "boolean",
           "null"
          ]
         },
         "detail": {
          "type": "string",
          "minLength": 3
         },
         "source": {
          "type": "string",
          "format": "uri"
         },
         "days": {
          "description": "Dauer der Testphase in Tagen, wenn der Anbieter sie nennt.",
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
         },
         "paymentDetails": {
          "description": "true: Zahlungsdaten bei der Anmeldung nötig, false: ausdrücklich ohne Zahlungsdaten.",
          "type": "boolean"
         }
        },
        "required": [
         "value",
         "detail"
        ],
        "additionalProperties": false
       },
       "publicPrice": {
        "type": "boolean",
        "description": "Ein konkreter Einstiegspreis ist veröffentlicht, einschließlich kostenlosem Einstieg. Keine Zusage eines festen Gesamtpreises."
       },
       "freeEntry": {
        "type": "boolean",
        "description": "Ein dauerhaft kostenloser Tarif ist vorhanden. Funktions- und Mengenlimits gelten weiterhin."
       }
      },
      "required": [
       "plans",
       "extras",
       "note",
       "source",
       "publicPrice",
       "freeEntry"
      ],
      "additionalProperties": false
     },
     "capabilities": {
      "type": "object",
      "propertyNames": {
       "type": "string",
       "enum": [
        "transcription",
        "live",
        "file-upload",
        "voice-commands",
        "dictation-anywhere",
        "medical-vocabulary",
        "clinical-notes",
        "legal-vocabulary",
        "templates",
        "speaker-labels",
        "action-items",
        "integrations",
        "api",
        "exports",
        "subtitle-export",
        "translation",
        "burn-in",
        "human-review",
        "evidence-linking"
       ]
      },
      "additionalProperties": {
       "type": "object",
       "properties": {
        "value": {
         "description": "true: dokumentiert, false: laut Hersteller ausgeschlossen oder nach dem dokumentierten Produktumfang nicht vorgesehen, mit Begründung in detail, null: keine Herstellerangabe.",
         "type": [
          "boolean",
          "null"
         ]
        },
        "detail": {
         "type": "string",
         "minLength": 10
        },
        "sources": {
         "type": "array",
         "items": {
          "type": "object",
          "properties": {
           "title": {
            "type": "string",
            "minLength": 3
           },
           "url": {
            "type": "string",
            "format": "uri"
           }
          },
          "required": [
           "title",
           "url"
          ],
          "additionalProperties": false
         }
        },
        "formats": {
         "description": "Nur bei exports: Dateiformate.",
         "type": "array",
         "items": {
          "type": "string",
          "enum": [
           "docx",
           "pdf",
           "txt",
           "rtf",
           "odt",
           "html",
           "md",
           "csv",
           "xlsx",
           "json",
           "xml",
           "srt",
           "vtt",
           "ebu-stl",
           "scc",
           "ttml",
           "sbv",
           "mp4",
           "mp3",
           "wav"
          ]
         }
        },
        "targets": {
         "description": "Nur bei integrations: angebundene Systeme.",
         "type": "array",
         "items": {
          "type": "object",
          "properties": {
           "name": {
            "type": "string",
            "minLength": 2,
            "description": "Produktname, etwa CGM M1 PRO, tomedo, Microsoft Teams, Zapier."
           },
           "kind": {
            "type": "string",
            "enum": [
             "pvs",
             "kis",
             "care",
             "meeting",
             "video",
             "office",
             "crm",
             "storage",
             "automation",
             "calendar",
             "other"
            ]
           },
           "method": {
            "type": "string",
            "enum": [
             "gdt",
             "fhir",
             "hl7",
             "api",
             "plugin",
             "export",
             "copy",
             "cursor"
            ]
           }
          },
          "required": [
           "name",
           "kind"
          ],
          "additionalProperties": false
         }
        }
       },
       "required": [
        "value",
        "detail",
        "sources"
       ],
       "additionalProperties": false
      },
      "required": [
       "transcription",
       "live",
       "file-upload",
       "voice-commands",
       "dictation-anywhere",
       "medical-vocabulary",
       "clinical-notes",
       "legal-vocabulary",
       "templates",
       "speaker-labels",
       "action-items",
       "integrations",
       "api",
       "exports",
       "subtitle-export",
       "translation",
       "burn-in",
       "human-review",
       "evidence-linking"
      ]
     },
     "workflow": {
      "type": "object",
      "properties": {
       "germanInput": {
        "description": "Deutsche Audio-Eingabe im dokumentierten Workflow. null: keine Herstellerangabe.",
        "type": [
         "boolean",
         "null"
        ]
       },
       "germanOutput": {
        "description": "Deutsch für die primäre Ausgabe: klinisches Dokument, Meeting-Notizen oder bei reinen Transkriptionsdiensten das Transkript. Ein deutsches Transkript belegt keine deutschen Meeting-Notizen. null: keine Herstellerangabe.",
        "type": [
         "boolean",
         "null"
        ]
       },
       "inputModes": {
        "minItems": 1,
        "type": "array",
        "items": {
         "type": "string",
         "enum": [
          "conversation",
          "dictation",
          "file-upload",
          "meeting-bot",
          "desktop-audio"
         ]
        },
        "description": "Abgeleitet aus classification.inputs."
       },
       "outputTypes": {
        "type": "array",
        "items": {
         "type": "string",
         "enum": [
          "transcript",
          "clinical-note",
          "therapy-note",
          "nursing-note",
          "anamnesis-report",
          "meeting-summary",
          "tasks",
          "written-document",
          "subtitles"
         ]
        },
        "description": "Abgeleitet aus classification.outputs, den dokumentierten Aufgaben und der Funktion Aufgaben."
       },
       "sources": {
        "minItems": 1,
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "title": {
           "type": "string",
           "minLength": 3
          },
          "url": {
           "type": "string",
           "format": "uri"
          }
         },
         "required": [
          "title",
          "url"
         ],
         "additionalProperties": false
        }
       }
      },
      "required": [
       "germanInput",
       "germanOutput",
       "inputModes",
       "outputTypes",
       "sources"
      ],
      "additionalProperties": false
     },
     "classification": {
      "type": "object",
      "properties": {
       "checkedAt": {
        "type": "string",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
       },
       "inputs": {
        "minItems": 1,
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "id": {
           "type": "string",
           "enum": [
            "conversation",
            "dictation",
            "file-upload",
            "meeting-bot",
            "desktop-audio"
           ]
          },
          "detail": {
           "description": "Redaktionelle Beschreibung für diesen Anbieter, belegt durch sources. Ohne Angabe gilt die allgemeine Definition des Aufnahmewegs oder Ergebnisses.",
           "type": "string",
           "minLength": 15
          },
          "sources": {
           "minItems": 1,
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "title": {
              "type": "string",
              "minLength": 3
             },
             "url": {
              "type": "string",
              "format": "uri"
             },
             "checked": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
             }
            },
            "required": [
             "title",
             "url",
             "checked"
            ],
            "additionalProperties": false
           }
          },
          "available": {
           "description": "false: laut Hersteller ausgeschlossen, mit Begründung in detail. Ohne Angabe: dokumentiert.",
           "type": "boolean"
          },
          "live": {
           "description": "false, wenn der Dienst Audio nicht selbst während des Gesprächs oder Diktats aufnimmt, etwa bei eigenem Aufnahmegerät und späterem Upload.",
           "type": "boolean"
          },
          "limits": {
           "description": "Technische Eingabegrenzen für diesen Aufnahmeweg, mit gezielten Tarif-, Aufgaben- und Plattformregeln.",
           "minItems": 1,
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "plans": {
              "description": "Tarifnamen aus pricing.plans. Ohne Angabe gilt die Regel für alle Tarife.",
              "minItems": 1,
              "type": "array",
              "items": {
               "type": "string",
               "minLength": 2
              }
             },
             "task": {
              "description": "Aufgabe dieses Aufnahmewegs. Ohne Angabe gilt die Regel für alle Aufgaben.",
              "type": "string",
              "enum": [
               "clinical-notes",
               "therapy-notes",
               "nursing-notes",
               "anamnesis-report",
               "general-dictation",
               "legal-dictation",
               "voice-writing",
               "file-subtitles",
               "live-subtitles"
              ]
             },
             "platform": {
              "description": "Nur diese Plattform, etwa android für eine abweichende Aufnahmelänge.",
              "type": "string",
              "enum": [
               "web",
               "windows",
               "macos",
               "linux",
               "ios",
               "android",
               "desktop",
               "mobile",
               "browser-extension"
              ]
             },
             "mediaType": {
              "description": "Nur Datei-Upload: Audio- oder Videodatei.",
              "type": "string",
              "enum": [
               "audio",
               "video"
              ]
             },
             "speakerRecognition": {
              "description": "Abweichende Grenze mit oder ohne aktivierte Sprechererkennung.",
              "type": "boolean"
             },
             "maxDuration": {
              "oneOf": [
               {
                "type": "object",
                "properties": {
                 "status": {
                  "type": "string",
                  "const": "limited"
                 },
                 "minutes": {
                  "type": "number",
                  "exclusiveMinimum": 0
                 }
                },
                "required": [
                 "status",
                 "minutes"
                ],
                "additionalProperties": false
               },
               {
                "type": "object",
                "properties": {
                 "status": {
                  "type": "string",
                  "const": "unlimited"
                 }
                },
                "required": [
                 "status"
                ],
                "additionalProperties": false
               },
               {
                "type": "object",
                "properties": {
                 "status": {
                  "type": "string",
                  "const": "unknown"
                 }
                },
                "required": [
                 "status"
                ],
                "additionalProperties": false
               }
              ],
              "description": "Höchstdauer einer einzelnen Aufnahme, Sitzung oder Datei in Minuten. unknown ist keine Angabe, unlimited ausdrücklich unbegrenzt."
             },
             "maxFileSize": {
              "description": "Nur Datei-Upload: Höchstgröße einer einzelnen Datei in dezimalen MB (1 GB = 1.000 MB).",
              "oneOf": [
               {
                "type": "object",
                "properties": {
                 "status": {
                  "type": "string",
                  "const": "limited"
                 },
                 "megabytes": {
                  "type": "number",
                  "exclusiveMinimum": 0
                 }
                },
                "required": [
                 "status",
                 "megabytes"
                ],
                "additionalProperties": false
               },
               {
                "type": "object",
                "properties": {
                 "status": {
                  "type": "string",
                  "const": "unlimited"
                 }
                },
                "required": [
                 "status"
                ],
                "additionalProperties": false
               },
               {
                "type": "object",
                "properties": {
                 "status": {
                  "type": "string",
                  "const": "unknown"
                 }
                },
                "required": [
                 "status"
                ],
                "additionalProperties": false
               }
              ]
             },
             "sources": {
              "type": "array",
              "items": {
               "type": "object",
               "properties": {
                "title": {
                 "type": "string",
                 "minLength": 3
                },
                "url": {
                 "type": "string",
                 "format": "uri"
                },
                "checked": {
                 "type": "string",
                 "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                }
               },
               "required": [
                "title",
                "url",
                "checked"
               ],
               "additionalProperties": false
              },
              "description": "Datierte Herstellerquellen zu den Höchstwerten."
             }
            },
            "required": [
             "maxDuration",
             "sources"
            ],
            "additionalProperties": false
           }
          }
         },
         "required": [
          "id",
          "sources"
         ],
         "additionalProperties": false
        },
        "description": "Dokumentierte Aufnahmewege."
       },
       "outputs": {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "id": {
           "type": "string",
           "enum": [
            "transcript",
            "clinical-note",
            "meeting-summary",
            "subtitles"
           ]
          },
          "detail": {
           "description": "Redaktionelle Beschreibung für diesen Anbieter, belegt durch sources. Ohne Angabe gilt die allgemeine Definition des Aufnahmewegs oder Ergebnisses.",
           "type": "string",
           "minLength": 15
          },
          "sources": {
           "minItems": 1,
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "title": {
              "type": "string",
              "minLength": 3
             },
             "url": {
              "type": "string",
              "format": "uri"
             },
             "checked": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
             }
            },
            "required": [
             "title",
             "url",
             "checked"
            ],
            "additionalProperties": false
           }
          },
          "available": {
           "description": "false: laut Hersteller ausgeschlossen, mit Begründung in detail. Ohne Angabe: dokumentiert.",
           "type": "boolean"
          }
         },
         "required": [
          "id",
          "sources"
         ],
         "additionalProperties": false
        },
        "description": "Dokumentierte Ergebnisse außerhalb der Testreihen-Aufgaben. Ergebnisse einer Aufgabe stehen bei der Aufgabe."
       },
       "tasks": {
        "default": [],
        "description": "Aufgaben in Kategorien mit Testreihen-Aufgaben. Nicht aufgeführte Aufgaben gelten als „Keine Angabe“.",
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "category": {
           "type": "string",
           "enum": [
            "audio-transkription",
            "diktiersoftware",
            "medical-scribes",
            "medizinische-transkription",
            "meeting-scribes",
            "untertitel"
           ]
          },
          "task": {
           "type": "string",
           "enum": [
            "clinical-notes",
            "therapy-notes",
            "nursing-notes",
            "anamnesis-report",
            "general-dictation",
            "legal-dictation",
            "voice-writing",
            "file-subtitles",
            "live-subtitles"
           ]
          },
          "value": {
           "description": "true: dokumentiert, false: ausgeschlossen, null: keine Herstellerangabe, mit erklärendem Text.",
           "type": [
            "boolean",
            "null"
           ]
          },
          "detail": {
           "type": "string",
           "minLength": 15
          },
          "sources": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "title": {
              "type": "string",
              "minLength": 3
             },
             "url": {
              "type": "string",
              "format": "uri"
             },
             "checked": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
             }
            },
            "required": [
             "title",
             "url",
             "checked"
            ],
            "additionalProperties": false
           }
          }
         },
         "required": [
          "category",
          "task",
          "value",
          "sources"
         ],
         "additionalProperties": false
        }
       },
       "specialties": {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "id": {
           "type": "string",
           "enum": [
            "general-medicine",
            "mental-health",
            "psychiatry",
            "neurology",
            "orthopedics",
            "nursing",
            "general-business",
            "legal"
           ]
          },
          "detail": {
           "description": "Nur, wenn der Anbieter zum Fachbereich etwas Eigenes sagt, das nicht schon bei einer Aufgabe steht.",
           "type": "string",
           "minLength": 15
          },
          "sources": {
           "minItems": 1,
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "title": {
              "type": "string",
              "minLength": 3
             },
             "url": {
              "type": "string",
              "format": "uri"
             },
             "checked": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
             }
            },
            "required": [
             "title",
             "url",
             "checked"
            ],
            "additionalProperties": false
           }
          }
         },
         "required": [
          "id",
          "sources"
         ],
         "additionalProperties": false
        }
       }
      },
      "required": [
       "checkedAt",
       "inputs",
       "outputs",
       "tasks",
       "specialties"
      ],
      "additionalProperties": false
     },
     "tasks": {
      "type": "array",
      "items": {
       "type": "string",
       "enum": [
        "clinical-notes",
        "therapy-notes",
        "nursing-notes",
        "anamnesis-report",
        "general-dictation",
        "legal-dictation",
        "voice-writing",
        "file-subtitles",
        "live-subtitles"
       ]
      },
      "description": "Dokumentierte Aufgaben in Kategorien mit Aufgaben, etwa clinical-notes oder legal-dictation. Keine Qualitätszusage."
     },
     "privacy": {
      "type": "object",
      "properties": {
       "checked": {
        "type": "string",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
       },
       "gdpr": {
        "type": "object",
        "properties": {
         "value": {
          "type": [
           "boolean",
           "null"
          ]
         },
         "detail": {
          "type": "string",
          "minLength": 10
         },
         "source": {
          "anyOf": [
           {
            "type": "object",
            "properties": {
             "title": {
              "type": "string",
              "minLength": 3
             },
             "url": {
              "type": "string",
              "format": "uri"
             }
            },
            "required": [
             "title",
             "url"
            ],
            "additionalProperties": false
           },
           {
            "type": "null"
           }
          ]
         }
        },
        "required": [
         "value",
         "detail",
         "source"
        ],
        "additionalProperties": false,
        "description": "DSGVO-Angabe des Herstellers. Bei ausschließlich lokaler Kernverarbeitung entfällt der Punkt. ScribeIndex weist dann „Beim Anwender (lokal)“ aus, siehe Methodik."
       },
       "avv": {
        "type": "object",
        "properties": {
         "value": {
          "type": [
           "boolean",
           "null"
          ]
         },
         "detail": {
          "type": "string",
          "minLength": 10
         },
         "source": {
          "anyOf": [
           {
            "type": "object",
            "properties": {
             "title": {
              "type": "string",
              "minLength": 3
             },
             "url": {
              "type": "string",
              "format": "uri"
             }
            },
            "required": [
             "title",
             "url"
            ],
            "additionalProperties": false
           },
           {
            "type": "null"
           }
          ]
         },
         "condition": {
          "description": "Tarifbedingung als Wortgruppe, z. B. „nur im Enterprise-Tarif“. Ohne Angabe gilt der AVV für alle Tarife.",
          "type": "string",
          "minLength": 2
         }
        },
        "required": [
         "value",
         "detail",
         "source"
        ],
        "additionalProperties": false,
        "description": "AVV-Angabe des Herstellers. Bei ausschließlich lokaler Kernverarbeitung entfällt der Punkt. ScribeIndex weist dann „Entfällt (lokal)“ aus, siehe Methodik."
       },
       "euHealthDataUse": {
        "type": "object",
        "properties": {
         "value": {
          "type": [
           "boolean",
           "null"
          ]
         },
         "detail": {
          "type": "string",
          "minLength": 10
         },
         "source": {
          "anyOf": [
           {
            "type": "object",
            "properties": {
             "title": {
              "type": "string",
              "minLength": 3
             },
             "url": {
              "type": "string",
              "format": "uri"
             }
            },
            "required": [
             "title",
             "url"
            ],
            "additionalProperties": false
           },
           {
            "type": "null"
           }
          ]
         }
        },
        "required": [
         "value",
         "detail",
         "source"
        ],
        "additionalProperties": false
       },
       "clientDataUse": {
        "description": "Einsatz mit Mandantendaten unter Berufsgeheimnis (§ 203 StGB, § 43e BRAO). Pflicht bei Anbietern mit juristischer Aufgabe.",
        "type": "object",
        "properties": {
         "value": {
          "type": [
           "boolean",
           "null"
          ]
         },
         "detail": {
          "type": "string",
          "minLength": 10
         },
         "source": {
          "anyOf": [
           {
            "type": "object",
            "properties": {
             "title": {
              "type": "string",
              "minLength": 3
             },
             "url": {
              "type": "string",
              "format": "uri"
             }
            },
            "required": [
             "title",
             "url"
            ],
            "additionalProperties": false
           },
           {
            "type": "null"
           }
          ]
         }
        },
        "required": [
         "value",
         "detail",
         "source"
        ],
        "additionalProperties": false
       },
       "localAudioProcessing": {
        "type": "object",
        "properties": {
         "value": {
          "type": [
           "boolean",
           "null"
          ]
         },
         "detail": {
          "type": "string",
          "minLength": 10
         },
         "source": {
          "anyOf": [
           {
            "type": "object",
            "properties": {
             "title": {
              "type": "string",
              "minLength": 3
             },
             "url": {
              "type": "string",
              "format": "uri"
             }
            },
            "required": [
             "title",
             "url"
            ],
            "additionalProperties": false
           },
           {
            "type": "null"
           }
          ]
         }
        },
        "required": [
         "value",
         "detail",
         "source"
        ],
        "additionalProperties": false
       },
       "usesCustomerDataForTraining": {
        "type": "object",
        "properties": {
         "value": {
          "type": [
           "boolean",
           "null"
          ]
         },
         "detail": {
          "type": "string",
          "minLength": 10
         },
         "source": {
          "anyOf": [
           {
            "type": "object",
            "properties": {
             "title": {
              "type": "string",
              "minLength": 3
             },
             "url": {
              "type": "string",
              "format": "uri"
             }
            },
            "required": [
             "title",
             "url"
            ],
            "additionalProperties": false
           },
           {
            "type": "null"
           }
          ]
         }
        },
        "required": [
         "value",
         "detail",
         "source"
        ],
        "additionalProperties": false,
        "description": "value: true = Training mit Kundendaten ist ohne vorherige Einwilligung erlaubt, auch wenn es standardmäßig aktiv und abschaltbar ist oder Patientendaten ausnimmt (trainingPolicy allowed, opt-out oder no-patient-data). false = ausgeschlossen oder nur mit Einwilligung (excluded oder opt-in). null = keine Angabe. Die genaue Regel steht in trainingPolicy."
       },
       "trainingPolicy": {
        "default": null,
        "description": "excluded: laut Vertrag oder Datenschutzerklärung ausgeschlossen (Grundlage: Quelle von usesCustomerDataForTraining), opt-in: nur nach ausdrücklicher Zustimmung, opt-out: standardmäßig aktiv und abwählbar, no-patient-data: Patientendaten und daraus erzeugte Dokumente ausgeschlossen, andere anonymisierte Nutzer- oder Nutzungsdaten erlaubt, allowed: erlaubt ohne dokumentierte Abwahl, null: keine Angabe. Läuft der Kern ausschließlich lokal, gilt das Training ohne Angabe als ausgeschlossen, weil der Anbieter keine Inhalte erhält.",
        "anyOf": [
         {
          "type": "string",
          "enum": [
           "excluded",
           "opt-in",
           "opt-out",
           "no-patient-data",
           "allowed"
          ]
         },
         {
          "type": "null"
         }
        ]
       },
       "storage": {
        "minItems": 1,
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "region": {
           "type": "string",
           "enum": [
            "eu",
            "europe",
            "uk",
            "us",
            "local",
            "other",
            "unknown"
           ],
           "description": "eu: ausdrücklich Europäische Union. europe: geografisch Europa, ohne bestätigte Länder oder EU-Zuordnung. uk: Vereinigtes Königreich. us: Vereinigte Staaten. local: auf dem Gerät oder in der eigenen Infrastruktur des Anwenders. other: Länder außerhalb dieser Regionen, genannt in label und country. unknown: Der Anbieter nennt keinen Ort."
          },
          "country": {
           "description": "Nur bei other: das Land, etwa Japan oder Schweiz. Besteht für das Land ein Angemessenheitsbeschluss der EU, steht er im Status.",
           "type": "string",
           "minLength": 2
          },
          "label": {
           "type": "string",
           "minLength": 2
          },
          "scope": {
           "type": "string",
           "minLength": 8
          },
          "condition": {
           "description": "Voraussetzung, unter der diese Region gilt, z. B. ein Tarif wie Enterprise.",
           "type": "string",
           "minLength": 2
          },
          "role": {
           "description": "Geltungsbereich: optional (Zusatzfunktion oder nur nach Einwilligung), support (nur Support und interne Prozesse), choice (wählbare Alternative), default (Standardregion, die eine gewählte Alternative ersetzt). Ohne Angabe: Kernverarbeitung, die immer gilt.",
           "type": "string",
           "enum": [
            "optional",
            "support",
            "choice",
            "default"
           ]
          },
          "framework": {
           "description": "Nur bei us: Der Empfänger ist nach dem EU-US Data Privacy Framework zertifiziert und stützt die Übermittlung laut den Quellen des Eintrags darauf (Durchführungsbeschluss (EU) 2023/1795). Das ist ein Angemessenheitsbeschluss für zertifizierte Empfänger, der Ort zählt wie ein Land mit Angemessenheitsbeschluss.",
           "type": "string",
           "const": "eu-us-dpf"
          },
          "sources": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "title": {
              "type": "string",
              "minLength": 3
             },
             "url": {
              "type": "string",
              "format": "uri"
             }
            },
            "required": [
             "title",
             "url"
            ],
            "additionalProperties": false
           }
          }
         },
         "required": [
          "region",
          "label",
          "scope",
          "sources"
         ],
         "additionalProperties": false
        }
       },
       "processing": {
        "minItems": 1,
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "region": {
           "type": "string",
           "enum": [
            "eu",
            "europe",
            "uk",
            "us",
            "local",
            "other",
            "unknown"
           ],
           "description": "eu: ausdrücklich Europäische Union. europe: geografisch Europa, ohne bestätigte Länder oder EU-Zuordnung. uk: Vereinigtes Königreich. us: Vereinigte Staaten. local: auf dem Gerät oder in der eigenen Infrastruktur des Anwenders. other: Länder außerhalb dieser Regionen, genannt in label und country. unknown: Der Anbieter nennt keinen Ort."
          },
          "country": {
           "description": "Nur bei other: das Land, etwa Japan oder Schweiz. Besteht für das Land ein Angemessenheitsbeschluss der EU, steht er im Status.",
           "type": "string",
           "minLength": 2
          },
          "label": {
           "type": "string",
           "minLength": 2
          },
          "scope": {
           "type": "string",
           "minLength": 8
          },
          "condition": {
           "description": "Voraussetzung, unter der diese Region gilt, z. B. ein Tarif wie Enterprise.",
           "type": "string",
           "minLength": 2
          },
          "role": {
           "description": "Geltungsbereich: optional (Zusatzfunktion oder nur nach Einwilligung), support (nur Support und interne Prozesse), choice (wählbare Alternative), default (Standardregion, die eine gewählte Alternative ersetzt). Ohne Angabe: Kernverarbeitung, die immer gilt.",
           "type": "string",
           "enum": [
            "optional",
            "support",
            "choice",
            "default"
           ]
          },
          "framework": {
           "description": "Nur bei us: Der Empfänger ist nach dem EU-US Data Privacy Framework zertifiziert und stützt die Übermittlung laut den Quellen des Eintrags darauf (Durchführungsbeschluss (EU) 2023/1795). Das ist ein Angemessenheitsbeschluss für zertifizierte Empfänger, der Ort zählt wie ein Land mit Angemessenheitsbeschluss.",
           "type": "string",
           "const": "eu-us-dpf"
          },
          "sources": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "title": {
              "type": "string",
              "minLength": 3
             },
             "url": {
              "type": "string",
              "format": "uri"
             }
            },
            "required": [
             "title",
             "url"
            ],
            "additionalProperties": false
           }
          }
         },
         "required": [
          "region",
          "label",
          "scope",
          "sources"
         ],
         "additionalProperties": false
        }
       },
       "certifications": {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "standard": {
           "type": "string",
           "enum": [
            "iso27001",
            "iso27017",
            "iso27018",
            "iso27701",
            "iso42001",
            "iso9001",
            "soc2",
            "c5",
            "hds",
            "hitrust",
            "cyber-essentials",
            "cyber-essentials-plus",
            "hipaa"
           ],
           "description": "Norm oder Prüfung. hipaa ist keine Zertifizierung, sondern eine Konformitätsangabe des Herstellers."
          },
          "level": {
           "description": "Typ 1 oder Typ 2 bei SOC 2 und BSI C5.",
           "type": "string",
           "enum": [
            "type-1",
            "type-2"
           ]
          },
          "version": {
           "description": "Ausgabe der Norm, etwa 2022 bei ISO/IEC 27001:2022.",
           "type": "string",
           "pattern": "^\\d{4}$"
          },
          "scope": {
           "type": "string"
          },
          "infrastructure": {
           "description": "Zertifikat des Rechenzentrums- oder Cloudpartners, nicht des Anbieters selbst.",
           "type": "boolean"
          },
          "sources": {
           "minItems": 1,
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "title": {
              "type": "string",
              "minLength": 3
             },
             "url": {
              "type": "string",
              "format": "uri"
             }
            },
            "required": [
             "title",
             "url"
            ],
            "additionalProperties": false
           }
          }
         },
         "required": [
          "standard",
          "scope",
          "sources"
         ],
         "additionalProperties": false
        }
       },
       "summary": {
        "type": "string",
        "minLength": 30
       }
      },
      "required": [
       "checked",
       "gdpr",
       "avv",
       "euHealthDataUse",
       "localAudioProcessing",
       "usesCustomerDataForTraining",
       "trainingPolicy",
       "storage",
       "processing",
       "certifications",
       "summary"
      ],
      "additionalProperties": false
     },
     "technology": {
      "anyOf": [
       {
        "type": "object",
        "properties": {
         "checked": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
         },
         "summary": {
          "type": "string",
          "minLength": 40
         },
         "stages": {
          "type": "array",
          "items": {
           "type": "object",
           "properties": {
            "id": {
             "type": "string",
             "enum": [
              "asr",
              "diarization",
              "generation",
              "assistant",
              "infrastructure"
             ],
             "description": "Verarbeitungsstufe: asr = Spracherkennung, diarization = Sprecherzuordnung, generation = Dokumenterstellung, assistant = Assistent und Zusatzfunktionen, infrastructure = Infrastruktur und Verarbeitungsort."
            },
            "approach": {
             "type": "string",
             "minLength": 3
            },
            "unknown": {
             "default": false,
             "description": "true: Kein Modell genannt. Beginnt approach mit „Nicht vorgesehen“, hat das Produkt diesen Schritt nicht. Beginnt approach mit „Optional“, gibt es ihn nur als Zusatzmodul.",
             "type": "boolean"
            },
            "note": {
             "type": "string"
            },
            "sources": {
             "type": "array",
             "items": {
              "type": "object",
              "properties": {
               "title": {
                "type": "string",
                "minLength": 3
               },
               "url": {
                "type": "string",
                "format": "uri"
               },
               "checked": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
               }
              },
              "required": [
               "title",
               "url"
              ],
              "additionalProperties": false
             }
            },
            "models": {
             "type": "array",
             "items": {
              "type": "object",
              "properties": {
               "name": {
                "type": "string",
                "minLength": 2
               },
               "vendor": {
                "type": "string",
                "minLength": 2
               },
               "type": {
                "type": "string",
                "enum": [
                 "proprietary-inhouse",
                 "third-party-api",
                 "open-weights",
                 "fine-tuned-open-weights",
                 "unknown"
                ]
               },
               "evidence": {
                "type": "string",
                "enum": [
                 "documented",
                 "technical",
                 "estimated"
                ],
                "description": "documented: Herstellerangabe mit Quelle. technical: von ScribeIndex aus der Technik des Anbieters ermittelt, ohne Quelle, mit Begründung. estimated: begründete Einschätzung mit Quelle."
               },
               "confidence": {
                "type": "string",
                "enum": [
                 "high",
                 "medium",
                 "low"
                ]
               },
               "rationale": {
                "type": "string",
                "minLength": 20,
                "description": "Begründung der Angabe. Bei technical nur der Hinweis, dass ScribeIndex das Modell aus der Technik des Anbieters ermittelt hat, ohne Fundstelle."
               },
               "auxiliary": {
                "description": "Nebenrolle ohne Beitrag zum Dokument, etwa Evaluation oder Sicherheitsprüfung. Zählt nicht zur Kernverarbeitung.",
                "type": "boolean"
               },
               "optional": {
                "description": "Optionales Modul, das Kunden zubuchen oder einschalten. Zählt nicht zur Kernverarbeitung.",
                "type": "boolean"
               },
               "englishOnly": {
                "description": "Nur für englische Aufnahmen im Einsatz. Zählt nicht zur Bewertung deutscher Gespräche.",
                "type": "boolean"
               },
               "historical": {
                "description": "Gilt nur für einen früheren Produktstand, der heutige Einsatz ist offen. Zählt nicht zur Kernverarbeitung.",
                "type": "boolean"
               },
               "reference": {
                "description": "Referenz des Modellabgleichs, auf die dieses Modell verweist.",
                "type": "string",
                "enum": [
                 "assemblyai",
                 "deepgram",
                 "elevenlabs",
                 "speechmatics",
                 "soniox",
                 "google-chirp",
                 "gemini-audio",
                 "azure-speech",
                 "whisper",
                 "openai-transcribe",
                 "parakeet",
                 "gpt",
                 "claude",
                 "gemini",
                 "llama",
                 "mistral",
                 "nemotron"
                ]
               },
               "tasks": {
                "description": "Das Modell ist laut Quelle nur bei diesen Aufgaben im Einsatz, etwa file-subtitles. Ohne Angabe gilt es für alle Aufgaben des Anbieters.",
                "minItems": 1,
                "type": "array",
                "items": {
                 "type": "string",
                 "enum": [
                  "clinical-notes",
                  "therapy-notes",
                  "nursing-notes",
                  "anamnesis-report",
                  "general-dictation",
                  "legal-dictation",
                  "voice-writing",
                  "file-subtitles",
                  "live-subtitles"
                 ]
                }
               },
               "sources": {
                "type": "array",
                "items": {
                 "type": "object",
                 "properties": {
                  "title": {
                   "type": "string",
                   "minLength": 3
                  },
                  "url": {
                   "type": "string",
                   "format": "uri"
                  },
                  "checked": {
                   "type": "string",
                   "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                  }
                 },
                 "required": [
                  "title",
                  "url"
                 ],
                 "additionalProperties": false
                }
               },
               "assessment": {
                "description": "Einordnung des Modells. Entfällt für die Stufe infrastructure.",
                "type": "object",
                "properties": {
                 "status": {
                  "type": "string",
                  "enum": [
                   "model",
                   "variant",
                   "base",
                   "estimated",
                   "family",
                   "vendor",
                   "inhouse",
                   "unknown"
                  ],
                  "description": "model: Referenzwert für genau dieses Modell. variant: Angepasstes Modell: Referenz des Basismodells. base: Referenz des Basismodells. estimated: Vermutetes Modell. family: Referenz der Modellfamilie. vendor: Nur der KI-Anbieter ist bekannt. inhouse: Eigenentwicklung ohne unabhängige Referenz. unknown: Keine Referenz verfügbar"
                 },
                 "statusLabel": {
                  "type": "string"
                 },
                 "rating": {
                  "type": "string",
                  "enum": [
                   "top",
                   "strong",
                   "standard",
                   "weak",
                   "none"
                  ],
                  "description": "top: Spitzenklasse. strong: Stark. standard: Solide. weak: Schwach. none: Ohne Referenz"
                 },
                 "ratingLabel": {
                  "type": "string"
                 },
                 "note": {
                  "type": "string"
                 },
                 "references": {
                  "type": "array",
                  "items": {
                   "type": "object",
                   "properties": {
                    "id": {
                     "type": "string"
                    },
                    "model": {
                     "type": "string"
                    },
                    "benchmark": {
                     "type": "string"
                    },
                    "value": {
                     "type": "number"
                    },
                    "unit": {
                     "type": "string"
                    },
                    "direction": {
                     "type": "string",
                     "enum": [
                      "lower",
                      "higher"
                     ],
                     "description": "lower: niedrigere Werte sind besser. higher: höhere Werte sind besser."
                    }
                   },
                   "required": [
                    "id",
                    "model",
                    "benchmark",
                    "value",
                    "unit",
                    "direction"
                   ],
                   "additionalProperties": false
                  },
                  "description": "Referenzwerte aus /daten/model-benchmarks.json."
                 },
                 "vendorClaims": {
                  "type": "array",
                  "items": {
                   "type": "object",
                   "properties": {
                    "provider": {
                     "type": "string"
                    },
                    "modelName": {
                     "type": "string"
                    },
                    "metric": {
                     "type": "string"
                    },
                    "value": {
                     "type": "number"
                    },
                    "unit": {
                     "type": "string"
                    },
                    "comparison": {
                     "type": [
                      "string",
                      "null"
                     ]
                    },
                    "published": {
                     "type": [
                      "string",
                      "null"
                     ]
                    },
                    "source": {
                     "type": "object",
                     "properties": {
                      "title": {
                       "type": "string"
                      },
                      "url": {
                       "type": "string",
                       "format": "uri"
                      }
                     },
                     "required": [
                      "title",
                      "url"
                     ],
                     "additionalProperties": false
                    },
                    "checked": {
                     "type": "string"
                    }
                   },
                   "required": [
                    "provider",
                    "modelName",
                    "metric",
                    "value",
                    "unit",
                    "source",
                    "checked"
                   ],
                   "additionalProperties": false
                  },
                  "description": "Herstellerangaben, nicht unabhängig geprüft."
                 },
                 "issue": {
                  "anyOf": [
                   {
                    "type": "object",
                    "properties": {
                     "text": {
                      "type": "string"
                     },
                     "basis": {
                      "type": "string",
                      "enum": [
                       "studies",
                       "editorial"
                      ],
                      "description": "studies: eigene Tests, zusätzlich in begutachteten Studien belegt. editorial: eigene Tests von ScribeIndex mit deutschen Aufnahmen."
                     },
                     "sources": {
                      "type": "array",
                      "items": {
                       "type": "object",
                       "properties": {
                        "label": {
                         "type": "string"
                        },
                        "title": {
                         "type": "string"
                        },
                        "url": {
                         "type": "string",
                         "format": "uri"
                        }
                       },
                       "required": [
                        "label",
                        "title",
                        "url"
                       ],
                       "additionalProperties": false
                      }
                     }
                    },
                    "required": [
                     "text",
                     "basis",
                     "sources"
                    ],
                    "additionalProperties": false
                   },
                   {
                    "type": "null"
                   }
                  ],
                  "description": "Abzug um eine Stufe mit Begründung und Grundlage. null ohne Abzug."
                 }
                },
                "required": [
                 "status",
                 "statusLabel",
                 "rating",
                 "ratingLabel",
                 "note",
                 "references",
                 "vendorClaims",
                 "issue"
                ],
                "additionalProperties": false
               }
              },
              "required": [
               "name",
               "vendor",
               "type",
               "evidence",
               "confidence",
               "rationale",
               "sources"
              ],
              "additionalProperties": false
             }
            }
           },
           "required": [
            "id",
            "approach",
            "unknown",
            "models"
           ],
           "additionalProperties": false
          }
         },
         "identification": {
          "type": "array",
          "items": {
           "type": "object",
           "properties": {
            "stage": {
             "type": "string",
             "enum": [
              "asr",
              "diarization",
              "generation",
              "assistant",
              "infrastructure"
             ],
             "description": "Verarbeitungsstufe: asr = Spracherkennung, diarization = Sprecherzuordnung, generation = Dokumenterstellung, assistant = Assistent und Zusatzfunktionen, infrastructure = Infrastruktur und Verarbeitungsort."
            },
            "testPeriod": {
             "type": "string",
             "description": "Quartal des Abgleichs."
            },
            "result": {
             "type": "string",
             "enum": [
              "identified",
              "candidates",
              "inconclusive"
             ],
             "description": "identified: Mindestens 60 % der Prüfeingaben entfallen auf eine Referenz. candidates: Die ähnlichste Referenz erreicht 40 bis unter 60 %. inconclusive: Keine Referenz erreicht 40 %."
            },
            "candidates": {
             "type": "array",
             "items": {
              "type": "object",
              "properties": {
               "reference": {
                "type": "string",
                "description": "Referenz-ID, „other“ für alle übrigen Referenzen."
               },
               "label": {
                "type": "string"
               },
               "share": {
                "type": "number"
               }
              },
              "required": [
               "reference",
               "label",
               "share"
              ],
              "additionalProperties": false
             }
            },
            "probes": {
             "type": "integer",
             "minimum": -9007199254740991,
             "maximum": 9007199254740991
            },
            "assigned": {
             "type": "boolean",
             "description": "Zuordnungsschwelle von 60 % erreicht. Sonst ist die ähnlichste Referenz nur ein Hinweis."
            },
            "fit": {
             "type": "string",
             "enum": [
              "documented",
              "estimated",
              "differs-documented",
              "differs-estimated",
              "unnamed",
              "own",
              "none"
             ],
             "description": "Verhältnis der führenden Referenz zu den Modelleinträgen. documented: passt zur Herstellerangabe oder zum technisch ermittelten Modell. estimated: passt zur Einschätzung. differs-documented: weicht von der Herstellerangabe oder vom technisch ermittelten Modell ab. differs-estimated: weicht von der Einschätzung ab. unnamed: Der Anbieter nennt kein vergleichbares Modell. own: Keine Referenz erreicht 40 %, für die Stufe sind nur Eigenentwicklungen bekannt. none: Keine Referenz erreicht 40 %."
            },
            "text": {
             "type": "string",
             "description": "Einordnung des Abgleichs in Worten."
            }
           },
           "required": [
            "stage",
            "testPeriod",
            "result",
            "candidates",
            "probes",
            "assigned",
            "fit",
            "text"
           ],
           "additionalProperties": false
          },
          "description": "Ergebnisse des eigenen Modellabgleichs je Verarbeitungsstufe."
         }
        },
        "required": [
         "checked",
         "summary",
         "stages",
         "identification"
        ],
        "additionalProperties": false
       },
       {
        "type": "null"
       }
      ]
     },
     "results": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "id": {
         "type": "string",
         "description": "Stabile Kennung aus Anbieter und Testreihe."
        },
        "provider": {
         "type": "string",
         "description": "Anbieterkennung, entspricht /anbieter/<provider>/."
        },
        "providerName": {
         "type": "string"
        },
        "test": {
         "type": "string",
         "description": "Testreihe: Kategorie oder Kategorie:<Aufgabe>."
        },
        "label": {
         "type": "string"
        },
        "category": {
         "type": "string",
         "enum": [
          "audio-transkription",
          "diktiersoftware",
          "medical-scribes",
          "medizinische-transkription",
          "meeting-scribes",
          "untertitel"
         ],
         "description": "Kategoriekennung: audio-transkription = Audiotranskription, diktiersoftware = Diktiersoftware, medical-scribes = Medical Scribes, medizinische-transkription = Medizinische Spracherkennung, meeting-scribes = Meeting-Scribes, untertitel = Untertitel."
        },
        "task": {
         "description": "Aufgabe innerhalb einer Kategorie mit Aufgaben, etwa clinical-notes. Fehlt bei Kategorien ohne Aufgaben.",
         "type": "string",
         "enum": [
          "clinical-notes",
          "therapy-notes",
          "nursing-notes",
          "anamnesis-report",
          "general-dictation",
          "legal-dictation",
          "voice-writing",
          "file-subtitles",
          "live-subtitles"
         ]
        },
        "url": {
         "type": "string",
         "format": "uri",
         "description": "Ergebnisabschnitt auf der Testseite des Anbieters."
        },
        "rankingUrl": {
         "type": "string",
         "format": "uri",
         "description": "Rangliste der Testreihe."
        },
        "testPeriod": {
         "type": "string",
         "description": "Testzeitraum als Quartal, etwa 2026-Q3, oder Quartalsspanne wie 2026-Q2/2026-Q3."
        },
        "protocol": {
         "type": "string"
        },
        "corpus": {
         "type": "string"
        },
        "scenarios": {
         "type": "integer",
         "exclusiveMinimum": 0,
         "maximum": 9007199254740991
        },
        "runs": {
         "type": "integer",
         "exclusiveMinimum": 0,
         "maximum": 9007199254740991
        },
        "completed": {
         "type": "integer",
         "exclusiveMinimum": 0,
         "maximum": 9007199254740991
        },
        "total": {
         "type": "integer",
         "exclusiveMinimum": 0,
         "maximum": 9007199254740991
        },
        "completionRatePercent": {
         "type": [
          "number",
          "null"
         ]
        },
        "evaluation": {
         "type": "object",
         "properties": {
          "output": {
           "type": "string",
           "enum": [
            "verbatim-transcript",
            "edited-transcript",
            "clinical-note",
            "therapy-note",
            "nursing-note",
            "anamnesis-report",
            "meeting-summary",
            "written-document",
            "subtitles",
            "live-subtitles"
           ],
           "description": "Bewertete Ausgabe: verbatim-transcript = wortnahes Transkript, edited-transcript = bearbeitetes Transkript, clinical-note = klinisches Dokument, therapy-note = Sitzungsdokumentation, nursing-note = Eintrag der Pflegedokumentation, anamnesis-report = Anamnesebericht, meeting-summary = Meeting-Notizen, written-document = ausgearbeiteter Text, subtitles = Untertiteldatei, live-subtitles = Live-Untertitel."
          },
          "semanticRubric": {
           "anyOf": [
            {
             "type": "string",
             "minLength": 5
            },
            {
             "type": "null"
            }
           ]
          },
          "wordErrorRate": {
           "type": "object",
           "properties": {
            "applicability": {
             "type": "string",
             "enum": [
              "word-aligned",
              "diagnostic",
              "not-applicable"
             ],
             "description": "word-aligned: wortnahe Ausgabe, die WER ist zwischen Diensten vergleichbar. diagnostic: sprachlich überarbeitete Ausgabe, die WER zeigt nur die Abweichung vom Wortlaut und geht nicht in Score und Rangliste ein. not-applicable: Die Hauptausgabe ist ein Dokument, für sie wird keine WER berechnet. Liefert der Dienst zusätzlich ein Transkript, steht dessen WER unter additionalMetrics."
            },
            "basis": {
             "type": "string",
             "enum": [
              "delivered-output",
              "unavailable"
             ],
             "description": "delivered-output: Die WER beruht auf der tatsächlich gelieferten Ausgabe. unavailable: keine Wortzähler für die Hauptausgabe, weil dort keine WER anwendbar ist."
            },
            "explanation": {
             "type": "string",
             "minLength": 20
            }
           },
           "required": [
            "applicability",
            "basis",
            "explanation"
           ],
           "additionalProperties": false
          },
          "speakerLabels": {
           "description": "false: Die Ausgabe enthält keine Sprecherkennungen. Für die DER gilt sie als Ausgabe mit einem einzigen Sprecher, die DER ist dann der Anteil der Sprechzeit aller Personen außer der am längsten sprechenden, dazu verpasste und fälschlich erkannte Sprache. Fehlt das Feld, enthält die Ausgabe Sprecherkennungen oder die Testreihe bewertet keine Sprecher.",
           "type": "boolean",
           "const": false
          }
         },
         "required": [
          "output",
          "semanticRubric",
          "wordErrorRate"
         ],
         "additionalProperties": false
        },
        "score": {
         "anyOf": [
          {
           "type": "object",
           "properties": {
            "version": {
             "type": "string",
             "description": "Version des Bewertungsmodells, nach dem der ScribeIndex-Score berechnet wurde."
            },
            "value": {
             "type": "number",
             "description": "ScribeIndex-Score 0 bis 100 aus den ungerundeten Teilwerten, auf vier Nachkommastellen gerundet. Website und Platz (rank) runden den genauen Wert auf eine Nachkommastelle."
            },
            "ci95": {
             "anyOf": [
              {
               "type": "array",
               "prefixItems": [
                {
                 "type": "number"
                },
                {
                 "type": "number"
                }
               ],
               "items": false,
               "minItems": 2,
               "maxItems": 2
              },
              {
               "type": "null"
              }
             ],
             "description": "95-%-Intervall des ScribeIndex-Scores. In jeder Bootstrap-Stichprobe über Szenarien wird der vollständige Score neu berechnet. Verfahren siehe ci95Method."
            },
            "ci95Method": {
             "anyOf": [
              {
               "type": "string",
               "enum": [
                "paired-cluster-bootstrap",
                "paired-cluster-bootstrap-beta-critical"
               ]
              },
              {
               "type": "null"
              }
             ],
             "description": "paired-cluster-bootstrap: Alle Teilwerte stammen aus denselben gepaarten Bootstrap-Stichproben über Szenarien. paired-cluster-bootstrap-beta-critical: Inhaltsqualität, Korrekturaufwand und Abschlussquote stammen aus denselben gepaarten Bootstrap-Stichproben. Der Anteil schwerwiegender Fehler wird je Stichprobe und Dienst unabhängig aus einer Beta-Verteilung (Jeffreys) mit effektivem Stichprobenumfang n / Designeffekt gezogen, weil der Bootstrap bei null oder wenigen Ereignissen keine oder kaum Streuung liefert."
            },
            "pairedDifferences": {
             "type": "array",
             "items": {
              "type": "object",
              "properties": {
               "provider": {
                "type": "string"
               },
               "ci95": {
                "type": "array",
                "prefixItems": [
                 {
                  "type": "number"
                 },
                 {
                  "type": "number"
                 }
                ],
                "items": false,
                "minItems": 2,
                "maxItems": 2
               }
              },
              "required": [
               "provider",
               "ci95"
              ],
              "additionalProperties": false
             },
             "description": "95-%-Intervall der Scoredifferenz (dieser Dienst minus Vergleichsdienst) je Bootstrap-Stichprobe. Bei ci95Method paired-cluster-bootstrap-beta-critical ist der Teilwert schwerwiegende Fehler nicht gepaart. Der gemeinsame Einfluss schwieriger Aufnahmen hebt sich in der Differenz dieses Teilwerts nicht auf, das Intervall wird dadurch breiter."
            },
            "rank": {
             "anyOf": [
              {
               "type": "integer",
               "minimum": -9007199254740991,
               "maximum": 9007199254740991
              },
              {
               "type": "null"
              }
             ],
             "description": "Platz nach dem auf eine Nachkommastelle gerundeten ScribeIndex-Score. Gleiche gerundete Werte teilen sich den Platz. null: einzige Messung der Testreihe, ohne Platzierung."
            },
            "cohortSize": {
             "type": "integer",
             "minimum": -9007199254740991,
             "maximum": 9007199254740991,
             "description": "Zahl der Dienste mit Score in dieser Testreihe."
            },
            "criticalRatePercent": {
             "description": "Anteil der Ausgaben mit mindestens einem schwerwiegenden Fehler.",
             "type": [
              "number",
              "null"
             ]
            },
            "contentQuality": {
             "type": "number",
             "description": "q, Ergebnis der Qualitätsformel der Aufgabe in Punkten von 0 bis 100, vor dem Nullpunkt des Teilwerts Inhaltsqualität."
            },
            "references": {
             "type": "object",
             "properties": {
              "key": {
               "type": "string"
              },
              "qualityErrorPoints": {
               "type": "number"
              },
              "correctionMinutes": {
               "type": "number"
              },
              "criticalPercent": {
               "type": [
                "number",
                "null"
               ]
              }
             },
             "required": [
              "key",
              "qualityErrorPoints",
              "correctionMinutes",
              "criticalPercent"
             ],
             "additionalProperties": false,
             "description": "Bezugsgrößen der Teilwerte. qualityErrorPoints: fehlende Punkte zum fehlerfreien Ergebnis (100 − q), bei denen der Teilwert Inhaltsqualität 0 erreicht, Teilwert = 100 · max(0, 1 − (100 − q) / qualityErrorPoints), für alle Aufgaben gleich. correctionMinutes: Nacharbeit in Minuten je Audiostunde, bei der der Teilwert Korrekturaufwand 0 erreicht, Teilwert = 100 · max(0, 1 − Nacharbeit / correctionMinutes). criticalPercent: Anteil der Ausgaben mit schwerwiegendem Fehler, bei dem der Teilwert schwerwiegende Fehler 0 erreicht, nur bei medizinischen und juristischen Aufgaben, sonst null. Alle drei sind Bezugsgrößen des Scores, keine fachlichen Grenzwerte."
            },
            "components": {
             "type": "array",
             "items": {
              "type": "object",
              "properties": {
               "key": {
                "type": "string",
                "enum": [
                 "quality",
                 "critical",
                 "effort",
                 "reliability"
                ],
                "description": "quality: Inhaltsqualität, critical: Schwerwiegende Fehler, effort: Korrekturaufwand, reliability: Abschlussquote"
               },
               "label": {
                "type": "string"
               },
               "value": {
                "type": "number"
               },
               "weight": {
                "type": "number"
               },
               "contribution": {
                "type": "number"
               }
              },
              "required": [
               "key",
               "label",
               "value",
               "weight",
               "contribution"
              ],
              "additionalProperties": false
             },
             "description": "Teilwerte des Scores. value: Teilwert 0 bis 100, weight: Gewicht, contribution: value · weight. Die Beiträge ergeben zusammen den Score. quality ist 100 · max(0, 1 − (100 − q) / 30) mit q gleich Fakten-F1 bei medizinischen Aufgaben, sonst allgemeine Diktate 0,8 × (100 − WER) + 0,1 × name-accuracy + 0,1 × number-accuracy, juristische Diktate 0,8 × (100 − WER) + 0,1 × (100 − party-errors) + 0,1 × (100 − gemeinsame Quote aus amount-errors und deadline-errors), Audiotranskription 0,7 × (100 − WER) + 0,3 × (100 − der), Meetingnotizen 0,7 × Fakten-F1 + 0,3 × (100 − der), Textausarbeitung 0,8 × Fakten-F1 + 0,2 × instruction-compliance, Untertitel für Videodateien 0,5 × (100 − WER) + 0,3 × subtitle-timing-accuracy + 0,2 × subtitle-layout-accuracy, Live-Untertitel 0,5 × (100 − WER) + 0,3 × live-caption-timeliness + 0,2 × live-caption-stability. Jeder Teil ist auf 0 bis 100 begrenzt, die Kennzahlen stehen in additionalMetrics. Liefert ein Dienst Sprecherkennungen ohne eigene Zeitmarken, bestimmt ScribeIndex die Zeitmarken durch erzwungene Ausrichtung (Forced Alignment) seines eigenen Texts an der Aufnahme und berechnet die Kennzahl „der“ (DER) daraus wie bei allen anderen Diensten, mit verpasster und fälschlich erkannter Sprache und Fehlern an Segmentgrenzen. Enthält die Ausgabe gar keine Sprecherkennungen (evaluation.speakerLabels false), gilt sie für die DER als Ausgabe mit einem einzigen Sprecher. Die DER ist dann der Anteil der Sprechzeit aller Personen außer der am längsten sprechenden, dazu verpasste und fälschlich erkannte Sprache."
            }
           },
           "required": [
            "version",
            "value",
            "ci95",
            "ci95Method",
            "pairedDifferences",
            "rank",
            "cohortSize",
            "criticalRatePercent",
            "contentQuality",
            "references",
            "components"
           ],
           "additionalProperties": false
          },
          {
           "type": "null"
          }
         ],
         "description": "null: mindestens ein Teilwert fehlt, daher kein Score."
        },
        "mainMetric": {
         "type": "object",
         "properties": {
          "label": {
           "type": "string"
          },
          "abbreviation": {
           "type": "string"
          },
          "value": {
           "type": [
            "number",
            "null"
           ]
          },
          "direction": {
           "type": "string",
           "enum": [
            "lower",
            "higher"
           ],
           "description": "lower: niedrigere Werte sind besser. higher: höhere Werte sind besser."
          },
          "ci95": {
           "anyOf": [
            {
             "type": "array",
             "prefixItems": [
              {
               "type": "number"
              },
              {
               "type": "number"
              }
             ],
             "items": false,
             "minItems": 2,
             "maxItems": 2
            },
            {
             "type": "null"
            }
           ],
           "description": "95-%-Konfidenzintervall [untere Grenze, obere Grenze] in der Einheit der Kennzahl. null: kein Intervall berechnet."
          }
         },
         "required": [
          "label",
          "abbreviation",
          "value",
          "direction",
          "ci95"
         ],
         "additionalProperties": false
        },
        "transcription": {
         "anyOf": [
          {
           "type": "object",
           "properties": {
            "referenceWords": {
             "type": "integer",
             "minimum": -9007199254740991,
             "maximum": 9007199254740991
            },
            "substitutions": {
             "type": "integer",
             "minimum": -9007199254740991,
             "maximum": 9007199254740991
            },
            "deletions": {
             "type": "integer",
             "minimum": -9007199254740991,
             "maximum": 9007199254740991
            },
            "insertions": {
             "type": "integer",
             "minimum": -9007199254740991,
             "maximum": 9007199254740991
            },
            "errors": {
             "type": "integer",
             "minimum": -9007199254740991,
             "maximum": 9007199254740991
            },
            "werPercent": {
             "type": [
              "number",
              "null"
             ]
            },
            "ci95": {
             "anyOf": [
              {
               "type": "array",
               "prefixItems": [
                {
                 "type": "number"
                },
                {
                 "type": "number"
                }
               ],
               "items": false,
               "minItems": 2,
               "maxItems": 2
              },
              {
               "type": "null"
              }
             ],
             "description": "95-%-Konfidenzintervall [untere Grenze, obere Grenze] in der Einheit der Kennzahl. null: kein Intervall berechnet."
            },
            "comparable": {
             "type": "boolean",
             "description": "true: wortnahe Ausgabe, WER ist zwischen Anbietern vergleichbar. false: Die Ausgabe ist KI-überarbeitet, die WER zeigt nur die Abweichung vom Wortlaut."
            }
           },
           "required": [
            "referenceWords",
            "substitutions",
            "deletions",
            "insertions",
            "errors",
            "werPercent",
            "ci95",
            "comparable"
           ],
           "additionalProperties": false
          },
          {
           "type": "null"
          }
         ]
        },
        "facts": {
         "anyOf": [
          {
           "type": "object",
           "properties": {
            "truePositive": {
             "type": "integer",
             "minimum": -9007199254740991,
             "maximum": 9007199254740991
            },
            "falsePositive": {
             "type": "integer",
             "minimum": -9007199254740991,
             "maximum": 9007199254740991
            },
            "falseNegative": {
             "type": "integer",
             "minimum": -9007199254740991,
             "maximum": 9007199254740991
            },
            "referenceFacts": {
             "type": "integer",
             "minimum": -9007199254740991,
             "maximum": 9007199254740991,
             "description": "TP + FN"
            },
            "outputFacts": {
             "type": "integer",
             "minimum": -9007199254740991,
             "maximum": 9007199254740991,
             "description": "TP + FP"
            },
            "precisionPercent": {
             "type": [
              "number",
              "null"
             ]
            },
            "precisionCi95": {
             "anyOf": [
              {
               "type": "array",
               "prefixItems": [
                {
                 "type": "number"
                },
                {
                 "type": "number"
                }
               ],
               "items": false,
               "minItems": 2,
               "maxItems": 2
              },
              {
               "type": "null"
              }
             ],
             "description": "95-%-Konfidenzintervall [untere Grenze, obere Grenze] in der Einheit der Kennzahl. null: kein Intervall berechnet."
            },
            "recallPercent": {
             "type": [
              "number",
              "null"
             ]
            },
            "recallCi95": {
             "anyOf": [
              {
               "type": "array",
               "prefixItems": [
                {
                 "type": "number"
                },
                {
                 "type": "number"
                }
               ],
               "items": false,
               "minItems": 2,
               "maxItems": 2
              },
              {
               "type": "null"
              }
             ],
             "description": "95-%-Konfidenzintervall [untere Grenze, obere Grenze] in der Einheit der Kennzahl. null: kein Intervall berechnet."
            },
            "f1Percent": {
             "type": [
              "number",
              "null"
             ]
            },
            "f1Ci95": {
             "anyOf": [
              {
               "type": "array",
               "prefixItems": [
                {
                 "type": "number"
                },
                {
                 "type": "number"
                }
               ],
               "items": false,
               "minItems": 2,
               "maxItems": 2
              },
              {
               "type": "null"
              }
             ],
             "description": "95-%-Konfidenzintervall [untere Grenze, obere Grenze] in der Einheit der Kennzahl. null: kein Intervall berechnet."
            }
           },
           "required": [
            "truePositive",
            "falsePositive",
            "falseNegative",
            "referenceFacts",
            "outputFacts",
            "precisionPercent",
            "precisionCi95",
            "recallPercent",
            "recallCi95",
            "f1Percent",
            "f1Ci95"
           ],
           "additionalProperties": false
          },
          {
           "type": "null"
          }
         ]
        },
        "latency": {
         "type": "object",
         "properties": {
          "p50Seconds": {
           "type": "number",
           "minimum": 0
          },
          "p95Seconds": {
           "type": "number",
           "minimum": 0
          },
          "mode": {
           "type": "string",
           "enum": [
            "live-dictation",
            "live-conversation",
            "live-stream",
            "file-upload",
            "local-file"
           ],
           "description": "Messstrecke: live-dictation = Live-Diktat, live-conversation = Live-Gespräch, live-stream = Live-Übertragung (Zeitversatz statt Verarbeitungszeit), file-upload = hochgeladene Datei, local-file = lokal verarbeitete Datei. start und end nennen Beginn und Ende der Messung. Vergleichbar sind nur Werte derselben Messstrecke."
          },
          "start": {
           "type": "string",
           "minLength": 5
          },
          "end": {
           "type": "string",
           "minLength": 5
          }
         },
         "required": [
          "p50Seconds",
          "p95Seconds",
          "mode",
          "start",
          "end"
         ],
         "additionalProperties": false
        },
        "correction": {
         "type": "object",
         "properties": {
          "minutesPerAudioHour": {
           "type": "number",
           "description": "Geschätzte Nacharbeit bis zur Zielfassung je Audiostunde, aus den gezählten Fehlern aller abgeschlossenen Ausgaben mit festen Zeiten je Korrekturschritt, die für alle Dienste gleich sind, genau estimate.minutes ÷ estimate.audioHours, auf vier Nachkommastellen gerundet. Nicht enthalten ist die einmalige Durchsicht, die jedes Ergebnis auch ohne KI braucht, also das einmalige Durchlesen eines Dokuments oder Diktats, das einmalige Abhören eines Transkripts und das einmalige Abspielen eines Videos mit seinen Untertiteln."
          },
          "ci95": {
           "anyOf": [
            {
             "type": "array",
             "prefixItems": [
              {
               "type": "number"
              },
              {
               "type": "number"
              }
             ],
             "items": false,
             "minItems": 2,
             "maxItems": 2
            },
            {
             "type": "null"
            }
           ],
           "description": "95-%-Konfidenzintervall [untere Grenze, obere Grenze] in der Einheit der Kennzahl. null: kein Intervall berechnet."
          },
          "estimate": {
           "type": "object",
           "properties": {
            "outputs": {
             "type": "integer",
             "exclusiveMinimum": 0,
             "maximum": 9007199254740991,
             "description": "Abgeschlossene Ausgaben, für die die Nacharbeit geschätzt wurde."
            },
            "audioSeconds": {
             "type": "number",
             "exclusiveMinimum": 0,
             "description": "Ausgewertete Audiodauer in Sekunden, auf volle Minuten gerundet. Geteilt durch 3600 ergibt sie deshalb nicht genau audioHours."
            },
            "minutes": {
             "type": "number",
             "minimum": 0,
             "description": "Geschätzte Nacharbeit aller Ausgaben zusammen, auf 0,01 min gerundet."
            },
            "ci": {
             "type": "array",
             "prefixItems": [
              {
               "type": "number",
               "minimum": 0
              },
              {
               "type": "number",
               "minimum": 0
              }
             ],
             "items": false,
             "minItems": 2,
             "maxItems": 2
            },
            "audioHours": {
             "type": "number",
             "exclusiveMinimum": 0,
             "description": "Ausgewertete Audiodauer in Stunden, aus der genauen Audiodauer auf drei Nachkommastellen gerundet wie auf der Testseite, nicht aus dem gerundeten audioSeconds. Nenner von minutesPerAudioHour."
            }
           },
           "required": [
            "outputs",
            "audioSeconds",
            "minutes",
            "ci",
            "audioHours"
           ],
           "additionalProperties": false
          }
         },
         "required": [
          "minutesPerAudioHour",
          "ci95",
          "estimate"
         ],
         "additionalProperties": false
        },
        "additionalMetrics": {
         "type": "array",
         "items": {
          "type": "object",
          "properties": {
           "key": {
            "type": "string"
           },
           "label": {
            "type": "string"
           },
           "numerator": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
           },
           "denominator": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
           },
           "valuePercent": {
            "description": "numerator ÷ denominator in Prozent. null: Funktion im getesteten Aufbau nicht unterstützt (configuration.settings), Zähler und Nenner nennen dann die gesprochenen Referenzeinheiten ohne einen Treffer.",
            "type": [
             "number",
             "null"
            ]
           },
           "direction": {
            "type": "string",
            "enum": [
             "lower",
             "higher"
            ],
            "description": "lower: niedrigere Werte sind besser. higher: höhere Werte sind besser."
           },
           "definition": {
            "type": "string"
           },
           "ci95": {
            "anyOf": [
             {
              "type": "array",
              "prefixItems": [
               {
                "type": "number"
               },
               {
                "type": "number"
               }
              ],
              "items": false,
              "minItems": 2,
              "maxItems": 2
             },
             {
              "type": "null"
             }
            ],
            "description": "95-%-Konfidenzintervall [untere Grenze, obere Grenze] in der Einheit der Kennzahl. null: kein Intervall berechnet."
           },
           "ci95Method": {
            "anyOf": [
             {
              "type": "string",
              "enum": [
               "cluster-bootstrap-percentile",
               "wilson-design-effect"
              ]
             },
             {
              "type": "null"
             }
            ],
            "description": "cluster-bootstrap-percentile: Perzentilintervall aus dem gepaarten Cluster-Bootstrap über Szenarien. wilson-design-effect: Wilson-Intervall mit effektivem Stichprobenumfang n / designEffect, für alle Anteile binärer Einheiten aller Dienste, je Kennzahl und Testreihe ein Verfahren. Fehlerraten je Einheit (recognition-errors, cer, transcript-wer, der, der-strict) nutzen wie die WER den Cluster-Bootstrap."
           },
           "designEffect": {
            "description": "Designeffekt 1 + (m − 1) · ICC. m ist denominator ÷ Zahl der Aufnahmen des Dienstes mit Einheiten der Kennzahl. Die ICC gilt gemeinsam für alle Dienste der Testreihe und kommt aus dem ANOVA-Schätzer über die Zähler je Aufnahme, gepoolt innerhalb der Dienste (Dienst als fester Effekt), begrenzt auf 0 bis 1. Bei schwerwiegenden Fehlern ist die Einheit das Dokument je Lauf, und die ICC gilt gemeinsam für alle Testreihen derselben Schweregrad-Rubrik (alle medizinischen Testreihen zusammen, das juristische Diktat allein, Dienst und Testreihe als fester Effekt). Gibt es über alle Dienste der Testreihe weniger als fünf Paare aus Dienst und Aufnahme mit Ereignissen oder mit Nicht-Ereignissen, bei schwerwiegenden Fehlern über alle Testreihen der Rubrik weniger als zehn, gilt ICC = 1, jede Aufnahme zählt dann einmal. null: nicht unterstützte Funktion.",
            "type": [
             "number",
             "null"
            ]
           }
          },
          "required": [
           "key",
           "label",
           "numerator",
           "denominator",
           "valuePercent",
           "direction",
           "definition",
           "ci95",
           "ci95Method",
           "designEffect"
          ],
          "additionalProperties": false
         }
        },
        "scalarMetrics": {
         "type": "array",
         "items": {
          "type": "object",
          "properties": {
           "key": {
            "type": "string",
            "minLength": 1
           },
           "label": {
            "type": "string",
            "minLength": 1
           },
           "value": {
            "type": "number"
           },
           "unit": {
            "type": "string",
            "minLength": 1
           },
           "direction": {
            "type": "string",
            "enum": [
             "lower",
             "higher",
             "none"
            ],
            "description": "none: beschreibender Wert ohne bessere Richtung, etwa die mittlere Zeilenlänge."
           },
           "definition": {
            "type": "string",
            "minLength": 20
           },
           "statistic": {
            "type": "string",
            "enum": [
             "mean",
             "median",
             "p95"
            ]
           },
           "sampleSize": {
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991
           },
           "ci": {
            "type": "array",
            "prefixItems": [
             {
              "type": "number"
             },
             {
              "type": "number"
             }
            ],
            "items": false,
            "minItems": 2,
            "maxItems": 2
           }
          },
          "required": [
           "key",
           "label",
           "value",
           "unit",
           "direction",
           "definition",
           "statistic",
           "sampleSize"
          ],
          "additionalProperties": false
         }
        },
        "errorTypes": {
         "type": "array",
         "items": {
          "type": "object",
          "properties": {
           "label": {
            "type": "string"
           },
           "count": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
           }
          },
          "required": [
           "label",
           "count"
          ],
          "additionalProperties": false
         }
        },
        "failedRuns": {
         "type": "array",
         "items": {
          "type": "object",
          "properties": {
           "scenarioId": {
            "type": "string"
           },
           "run": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
           },
           "reason": {
            "type": "string"
           }
          },
          "required": [
           "scenarioId",
           "run",
           "reason"
          ],
          "additionalProperties": false
         },
         "description": "Abgebrochene Läufe mit Szenario und Grund."
        },
        "configuration": {
         "type": "object",
         "properties": {
          "locale": {
           "type": "string",
           "pattern": "^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
          },
          "automaticLanguageDetection": {
           "type": "boolean"
          },
          "productVersion": {
           "anyOf": [
            {
             "type": "string",
             "minLength": 1
            },
            {
             "type": "null"
            }
           ]
          },
          "modelVersions": {
           "anyOf": [
            {
             "minItems": 1,
             "type": "array",
             "items": {
              "type": "object",
              "properties": {
               "name": {
                "type": "string",
                "minLength": 1
               },
               "version": {
                "anyOf": [
                 {
                  "type": "string",
                  "minLength": 1
                 },
                 {
                  "type": "null"
                 }
                ]
               }
              },
              "required": [
               "name",
               "version"
              ],
              "additionalProperties": false
             }
            },
            {
             "type": "null"
            }
           ]
          },
          "template": {
           "anyOf": [
            {
             "type": "object",
             "properties": {
              "id": {
               "type": "string",
               "minLength": 1
              },
              "version": {
               "anyOf": [
                {
                 "type": "string",
                 "minLength": 1
                },
                {
                 "type": "null"
                }
               ]
              }
             },
             "required": [
              "id",
              "version"
             ],
             "additionalProperties": false
            },
            {
             "type": "null"
            }
           ]
          },
          "instruction": {
           "type": "object",
           "properties": {
            "id": {
             "type": "string",
             "minLength": 1
            },
            "version": {
             "type": "string",
             "minLength": 1
            }
           },
           "required": [
            "id",
            "version"
           ],
           "additionalProperties": false
          },
          "customVocabulary": {
           "anyOf": [
            {
             "type": "object",
             "properties": {
              "id": {
               "type": "string",
               "minLength": 1
              },
              "version": {
               "type": "string",
               "minLength": 1
              }
             },
             "required": [
              "id",
              "version"
             ],
             "additionalProperties": false
            },
            {
             "type": "null"
            }
           ]
          },
          "settings": {
           "type": "object",
           "propertyNames": {
            "type": "string"
           },
           "additionalProperties": {
            "type": [
             "string",
             "number",
             "boolean",
             "null"
            ]
           }
          },
          "scorer": {
           "type": "object",
           "properties": {
            "name": {
             "type": "string",
             "minLength": 1
            },
            "version": {
             "type": "string",
             "minLength": 1
            }
           },
           "required": [
            "name",
            "version"
           ],
           "additionalProperties": false
          },
          "normalization": {
           "anyOf": [
            {
             "type": "object",
             "properties": {
              "id": {
               "type": "string",
               "minLength": 1
              },
              "version": {
               "type": "string",
               "minLength": 1
              }
             },
             "required": [
              "id",
              "version"
             ],
             "additionalProperties": false
            },
            {
             "type": "null"
            }
           ]
          }
         },
         "required": [
          "locale",
          "automaticLanguageDetection",
          "productVersion",
          "modelVersions",
          "template",
          "instruction",
          "customVocabulary",
          "settings",
          "scorer",
          "normalization"
         ],
         "additionalProperties": false
        },
        "corpusMetadata": {
         "type": "object",
         "properties": {
          "version": {
           "type": "string",
           "minLength": 1
          },
          "manifestSha256": {
           "type": "string",
           "pattern": "^[a-f0-9]{64}$"
          },
          "referenceVersion": {
           "type": "string",
           "minLength": 1
          },
          "referenceSha256": {
           "type": "string",
           "pattern": "^[a-f0-9]{64}$"
          },
          "sourceScenarioCount": {
           "type": "integer",
           "exclusiveMinimum": 0,
           "maximum": 9007199254740991
          },
          "evaluatedScenarioCount": {
           "type": "integer",
           "exclusiveMinimum": 0,
           "maximum": 9007199254740991
          },
          "totalAudioSeconds": {
           "type": "number",
           "exclusiveMinimum": 0
          },
          "durationSeconds": {
           "type": "object",
           "properties": {
            "minimum": {
             "type": "number",
             "exclusiveMinimum": 0
            },
            "maximum": {
             "type": "number",
             "exclusiveMinimum": 0
            }
           },
           "required": [
            "minimum",
            "maximum"
           ],
           "additionalProperties": false
          },
          "audioFormats": {
           "minItems": 1,
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "codec": {
              "type": "string",
              "minLength": 1
             },
             "sampleRateHertz": {
              "type": "integer",
              "exclusiveMinimum": 0,
              "maximum": 9007199254740991
             },
             "channels": {
              "type": "integer",
              "exclusiveMinimum": 0,
              "maximum": 9007199254740991
             }
            },
            "required": [
             "codec",
             "sampleRateHertz",
             "channels"
            ],
            "additionalProperties": false
           }
          },
          "conversions": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "description": {
              "type": "string",
              "minLength": 1
             },
             "tool": {
              "type": "string",
              "minLength": 1
             },
             "version": {
              "type": "string",
              "minLength": 1
             }
            },
            "required": [
             "description",
             "tool",
             "version"
            ],
            "additionalProperties": false
           }
          },
          "exclusions": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "scenarioId": {
              "type": "string",
              "minLength": 1
             },
             "reason": {
              "type": "string",
              "minLength": 1
             }
            },
            "required": [
             "scenarioId",
             "reason"
            ],
            "additionalProperties": false
           }
          }
         },
         "required": [
          "version",
          "manifestSha256",
          "referenceVersion",
          "referenceSha256",
          "sourceScenarioCount",
          "evaluatedScenarioCount",
          "totalAudioSeconds",
          "durationSeconds",
          "audioFormats",
          "conversions",
          "exclusions"
         ],
         "additionalProperties": false,
         "description": "Korpusmetadaten. totalAudioSeconds und durationSeconds sind auf volle Minuten gerundet."
        },
        "uncertainty": {
         "type": "object",
         "properties": {
          "confidenceLevel": {
           "type": "number",
           "const": 0.95
          },
          "method": {
           "type": "string",
           "const": "paired-cluster-bootstrap"
          },
          "clusterUnit": {
           "type": "string",
           "enum": [
            "session",
            "scenario"
           ]
          },
          "clusterCount": {
           "type": "integer",
           "minimum": 2,
           "maximum": 9007199254740991
          },
          "resamples": {
           "type": "integer",
           "exclusiveMinimum": 0,
           "maximum": 9007199254740991
          },
          "seed": {
           "type": "integer",
           "minimum": 0,
           "maximum": 4294967295
          },
          "intervalMethod": {
           "type": "string",
           "enum": [
            "percentile",
            "bca",
            "basic"
           ]
          },
          "aggregation": {
           "type": "string",
           "const": "pooled-counts"
          },
          "pairedSampleManifestSha256": {
           "type": "string",
           "pattern": "^[a-f0-9]{64}$"
          }
         },
         "required": [
          "confidenceLevel",
          "method",
          "clusterUnit",
          "clusterCount",
          "resamples",
          "seed",
          "intervalMethod",
          "aggregation",
          "pairedSampleManifestSha256"
         ],
         "additionalProperties": false
        }
       },
       "required": [
        "id",
        "provider",
        "providerName",
        "test",
        "label",
        "category",
        "url",
        "rankingUrl",
        "testPeriod",
        "protocol",
        "corpus",
        "scenarios",
        "runs",
        "completed",
        "total",
        "completionRatePercent",
        "evaluation",
        "score",
        "mainMetric",
        "transcription",
        "facts",
        "latency",
        "correction",
        "additionalMetrics",
        "errorTypes",
        "failedRuns",
        "configuration",
        "corpusMetadata",
        "uncertainty"
       ],
       "additionalProperties": false
      }
     }
    },
    "required": [
     "slug",
     "tagline",
     "description",
     "summary",
     "website",
     "categories",
     "bestFor",
     "input",
     "output",
     "languages",
     "deployment",
     "highlights",
     "considerations",
     "facts",
     "sources",
     "name",
     "shortName",
     "url",
     "dataUrl",
     "checked",
     "pricing",
     "capabilities",
     "workflow",
     "classification",
     "tasks",
     "privacy",
     "technology",
     "results"
    ],
    "additionalProperties": false
   }
  }
 },
 "required": [
  "schemaVersion",
  "name",
  "language",
  "license",
  "citation",
  "definitions",
  "providers"
 ],
 "additionalProperties": false,
 "title": "ScribeIndex Anbieterdaten",
 "description": "Aufbau von /daten/anbieter.json. Einzeldateien /daten/<anbieter>.json enthalten dieselben Felder unter provider."
}