{
  "openapi": "3.0.0",
  "paths": {
    "/v1/media/input": {
      "post": {
        "description": "To use the provided temporary storage is a two step process.\n    You start by declaring a media:// url that you can reference in any other API calls. The response will provide a url where you can put your media. This allows you to use the media:// url as a short-cut for a temporary storage location.\n    You'll be returned a pre-signed url you can use to PUT and upload your media file. The temporary storage should allow you to read and write to the media:// locations for a period of at least 24 hours before it is removed.",
        "operationId": "getMediaUploadURL",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GetMediaUploadUrl" } } }
        },
        "responses": {
          "201": {
            "description": "",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MediaResponse" } } }
          },
          "400": {
            "description": "Invalid request",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } } }
          },
          "402": {
            "description": "Subscription is required",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          },
          "429": {
            "description": "Too many requests",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          }
        },
        "security": [{ "api-key": [] }],
        "summary": "Get upload URL",
        "tags": ["Media"],
        "x-api-key-permissions": ["media:write"]
      }
    },
    "/v1/media/output": {
      "post": {
        "description": "You can download media you previously uploaded with /media/input or media that was generated through another API call.\nThe temporary storage should allow you to read and write to the media:// locations for a period of at least 24 hours before it is removed.",
        "operationId": "getMediaDownloadURL",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GetMediaUploadUrl" } } }
        },
        "responses": {
          "201": {
            "description": "",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MediaResponse" } } }
          },
          "400": {
            "description": "Invalid request",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } } }
          },
          "402": {
            "description": "Subscription is required",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          },
          "429": {
            "description": "Too many requests",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          }
        },
        "security": [{ "api-key": [] }],
        "summary": "Get download URL",
        "tags": ["Media"],
        "x-api-key-permissions": ["media:read"]
      }
    },
    "/v1/test": {
      "get": {
        "operationId": "testKey",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TestResponse" } } }
          },
          "400": {
            "description": "Invalid request",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } } }
          },
          "402": {
            "description": "Subscription is required",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          },
          "429": {
            "description": "Too many requests",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          }
        },
        "security": [{ "api-key": [] }],
        "summary": "Test API endpoint",
        "tags": ["Api", "Test"]
      }
    },
    "/v1/diarize": {
      "post": {
        "operationId": "diarize",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DiarizeRequest" } } }
        },
        "responses": {
          "200": {
            "description": "",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/JobCreated" } } }
          },
          "400": {
            "description": "Invalid request",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } } }
          },
          "402": {
            "description": "Subscription is required",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          },
          "429": {
            "description": "Too many requests",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          }
        },
        "security": [{ "api-key": [] }],
        "summary": "Diarize audio",
        "tags": ["Api", "Operations"],
        "x-api-key-permissions": ["jobs:write"]
      }
    },
    "/v1/voiceprint": {
      "post": {
        "operationId": "voiceprint",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VoiceprintRequest" } } }
        },
        "responses": {
          "200": {
            "description": "",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/JobCreated" } } }
          },
          "400": {
            "description": "Invalid request",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } } }
          },
          "402": {
            "description": "Subscription is required",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          },
          "429": {
            "description": "Too many requests",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          }
        },
        "security": [{ "api-key": [] }],
        "summary": "Extract voiceprint",
        "tags": ["Api", "Operations"],
        "x-api-key-permissions": ["jobs:write"]
      }
    },
    "/v1/identify": {
      "post": {
        "operationId": "identify",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IdentifyRequest" } } }
        },
        "responses": {
          "200": {
            "description": "",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/JobCreated" } } }
          },
          "400": {
            "description": "Invalid request",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } } }
          },
          "402": {
            "description": "Subscription is required",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          },
          "429": {
            "description": "Too many requests",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          }
        },
        "security": [{ "api-key": [] }],
        "summary": "Identify speaker with diarization",
        "tags": ["Api", "Operations"],
        "x-api-key-permissions": ["jobs:write"]
      }
    },
    "/v1/jobs/{jobId}": {
      "get": {
        "operationId": "getJobById",
        "parameters": [
          {
            "name": "jobId",
            "required": true,
            "in": "path",
            "description": "Job ID to track the progress",
            "schema": { "type": "string" }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    { "$ref": "#/components/schemas/DiarizationJob", "title": "Diarization" },
                    { "$ref": "#/components/schemas/VoiceprintJob", "title": "Voiceprint" },
                    { "$ref": "#/components/schemas/IdentifyJob", "title": "Identification" }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid request",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } } }
          },
          "402": {
            "description": "Subscription is required",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          },
          "429": {
            "description": "Too many requests",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          }
        },
        "security": [{ "api-key": [] }],
        "summary": "Get job by ID",
        "tags": ["Api", "Jobs"],
        "x-api-key-permissions": ["jobs:read"]
      }
    },
    "/v2/jobs": {
      "get": {
        "operationId": "getJobsByTeamV2",
        "parameters": [
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Number of jobs to return",
            "schema": { "minimum": 1, "maximum": 100, "default": 10, "example": 10, "type": "number" }
          },
          {
            "name": "cursor",
            "required": false,
            "in": "query",
            "description": "Cursor for pagination. Pass the `nextCursor` value from the previous response.",
            "schema": { "format": "uuid", "example": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "type": "string" }
          },
          {
            "name": "status",
            "required": false,
            "in": "query",
            "description": "Status of the jobs to return",
            "schema": {
              "example": "succeeded",
              "type": "string",
              "enum": ["pending", "created", "succeeded", "canceled", "failed", "running"]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GetJobsResponseV2" } } }
          },
          "400": {
            "description": "Invalid request",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } } }
          },
          "402": {
            "description": "Subscription is required",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          },
          "429": {
            "description": "Too many requests",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          }
        },
        "security": [{ "api-key": [] }],
        "summary": "Get all jobs.",
        "tags": ["Api", "Jobs"],
        "x-api-key-permissions": ["jobs:read"]
      }
    },
    "/v1/live": {
      "post": {
        "operationId": "createStream",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateStream" } } }
        },
        "responses": {
          "200": {
            "description": "",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StreamCreated" } } }
          },
          "400": {
            "description": "Invalid request",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } } }
          },
          "402": {
            "description": "Subscription is required",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          },
          "429": {
            "description": "Too many requests",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          }
        },
        "security": [{ "api-key": [] }],
        "summary": "Create a new live stream",
        "tags": ["Streaming"],
        "x-api-key-permissions": ["stream:write"]
      }
    },
    "/v1/live/{id}": {
      "get": {
        "operationId": "getStream",
        "parameters": [{ "name": "id", "required": true, "in": "path", "schema": { "type": "string" } }],
        "responses": {
          "200": {
            "description": "",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Stream" } } }
          },
          "400": {
            "description": "Invalid request",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValidationErrorResponse" } } }
          },
          "402": {
            "description": "Subscription is required",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          },
          "429": {
            "description": "Too many requests",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }
          }
        },
        "security": [{ "api-key": [] }],
        "summary": "Get a live stream by ID",
        "tags": ["Streaming"],
        "x-api-key-permissions": ["stream:read"]
      }
    }
  },
  "info": {
    "title": "pyannoteAI API",
    "description": "",
    "version": "local",
    "contact": {},
    "termsOfService": "https://pyannote.ai/terms-of-use"
  },
  "tags": [],
  "servers": [{ "url": "https://api.pyannote.ai" }],
  "components": {
    "securitySchemes": { "api-key": { "scheme": "bearer", "bearerFormat": "JWT", "type": "http" } },
    "schemas": {
      "GetMediaUploadUrl": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "maxLength": 255,
            "pattern": "/^media:\\/\\/[a-zA-Z0-9\\-_\\.\\/]+$/",
            "description": "The url should be in the form media://object-key where the object-key can be any alpha-numeric string. The object-key is unique to your account API token so there is no risk of collision with other users."
          }
        },
        "required": ["url"]
      },
      "MediaResponse": { "type": "object", "properties": { "url": { "type": "string" } }, "required": ["url"] },
      "TestResponse": {
        "type": "object",
        "properties": {
          "status": { "type": "string", "description": "Status of the test", "example": "OK" },
          "message": { "type": "string", "description": "Message of the test", "example": "Test connection successful" }
        },
        "required": ["status", "message"]
      },
      "TranscriptionConfiguration": {
        "type": "object",
        "properties": {
          "model": {
            "type": "string",
            "default": "parakeet-tdt-0.6b-v3",
            "enum": ["parakeet-tdt-0.6b-v3", "faster-whisper-large-v3-turbo"],
            "description": "Transcription model to use. Supported languages depend on the chosen model:\n  - `parakeet-tdt-0.6b-v3`: Bulgarian, Croatian, Czech, Danish, Dutch, English, Estonian, Finnish, French, German, Greek, Hungarian, Italian, Latvian, Lithuanian, Maltese, Polish, Portuguese, Romanian, Slovak, Slovenian, Spanish, Swedish, Russian or Ukrainian.\n  - `faster-whisper-large-v3-turbo`: Afrikaans, Albanian, Amharic, Arabic, Armenian, Assamese, Azerbaijani, Bashkir, Basque, Belarusian, Bengali, Bosnian, Breton, Bulgarian, Cantonese, Catalan, Chinese, Croatian, Czech, Danish, Dutch, English, Estonian, Faroese, Finnish, French, Galician, Georgian, German, Greek, Gujarati, HaitianCreole, Hausa, Hawaiian, Hebrew, Hindi, Hungarian, Icelandic, Indonesian, Italian, Japanese, Javanese, Kannada, Kazakh, Khmer, Korean, Lao, Latin, Latvian, Lingala, Lithuanian, Luxembourgish, Macedonian, Malagasy, Malay, Malayalam, Maltese, Maori, Marathi, Mongolian, Myanmar, Nepali, Norwegian, Nynorsk, Occitan, Pashto, Persian, Polish, Portuguese, Punjabi, Romanian, Russian, Sanskrit, Serbian, Shona, Sindhi, Sinhala, Slovak, Slovenian, Somali, Spanish, Sundanese, Swahili, Swedish, Tagalog, Tajik, Tamil, Tatar, Telugu, Thai, Tibetan, Turkish, Turkmen, Ukrainian, Urdu, Uzbek, Vietnamese, Welsh, Yiddish or Yoruba.",
            "example": "faster-whisper-large-v3-turbo"
          }
        }
      },
      "DiarizeRequest": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "URL of the audio file to be processed",
            "example": "https://example.com/audio.wav"
          },
          "webhook": {
            "type": "string",
            "description": "Webhook URL to receive results when job is completed (optional)",
            "example": "https://example.com/webhook"
          },
          "webhookStatusOnly": {
            "type": "boolean",
            "default": false,
            "description": "When true, webhook payload only includes jobId and status (excludes output). Useful for large payloads.",
            "example": true
          },
          "model": {
            "type": "string",
            "enum": ["precision-2", "community-1"],
            "example": "precision-2",
            "default": "precision-2",
            "nullable": true
          },
          "numSpeakers": {
            "type": "number",
            "minimum": 1,
            "description": "Number of speakers. Only use if the number of speakers is known in advance. Number of speakers is detected automatically if not provided. Setting this value results in better overall diarization performance. In rare cases where we cannot honor this request (e.g. short files and large number of speakers), a warning will be added to the output. Equivalent to sending minSpeakers==maxSpeakers",
            "example": 2
          },
          "minSpeakers": {
            "type": "number",
            "minimum": 1,
            "description": "Minimum number of speakers (must be <= maxSpeakers if both are set)",
            "example": 1
          },
          "maxSpeakers": {
            "type": "number",
            "minimum": 1,
            "description": "Maximum number of speakers (must be >= minSpeakers if both are set)",
            "example": 4
          },
          "turnLevelConfidence": {
            "type": "boolean",
            "nullable": true,
            "default": false,
            "description": "Includes turn-level confidence values in the output.",
            "example": true
          },
          "exclusive": {
            "type": "boolean",
            "default": false,
            "description": "Includes exclusive diarization values in the output in `exclusiveDiarization` key (equivalent to diarization but without overlapping speech).",
            "example": true
          },
          "confidence": {
            "type": "boolean",
            "default": false,
            "description": "Include confidence values in the output. Output is considerably larger when this option is enabled. Output includes a list of confidence scores with a resolution.",
            "example": true
          },
          "transcription": {
            "type": "boolean",
            "default": false,
            "description": "Enable speaker attributed transcription. Only available for the `precision-2` diarization model."
          },
          "transcriptionConfig": {
            "description": "Transcription configuration, if `transcription: true`",
            "allOf": [{ "$ref": "#/components/schemas/TranscriptionConfiguration" }]
          }
        },
        "required": ["url"]
      },
      "JobCreated": {
        "type": "object",
        "properties": {
          "jobId": {
            "type": "string",
            "example": "3c8a89a5-dcc6-4edb-a75d-ffd64739674d",
            "description": "ID of the job"
          },
          "status": {
            "type": "string",
            "description": "Status of the job",
            "example": "created",
            "enum": ["pending", "created", "succeeded", "canceled", "failed", "running"]
          },
          "warning": { "type": "string", "description": "Warning message if any" }
        },
        "required": ["jobId", "status"]
      },
      "VoiceprintRequest": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "URL of the voiceprint audio file",
            "example": "https://example.com/voice.wav"
          },
          "model": {
            "type": "string",
            "enum": ["precision-2"],
            "example": "precision-2",
            "default": "precision-2",
            "nullable": true
          },
          "webhook": {
            "type": "string",
            "description": "Webhook URL to receive voiceprint results (optional)",
            "example": "https://example.com/webhook"
          },
          "webhookStatusOnly": {
            "type": "boolean",
            "default": false,
            "description": "When true, webhook payload only includes jobId and status (excludes output). Useful for large payloads.",
            "example": true
          }
        },
        "required": ["url"]
      },
      "MatchingOptions": {
        "type": "object",
        "properties": {
          "exclusive": {
            "type": "boolean",
            "nullable": true,
            "default": true,
            "description": "Prevent multiple speakers from being matched to the same voiceprint. Default to true"
          },
          "threshold": {
            "type": "number",
            "nullable": true,
            "default": 0,
            "minimum": 0,
            "maximum": 100,
            "format": "float",
            "description": "Prevent matching if confidence score is below this threshold. Value is between 0 and 100. Default is 0, meaning all voiceprints are matched"
          }
        }
      },
      "Voiceprint": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string",
            "maxLength": 100,
            "pattern": "^(?!speaker_).*",
            "description": "Label for the speaker. Labels can't start with \"SPEAKER_\"",
            "example": "John Doe"
          },
          "voiceprint": {
            "type": "string",
            "maxLength": 20000,
            "format": "string",
            "description": "Voiceprint of a speaker",
            "example": "U29tZUJhc2U2NERhdGE"
          }
        },
        "required": ["label", "voiceprint"]
      },
      "IdentifyRequest": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "URL of the audio file to be processed",
            "example": "https://example.com/audio.wav"
          },
          "webhook": {
            "type": "string",
            "description": "Webhook URL to receive results when job is completed (optional)",
            "example": "https://example.com/webhook"
          },
          "webhookStatusOnly": {
            "type": "boolean",
            "default": false,
            "description": "When true, webhook payload only includes jobId and status (excludes output). Useful for large payloads.",
            "example": true
          },
          "model": {
            "type": "string",
            "enum": ["precision-2"],
            "example": "precision-2",
            "default": "precision-2",
            "nullable": true
          },
          "numSpeakers": {
            "type": "number",
            "minimum": 1,
            "description": "Number of speakers. Only use if the number of speakers is known in advance. Number of speakers is detected automatically if not provided. Setting this value results in better overall diarization performance. In rare cases where we cannot honor this request (e.g. short files and large number of speakers), a warning will be added to the output. Equivalent to sending minSpeakers==maxSpeakers",
            "example": 2
          },
          "minSpeakers": {
            "type": "number",
            "minimum": 1,
            "description": "Minimum number of speakers (must be <= maxSpeakers if both are set)",
            "example": 1
          },
          "maxSpeakers": {
            "type": "number",
            "minimum": 1,
            "description": "Maximum number of speakers (must be >= minSpeakers if both are set)",
            "example": 4
          },
          "turnLevelConfidence": {
            "type": "boolean",
            "nullable": true,
            "default": false,
            "description": "Includes turn-level confidence values in the output.",
            "example": true
          },
          "exclusive": {
            "type": "boolean",
            "default": false,
            "description": "Includes exclusive diarization values in the output in `exclusiveDiarization` key (equivalent to diarization but without overlapping speech).",
            "example": true
          },
          "confidence": {
            "type": "boolean",
            "default": false,
            "description": "Include confidence values in the output. Output is considerably larger when this option is enabled. Output includes a list of confidence scores with a resolution.",
            "example": true
          },
          "matching": {
            "description": "Customize how voiceprints are matched against speakers",
            "allOf": [{ "$ref": "#/components/schemas/MatchingOptions" }]
          },
          "voiceprints": {
            "minItems": 1,
            "maxItems": 50,
            "description": "List of voiceprints to identify against",
            "type": "array",
            "items": { "$ref": "#/components/schemas/Voiceprint" }
          }
        },
        "required": ["voiceprints"]
      },
      "JobListItem": {
        "type": "object",
        "properties": {
          "id": { "type": "string" },
          "status": { "type": "string" },
          "createdAt": { "format": "date-time", "type": "string" }
        },
        "required": ["id", "status", "createdAt"]
      },
      "GetJobsResponseV2": {
        "type": "object",
        "properties": {
          "items": {
            "description": "List of jobs. Sorted by creation date, descending. Does not include output data.",
            "type": "array",
            "items": { "$ref": "#/components/schemas/JobListItem" }
          },
          "nextCursor": {
            "type": "string",
            "nullable": true,
            "description": "Cursor to pass as `cursor` query param to get the next page. Null if there are no more results.",
            "example": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
          }
        },
        "required": ["items", "nextCursor"]
      },
      "CreateStream": { "type": "object", "properties": {} },
      "StreamCreated": {
        "type": "object",
        "properties": { "id": { "type": "string" }, "url": { "type": "string" } },
        "required": ["id", "url"]
      },
      "StreamStatus": {
        "type": "string",
        "enum": ["created", "running", "done", "error"],
        "description": "Status of the stream"
      },
      "Stream": {
        "type": "object",
        "properties": {
          "id": { "type": "string" },
          "status": {
            "description": "Status of the stream",
            "example": "created",
            "allOf": [{ "$ref": "#/components/schemas/StreamStatus" }]
          },
          "startedAt": { "format": "date-time", "type": "string", "nullable": true },
          "completedAt": { "format": "date-time", "type": "string", "nullable": true },
          "input": { "$ref": "#/components/schemas/CreateStream" }
        },
        "required": ["id", "startedAt", "completedAt", "input"]
      },
      "JobStatus": {
        "type": "string",
        "enum": ["pending", "created", "succeeded", "canceled", "failed", "running"],
        "description": "Status of the job"
      },
      "DiarizationSegment": {
        "type": "object",
        "properties": {
          "speaker": { "type": "string", "description": "Speaker label", "example": "SPEAKER_00" },
          "start": { "type": "number", "description": "Start time of the segment in seconds", "example": 15 },
          "end": { "type": "number", "description": "End time of the segment in seconds", "example": 30.5 },
          "confidence": {
            "type": "object",
            "description": "Confidence scores that this speech turn matches each diarization speaker. Only available if `turnLevelConfidence` is set to true when job is created.",
            "example": { "SPEAKER_00": 16, "SPEAKER_01": 93 }
          }
        },
        "required": ["speaker", "start", "end"]
      },
      "Confidence": {
        "type": "object",
        "properties": {
          "score": {
            "description": "List of confidence scores for each sample. Values are between 0 and 100",
            "example": [95, 89, 78, 67, 56, 45, 34, 23, 12, 1],
            "type": "array",
            "items": { "type": "number" }
          },
          "resolution": {
            "type": "number",
            "description": "Resolution of the confidence scores. Value is number of seconds per sample",
            "example": 0.02
          }
        },
        "required": ["score", "resolution"]
      },
      "TranscriptionSegment": {
        "type": "object",
        "properties": {
          "start": { "type": "number", "description": "Start time of the segment in seconds" },
          "end": { "type": "number", "description": "End time of the segment in seconds" },
          "text": { "type": "string", "description": "The transcribed speech content for this segment" },
          "speaker": { "type": "string", "description": "Speaker label" }
        },
        "required": ["start", "end", "text", "speaker"]
      },
      "DiarizationJobOutput": {
        "type": "object",
        "properties": {
          "diarization": {
            "description": "List of diarization segments",
            "type": "array",
            "items": { "$ref": "#/components/schemas/DiarizationSegment" }
          },
          "confidence": {
            "description": "Confidence scores details. Only returned if `confidence` is set to true when job is created",
            "allOf": [{ "$ref": "#/components/schemas/Confidence" }]
          },
          "exclusiveDiarization": {
            "description": "Exclusive diarization segments where only one speaker is active at a time. Only returned if `exclusive` is set to true when job is created.",
            "type": "array",
            "items": { "$ref": "#/components/schemas/DiarizationSegment" }
          },
          "wordLevelTranscription": {
            "description": "Word-level transcription segments with text. Only returned if `transcription` is set to true when job is created.",
            "example": [{ "start": 0.5, "end": 0.8, "text": "Hello", "speaker": "SPEAKER_00" }],
            "type": "array",
            "items": { "$ref": "#/components/schemas/TranscriptionSegment" }
          },
          "turnLevelTranscription": {
            "description": "Turn-level (speaker turn) transcription segments with text. Only returned if `transcription` is set to true when job is created.",
            "example": [{ "start": 0.5, "end": 2.3, "text": "Hello, how are you?", "speaker": "SPEAKER_00" }],
            "type": "array",
            "items": { "$ref": "#/components/schemas/TranscriptionSegment" }
          },
          "error": { "type": "string", "description": "Error message if any" },
          "warning": { "type": "string", "description": "Warning message if any" }
        },
        "required": ["diarization"]
      },
      "DiarizationJob": {
        "type": "object",
        "properties": {
          "jobId": {
            "type": "string",
            "description": "Job ID to track the progress or get the results",
            "example": "fb16c565-f3f0-4402-a08c-9d44df0ccc7b"
          },
          "status": { "description": "Status of the job", "allOf": [{ "$ref": "#/components/schemas/JobStatus" }] },
          "createdAt": {
            "format": "date-time",
            "type": "string",
            "description": "Date and time the job was created",
            "example": "2024-02-20T12:00:00Z"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string",
            "description": "Date and time the job was last updated",
            "example": "2024-02-20T12:00:00Z"
          },
          "output": {
            "description": "Output segments of a diarization, available for 24 hours after job completion",
            "allOf": [{ "$ref": "#/components/schemas/DiarizationJobOutput" }]
          }
        }
      },
      "IdentificationSegment": {
        "type": "object",
        "properties": {
          "speaker": { "type": "string", "description": "Speaker label", "example": "SPEAKER_00" },
          "start": { "type": "number", "description": "Start time of the segment in seconds", "example": 15 },
          "end": { "type": "number", "description": "End time of the segment in seconds", "example": 30.5 },
          "confidence": {
            "type": "object",
            "description": "Confidence scores that this speech turn matches each diarization speaker. Only available if `turnLevelConfidence` is set to true when job is created.",
            "example": { "SPEAKER_00": 16, "SPEAKER_01": 93 }
          },
          "diarizationSpeaker": { "type": "string", "description": "Speaker label", "example": "SPEAKER_00" },
          "match": {
            "type": "string",
            "description": "Label of the voiceprint that was identified following the matching settings",
            "example": "Sam",
            "nullable": true
          }
        },
        "required": ["diarizationSpeaker", "match"]
      },
      "IdentificationVoiceprint": {
        "type": "object",
        "properties": {
          "speaker": { "type": "string", "description": "Diarization speaker", "example": "SPEAKER_00" },
          "match": {
            "type": "string",
            "description": "Label of the voiceprint that was identified following the matching settings",
            "example": "Sam"
          },
          "confidence": {
            "type": "object",
            "description": "Confidence for each speaker label, as a dictionary of speaker label to confidence score",
            "example": { "Sam": 16, "Rick": 24 }
          }
        },
        "required": ["speaker", "match", "confidence"]
      },
      "IdentificationJobOutput": {
        "type": "object",
        "properties": {
          "diarization": {
            "description": "List of diarization segments",
            "type": "array",
            "items": { "$ref": "#/components/schemas/DiarizationSegment" }
          },
          "confidence": {
            "description": "Confidence scores details. Only returned if `confidence` is set to true when job is created",
            "allOf": [{ "$ref": "#/components/schemas/Confidence" }]
          },
          "exclusiveDiarization": {
            "description": "Exclusive diarization segments where only one speaker is active at a time. Only returned if `exclusive` is set to true when job is created.",
            "type": "array",
            "items": { "$ref": "#/components/schemas/DiarizationSegment" }
          },
          "error": { "type": "string", "description": "Error message if any" },
          "warning": { "type": "string", "description": "Warning message if any" },
          "identification": {
            "description": "List of identification segments",
            "type": "array",
            "items": { "$ref": "#/components/schemas/IdentificationSegment" }
          },
          "voiceprints": { "type": "array", "items": { "$ref": "#/components/schemas/IdentificationVoiceprint" } }
        }
      },
      "IdentifyJob": {
        "type": "object",
        "properties": {
          "jobId": {
            "type": "string",
            "description": "Job ID to track the progress or get the results",
            "example": "fb16c565-f3f0-4402-a08c-9d44df0ccc7b"
          },
          "status": { "description": "Status of the job", "allOf": [{ "$ref": "#/components/schemas/JobStatus" }] },
          "createdAt": {
            "format": "date-time",
            "type": "string",
            "description": "Date and time the job was created",
            "example": "2024-02-20T12:00:00Z"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string",
            "description": "Date and time the job was last updated",
            "example": "2024-02-20T12:00:00Z"
          },
          "output": {
            "description": "Output segments of an identification job, available for 24 hours after job completion",
            "allOf": [{ "$ref": "#/components/schemas/IdentificationJobOutput" }]
          }
        }
      },
      "VoiceprintJobResults": {
        "type": "object",
        "properties": {
          "voiceprint": {
            "type": "string",
            "description": "Voiceprint of the audio. To be used for identification",
            "example": "aGVsbG8gd29ybGQ"
          },
          "warning": { "type": "string", "description": "Warning message if any" },
          "error": { "type": "string", "description": "Error message if any" }
        },
        "required": ["voiceprint"]
      },
      "VoiceprintJob": {
        "type": "object",
        "properties": {
          "jobId": {
            "type": "string",
            "description": "Job ID to track the progress or get the results",
            "example": "fb16c565-f3f0-4402-a08c-9d44df0ccc7b"
          },
          "status": { "description": "Status of the job", "allOf": [{ "$ref": "#/components/schemas/JobStatus" }] },
          "createdAt": {
            "format": "date-time",
            "type": "string",
            "description": "Date and time the job was created",
            "example": "2024-02-20T12:00:00Z"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string",
            "description": "Date and time the job was last updated",
            "example": "2024-02-20T12:00:00Z"
          },
          "output": {
            "description": "Output of a voiceprint job, available for 24 hours after job completion",
            "allOf": [{ "$ref": "#/components/schemas/VoiceprintJobResults" }]
          }
        }
      },
      "ValidationError": {
        "type": "object",
        "properties": {
          "field": { "type": "string", "description": "Field name", "example": "url" },
          "message": { "type": "string", "description": "Error message", "example": "Invalid URL" }
        },
        "required": ["field", "message"]
      },
      "ValidationErrorResponse": {
        "type": "object",
        "properties": {
          "message": { "type": "string", "description": "Error message", "example": "Invalid request" },
          "errors": {
            "description": "List of errors",
            "type": "array",
            "items": { "$ref": "#/components/schemas/ValidationError" }
          }
        },
        "required": ["message", "errors"]
      },
      "ApiError": {
        "type": "object",
        "properties": {
          "requestId": {
            "type": "string",
            "description": "Request ID",
            "example": "37a4c3a0-b034-4e8c-9ed9-76da6645544a"
          },
          "message": { "type": "string", "description": "Error message", "example": "Error message" }
        },
        "required": ["requestId", "message"]
      }
    }
  },
  "externalDocs": { "description": "pyannoteAI Docs", "url": "https://docs.pyannote.ai/" }
}
