{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/annsa-ai/json-schema/annsa-ai-transcript-upload-schema.json",
  "title": "TranscriptUpload",
  "x-generated": "2026-11-01",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/annsa-ai-openapi.json#/components/schemas/TranscriptUpload",
  "type": "object",
  "required": [
    "title",
    "text"
  ],
  "properties": {
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    },
    "text": {
      "type": "string",
      "minLength": 50,
      "maxLength": 500000,
      "description": "The transcript body. Speaker labels are preserved if present."
    },
    "transcript_type": {
      "type": "string",
      "default": "discovery",
      "description": "What kind of conversation this was."
    },
    "transcript_date": {
      "type": "string",
      "description": "When the conversation happened. Preserved on export."
    },
    "company_name": {
      "type": "string"
    },
    "customer_name": {
      "type": "string"
    },
    "customer_email": {
      "type": "string",
      "format": "email"
    },
    "revenue_band": {
      "type": "string"
    },
    "sku": {
      "type": "string"
    },
    "project_id": {
      "type": "string"
    },
    "customer_speaker": {
      "type": "string",
      "maxLength": 64,
      "description": "The customer's speaker label. Supply it and only their words become signals, so the interviewer's questions never reach the roadmap. Omit it and segmentation treats the whole transcript as one voice."
    }
  }
}