curl --request POST \
--url https://api.cloudglue.dev/v1/describe \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>",
"enable_summary": true,
"enable_speech": true,
"enable_visual_scene_description": true,
"enable_scene_text": true,
"enable_audio_description": true,
"include_chapters": false,
"include_shots": false,
"use_in_default_index": true,
"participants": [
{
"name": "<string>",
"scope": "<string>"
}
],
"prompt": "<string>",
"include_metadata": false,
"segmentation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://api.cloudglue.dev/v1/describe"
payload = {
"url": "<string>",
"enable_summary": True,
"enable_speech": True,
"enable_visual_scene_description": True,
"enable_scene_text": True,
"enable_audio_description": True,
"include_chapters": False,
"include_shots": False,
"use_in_default_index": True,
"participants": [
{
"name": "<string>",
"scope": "<string>"
}
],
"prompt": "<string>",
"include_metadata": False,
"segmentation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
url: '<string>',
enable_summary: true,
enable_speech: true,
enable_visual_scene_description: true,
enable_scene_text: true,
enable_audio_description: true,
include_chapters: false,
include_shots: false,
use_in_default_index: true,
participants: [{name: '<string>', scope: '<string>'}],
prompt: '<string>',
include_metadata: false,
segmentation_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://api.cloudglue.dev/v1/describe', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cloudglue.dev/v1/describe",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => '<string>',
'enable_summary' => true,
'enable_speech' => true,
'enable_visual_scene_description' => true,
'enable_scene_text' => true,
'enable_audio_description' => true,
'include_chapters' => false,
'include_shots' => false,
'use_in_default_index' => true,
'participants' => [
[
'name' => '<string>',
'scope' => '<string>'
]
],
'prompt' => '<string>',
'include_metadata' => false,
'segmentation_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.cloudglue.dev/v1/describe"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"enable_summary\": true,\n \"enable_speech\": true,\n \"enable_visual_scene_description\": true,\n \"enable_scene_text\": true,\n \"enable_audio_description\": true,\n \"include_chapters\": false,\n \"include_shots\": false,\n \"use_in_default_index\": true,\n \"participants\": [\n {\n \"name\": \"<string>\",\n \"scope\": \"<string>\"\n }\n ],\n \"prompt\": \"<string>\",\n \"include_metadata\": false,\n \"segmentation_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.cloudglue.dev/v1/describe")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"enable_summary\": true,\n \"enable_speech\": true,\n \"enable_visual_scene_description\": true,\n \"enable_scene_text\": true,\n \"enable_audio_description\": true,\n \"include_chapters\": false,\n \"include_shots\": false,\n \"use_in_default_index\": true,\n \"participants\": [\n {\n \"name\": \"<string>\",\n \"scope\": \"<string>\"\n }\n ],\n \"prompt\": \"<string>\",\n \"include_metadata\": false,\n \"segmentation_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cloudglue.dev/v1/describe")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"<string>\",\n \"enable_summary\": true,\n \"enable_speech\": true,\n \"enable_visual_scene_description\": true,\n \"enable_scene_text\": true,\n \"enable_audio_description\": true,\n \"include_chapters\": false,\n \"include_shots\": false,\n \"use_in_default_index\": true,\n \"participants\": [\n {\n \"name\": \"<string>\",\n \"scope\": \"<string>\"\n }\n ],\n \"prompt\": \"<string>\",\n \"include_metadata\": false,\n \"segmentation_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"job_id": "<string>",
"status": "pending",
"url": "<string>",
"duration_seconds": 123,
"thumbnail_url": "<string>",
"created_at": 123,
"describe_config": {
"enable_summary": true,
"enable_speech": true,
"enable_visual_scene_description": true,
"enable_scene_text": true,
"enable_audio_description": true,
"participants": [
{
"name": "<string>",
"scope": "<string>"
}
],
"prompt": "<string>"
},
"use_in_default_index": true,
"data": {
"content": "<string>",
"title": "<string>",
"summary": "<string>",
"segment_summary": [
{
"title": "<string>",
"summary": "<string>",
"start_time": 123,
"end_time": 123,
"thumbnail_url": "<string>"
}
],
"visual_scene_description": [
{
"text": "<string>",
"start_time": 123,
"end_time": 123
}
],
"scene_text": [
{
"text": "<string>",
"start_time": 123,
"end_time": 123
}
],
"speech": [
{
"speaker": "<string>",
"text": "<string>",
"start_time": 123,
"end_time": 123,
"words": [
{
"word": "<string>",
"start_time": 123,
"end_time": 123
}
]
}
],
"audio_description": [
{
"text": "<string>",
"start_time": 123,
"end_time": 123
}
]
},
"error": "<string>",
"segmentation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"chapters": [
{
"index": 1,
"start_time": 1,
"end_time": 1,
"description": "<string>"
}
],
"shots": [
{
"index": 1,
"start_time": 1,
"end_time": 1
}
],
"total_chapters": 1,
"total_shots": 1,
"file": {
"id": "<string>",
"status": "pending",
"uri": "<string>",
"bytes": 123,
"created_at": 123,
"filename": "<string>",
"metadata": {},
"media_type": "video",
"media_info": {
"duration_seconds": 123,
"width": 123,
"height": 123,
"sample_rate": 123,
"channels": 123,
"bitrate": 123,
"format": "<string>",
"has_audio": true
},
"video_info": {
"duration_seconds": 123,
"height": 123,
"width": 123,
"format": "<string>",
"has_audio": true
},
"thumbnail_url": "<string>",
"source": "video",
"source_metadata": {
"source_type": "grain",
"grain_recording_id": "<string>",
"title": "<string>",
"start_datetime": "2023-11-07T05:31:56Z",
"end_datetime": "2023-11-07T05:31:56Z",
"duration_ms": 123,
"media_type": "audio",
"upstream_source": "aircall",
"grain_url": "<string>",
"thumbnail_url": "<string>",
"tags": [
"<string>"
],
"teams": [
{
"id": "<string>",
"name": "<string>"
}
],
"meeting_type": {
"id": "<string>",
"name": "<string>",
"scope": "<string>"
},
"participants": [
{
"id": "<string>",
"name": "<string>",
"email": "<string>",
"scope": "internal",
"confirmed_attendee": true,
"hs_contact_id": "<string>"
}
],
"highlights": [
{}
],
"ai_summary": {
"text": "<string>"
},
"ai_action_items": [
{
"status": "pending",
"timestamp_ms": 123,
"text": "<string>",
"assignee": {
"id": "<string>",
"name": "<string>",
"user_id": "<string>"
}
}
],
"ai_template_sections": [
{}
],
"calendar_event": {
"ical_uid": "<string>"
},
"hubspot": {
"hubspot_company_ids": [
"<string>"
],
"hubspot_deal_ids": [
"<string>"
]
}
}
}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Describe Video
Get a comprehensive multimodal description of a video
curl --request POST \
--url https://api.cloudglue.dev/v1/describe \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>",
"enable_summary": true,
"enable_speech": true,
"enable_visual_scene_description": true,
"enable_scene_text": true,
"enable_audio_description": true,
"include_chapters": false,
"include_shots": false,
"use_in_default_index": true,
"participants": [
{
"name": "<string>",
"scope": "<string>"
}
],
"prompt": "<string>",
"include_metadata": false,
"segmentation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://api.cloudglue.dev/v1/describe"
payload = {
"url": "<string>",
"enable_summary": True,
"enable_speech": True,
"enable_visual_scene_description": True,
"enable_scene_text": True,
"enable_audio_description": True,
"include_chapters": False,
"include_shots": False,
"use_in_default_index": True,
"participants": [
{
"name": "<string>",
"scope": "<string>"
}
],
"prompt": "<string>",
"include_metadata": False,
"segmentation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
url: '<string>',
enable_summary: true,
enable_speech: true,
enable_visual_scene_description: true,
enable_scene_text: true,
enable_audio_description: true,
include_chapters: false,
include_shots: false,
use_in_default_index: true,
participants: [{name: '<string>', scope: '<string>'}],
prompt: '<string>',
include_metadata: false,
segmentation_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://api.cloudglue.dev/v1/describe', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cloudglue.dev/v1/describe",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => '<string>',
'enable_summary' => true,
'enable_speech' => true,
'enable_visual_scene_description' => true,
'enable_scene_text' => true,
'enable_audio_description' => true,
'include_chapters' => false,
'include_shots' => false,
'use_in_default_index' => true,
'participants' => [
[
'name' => '<string>',
'scope' => '<string>'
]
],
'prompt' => '<string>',
'include_metadata' => false,
'segmentation_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.cloudglue.dev/v1/describe"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"enable_summary\": true,\n \"enable_speech\": true,\n \"enable_visual_scene_description\": true,\n \"enable_scene_text\": true,\n \"enable_audio_description\": true,\n \"include_chapters\": false,\n \"include_shots\": false,\n \"use_in_default_index\": true,\n \"participants\": [\n {\n \"name\": \"<string>\",\n \"scope\": \"<string>\"\n }\n ],\n \"prompt\": \"<string>\",\n \"include_metadata\": false,\n \"segmentation_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.cloudglue.dev/v1/describe")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"enable_summary\": true,\n \"enable_speech\": true,\n \"enable_visual_scene_description\": true,\n \"enable_scene_text\": true,\n \"enable_audio_description\": true,\n \"include_chapters\": false,\n \"include_shots\": false,\n \"use_in_default_index\": true,\n \"participants\": [\n {\n \"name\": \"<string>\",\n \"scope\": \"<string>\"\n }\n ],\n \"prompt\": \"<string>\",\n \"include_metadata\": false,\n \"segmentation_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cloudglue.dev/v1/describe")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"<string>\",\n \"enable_summary\": true,\n \"enable_speech\": true,\n \"enable_visual_scene_description\": true,\n \"enable_scene_text\": true,\n \"enable_audio_description\": true,\n \"include_chapters\": false,\n \"include_shots\": false,\n \"use_in_default_index\": true,\n \"participants\": [\n {\n \"name\": \"<string>\",\n \"scope\": \"<string>\"\n }\n ],\n \"prompt\": \"<string>\",\n \"include_metadata\": false,\n \"segmentation_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"job_id": "<string>",
"status": "pending",
"url": "<string>",
"duration_seconds": 123,
"thumbnail_url": "<string>",
"created_at": 123,
"describe_config": {
"enable_summary": true,
"enable_speech": true,
"enable_visual_scene_description": true,
"enable_scene_text": true,
"enable_audio_description": true,
"participants": [
{
"name": "<string>",
"scope": "<string>"
}
],
"prompt": "<string>"
},
"use_in_default_index": true,
"data": {
"content": "<string>",
"title": "<string>",
"summary": "<string>",
"segment_summary": [
{
"title": "<string>",
"summary": "<string>",
"start_time": 123,
"end_time": 123,
"thumbnail_url": "<string>"
}
],
"visual_scene_description": [
{
"text": "<string>",
"start_time": 123,
"end_time": 123
}
],
"scene_text": [
{
"text": "<string>",
"start_time": 123,
"end_time": 123
}
],
"speech": [
{
"speaker": "<string>",
"text": "<string>",
"start_time": 123,
"end_time": 123,
"words": [
{
"word": "<string>",
"start_time": 123,
"end_time": 123
}
]
}
],
"audio_description": [
{
"text": "<string>",
"start_time": 123,
"end_time": 123
}
]
},
"error": "<string>",
"segmentation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"chapters": [
{
"index": 1,
"start_time": 1,
"end_time": 1,
"description": "<string>"
}
],
"shots": [
{
"index": 1,
"start_time": 1,
"end_time": 1
}
],
"total_chapters": 1,
"total_shots": 1,
"file": {
"id": "<string>",
"status": "pending",
"uri": "<string>",
"bytes": 123,
"created_at": 123,
"filename": "<string>",
"metadata": {},
"media_type": "video",
"media_info": {
"duration_seconds": 123,
"width": 123,
"height": 123,
"sample_rate": 123,
"channels": 123,
"bitrate": 123,
"format": "<string>",
"has_audio": true
},
"video_info": {
"duration_seconds": 123,
"height": 123,
"width": 123,
"format": "<string>",
"has_audio": true
},
"thumbnail_url": "<string>",
"source": "video",
"source_metadata": {
"source_type": "grain",
"grain_recording_id": "<string>",
"title": "<string>",
"start_datetime": "2023-11-07T05:31:56Z",
"end_datetime": "2023-11-07T05:31:56Z",
"duration_ms": 123,
"media_type": "audio",
"upstream_source": "aircall",
"grain_url": "<string>",
"thumbnail_url": "<string>",
"tags": [
"<string>"
],
"teams": [
{
"id": "<string>",
"name": "<string>"
}
],
"meeting_type": {
"id": "<string>",
"name": "<string>",
"scope": "<string>"
},
"participants": [
{
"id": "<string>",
"name": "<string>",
"email": "<string>",
"scope": "internal",
"confirmed_attendee": true,
"hs_contact_id": "<string>"
}
],
"highlights": [
{}
],
"ai_summary": {
"text": "<string>"
},
"ai_action_items": [
{
"status": "pending",
"timestamp_ms": 123,
"text": "<string>",
"assignee": {
"id": "<string>",
"name": "<string>",
"user_id": "<string>"
}
}
],
"ai_template_sections": [
{}
],
"calendar_event": {
"ical_uid": "<string>"
},
"hubspot": {
"hubspot_company_ids": [
"<string>"
],
"hubspot_deal_ids": [
"<string>"
]
}
}
}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Media description job parameters
Input media URL. Supports URIs of files uploaded to Cloudglue Files endpoint, public YouTube video URLs, public TikTok video URLs, public Loom share URLs, public HTTP URLs (including direct image URLs such as JPEG/PNG/WebP), and files which have been granted access to Cloudglue via data connectors.
Note that YouTube videos are currently limited to speech level understanding only. Public TikTok video URLs will be scraped and stored automatically — subject to charges. For files via our Data connectors, see our documentation on data connectors for setup information.
Whether to generate video-level and segment-level (moment-level) summaries and titles
Whether to generate speech transcript
Whether to generate visual scene description
Whether to generate scene text extraction
Whether to generate audio description
Show child attributes
Show child attributes
Include narrative chapters in the response when segmentation strategy is 'narrative'. Only affects cached completed results; newly created pending jobs do not include chapters.
Include shot boundaries in the response when segmentation strategy is 'shot-detector'. Only affects cached completed results; newly created pending jobs do not include shots.
When true, the video's search documents will be added to the account's default index, making them searchable via the Response API and Deep Search API with source: 'default'.
Known participants on the recording. When provided, speaker naming is constrained to these people: transcript speaker labels will only use one of these names (or a generic "Speaker N"), never an invented name. Intended for uploaded files, which (unlike data-connector files such as Grain) carry no participant metadata; for connector files this is populated automatically and need not be supplied.
50Show child attributes
Show child attributes
Optional free-form guidance for the description. Use it to name the terms, product names, acronyms, or people that matter for this media and how they are spelled, or to say what the description should pay attention to — e.g. "Spell product names as Cloudglue and Aviary; call out any pricing discussed". It steers emphasis and vocabulary across the visual, scene-text, speech, and summary passes; it cannot make the description report content that is not in the media, and it does not change the response shape. To constrain transcript speaker labels to a known cast, use participants instead — a prompt is context, not a constraint. Changing it produces a new describe job rather than reusing a cached one.
2000Include the file's user-defined metadata and source metadata on the returned file object.
Segmentation job id to use. If not provided will use default to uniform 20s segmentation. Cannot be provided together with segmentation_config.
Configuration for video segmentation. Cannot be provided together with segmentation_id.
Show child attributes
Show child attributes
Response
Successful response
pending, processing, completed, failed, not_applicable The URL of the processed video
Duration of the video in seconds
URL of the file-level thumbnail for the video. Only present when include_thumbnails=true.
Unix timestamp in milliseconds when the job was created
Configuration for media description from videos
Show child attributes
Show child attributes
Whether this describe job's search documents are included in the default index.
Show child attributes
Show child attributes
Error message if status is 'failed'
The ID of the segmentation job if the describe was run with a segmentation
Array of narrative chapters (only present when include_chapters=true and segmentation strategy is 'narrative')
Show child attributes
Show child attributes
Array of shot boundaries (only present when include_shots=true and segmentation strategy is 'shot-detector')
Show child attributes
Show child attributes
Total number of chapters (only present when include_chapters=true and segmentation strategy is 'narrative')
x >= 0Total number of shots (only present when include_shots=true and segmentation strategy is 'shot-detector')
x >= 0The file this document describes. metadata and source_metadata are only included when include_metadata is true.
Show child attributes
Show child attributes