{
  "openapi": "3.1.0",
  "info": {
    "title": "AI Gateway",
    "version": "dev",
    "description": "HTTP API for creating and polling AI jobs (transcription, translation, video analysis).\n\n### Local testing (Swagger UI)\n\n1. Open Swagger UI (default http://localhost:8090/swagger/).\n2. **Authorize** → **oauth2ClientCredentials** → **Authorize** (token URL and audience come from the gateway's `/openapi.json`).\n3. Call **POST /v1/transcriptions** (or translations / video analyses), then poll **GET** by job `id`.\n"
  },
  "servers": [
    {
      "url": "https://api.dev.ai.scw.mymedia.services",
      "description": "API gateway"
    }
  ],
  "security": [
    {
      "oauth2ClientCredentials": []
    }
  ],
  "tags": [
    {
      "name": "Transcript",
      "description": "Operations related to converting audio or video content into structured, time-aligned text"
    },
    {
      "name": "Translation",
      "description": "Operations related to translating text or document content between languages"
    },
    {
      "name": "Video Analysis",
      "description": "Operations related to extracting structured metadata and insights from video content"
    },
    {
      "name": "Providers",
      "description": "Backend providers available in the gateway and their supported capabilities"
    },
    {
      "name": "Schemas",
      "description": "Available schemas"
    }
  ],
  "paths": {
    "/v1/providers": {
      "get": {
        "summary": "List available providers",
        "description": "Returns all backend providers configured in the gateway, along with the resource types and features each one supports. Use this to determine which `provider` value to pass when creating a job, and which features are available for a given provider.\n",
        "operationId": "listProviders",
        "responses": {
          "200": {
            "description": "List of available providers",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderList"
                }
              }
            }
          }
        },
        "tags": [
          "Providers"
        ]
      }
    },
    "/v1/transcriptions": {
      "post": {
        "summary": "Create transcription job",
        "description": "Submits an asynchronous speech-to-text job and returns **202 Accepted** with a job resource.\n\n### How it works\n\n1. The gateway validates the request and stores a job (`status: pending`).\n2. For **video** input, audio is extracted first, then sent to the transcription backend.\n3. For **audio** input, transcription starts immediately.\n4. Poll **GET /v1/transcriptions/{id}** until `status` is `completed` or `failed`, or configure\n   `attributes.webhook` to receive lifecycle callbacks (see **Webhooks → transcription**).\n\n### Request body (`data.attributes`)\n\n| Field | Required | Description |\n|-------|----------|-------------|\n| `input` | Yes | Source media (`type`, `url`, optional `audio_track`). |\n| `options` | No | Transcription settings: source `language`, `timestamps`, output `format`, `diarization`, queue `priority`. |\n| `webhook` | No | HTTPS endpoint for `transcription.progress`, `.completed`, and `.failed` events. |\n| `provider` | No | Backend to use (e.g. `eden-ai`). If omitted, the gateway selects a provider. See **GET /v1/providers**. |\n| `meta.client` | No | Opaque key-value metadata echoed back in responses and webhooks. |\n\n### Options reference\n\n- **`language`** — BCP 47 code of the spoken language (e.g. `en`, `en-US`, `fr`). Use `auto` only when\n  the chosen provider supports language detection. The default backend (Google via Eden AI) requires an\n  explicit code; omitting `language` may fall back to `en-US` in deployment configuration.\n- **`timestamps`** — When `true`, the result includes time-aligned `segments` (`start`, `end`, `text`).\n- **`format`** — Result serialization: `json` (structured segments), `srt`, or `vtt` (subtitle files).\n- **`diarization`** — When `true`, speakers are distinguished in the transcript (provider-dependent).\n- **`priority`** — Queue priority: `low`, `standard` (default), or `high`.\n\n### Input URL\n\nThe `input.url` must be reachable by the gateway and workers (HTTP/HTTPS). In local Compose stacks,\nuse the MinIO sample URL from the request example or your own publicly accessible file.\n",
        "operationId": "createTranscription",
        "requestBody": {
          "required": true,
          "description": "JSON:API-style envelope. Only `data.attributes.input` is required; all other fields are optional.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Job accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Job"
                }
              }
            }
          },
          "422": {
            "description": "The selected or auto-selected provider does not support one or more requested options.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "tags": [
          "Transcript"
        ]
      }
    },
    "/v1/transcriptions/{id}": {
      "get": {
        "summary": "Get transcription job",
        "description": "Returns the current job resource, including `status`, `progress` (while processing), and `result`\n(when `status` is `completed`). Use the job `id` from the **202** response to **POST /v1/transcriptions**.\n",
        "operationId": "getTranscription",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Job UUID returned when the transcription was created.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "2f41bc1f-b608-4360-acd9-a26a296fea3c"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Job status",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Job"
                }
              }
            }
          }
        },
        "tags": [
          "Transcript"
        ]
      }
    },
    "/v1/transcriptions/{id}/result": {
      "get": {
        "summary": "Get transcription result",
        "description": "Returns only the transcription output (`format`, `language`, `segments`, optional `download_url`).\nAvailable when the job `status` is `completed`; otherwise responds with **404** (`RESULT_NOT_READY`).\n\nResponse content type depends on the requested `options.format` (`application/json`, `text/srt`, or `text/vtt`).\n",
        "operationId": "getTranscriptionResult",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Job UUID returned when the transcription was created.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "2f41bc1f-b608-4360-acd9-a26a296fea3c"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Transcription result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result"
                }
              },
              "text/srt": {
                "schema": {
                  "type": "string"
                }
              },
              "text/vtt": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "tags": [
          "Transcript"
        ]
      }
    },
    "/v1/translations": {
      "post": {
        "summary": "Create translation job",
        "operationId": "createTranslation",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/translation_CreateRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Job accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/translation_Job"
                }
              }
            }
          },
          "422": {
            "description": "The selected or auto-selected provider does not support one or more requested options.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "tags": [
          "Translation"
        ]
      }
    },
    "/v1/translations/{id}": {
      "get": {
        "summary": "Get translation job",
        "operationId": "getTranslation",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "9a1bc2f3-d405-4678-bcde-f12345678901"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Job status",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/translation_Job"
                }
              }
            }
          }
        },
        "tags": [
          "Translation"
        ]
      }
    },
    "/v1/translations/{id}/result": {
      "get": {
        "summary": "Get translation result",
        "operationId": "getTranslationResult",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "9a1bc2f3-d405-4678-bcde-f12345678901"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Translation result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/translation_Result"
                }
              },
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "tags": [
          "Translation"
        ]
      }
    },
    "/v1/video-analyses": {
      "post": {
        "summary": "Create video analysis job",
        "operationId": "createVideoAnalysis",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/video-analysis_CreateRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Job accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/video-analysis_Job"
                }
              }
            }
          },
          "422": {
            "description": "The selected or auto-selected provider does not support one or more requested features.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "tags": [
          "Video Analysis"
        ]
      }
    },
    "/v1/video-analyses/{id}": {
      "get": {
        "summary": "Get video analysis job",
        "operationId": "getVideoAnalysis",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "3e7dc4b2-91f0-4a1e-8c2d-b56789012345"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Job status",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/video-analysis_Job"
                }
              }
            }
          }
        },
        "tags": [
          "Video Analysis"
        ]
      }
    },
    "/v1/video-analyses/{id}/result": {
      "get": {
        "summary": "Get video analysis result",
        "operationId": "getVideoAnalysisResult",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "3e7dc4b2-91f0-4a1e-8c2d-b56789012345"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Video analysis result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/video-analysis_Result"
                }
              }
            }
          }
        },
        "tags": [
          "Video Analysis"
        ]
      }
    }
  },
  "webhooks": {
    "transcription": {
      "post": {
        "summary": "Transcription job lifecycle event",
        "operationId": "transcriptionWebhook",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookPayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Webhook received successfully"
          }
        },
        "tags": [
          "Transcript"
        ]
      }
    },
    "translation": {
      "post": {
        "summary": "Translation job lifecycle event",
        "operationId": "translationWebhook",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/translation_WebhookPayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Webhook received successfully"
          }
        },
        "tags": [
          "Translation"
        ]
      }
    },
    "video-analysis": {
      "post": {
        "summary": "Video analysis job lifecycle event",
        "operationId": "videoAnalysisWebhook",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/video-analysis_WebhookPayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Webhook received successfully"
          }
        },
        "tags": [
          "Video Analysis"
        ]
      }
    }
  },
  "components": {
    "securitySchemes": {
      "oauth2ClientCredentials": {
        "type": "oauth2",
        "description": "OIDC client credentials (machine-to-machine). Runtime values are set by the API gateway `/openapi.json` endpoint.",
        "x-oidc-issuer": "https://dev-maas.eu.auth0.com/",
        "x-oidc-audience": "https://api.ai-gateway.bce.lu",
        "flows": {
          "clientCredentials": {
            "tokenUrl": "https://dev-maas.eu.auth0.com/oauth/token",
            "scopes": {}
          }
        }
      }
    },
    "schemas": {
      "Feature": {
        "type": "string",
        "description": "A specific transcription capability that may or may not be supported by a given provider. `language_detection`: automatically detect the source language without explicit specification. `diarization`: identify and label distinct speakers in the transcript. `timestamps`: produce time-aligned transcript segments.\n",
        "enum": [
          "language_detection",
          "diarization",
          "timestamps"
        ]
      },
      "TranscriptionCapabilities": {
        "type": "object",
        "description": "Transcription features supported by this provider.",
        "properties": {
          "features": {
            "type": "array",
            "description": "Subset of transcription features this provider can handle.",
            "items": {
              "$ref": "#/components/schemas/Feature"
            },
            "example": [
              "language_detection",
              "diarization",
              "timestamps"
            ]
          }
        }
      },
      "translation_Feature": {
        "type": "string",
        "description": "A specific translation capability that may or may not be supported by a given provider. `language_detection`: automatically detect the source language without explicit specification. `formality`: control the formality level (formal, informal) of the translated output.\n",
        "enum": [
          "language_detection",
          "formality"
        ]
      },
      "TranslationCapabilities": {
        "type": "object",
        "description": "Translation features supported by this provider.",
        "properties": {
          "features": {
            "type": "array",
            "description": "Subset of translation features this provider can handle.",
            "items": {
              "$ref": "#/components/schemas/translation_Feature"
            },
            "example": [
              "language_detection",
              "formality"
            ]
          }
        }
      },
      "video-analysis_Feature": {
        "type": "string",
        "description": "A specific analysis capability to apply to the video. `labels`: detect objects, scenes, and actions throughout the video. `scenes`: detect scene and shot boundaries. `faces`: detect and track faces across frames. `speech_to_text`: convert speech to text, with speaker identification. `ocr`: extract on-screen text from video frames. `content_moderation`: flag explicit or inappropriate content. `sentiment`: analyse the overall tone and emotional valence. `topics`: extract key topics and keywords from audio and visual content. `brands`: detect brand logos and visual trademarks. `summary`: generate a natural-language description of the video content.\n",
        "enum": [
          "labels",
          "scenes",
          "faces",
          "speech_to_text",
          "ocr",
          "content_moderation",
          "sentiment",
          "topics",
          "brands",
          "summary"
        ]
      },
      "VideoAnalysisCapabilities": {
        "type": "object",
        "description": "Video analysis features supported by this provider.",
        "properties": {
          "features": {
            "type": "array",
            "description": "Subset of video analysis features this provider can handle.",
            "items": {
              "$ref": "#/components/schemas/video-analysis_Feature"
            },
            "example": [
              "labels",
              "scenes",
              "faces",
              "speech_to_text",
              "ocr",
              "content_moderation",
              "sentiment",
              "topics",
              "brands",
              "summary"
            ]
          }
        }
      },
      "ProviderAttributes": {
        "type": "object",
        "description": "Capabilities of a provider across all supported resource types.",
        "properties": {
          "name": {
            "type": "string",
            "description": "Human-readable name of the provider.",
            "example": "TwelveLabs"
          },
          "resources": {
            "type": "object",
            "description": "Capabilities offered by this provider per resource type. Only resource types supported by this provider appear in this object.\n",
            "properties": {
              "transcriptions": {
                "$ref": "#/components/schemas/TranscriptionCapabilities"
              },
              "translations": {
                "$ref": "#/components/schemas/TranslationCapabilities"
              },
              "video-analyses": {
                "$ref": "#/components/schemas/VideoAnalysisCapabilities"
              }
            }
          }
        }
      },
      "ProviderList": {
        "type": "object",
        "description": "List of available backend providers.",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Unique identifier for the provider.",
                  "example": "twelvelabs"
                },
                "type": {
                  "type": "string",
                  "enum": [
                    "provider"
                  ],
                  "example": "provider"
                },
                "attributes": {
                  "$ref": "#/components/schemas/ProviderAttributes"
                }
              }
            }
          }
        }
      },
      "Input": {
        "type": "object",
        "description": "Identifies the media file to transcribe. The URL must be reachable from the gateway and worker services (no authentication headers are forwarded).\n",
        "required": [
          "type",
          "url"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "Media kind. `video` — audio is extracted from the container, then transcribed (two-step pipeline). `audio` — the file is transcribed directly.\n",
            "enum": [
              "video",
              "audio"
            ],
            "example": "video"
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "HTTP or HTTPS URL of the source file (e.g. MP4, WAV, MP3). Must be publicly accessible or reachable on the deployment network (e.g. MinIO in local Docker Compose).\n",
            "example": "http://minio:9000/ai-gateway/samples/speech_sample.mp4"
          },
          "audio_track": {
            "type": "integer",
            "description": "Zero-based index of the audio track to transcribe when `type` is `video`. Omit to use the first audio track. Ignored for `type` `audio`.\n",
            "example": 0
          }
        }
      },
      "Options": {
        "type": "object",
        "description": "Optional settings for the transcription engine and result shape. Provider capabilities vary; unsupported combinations may return **422**. Check **GET /v1/providers** for supported features.\n",
        "properties": {
          "language": {
            "type": "string",
            "description": "BCP 47 language code of the speech in the source media (e.g. `en`, `en-US`, `fr`, `de`). Two-letter codes are normalized where applicable (`en` → `en-US`). Use `auto` to request automatic language detection when the selected provider supports it. The default Eden AI Google engine does **not** auto-detect; specify a language explicitly or rely on the deployment default (typically `en-US`) when this field is omitted.\n",
            "example": "en"
          },
          "timestamps": {
            "type": "boolean",
            "description": "When `true`, the result includes a `segments` array with `start`, `end`, and `text` for each utterance. When `false` or omitted, the backend may return plain text only (provider-dependent).\n",
            "default": true,
            "example": true
          },
          "format": {
            "type": "string",
            "description": "How the transcript is returned in `attributes.result` and **GET /v1/transcriptions/{id}/result**. `json` — structured object with `segments` (recommended for APIs). `srt` / `vtt` — SubRip or WebVTT subtitle text; a `download_url` may be provided when the provider exports a file.\n",
            "enum": [
              "srt",
              "vtt",
              "json"
            ],
            "example": "json"
          },
          "diarization": {
            "type": "boolean",
            "description": "When `true`, requests speaker diarization (who spoke when). Support depends on the provider; see `diarization` under transcription features in **GET /v1/providers**.\n",
            "default": false,
            "example": false
          },
          "priority": {
            "type": "string",
            "description": "Relative queue priority for the job. `high` jobs are scheduled before `standard` and `low` when the platform is under load. Does not change transcription quality.\n",
            "enum": [
              "low",
              "standard",
              "high"
            ],
            "default": "standard",
            "example": "standard"
          }
        }
      },
      "Webhook": {
        "writeOnly": true,
        "type": "object",
        "description": "Destination configuration for job lifecycle notifications.",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "The endpoint the gateway will POST event payloads to.",
            "example": "https://webhook.site/64be6fc3-7869-48c1-85bc-a28a6c756ab7"
          },
          "headers": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Optional HTTP headers included in every webhook request. Typically used for authentication."
          }
        }
      },
      "Provider": {
        "type": "string",
        "description": "Identifier of the backend provider to use for processing this job. When omitted, the gateway selects the most appropriate provider automatically based on the requested features and availability. Use `GET /v1/providers` to list available providers and their supported features.\n",
        "example": "twelvelabs"
      },
      "AttributesCreate": {
        "type": "object",
        "description": "Parameters that control what is transcribed and how. Only `input` is required; configure `options`, `webhook`, and `provider` as needed.\n",
        "required": [
          "input"
        ],
        "properties": {
          "input": {
            "description": "Source audio or video file to transcribe.",
            "$ref": "#/components/schemas/Input"
          },
          "options": {
            "description": "Optional transcription settings (language, output format, timestamps, diarization, priority). See the **Options** schema for field-level details.\n",
            "$ref": "#/components/schemas/Options"
          },
          "webhook": {
            "description": "Optional callback URL. When set, the gateway POSTs JSON payloads on each lifecycle transition (`transcription.progress`, `transcription.completed`, `transcription.failed`).\n",
            "$ref": "#/components/schemas/Webhook"
          },
          "provider": {
            "description": "Backend provider id for this job (e.g. `eden-ai`). When omitted, the gateway picks a provider that supports the requested options. List providers and features with **GET /v1/providers**.\n",
            "$ref": "#/components/schemas/Provider"
          }
        }
      },
      "Meta": {
        "type": "object",
        "description": "Metadata envelope shared between client and system.",
        "properties": {
          "client": {
            "type": "object",
            "additionalProperties": true,
            "description": "Arbitrary key-value data provided by the client. Returned unchanged in all responses."
          },
          "system": {
            "readOnly": true,
            "type": "object",
            "additionalProperties": true,
            "description": "Internal metadata added by the gateway. Not exposed unless explicitly required.",
            "example": {
              "region": "eu-west-1",
              "worker_id": "wk_789"
            }
          }
        }
      },
      "CreateRequest": {
        "type": "object",
        "description": "Request body for **POST /v1/transcriptions**. Wraps job parameters in a JSON:API-style `data` object. The gateway enqueues the job and returns immediately; transcription runs asynchronously.\n",
        "required": [
          "data"
        ],
        "example": {
          "data": {
            "type": "transcription-job",
            "attributes": {
              "input": {
                "type": "video",
                "url": "http://minio:9000/ai-gateway/samples/speech_sample.mp4"
              },
              "options": {
                "language": "en",
                "timestamps": true,
                "format": "json",
                "diarization": false,
                "priority": "standard"
              },
              "webhook": {
                "url": "https://webhook.site/64be6fc3-7869-48c1-85bc-a28a6c756ab7"
              }
            }
          }
        },
        "properties": {
          "data": {
            "type": "object",
            "description": "JSON:API-style resource envelope. Must include `type` and `attributes`; `meta` is optional.\n",
            "required": [
              "type",
              "attributes"
            ],
            "properties": {
              "type": {
                "type": "string",
                "description": "Resource type discriminator. Must be exactly `transcription-job` for this endpoint.\n",
                "example": "transcription-job"
              },
              "attributes": {
                "$ref": "#/components/schemas/AttributesCreate"
              },
              "meta": {
                "description": "Optional client metadata (`meta.client`). Stored with the job and returned unchanged in GET responses and webhook payloads. Not used for routing or processing.\n",
                "$ref": "#/components/schemas/Meta"
              }
            }
          }
        }
      },
      "JobStatus": {
        "type": "string",
        "description": "Current lifecycle state of the job. `pending`: accepted, waiting to be picked up. `processing`: actively being worked on. `completed`: finished successfully. `failed`: encountered an unrecoverable error.\n",
        "enum": [
          "pending",
          "processing",
          "completed",
          "failed"
        ],
        "example": "processing"
      },
      "Error": {
        "type": "object",
        "description": "Details of a job failure. Only present when `status` is `failed`.",
        "properties": {
          "code": {
            "type": "string",
            "description": "Machine-readable error identifier.",
            "example": "AUDIO_UNREADABLE"
          },
          "message": {
            "type": "string",
            "description": "Human-readable explanation of the error.",
            "example": "Could not extract audio from the provided file."
          }
        }
      },
      "Attributes": {
        "type": "object",
        "description": "Base attributes shared by all asynchronous job types.",
        "properties": {
          "provider": {
            "readOnly": true,
            "$ref": "#/components/schemas/Provider"
          },
          "status": {
            "readOnly": true,
            "$ref": "#/components/schemas/JobStatus"
          },
          "progress": {
            "readOnly": true,
            "type": "integer",
            "minimum": 0,
            "maximum": 100,
            "description": "Processing progress as a percentage. Only meaningful while status is `processing`.",
            "example": 72
          },
          "error": {
            "readOnly": true,
            "$ref": "#/components/schemas/Error"
          },
          "created_at": {
            "readOnly": true,
            "type": "string",
            "format": "date-time",
            "description": "When the job was created.",
            "example": "2024-03-15T10:00:00Z"
          },
          "processed_at": {
            "readOnly": true,
            "type": "string",
            "format": "date-time",
            "description": "When the job transitioned from `pending` to `processing`. Subtract from `created_at` to get queue wait time.",
            "example": "2024-03-15T10:00:05Z"
          },
          "completed_at": {
            "readOnly": true,
            "type": "string",
            "format": "date-time",
            "description": "When the job reached a terminal state (`completed` or `failed`). Subtract from `processed_at` to get processing duration.",
            "example": "2024-03-15T10:02:30Z"
          }
        }
      },
      "Segment": {
        "type": "object",
        "description": "A single time-aligned segment of the transcript.",
        "properties": {
          "start": {
            "type": "number",
            "description": "Start time of the segment in seconds.",
            "example": 12.5
          },
          "end": {
            "type": "number",
            "description": "End time of the segment in seconds.",
            "example": 15.8
          },
          "text": {
            "type": "string",
            "description": "Transcribed text for this time range.",
            "example": "Welcome to today's interview."
          }
        }
      },
      "Result": {
        "type": "object",
        "description": "Output of a completed transcription job.",
        "properties": {
          "format": {
            "type": "string",
            "enum": [
              "srt",
              "vtt",
              "json"
            ],
            "description": "Format of the transcription result, matching the requested output format.",
            "example": "srt"
          },
          "duration": {
            "type": "number",
            "description": "Total duration of the media file in seconds.",
            "example": 183.4
          },
          "language": {
            "type": "string",
            "description": "BCP 47 language code of the transcribed audio, as detected or specified.",
            "example": "en"
          },
          "download_url": {
            "type": "string",
            "format": "uri",
            "description": "Pre-signed URL to download the full transcription file. Valid for a limited time.",
            "example": "https://storage.example.com/results/2f41bc1f-b608-4360-acd9-a26a296fea3c.srt"
          },
          "segments": {
            "type": "array",
            "description": "Time-aligned transcript segments. Present when `timestamps` was enabled.",
            "items": {
              "$ref": "#/components/schemas/Segment"
            }
          }
        }
      },
      "transcription_Attributes": {
        "description": "Full attributes of a transcription job, combining input, job state, and result.",
        "allOf": [
          {
            "$ref": "#/components/schemas/Attributes"
          },
          {
            "$ref": "#/components/schemas/AttributesCreate"
          },
          {
            "type": "object",
            "properties": {
              "result": {
                "readOnly": true,
                "description": "Transcription output. Populated once status is `completed`.",
                "$ref": "#/components/schemas/Result"
              }
            }
          }
        ]
      },
      "Job": {
        "type": "object",
        "description": "A transcription job resource, including its current status and result when available.",
        "properties": {
          "data": {
            "type": "object",
            "description": "JSON:API-style data envelope.",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "description": "Unique identifier for the transcription job.",
                "example": "2f41bc1f-b608-4360-acd9-a26a296fea3c"
              },
              "type": {
                "type": "string",
                "enum": [
                  "transcription-job"
                ],
                "description": "Resource type identifier. Always `transcription-job`.",
                "example": "transcription-job"
              },
              "attributes": {
                "$ref": "#/components/schemas/transcription_Attributes"
              },
              "meta": {
                "$ref": "#/components/schemas/Meta"
              }
            }
          }
        }
      },
      "ErrorResponse": {
        "type": "object",
        "description": "Standard error response envelope.",
        "properties": {
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "translation_Input": {
        "type": "object",
        "description": "Source content to translate.",
        "required": [
          "type",
          "target_language"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "Type of the source content.",
            "enum": [
              "text",
              "document"
            ],
            "example": "text"
          },
          "content": {
            "type": "string",
            "description": "The text content to translate. Required when `type` is `text`.",
            "example": "Hello, how are you today?"
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Publicly accessible URL of the document to translate. Required when `type` is `document`.",
            "example": "https://cdn.example.com/documents/report.pdf"
          },
          "target_language": {
            "type": "string",
            "description": "BCP 47 language code of the target language.",
            "example": "fr"
          }
        }
      },
      "translation_Options": {
        "type": "object",
        "description": "Optional settings controlling translation behaviour.",
        "properties": {
          "source_language": {
            "type": "string",
            "description": "BCP 47 language code of the source content. Use `auto` to detect the language automatically.",
            "example": "auto"
          },
          "formality": {
            "type": "string",
            "description": "Formality level of the translated output.",
            "enum": [
              "default",
              "formal",
              "informal"
            ],
            "example": "formal"
          },
          "priority": {
            "type": "string",
            "description": "Processing priority. Higher priority jobs are picked up sooner.",
            "enum": [
              "low",
              "standard",
              "high"
            ],
            "example": "standard"
          }
        }
      },
      "translation_AttributesCreate": {
        "type": "object",
        "description": "Input fields required to create a translation job.",
        "required": [
          "input"
        ],
        "properties": {
          "input": {
            "$ref": "#/components/schemas/translation_Input"
          },
          "options": {
            "$ref": "#/components/schemas/translation_Options"
          },
          "webhook": {
            "$ref": "#/components/schemas/Webhook"
          },
          "provider": {
            "$ref": "#/components/schemas/Provider"
          }
        }
      },
      "translation_CreateRequest": {
        "type": "object",
        "description": "Request body to create a new translation job.",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "description": "JSON:API-style data envelope.",
            "required": [
              "type",
              "attributes"
            ],
            "properties": {
              "type": {
                "type": "string",
                "description": "Resource type identifier. Must be `translation-job`.",
                "example": "translation-job"
              },
              "attributes": {
                "$ref": "#/components/schemas/translation_AttributesCreate"
              },
              "meta": {
                "$ref": "#/components/schemas/Meta"
              }
            }
          }
        }
      },
      "translation_Result": {
        "type": "object",
        "description": "Output of a completed translation job.",
        "properties": {
          "source_language": {
            "type": "string",
            "description": "BCP 47 language code of the source content, as detected or specified.",
            "example": "en"
          },
          "target_language": {
            "type": "string",
            "description": "BCP 47 language code of the translated output.",
            "example": "fr"
          },
          "content": {
            "type": "string",
            "description": "Translated text content. Present when input `type` is `text`.",
            "example": "Bonjour, comment allez-vous aujourd'hui ?"
          },
          "download_url": {
            "type": "string",
            "format": "uri",
            "description": "Pre-signed URL to download the translated file. Valid for a limited time. Present when input `type` is `document`.",
            "example": "https://storage.example.com/results/9a1bc2f3-d405-4678-bcde-f12345678901.pdf"
          },
          "character_count": {
            "type": "integer",
            "description": "Number of characters in the source content.",
            "example": 1250
          }
        }
      },
      "translation_Attributes": {
        "description": "Full attributes of a translation job, combining input, job state, and result.",
        "allOf": [
          {
            "$ref": "#/components/schemas/Attributes"
          },
          {
            "$ref": "#/components/schemas/translation_AttributesCreate"
          },
          {
            "type": "object",
            "properties": {
              "result": {
                "readOnly": true,
                "description": "Translation output. Populated once status is `completed`.",
                "$ref": "#/components/schemas/translation_Result"
              }
            }
          }
        ]
      },
      "translation_Job": {
        "type": "object",
        "description": "A translation job resource, including its current status and result when available.",
        "properties": {
          "data": {
            "type": "object",
            "description": "JSON:API-style data envelope.",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "description": "Unique identifier for the translation job.",
                "example": "9a1bc2f3-d405-4678-bcde-f12345678901"
              },
              "type": {
                "type": "string",
                "enum": [
                  "translation-job"
                ],
                "description": "Resource type identifier. Always `translation-job`.",
                "example": "translation-job"
              },
              "attributes": {
                "$ref": "#/components/schemas/translation_Attributes"
              },
              "meta": {
                "$ref": "#/components/schemas/Meta"
              }
            }
          }
        }
      },
      "video-analysis_Input": {
        "type": "object",
        "description": "Source video and the list of analysis features to run.",
        "required": [
          "url",
          "features"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Publicly accessible URL of the video file.",
            "example": "https://cdn.example.com/videos/conference-talk.mp4"
          },
          "features": {
            "type": "array",
            "description": "One or more analysis capabilities to apply. At least one feature must be specified.",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/video-analysis_Feature"
            },
            "example": [
              "labels",
              "scenes",
              "speech_to_text",
              "summary"
            ]
          },
          "audio_track": {
            "type": "integer",
            "description": "Index of the audio track to use for speech-related features. Defaults to the first track when omitted.",
            "example": 0
          }
        }
      },
      "video-analysis_Options": {
        "type": "object",
        "description": "Optional settings controlling analysis behaviour.",
        "properties": {
          "language": {
            "type": "string",
            "description": "BCP 47 language code for speech and text features. Use `auto` to detect the language automatically.",
            "example": "auto"
          },
          "confidence_threshold": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Minimum confidence score (0–1) for a detection to be included in the result. Defaults to 0.5.",
            "example": 0.7
          },
          "priority": {
            "type": "string",
            "description": "Processing priority. Higher priority jobs are picked up sooner.",
            "enum": [
              "low",
              "standard",
              "high"
            ],
            "example": "standard"
          }
        }
      },
      "video-analysis_AttributesCreate": {
        "type": "object",
        "description": "Input fields required to create a video analysis job.",
        "required": [
          "input"
        ],
        "properties": {
          "input": {
            "$ref": "#/components/schemas/video-analysis_Input"
          },
          "options": {
            "$ref": "#/components/schemas/video-analysis_Options"
          },
          "webhook": {
            "$ref": "#/components/schemas/Webhook"
          },
          "provider": {
            "$ref": "#/components/schemas/Provider"
          }
        }
      },
      "video-analysis_CreateRequest": {
        "type": "object",
        "description": "Request body to create a new video analysis job.",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "description": "JSON:API-style data envelope.",
            "required": [
              "type",
              "attributes"
            ],
            "properties": {
              "type": {
                "type": "string",
                "description": "Resource type identifier. Must be `video-analysis-job`.",
                "example": "video-analysis-job"
              },
              "attributes": {
                "$ref": "#/components/schemas/video-analysis_AttributesCreate"
              },
              "meta": {
                "$ref": "#/components/schemas/Meta"
              }
            }
          }
        }
      },
      "VideoMetadata": {
        "type": "object",
        "description": "Technical properties of the processed video file.",
        "properties": {
          "duration": {
            "type": "number",
            "description": "Total duration of the video in seconds.",
            "example": 3742.5
          },
          "width": {
            "type": "integer",
            "description": "Video width in pixels.",
            "example": 1920
          },
          "height": {
            "type": "integer",
            "description": "Video height in pixels.",
            "example": 1080
          },
          "frame_rate": {
            "type": "number",
            "description": "Frames per second of the video.",
            "example": 29.97
          },
          "format": {
            "type": "string",
            "description": "Container format of the video file.",
            "example": "mp4"
          },
          "codec": {
            "type": "string",
            "description": "Video codec used for encoding.",
            "example": "h264"
          }
        }
      },
      "TimedInstance": {
        "type": "object",
        "description": "A time range in which a detection is active, with an optional per-occurrence confidence score.",
        "properties": {
          "start": {
            "type": "number",
            "description": "Start time of the occurrence in seconds.",
            "example": 12.5
          },
          "end": {
            "type": "number",
            "description": "End time of the occurrence in seconds.",
            "example": 15.8
          },
          "confidence": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Confidence score for this specific occurrence.",
            "example": 0.91
          }
        }
      },
      "LabelDetection": {
        "type": "object",
        "description": "A detected object, scene, or action with its temporal occurrences.",
        "properties": {
          "name": {
            "type": "string",
            "description": "Human-readable name of the detected label.",
            "example": "Conference room"
          },
          "confidence": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Overall confidence score for this label across the video.",
            "example": 0.94
          },
          "instances": {
            "type": "array",
            "description": "Time ranges in which this label was detected.",
            "items": {
              "$ref": "#/components/schemas/TimedInstance"
            }
          }
        }
      },
      "SceneDetection": {
        "type": "object",
        "description": "A distinct scene or shot within the video.",
        "properties": {
          "index": {
            "type": "integer",
            "description": "Zero-based position of this scene in the video.",
            "example": 3
          },
          "start": {
            "type": "number",
            "description": "Start time of the scene in seconds.",
            "example": 42
          },
          "end": {
            "type": "number",
            "description": "End time of the scene in seconds.",
            "example": 78.5
          }
        }
      },
      "FaceDetection": {
        "type": "object",
        "description": "A face detected and tracked across the video.",
        "properties": {
          "track_id": {
            "type": "integer",
            "description": "Integer identifier grouping all appearances of the same face within this video.",
            "example": 1
          },
          "fingerprint": {
            "type": "string",
            "description": "Base64-encoded face embedding vector produced by the underlying model. When present, fingerprints from different videos can be compared for similarity to determine whether the same person appears across videos. Fingerprints are only comparable when produced by the same backend model — cross-model comparison is not meaningful. Not all backends populate this field.\n",
            "example": "7hGkL2mXqP9nRsT4vWzA..."
          },
          "instances": {
            "type": "array",
            "description": "Time ranges in which this face is visible.",
            "items": {
              "$ref": "#/components/schemas/TimedInstance"
            }
          }
        }
      },
      "TranscriptSegment": {
        "type": "object",
        "description": "A speech-to-text segment with optional speaker attribution.",
        "properties": {
          "start": {
            "type": "number",
            "description": "Start time of the segment in seconds.",
            "example": 12.5
          },
          "end": {
            "type": "number",
            "description": "End time of the segment in seconds.",
            "example": 15.8
          },
          "text": {
            "type": "string",
            "description": "Transcribed speech for this time range.",
            "example": "Welcome to today's panel discussion on AI safety."
          },
          "speaker_id": {
            "type": "integer",
            "description": "Integer identifier grouping segments from the same speaker.",
            "example": 0
          },
          "language": {
            "type": "string",
            "description": "BCP 47 language code detected for this segment.",
            "example": "en"
          },
          "confidence": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Confidence score for this transcript segment.",
            "example": 0.97
          }
        }
      },
      "OcrText": {
        "type": "object",
        "description": "On-screen text detected within video frames.",
        "properties": {
          "text": {
            "type": "string",
            "description": "The detected text string.",
            "example": "Q3 Revenue: $4.2M"
          },
          "confidence": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Confidence score for this text detection.",
            "example": 0.91
          },
          "language": {
            "type": "string",
            "description": "BCP 47 language code of the detected text.",
            "example": "en"
          },
          "instances": {
            "type": "array",
            "description": "Time ranges in which this text is visible on screen.",
            "items": {
              "$ref": "#/components/schemas/TimedInstance"
            }
          }
        }
      },
      "ModerationSignal": {
        "type": "object",
        "description": "A specific content moderation signal with its temporal occurrences.",
        "properties": {
          "label": {
            "type": "string",
            "description": "Machine-readable label identifying the type of flagged content.",
            "enum": [
              "explicit_nudity",
              "suggestive",
              "violence",
              "visually_disturbing",
              "hate_symbols",
              "tobacco",
              "alcohol",
              "gambling"
            ],
            "example": "violence"
          },
          "confidence": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Overall confidence score for this signal across the video.",
            "example": 0.82
          },
          "instances": {
            "type": "array",
            "description": "Time ranges in which this signal was detected.",
            "items": {
              "$ref": "#/components/schemas/TimedInstance"
            }
          }
        }
      },
      "ContentModeration": {
        "type": "object",
        "description": "Content moderation signals detected in the video.",
        "properties": {
          "is_safe": {
            "type": "boolean",
            "description": "Whether the video passed moderation at the requested confidence threshold.",
            "example": true
          },
          "signals": {
            "type": "array",
            "description": "Individual moderation signals detected above the confidence threshold.",
            "items": {
              "$ref": "#/components/schemas/ModerationSignal"
            }
          }
        }
      },
      "SentimentInstance": {
        "type": "object",
        "description": "Sentiment detected within a specific time range.",
        "properties": {
          "start": {
            "type": "number",
            "description": "Start time of the segment in seconds.",
            "example": 0
          },
          "end": {
            "type": "number",
            "description": "End time of the segment in seconds.",
            "example": 45
          },
          "label": {
            "type": "string",
            "enum": [
              "positive",
              "neutral",
              "negative"
            ],
            "description": "Sentiment label for this time range.",
            "example": "positive"
          },
          "score": {
            "type": "number",
            "minimum": -1,
            "maximum": 1,
            "description": "Sentiment score for this time range.",
            "example": 0.71
          }
        }
      },
      "Sentiment": {
        "type": "object",
        "description": "Overall sentiment and tone of the video.",
        "properties": {
          "overall": {
            "type": "string",
            "description": "Dominant sentiment across the entire video.",
            "enum": [
              "positive",
              "neutral",
              "negative"
            ],
            "example": "positive"
          },
          "score": {
            "type": "number",
            "minimum": -1,
            "maximum": 1,
            "description": "Aggregate sentiment score from -1 (most negative) to 1 (most positive).",
            "example": 0.62
          },
          "instances": {
            "type": "array",
            "description": "Sentiment variations across the video timeline.",
            "items": {
              "$ref": "#/components/schemas/SentimentInstance"
            }
          }
        }
      },
      "Topic": {
        "type": "object",
        "description": "A topic or keyword extracted from the video content.",
        "properties": {
          "name": {
            "type": "string",
            "description": "Topic or keyword name.",
            "example": "artificial intelligence"
          },
          "confidence": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Confidence score for this topic.",
            "example": 0.95
          },
          "instances": {
            "type": "array",
            "description": "Time ranges in which this topic is relevant.",
            "items": {
              "$ref": "#/components/schemas/TimedInstance"
            }
          }
        }
      },
      "BrandDetection": {
        "type": "object",
        "description": "A detected brand logo or visual trademark.",
        "properties": {
          "name": {
            "type": "string",
            "description": "Name of the detected brand.",
            "example": "Acme Corp"
          },
          "confidence": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Overall confidence score for this brand detection.",
            "example": 0.88
          },
          "instances": {
            "type": "array",
            "description": "Time ranges in which this brand is visible on screen.",
            "items": {
              "$ref": "#/components/schemas/TimedInstance"
            }
          }
        }
      },
      "video-analysis_Result": {
        "type": "object",
        "description": "Output of a completed video analysis job. Only fields corresponding to the requested features are populated.",
        "properties": {
          "video_metadata": {
            "readOnly": true,
            "$ref": "#/components/schemas/VideoMetadata"
          },
          "labels": {
            "readOnly": true,
            "type": "array",
            "description": "Detected objects, scenes, and actions. Present when `labels` was requested.",
            "items": {
              "$ref": "#/components/schemas/LabelDetection"
            }
          },
          "scenes": {
            "readOnly": true,
            "type": "array",
            "description": "Scene and shot boundaries. Present when `scenes` was requested.",
            "items": {
              "$ref": "#/components/schemas/SceneDetection"
            }
          },
          "faces": {
            "readOnly": true,
            "type": "array",
            "description": "Faces detected and tracked across the video. Present when `faces` was requested.",
            "items": {
              "$ref": "#/components/schemas/FaceDetection"
            }
          },
          "speech_to_text": {
            "readOnly": true,
            "type": "array",
            "description": "Speech-to-text segments with speaker identification. Present when `speech_to_text` was requested.",
            "items": {
              "$ref": "#/components/schemas/TranscriptSegment"
            }
          },
          "ocr": {
            "readOnly": true,
            "type": "array",
            "description": "On-screen text extracted from video frames. Present when `ocr` was requested.",
            "items": {
              "$ref": "#/components/schemas/OcrText"
            }
          },
          "content_moderation": {
            "readOnly": true,
            "description": "Content moderation signals. Present when `content_moderation` was requested.",
            "$ref": "#/components/schemas/ContentModeration"
          },
          "sentiment": {
            "readOnly": true,
            "description": "Overall tone and sentiment of the video. Present when `sentiment` was requested.",
            "$ref": "#/components/schemas/Sentiment"
          },
          "topics": {
            "readOnly": true,
            "type": "array",
            "description": "Key topics and keywords extracted from the video. Present when `topics` was requested.",
            "items": {
              "$ref": "#/components/schemas/Topic"
            }
          },
          "brands": {
            "readOnly": true,
            "type": "array",
            "description": "Detected brand logos and visual trademarks. Present when `brands` was requested.",
            "items": {
              "$ref": "#/components/schemas/BrandDetection"
            }
          },
          "summary": {
            "readOnly": true,
            "type": "string",
            "description": "Natural-language description of the video content. Present when `summary` was requested.",
            "example": "A panel discussion on AI safety featuring three researchers. The conversation covers alignment challenges, regulatory proposals, and near-term risk mitigation strategies.\n"
          }
        }
      },
      "video-analysis_Attributes": {
        "description": "Full attributes of a video analysis job, combining input, job state, and result.",
        "allOf": [
          {
            "$ref": "#/components/schemas/Attributes"
          },
          {
            "$ref": "#/components/schemas/video-analysis_AttributesCreate"
          },
          {
            "type": "object",
            "properties": {
              "result": {
                "readOnly": true,
                "description": "Video analysis output. Populated once status is `completed`.",
                "$ref": "#/components/schemas/video-analysis_Result"
              }
            }
          }
        ]
      },
      "video-analysis_Job": {
        "type": "object",
        "description": "A video analysis job resource, including its current status and result when available.",
        "properties": {
          "data": {
            "type": "object",
            "description": "JSON:API-style data envelope.",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "description": "Unique identifier for the video analysis job.",
                "example": "3e7dc4b2-91f0-4a1e-8c2d-b56789012345"
              },
              "type": {
                "type": "string",
                "enum": [
                  "video-analysis-job"
                ],
                "description": "Resource type identifier. Always `video-analysis-job`.",
                "example": "video-analysis-job"
              },
              "attributes": {
                "$ref": "#/components/schemas/video-analysis_Attributes"
              },
              "meta": {
                "$ref": "#/components/schemas/Meta"
              }
            }
          }
        }
      },
      "WebhookPayload": {
        "description": "Envelope delivered to your webhook URL on every transcription job lifecycle event. The `event` field identifies the transition that occurred; `data` contains the full job resource at the time the event was triggered.\n",
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "The lifecycle event that triggered this notification. `transcription.progress`: the job is processing; `data.attributes.progress` is updated. `transcription.completed`: the job finished successfully; `data.attributes.result` is populated. `transcription.failed`: the job encountered an unrecoverable error; `data.attributes.error` is populated.\n",
                "enum": [
                  "transcription.progress",
                  "transcription.completed",
                  "transcription.failed"
                ],
                "example": "transcription.completed"
              }
            }
          },
          {
            "$ref": "#/components/schemas/Job"
          }
        ]
      },
      "translation_WebhookPayload": {
        "description": "Envelope delivered to your webhook URL on every translation job lifecycle event. The `event` field identifies the transition that occurred; `data` contains the full job resource at the time the event was triggered.\n",
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "The lifecycle event that triggered this notification. `translation.progress`: the job is processing; `data.attributes.progress` is updated. `translation.completed`: the job finished successfully; `data.attributes.result` is populated. `translation.failed`: the job encountered an unrecoverable error; `data.attributes.error` is populated.\n",
                "enum": [
                  "translation.progress",
                  "translation.completed",
                  "translation.failed"
                ],
                "example": "translation.completed"
              }
            }
          },
          {
            "$ref": "#/components/schemas/translation_Job"
          }
        ]
      },
      "video-analysis_WebhookPayload": {
        "description": "Envelope delivered to your webhook URL on every video analysis job lifecycle event. The `event` field identifies the transition that occurred; `data` contains the full job resource at the time the event was triggered.\n",
        "allOf": [
          {
            "type": "object",
            "required": [
              "event"
            ],
            "properties": {
              "event": {
                "type": "string",
                "description": "The lifecycle event that triggered this notification. `video-analysis.progress`: the job is processing; `data.attributes.progress` is updated. `video-analysis.completed`: the job finished successfully; `data.attributes.result` is populated. `video-analysis.failed`: the job encountered an unrecoverable error; `data.attributes.error` is populated.\n",
                "enum": [
                  "video-analysis.progress",
                  "video-analysis.completed",
                  "video-analysis.failed"
                ],
                "example": "video-analysis.completed"
              }
            }
          },
          {
            "$ref": "#/components/schemas/video-analysis_Job"
          }
        ]
      }
    }
  }
}
