openapi: 3.0.1 info: title: TwelveLabs API description: >- REST API for the TwelveLabs video-understanding platform. Upload and index video, run any-to-video semantic search (Marengo), generate text from video (Pegasus) - open-ended analysis, gist, and summaries - and create multimodal embeddings. All requests are authenticated with an `x-api-key` header. termsOfService: https://www.twelvelabs.io/terms-of-use contact: name: TwelveLabs Support url: https://docs.twelvelabs.io email: support@twelvelabs.io version: '1.3' servers: - url: https://api.twelvelabs.io/v1.3 security: - apiKeyAuth: [] tags: - name: Indexes description: Create and manage video indexes. - name: Videos description: Manage videos within an index. - name: Tasks description: Upload and index video via asynchronous indexing tasks. - name: Search description: Any-to-video semantic search powered by Marengo. - name: Analyze description: Generate text from video with Pegasus (analyze, gist, summarize). - name: Embed description: Create multimodal Marengo embeddings. paths: /indexes: get: operationId: listIndexes tags: - Indexes summary: List indexes description: Returns a list of the indexes in your account, with pagination. parameters: - name: page in: query schema: type: integer default: 1 description: Page number to retrieve. - name: page_limit in: query schema: type: integer default: 10 maximum: 50 description: Number of items per page. - name: sort_by in: query schema: type: string enum: [created_at, updated_at] default: created_at description: Field to sort by. - name: sort_option in: query schema: type: string enum: [asc, desc] default: desc description: Sort direction. - name: index_name in: query schema: type: string description: Filter by index name. responses: '200': description: OK content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Index' page_info: $ref: '#/components/schemas/PageInfo' post: operationId: createIndex tags: - Indexes summary: Create an index description: >- Creates an index configured with one or more video understanding models (Marengo for search/embeddings, Pegasus for analysis) and the modalities to enable. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateIndexRequest' responses: '201': description: Created content: application/json: schema: type: object properties: _id: type: string /indexes/{index_id}: get: operationId: retrieveIndex tags: - Indexes summary: Retrieve an index parameters: - $ref: '#/components/parameters/IndexId' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Index' put: operationId: updateIndex tags: - Indexes summary: Update an index description: Updates the name of the specified index. parameters: - $ref: '#/components/parameters/IndexId' requestBody: required: true content: application/json: schema: type: object required: - index_name properties: index_name: type: string responses: '200': description: OK delete: operationId: deleteIndex tags: - Indexes summary: Delete an index parameters: - $ref: '#/components/parameters/IndexId' responses: '204': description: No Content /indexes/{index_id}/videos: get: operationId: listVideos tags: - Videos summary: List videos description: Returns the videos indexed within the specified index. parameters: - $ref: '#/components/parameters/IndexId' - name: page in: query schema: type: integer default: 1 - name: page_limit in: query schema: type: integer default: 10 maximum: 50 - name: sort_by in: query schema: type: string enum: [created_at, updated_at] default: created_at - name: sort_option in: query schema: type: string enum: [asc, desc] default: desc responses: '200': description: OK content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Video' page_info: $ref: '#/components/schemas/PageInfo' /indexes/{index_id}/videos/{video_id}: get: operationId: retrieveVideo tags: - Videos summary: Retrieve video information parameters: - $ref: '#/components/parameters/IndexId' - $ref: '#/components/parameters/VideoId' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Video' put: operationId: updateVideo tags: - Videos summary: Update video information description: Updates the title and user metadata of the specified video. parameters: - $ref: '#/components/parameters/IndexId' - $ref: '#/components/parameters/VideoId' requestBody: required: true content: application/json: schema: type: object properties: video_title: type: string user_metadata: type: object additionalProperties: true responses: '200': description: OK delete: operationId: deleteVideo tags: - Videos summary: Delete a video parameters: - $ref: '#/components/parameters/IndexId' - $ref: '#/components/parameters/VideoId' responses: '204': description: No Content /tasks: get: operationId: listTasks tags: - Tasks summary: List video indexing tasks parameters: - name: index_id in: query schema: type: string description: Filter tasks by index. - name: status in: query schema: type: string enum: [validating, pending, queued, indexing, ready, failed] description: Filter tasks by status. - name: page in: query schema: type: integer default: 1 - name: page_limit in: query schema: type: integer default: 10 maximum: 50 responses: '200': description: OK content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Task' page_info: $ref: '#/components/schemas/PageInfo' post: operationId: createTask tags: - Tasks summary: Create a video indexing task description: >- Uploads a video by local file or public URL and indexes it into the target index. Returns a task whose status can be polled until it becomes `ready`. requestBody: required: true content: multipart/form-data: schema: type: object required: - index_id properties: index_id: type: string description: Unique identifier of the target index. video_file: type: string format: binary description: The video file to upload (use this OR video_url). video_url: type: string description: Publicly accessible URL of the video (use this OR video_file). enable_video_stream: type: boolean default: true description: Whether the platform stores the video for streaming. user_metadata: type: string description: JSON-encoded user metadata for categorization. responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/Task' /tasks/{task_id}: get: operationId: retrieveTask tags: - Tasks summary: Retrieve a video indexing task description: Returns the status and details of a specific indexing task. parameters: - $ref: '#/components/parameters/TaskId' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Task' delete: operationId: deleteTask tags: - Tasks summary: Delete a video indexing task parameters: - $ref: '#/components/parameters/TaskId' responses: '204': description: No Content /search: post: operationId: createSearch tags: - Search summary: Make any-to-video search request description: >- Searches an index using a text query and/or media (image) queries. Powered by Marengo. Returns paginated clip or video matches with relevance scores and timestamps. requestBody: required: true content: multipart/form-data: schema: type: object required: - index_id - search_options properties: index_id: type: string description: Unique identifier of the index to search. search_options: type: array description: Sources of information the platform uses. items: type: string enum: [visual, audio] query_text: type: string description: Natural-language query (up to 500 tokens). query_media_type: type: string enum: [image] description: Type of media query. query_media_url: type: string description: Publicly accessible URL of the query media. query_media_file: type: string format: binary description: Local query media file. group_by: type: string enum: [clip, video] default: clip operator: type: string enum: [or, and] default: or page_limit: type: integer default: 10 maximum: 50 filter: type: string description: Stringified JSON filter over video metadata. threshold: type: string enum: [high, medium, low, none] description: Minimum confidence level of returned results. sort_option: type: string enum: [score, clip_count] default: score responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/SearchResults' /search/{page_token}: get: operationId: retrieveSearchPage tags: - Search summary: Retrieve a specific page of search results description: >- Retrieves a subsequent page of search results using the `next_page_token` returned by a prior search request. parameters: - name: page_token in: path required: true schema: type: string description: Token identifying the page of results to retrieve. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/SearchResults' /analyze: post: operationId: analyzeVideo tags: - Analyze summary: Sync analysis (open-ended text generation) description: >- Generates open-ended text from a video with the Pegasus model based on a prompt. Returns the result in a single response, or as an NDJSON stream when `stream` is true (default). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AnalyzeRequest' responses: '200': description: OK. Single JSON response, or `application/x-ndjson` event stream when stream=true. content: application/json: schema: $ref: '#/components/schemas/AnalyzeResponse' application/x-ndjson: schema: $ref: '#/components/schemas/AnalyzeStreamEvent' /gist: post: operationId: generateGist tags: - Analyze summary: Generate gist (titles, topics, hashtags) description: >- Generates titles, topics, and/or hashtags for an indexed video using Pegasus, based on the requested gist types. requestBody: required: true content: application/json: schema: type: object required: - video_id - types properties: video_id: type: string description: Unique identifier of the video. types: type: array description: The gist types to generate. items: type: string enum: [title, topic, hashtag] responses: '200': description: OK content: application/json: schema: type: object properties: id: type: string title: type: string topics: type: array items: type: string hashtags: type: array items: type: string usage: $ref: '#/components/schemas/Usage' /summarize: post: operationId: summarizeVideo tags: - Analyze summary: Generate summaries, chapters, or highlights description: >- Generates a summary, chapters, or highlights for an indexed video using Pegasus, optionally guided by a prompt. requestBody: required: true content: application/json: schema: type: object required: - video_id - type properties: video_id: type: string description: Unique identifier of the video. type: type: string enum: [summary, chapter, highlight] description: The kind of text to generate. prompt: type: string description: Optional context to guide generation (up to 2,000 tokens). temperature: type: number default: 0.2 minimum: 0 maximum: 1 responses: '200': description: OK content: application/json: schema: type: object properties: id: type: string summary: type: string chapters: type: array items: type: object properties: chapter_number: type: integer start: type: number end: type: number chapter_title: type: string chapter_summary: type: string highlights: type: array items: type: object properties: start: type: number end: type: number highlight: type: string usage: $ref: '#/components/schemas/Usage' /embed: post: operationId: createEmbeddings tags: - Embed summary: Create sync embeddings description: >- Creates Marengo embeddings for text, image, audio, or short video in a single shared multimodal vector space. For longer audio/video, use the asynchronous embedding task endpoints. requestBody: required: true content: multipart/form-data: schema: type: object required: - model_name properties: model_name: type: string description: The Marengo embedding model, e.g. Marengo-retrieval-2.7. text: type: string description: Text to embed. image_url: type: string image_file: type: string format: binary audio_url: type: string audio_file: type: string format: binary video_url: type: string description: URL of a short (<10 min) video to embed. video_file: type: string format: binary responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/EmbeddingResponse' /embed/tasks: post: operationId: createEmbeddingTask tags: - Embed summary: Create an async embedding task description: >- Creates an asynchronous embedding task for longer audio and video (up to several hours). Results are stored for seven days. requestBody: required: true content: multipart/form-data: schema: type: object required: - model_name properties: model_name: type: string video_url: type: string video_file: type: string format: binary video_embedding_scopes: type: array items: type: string enum: [clip, video] responses: '201': description: Created content: application/json: schema: type: object properties: _id: type: string get: operationId: listEmbeddingTasks tags: - Embed summary: List async embedding tasks parameters: - name: page in: query schema: type: integer default: 1 - name: page_limit in: query schema: type: integer default: 10 maximum: 50 responses: '200': description: OK content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/EmbeddingTask' page_info: $ref: '#/components/schemas/PageInfo' /embed/tasks/{task_id}: get: operationId: retrieveEmbeddingTask tags: - Embed summary: Retrieve embedding task status and results parameters: - $ref: '#/components/parameters/TaskId' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/EmbeddingTask' components: securitySchemes: apiKeyAuth: type: apiKey in: header name: x-api-key description: TwelveLabs API key sent in the `x-api-key` request header. parameters: IndexId: name: index_id in: path required: true schema: type: string description: Unique identifier of the index. VideoId: name: video_id in: path required: true schema: type: string description: Unique identifier of the video. TaskId: name: task_id in: path required: true schema: type: string description: Unique identifier of the task. schemas: PageInfo: type: object properties: limit_per_page: type: integer total_results: type: integer page: type: integer total_page: type: integer next_page_token: type: string prev_page_token: type: string ModelConfig: type: object required: - model_name - model_options properties: model_name: type: string description: e.g. marengo3.0 or pegasus1.2. model_options: type: array items: type: string enum: [visual, audio] CreateIndexRequest: type: object required: - index_name - models properties: index_name: type: string models: type: array items: $ref: '#/components/schemas/ModelConfig' addons: type: array items: type: string enum: [thumbnail] Index: type: object properties: _id: type: string index_name: type: string models: type: array items: $ref: '#/components/schemas/ModelConfig' video_count: type: integer total_duration: type: number addons: type: array items: type: string created_at: type: string format: date-time updated_at: type: string format: date-time Video: type: object properties: _id: type: string created_at: type: string format: date-time updated_at: type: string format: date-time indexed_at: type: string format: date-time system_metadata: type: object properties: duration: type: number filename: type: string fps: type: number height: type: integer width: type: integer video_title: type: string user_metadata: type: object additionalProperties: true hls: type: object properties: video_url: type: string thumbnail_urls: type: array items: type: string status: type: string Task: type: object properties: _id: type: string index_id: type: string video_id: type: string status: type: string enum: [validating, pending, queued, indexing, ready, failed] created_at: type: string format: date-time updated_at: type: string format: date-time estimated_time: type: string format: date-time system_metadata: type: object properties: duration: type: number filename: type: string SearchResults: type: object properties: search_pool: type: object properties: total_count: type: integer total_duration: type: number index_id: type: string data: type: array items: $ref: '#/components/schemas/SearchClip' page_info: $ref: '#/components/schemas/PageInfo' SearchClip: type: object properties: score: type: number start: type: number end: type: number video_id: type: string confidence: type: string enum: [high, medium, low] thumbnail_url: type: string clips: type: array items: type: object properties: score: type: number start: type: number end: type: number video_id: type: string confidence: type: string AnalyzeRequest: type: object required: - video_id - prompt properties: video_id: type: string description: Unique identifier of the video to analyze. prompt: type: string description: The prompt guiding the analysis (up to 2,000 tokens). temperature: type: number default: 0.2 minimum: 0 maximum: 1 stream: type: boolean default: true description: When true, results are streamed as NDJSON events. max_tokens: type: integer description: Maximum number of tokens in the generated text. response_format: type: object description: Optional structured output format (json_schema). AnalyzeResponse: type: object properties: id: type: string data: type: string description: The generated text. finish_reason: type: string usage: $ref: '#/components/schemas/Usage' AnalyzeStreamEvent: type: object description: One NDJSON event emitted while streaming an analyze response. properties: event_type: type: string enum: [stream_start, text_generation, stream_end] text: type: string description: A slice of generated text (text_generation events). finish_reason: type: string metadata: type: object properties: generation_id: type: string usage: $ref: '#/components/schemas/Usage' EmbeddingResponse: type: object properties: model_name: type: string text_embedding: $ref: '#/components/schemas/EmbeddingSegments' image_embedding: $ref: '#/components/schemas/EmbeddingSegments' audio_embedding: $ref: '#/components/schemas/EmbeddingSegments' video_embedding: $ref: '#/components/schemas/EmbeddingSegments' EmbeddingSegments: type: object properties: segments: type: array items: type: object properties: float: type: array items: type: number start_offset_sec: type: number end_offset_sec: type: number embedding_scope: type: string enum: [clip, video] EmbeddingTask: type: object properties: _id: type: string model_name: type: string status: type: string enum: [processing, ready, failed] created_at: type: string format: date-time video_embedding: $ref: '#/components/schemas/EmbeddingSegments' Usage: type: object properties: output_tokens: type: integer input_tokens: type: integer Error: type: object properties: code: type: string message: type: string