changedOutput schema / anyOf
Previous value: -[
- {
- "properties": {
- "analyses": {
- "description": "Summaries of media.analyze results (counts, not data); include puts each in full at the top level",
- "properties": {
- "beats": {
- "properties": {
- "beats": {
- "type": "number"
- },
- "bpm": {
- "type": "number"
- }
- },
- "required": [
- "bpm",
- "beats"
- ],
- "type": "object"
- },
- "colour": {
- "properties": {
- "frames": {
- "type": "number"
- },
- "regions": {
- "items": {
- "type": "string"
- },
- "type": "array"
- }
- },
- "required": [
- "frames",
- "regions"
- ],
- "type": "object"
- },
- "faces": {
- "properties": {
- "frames_with_faces": {
- "type": "number"
- },
- "rate": {
- "type": "number"
- }
- },
- "required": [
- "rate",
- "frames_with_faces"
- ],
- "type": "object"
- },
- "look": {
- "description": "frames and questions: the latest run",
- "properties": {
- "frames": {
- "type": "number"
- },
- "questions": {
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- "runs": {
- "type": "number"
- }
- },
- "required": [
- "runs",
- "frames",
- "questions"
- ],
- "type": "object"
- },
- "picture": {
- "properties": {
- "frames": {
- "type": "number"
- },
- "from": {
- "type": "number"
- }
- },
- "required": [
- "frames",
- "from"
- ],
- "type": "object"
- },
- "sounds": {
- "description": "heard: the sounds the latest run found at or above its min_probability",
- "properties": {
- "heard": {
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- "min_probability": {
- "type": "number"
- },
- "model": {
- "type": "string"
- }
- },
- "required": [
- "model",
- "min_probability",
- "heard"
- ],
- "type": "object"
- },
- "speakers": {
- "properties": {
- "model": {
- "type": "string"
- },
- "speakers": {
- "type": "number"
- },
- "turns": {
- "type": "number"
- }
- },
- "required": [
- "model",
- "speakers",
- "turns"
- ],
- "type": "object"
- },
- "speech": {
- "properties": {
- "frame_seconds": {
- "type": "number"
- },
- "frames": {
- "type": "number"
- },
- "model": {
- "type": "string"
- }
- },
- "required": [
- "model",
- "frames",
- "frame_seconds"
- ],
- "type": "object"
- },
- "transcript": {
- "properties": {
- "language": {
- "type": "string"
- },
- "model": {
- "type": "string"
- },
- "words": {
- "description": "How many words; the words themselves are in transcript.words",
- "type": "number"
- }
- },
- "required": [
- "model",
- "language",
- "words"
- ],
- "type": "object"
- },
- "voice": {
- "additionalProperties": {},
- "description": "frames, and the summary media.analyze voice gives",
- "propertyNames": {
- "type": "string"
- },
- "type": "object"
- }
- },
- "type": "object"
- },
- "analysis": {
- "anyOf": [
- {
- "properties": {
- "channels": {
- "description": "Each channel at import",
- "items": {
- "properties": {
- "channel": {
- "exclusiveMinimum": 0,
- "type": "integer"
- },
- "noise_floor_dbfs": {
- "type": [
- "number",
- "null"
- ]
- },
- "peak_dbfs": {
- "type": [
- "number",
- "null"
- ]
- },
- "rms_dbfs": {
- "type": [
- "number",
- "null"
- ]
- }
- },
- "required": [
- "channel",
- "rms_dbfs",
- "peak_dbfs",
- "noise_floor_dbfs"
- ],
- "type": "object"
- },
- "type": "array"
- },
- "loudness_lufs": {
- "description": "Integrated loudness at import",
- "type": [
- "number",
- "null"
- ]
- }
- },
- "required": [
- "loudness_lufs"
- ],
- "type": "object"
- },
- {
- "type": "null"
- }
- ]
- },
- "beats": {
- "properties": {
- "beats": {
- "items": {
- "type": "number"
- },
- "type": "array"
- },
- "bpm": {
- "type": "number"
- },
- "downbeats": {
- "items": {
- "type": "number"
- },
- "type": "array"
- },
- "strengths": {
- "description": "Per beat: its onset strength, 0–1 of the strongest in the sound",
- "items": {
- "type": "number"
- },
- "type": "array"
- }
- },
- "required": [
- "bpm",
- "beats",
- "downbeats"
- ],
- "type": "object"
- },
- "codecs": {
- "properties": {
- "audio": {
- "type": [
- "string",
- "null"
- ]
- },
- "video": {
- "type": [
- "string",
- "null"
- ]
- }
- },
- "required": [
- "video",
- "audio"
- ],
- "type": "object"
- },
- "conform": {
- "description": "Why a mezzanine was made (vfr, rotation, hdr, codec); empty when not needed",
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- "created_at": {
- "description": "When it was imported or made",
- "type": "string"
- },
- "duration_seconds": {
- "type": [
- "number",
- "null"
- ]
- },
- "error": {
- "properties": {
- "code": {
- "enum": [
- "bad_request",
- "no_audio",
- "not_found",
- "expired",
- "media_not_ready",
- "media_offline",
- "engine_error",
- "render_failed",
- "interrupted",
- "stalled",
- "cancelled",
- "credential_required",
- "credential_invalid",
- "output_exists",
- "path_not_allowed",
- "limit_exceeded",
- "quota_exceeded",
- "subscription_required",
- "email_unverified",
- "service_unavailable",
- "server_busy"
- ],
- "type": "string"
- },
- "detail": {
- "additionalProperties": {},
- "propertyNames": {
- "type": "string"
- },
- "type": "object"
- },
- "hint": {
- "type": "string"
- },
- "message": {
- "type": "string"
- }
- },
- "required": [
- "code",
- "message"
- ],
- "type": "object"
- },
- "expires_at": {
- "description": "When url and page_url stop working",
- "type": "string"
- },
- "extension": {
- "description": "The extension its format takes (.png, .mp4), from the file itself, not its name",
- "type": "string"
- },
- "faces": {
- "properties": {
- "frames": {
- "items": {
- "properties": {
- "faces": {
- "items": {
- "description": "Top-left corner x, y and size w, h, fractions of the picture (centre: x + w/2, y + h/2); score 0–1",
- "properties": {
- "h": {
- "type": "number"
- },
- "score": {
- "type": "number"
- },
- "w": {
- "type": "number"
- },
- "x": {
- "type": "number"
- },
- "y": {
- "type": "number"
- }
- },
- "required": [
- "x",
- "y",
- "w",
- "h",
- "score"
- ],
- "type": "object"
- },
- "type": "array"
- },
- "time": {
- "type": "number"
- }
- },
- "required": [
- "time",
- "faces"
- ],
- "type": "object"
- },
- "type": "array"
- },
- "rate": {
- "type": "number"
- }
- },
- "required": [
- "rate",
- "frames"
- ],
- "type": "object"
- },
- "fingerprint": {
- "description": "Identity of the file (BLAKE3 of its size and first, middle and last 4 MB), as export.video gives",
- "type": [
- "string",
- "null"
- ]
- },
- "font_family": {
- "description": "Fonts: the family; use font_media_id in a text style to set text in it",
- "type": "string"
- },
- "fps": {
- "anyOf": [
- {
- "properties": {
- "den": {
- "type": "number"
- },
- "num": {
- "type": "number"
- }
- },
- "required": [
- "num",
- "den"
- ],
- "type": "object"
- },
- {
- "type": "null"
- }
- ]
- },
- "has_audio": {
- "type": "boolean"
- },
- "has_video": {
- "type": "boolean"
- },
- "height": {
- "type": [
- "number",
- "null"
- ]
- },
- "job": {
- "description": "media.get, while importing or being made: the job doing it",
- "properties": {
- "job_id": {
- "description": "Job handle; the same value is the MCP task id",
- "pattern": "^j_[0-9a-z]{26}$",
- "type": "string"
- },
- "progress": {
- "type": "number"
- },
- "seconds_left": {
- "type": "number"
- },
- "status": {
- "enum": [
- "working",
- "completed",
- "failed",
- "cancelled"
- ],
- "type": "string"
- },
- "status_message": {
- "type": "string"
- },
- "tool": {
- "type": "string"
- }
- },
- "required": [
- "job_id",
- "tool",
- "status"
- ],
- "type": "object"
- },
- "kind": {
- "anyOf": [
- {
- "enum": [
- "video",
- "audio",
- "image",
- "font",
- "lut"
- ],
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "look": {
- "properties": {
- "runs": {
- "items": {
- "properties": {
- "frames": {
- "items": {
- "properties": {
- "answers": {
- "additionalProperties": {
- "additionalProperties": {},
- "propertyNames": {
- "type": "string"
- },
- "type": "object"
- },
- "propertyNames": {
- "type": "string"
- },
- "type": "object"
- },
- "time": {
- "type": "number"
- }
- },
- "required": [
- "time",
- "answers"
- ],
- "type": "object"
- },
- "type": "array"
- },
- "id": {
- "type": "string"
- },
- "model": {
- "type": "string"
- },
- "questions": {
- "additionalProperties": {},
- "propertyNames": {
- "type": "string"
- },
- "type": "object"
- },
- "state": {
- "additionalProperties": {},
- "propertyNames": {
- "type": "string"
- },
- "type": "object"
- },
- "with_previous": {
- "type": "boolean"
- }
- },
- "required": [
- "id",
- "model",
- "questions",
- "with_previous",
- "frames"
- ],
- "type": "object"
- },
- "type": "array"
- }
- },
- "required": [
- "runs"
- ],
- "type": "object"
- },
- "media_id": {
- "description": "Media handle from media.import or a create.* tool",
- "pattern": "^m_[0-9a-z]{26}$",
- "type": "string"
- },
- "mime_type": {
- "description": "Its MIME type, likewise",
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "origin": {
- "description": "Where it came from, to tell one version from another: the import source, the export of which timeline, or the create.* tool and the media it was made from",
- "properties": {
- "attached": {
- "description": "url: the file the user attached in the chat, passed as media.import file",
- "type": "boolean"
- },
- "file_name": {
- "description": "upload: the name the file was sent with",
- "type": "string"
- },
- "frame": {
- "description": "still: the frame",
- "type": "number"
- },
- "from": {
- "description": "upload: a file the user sent; url: downloaded; path: a media root; render: an export.video; created: a create.* tool; still: a frame of a video or an edit",
- "enum": [
- "upload",
- "url",
- "path",
- "render",
- "created",
- "still"
- ],
- "type": "string"
- },
- "job_id": {
- "description": "render: the export.video job; created: the create.* job",
- "pattern": "^j_[0-9a-z]{26}$",
- "type": "string"
- },
- "media_id": {
- "description": "still: the video the frame is from",
- "pattern": "^m_[0-9a-z]{26}$",
- "type": "string"
- },
- "media_ids": {
- "description": "created: the media it was made from (a cutout's source, a page's assets)",
- "items": {
- "description": "Media handle from media.import or a create.* tool",
- "pattern": "^m_[0-9a-z]{26}$",
- "type": "string"
- },
- "type": "array"
- },
- "path": {
- "description": "path: the file it was imported from",
- "type": "string"
- },
- "preset": {
- "description": "render: the export preset",
- "type": "string"
- },
- "range": {
- "description": "render: the frames exported, when not the whole timeline",
- "properties": {
- "end": {
- "type": "number"
- },
- "start": {
- "type": "number"
- }
- },
- "required": [
- "start",
- "end"
- ],
- "type": "object"
- },
- "recipe": {
- "description": "created: a hash of what it was made from; the same recipe makes the same media",
- "type": "string"
- },
- "sources": {
- "description": "render: where each stretch of this file comes from, per track, read from the timeline when it was exported (kept after the timeline expires). With a speed curve, source_in and source_out are the clip's whole source range",
- "items": {
- "properties": {
- "end": {
- "type": "number"
- },
- "kind": {
- "enum": [
- "video",
- "audio"
- ],
- "type": "string"
- },
- "media_id": {
- "description": "The media this stretch plays",
- "pattern": "^m_[0-9a-z]{26}$",
- "type": "string"
- },
- "source_in": {
- "description": "Seconds into that media",
- "type": "number"
- },
- "source_out": {
- "type": "number"
- },
- "speed": {
- "additionalProperties": {},
- "description": "The clip's speed change, as clip.set_speed set it",
- "propertyNames": {
- "type": "string"
- },
- "type": "object"
- },
- "start": {
- "description": "Seconds into this file",
- "type": "number"
- },
- "track_id": {
- "description": "Track of the timeline; outer/inner inside a nested one",
- "type": "string"
- }
- },
- "required": [
- "track_id",
- "kind",
- "start",
- "end",
- "media_id",
- "source_in",
- "source_out"
- ],
- "type": "object"
- },
- "type": "array"
- },
- "timeline_id": {
- "description": "render: the timeline that was exported; still: the edit the frame is from",
- "pattern": "^tl_[0-9a-f]{32}$",
- "type": "string"
- },
- "tool": {
- "description": "created: the create.* tool that made it",
- "type": "string"
- },
- "upload_id": {
- "description": "Upload handle from media.upload",
- "pattern": "^u_[0-9a-z]{26}$",
- "type": "string"
- },
- "url": {
- "description": "url: the address it was downloaded from, without its query string",
- "type": "string"
- },
- "via": {
- "description": "upload: sent through a media.upload link, dropped on the account page, or a data: URI",
- "enum": [
- "media.upload",
- "account_page",
- "data_uri"
- ],
- "type": "string"
- }
- },
- "required": [
- "from"
- ],
- "type": "object"
- },
- "page_url": {
- "description": "media.get: a page that plays or shows the file in any browser, with no sign-in, to give a person; works until expires_at",
- "type": "string"
- },
- "pages": {
- "additionalProperties": {
- "properties": {
- "first": {
- "description": "Index in the whole list of the first item returned (transcript: the word index clip.add source {words} takes)",
- "type": "integer"
- },
- "list": {
- "description": "The list paged: transcript.words, beats.beats, faces.frames, speech.probabilities (one per frame_seconds from `from`), speakers.turns, voice.frames, colour.frames, picture.columns (every column alike), or look runs[].frames (each run is cut the same way; first and the counts are the latest run's)",
- "type": "string"
- },
- "matching": {
- "description": "Items in the time range (the whole list without one)",
- "type": "integer"
- },
- "next_offset": {
- "anyOf": [
- {
- "type": "integer"
- },
- {
- "type": "null"
- }
- ],
- "description": "The offset that gives the next page of this range, or null at its end"
- },
- "returned": {
- "type": "integer"
- },
- "total": {
- "description": "Items in the whole list",
- "type": "integer"
- }
- },
- "required": [
- "list",
- "first",
- "returned",
- "matching",
- "total",
- "next_offset"
- ],
- "type": "object"
- },
- "description": "media.get with a range, offset or limit: per included analysis, which piece of its list came back",
- "propertyNames": {
- "enum": [
- "transcript",
- "beats",
- "faces",
- "look",
- "speech",
- "sounds",
- "speakers",
- "voice",
- "colour",
- "picture"
- ],
- "type": "string"
- },
- "type": "object"
- },
- "probe": {
- "description": "media.get: everything FFprobe read from the file, as it gives it: the format and every stream (codec, pix_fmt, color_space, color_primaries, color_transfer, color_range, bit depth, sample rate, channel layout, tags, side data). Not for fonts and LUTs",
- "properties": {
- "format": {
- "additionalProperties": {},
- "propertyNames": {
- "type": "string"
- },
- "type": "object"
- },
- "streams": {
- "items": {
- "additionalProperties": {},
- "propertyNames": {
- "type": "string"
- },
- "type": "object"
- },
- "type": "array"
- }
- },
- "required": [
- "format",
- "streams"
- ],
- "type": "object"
- },
- "sound_seconds": {
- "description": "How long the sound runs; under duration_seconds, the end is soundless",
- "type": "number"
- },
- "sounds": {
- "description": "With include [\"sounds\"]: the latest media.analyze sounds run, every probability included",
- "properties": {
- "min_probability": {
- "type": "number"
- },
- "model": {
- "type": "string"
- },
- "peaks": {
- "additionalProperties": {
- "type": "number"
- },
- "description": "Per sound reported: the highest probability it reaches anywhere",
- "propertyNames": {
- "type": "string"
- },
- "type": "object"
- },
- "scores": {
- "description": "Every probability, for your own cut-off or arithmetic",
- "properties": {
- "start_seconds": {
- "description": "Where the first value starts: media seconds, or timeline seconds for a timeline",
- "type": "number"
- },
- "step_seconds": {
- "description": "Seconds each value covers: 0.04 (every frame) unless asked or too long",
- "type": "number"
- },
- "values": {
- "additionalProperties": {
- "items": {
- "type": "number"
- },
- "type": "array"
- },
- "description": "Per sound, the highest probability in each step, 0 to 1",
- "propertyNames": {
- "type": "string"
- },
- "type": "object"
- }
- },
- "required": [
- "start_seconds",
- "step_seconds",
- "values"
- ],
- "type": "object"
- },
- "spans": {
- "additionalProperties": {
- "items": {
- "properties": {
- "end": {
- "description": "Where it ends, on the same clock",
- "type": "number"
- },
- "peak_probability": {
- "type": "number"
- },
- "peak_seconds": {
- "description": "The middle of the most likely frame",
- "type": "number"
- },
- "start": {
- "description": "Where the run of matching 40 ms frames starts: media seconds, or timeline seconds for a timeline",
- "type": "number"
- }
- },
- "required": [
- "start",
- "end",
- "peak_seconds",
- "peak_probability"
- ],
- "type": "object"
- },
- "type": "array"
- },
- "description": "Per sound: the runs of 40 ms frames at or above min_probability, in time order; empty when it never is",
- "propertyNames": {
- "type": "string"
- },
- "type": "object"
- }
- },
- "required": [
- "model",
- "min_probability",
- "spans",
- "peaks"
- ],
- "type": "object"
- },
- "speech": {
- "description": "With include [\"speech\"]: the speech probability of every 32 ms frame",
- "properties": {
- "frame_seconds": {
- "description": "Each probability covers this long",
- "type": "number"
- },
- "from": {
- "description": "Seconds where the first probability starts",
- "type": "number"
- },
- "model": {
- "type": "string"
- },
- "probabilities": {
- "description": "Speech probability 0–1, one per frame, in order",
- "items": {
- "type": "number"
- },
- "type": "array"
- }
- },
- "required": [
- "model",
- "frame_seconds",
- "from",
- "probabilities"
- ],
- "type": "object"
- },
- "status": {
- "description": "importing: not probed yet; processing: usable in edits, proxy still rendering; ready; failed",
- "enum": [
- "importing",
- "processing",
- "ready",
- "failed"
- ],
- "type": "string"
- },
- "transcript": {
- "description": "With include [\"transcript\"]: every word as {text, start, end, confidence}",
- "properties": {
- "aligned_by": {
- "description": "The model that moved word edges to where the letters sound (English); null: the times are whisper's own, up to about a second off",
- "type": [
- "string",
- "null"
- ]
- },
- "from": {
- "description": "The stretch transcribed, if not all",
- "type": "number"
- },
- "language": {
- "type": "string"
- },
- "model": {
- "type": "string"
- },
- "text": {
- "type": "string"
- },
- "until": {
- "type": [
- "number",
- "null"
- ]
- },
- "words": {
- "description": "Media seconds. Aligned words start and end within about 0.05 s of where their letters sound; an end on a soft consonant (s, t, k, f) or a breath can ring on up to about 0.1 s more. Short ums are often missing from the words; kind speech finds them as speech. A word \"-\" (or one starting with it) is whisper marking a new speaker, as subtitles do: a hint only; kind speakers measures who speaks when",
- "items": {
- "properties": {
- "confidence": {
- "description": "0–1: how sure whisper is of the word itself",
- "type": "number"
- },
- "end": {
- "type": "number"
- },
- "speaker": {
- "description": "Who says it, from the latest speakers run",
- "type": [
- "number",
- "null"
- ]
- },
- "start": {
- "type": "number"
- },
- "text": {
- "type": "string"
- },
- "timing_confidence": {
- "description": "0–1: how clearly the letters were heard between start and end; null: not aligned (digits, symbols, other languages), times fitted between neighbours",
- "type": [
- "number",
- "null"
- ]
- }
- },
- "required": [
- "text",
- "start",
- "end",
- "confidence"
- ],
- "type": "object"
- },
- "type": "array"
- }
- },
- "required": [
- "model",
- "language",
- "text",
- "words"
- ],
- "type": "object"
- },
- "upload": {
- "description": "media.import {source: {upload}}: where to send the file. It imports once the last byte arrives (the PUT answers with the job_id); media.get says where it stands",
- "properties": {
- "expires_at": {
- "type": "string"
- },
- "max_bytes": {
- "type": "number"
- },
- "upload_id": {
- "description": "Upload handle from media.upload",
- "pattern": "^u_[0-9a-z]{26}$",
- "type": "string"
- },
- "url": {
- "description": "Signed: PUT the file here; no other credentials needed",
- "type": "string"
- }
- },
- "required": [
- "upload_id",
- "url",
- "expires_at",
- "max_bytes"
- ],
- "type": "object"
- },
- "url": {
- "description": "media.get: a signed download of the file itself, once it has one",
- "type": "string"
- },
- "warnings": {
- "description": "create.motion and create.still: what went wrong in the page as it rendered (uncaught errors, console errors, files blocked or not found, tags never closed). It rendered anyway",
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- "width": {
- "type": [
- "number",
- "null"
- ]
- }
- },
- "required": [
- "media_id",
- "name",
- "status",
- "kind",
- "duration_seconds",
- "fps",
- "width",
- "height",
- "has_video",
- "has_audio",
- "codecs",
- "conform",
- "analysis"
- ],
- "type": "object"
- },
- {
- "properties": {
- "hint": {
- "type": "string"
- },
- "job_id": {
- "description": "Job handle; the same value is the MCP task id",
- "pattern": "^j_[0-9a-z]{26}$",
- "type": "string"
- },
- "media_id": {
- "description": "The media it is making; usable in edits once processing",
- "pattern": "^m_[0-9a-z]{26}$",
- "type": "string"
- },
- "status": {
- "enum": [
- "working",
- "completed",
- "failed",
- "cancelled"
- ],
- "type": "string"
- },
- "status_uri": {
- "type": "string"
- }
- },
- "required": [
- "job_id",
- "status",
- "status_uri",
- "hint"
- ],
- "type": "object"
- }
-]New value: +[
+ {
+ "properties": {
+ "analyses": {
+ "description": "Summaries of media.analyze results (counts, not data); include puts each in full at the top level",
+ "properties": {
+ "beats": {
+ "properties": {
+ "beats": {
+ "type": "number"
+ },
+ "bpm": {
+ "type": "number"
+ }
+ },
+ "required": [
+ "bpm",
+ "beats"
+ ],
+ "type": "object"
+ },
+ "colour": {
+ "properties": {
+ "frames": {
+ "type": "number"
+ },
+ "regions": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "frames",
+ "regions"
+ ],
+ "type": "object"
+ },
+ "faces": {
+ "properties": {
+ "frames_with_faces": {
+ "type": "number"
+ },
+ "rate": {
+ "type": "number"
+ }
+ },
+ "required": [
+ "rate",
+ "frames_with_faces"
+ ],
+ "type": "object"
+ },
+ "look": {
+ "description": "frames and questions: the latest run",
+ "properties": {
+ "frames": {
+ "type": "number"
+ },
+ "questions": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "runs": {
+ "type": "number"
+ }
+ },
+ "required": [
+ "runs",
+ "frames",
+ "questions"
+ ],
+ "type": "object"
+ },
+ "picture": {
+ "properties": {
+ "frames": {
+ "type": "number"
+ },
+ "from": {
+ "type": "number"
+ }
+ },
+ "required": [
+ "frames",
+ "from"
+ ],
+ "type": "object"
+ },
+ "sounds": {
+ "description": "heard: the sounds the latest run found at or above its min_probability",
+ "properties": {
+ "heard": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "min_probability": {
+ "type": "number"
+ },
+ "model": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "model",
+ "min_probability",
+ "heard"
+ ],
+ "type": "object"
+ },
+ "speakers": {
+ "properties": {
+ "model": {
+ "type": "string"
+ },
+ "speakers": {
+ "type": "number"
+ },
+ "turns": {
+ "type": "number"
+ }
+ },
+ "required": [
+ "model",
+ "speakers",
+ "turns"
+ ],
+ "type": "object"
+ },
+ "speech": {
+ "properties": {
+ "frame_seconds": {
+ "type": "number"
+ },
+ "frames": {
+ "type": "number"
+ },
+ "model": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "model",
+ "frames",
+ "frame_seconds"
+ ],
+ "type": "object"
+ },
+ "transcript": {
+ "properties": {
+ "language": {
+ "type": "string"
+ },
+ "model": {
+ "type": "string"
+ },
+ "words": {
+ "description": "How many words; the words themselves are in transcript.words",
+ "type": "number"
+ }
+ },
+ "required": [
+ "model",
+ "language",
+ "words"
+ ],
+ "type": "object"
+ },
+ "voice": {
+ "additionalProperties": {},
+ "description": "frames, and the summary media.analyze voice gives",
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "analysis": {
+ "anyOf": [
+ {
+ "properties": {
+ "channels": {
+ "description": "Each channel at import",
+ "items": {
+ "properties": {
+ "channel": {
+ "exclusiveMinimum": 0,
+ "type": "integer"
+ },
+ "noise_floor_dbfs": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "peak_dbfs": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "rms_dbfs": {
+ "type": [
+ "number",
+ "null"
+ ]
+ }
+ },
+ "required": [
+ "channel",
+ "rms_dbfs",
+ "peak_dbfs",
+ "noise_floor_dbfs"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "loudness_lufs": {
+ "description": "Integrated loudness at import",
+ "type": [
+ "number",
+ "null"
+ ]
+ }
+ },
+ "required": [
+ "loudness_lufs"
+ ],
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "beats": {
+ "properties": {
+ "beats": {
+ "items": {
+ "type": "number"
+ },
+ "type": "array"
+ },
+ "bpm": {
+ "type": "number"
+ },
+ "downbeats": {
+ "items": {
+ "type": "number"
+ },
+ "type": "array"
+ },
+ "strengths": {
+ "description": "Per beat: its onset strength, 0–1 of the strongest in the sound",
+ "items": {
+ "type": "number"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "bpm",
+ "beats",
+ "downbeats"
+ ],
+ "type": "object"
+ },
+ "codecs": {
+ "properties": {
+ "audio": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "video": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "required": [
+ "video",
+ "audio"
+ ],
+ "type": "object"
+ },
+ "conform": {
+ "description": "Why a mezzanine was made (vfr, rotation, hdr, codec); empty when not needed",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "created_at": {
+ "description": "When it was imported or made",
+ "type": "string"
+ },
+ "duration_seconds": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "error": {
+ "properties": {
+ "code": {
+ "enum": [
+ "bad_request",
+ "no_audio",
+ "not_found",
+ "expired",
+ "media_not_ready",
+ "media_offline",
+ "engine_error",
+ "render_failed",
+ "interrupted",
+ "stalled",
+ "cancelled",
+ "credential_required",
+ "credential_invalid",
+ "output_exists",
+ "path_not_allowed",
+ "limit_exceeded",
+ "quota_exceeded",
+ "subscription_required",
+ "email_unverified",
+ "service_unavailable",
+ "server_busy"
+ ],
+ "type": "string"
+ },
+ "detail": {
+ "additionalProperties": {},
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "hint": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "code",
+ "message"
+ ],
+ "type": "object"
+ },
+ "expires_at": {
+ "description": "When url and page_url stop working",
+ "type": "string"
+ },
+ "extension": {
+ "description": "The extension its format takes (.png, .mp4), from the file itself, not its name",
+ "type": "string"
+ },
+ "faces": {
+ "properties": {
+ "frames": {
+ "items": {
+ "properties": {
+ "faces": {
+ "items": {
+ "description": "Top-left corner x, y and size w, h, fractions of the picture (centre: x + w/2, y + h/2); score 0–1",
+ "properties": {
+ "h": {
+ "type": "number"
+ },
+ "score": {
+ "type": "number"
+ },
+ "w": {
+ "type": "number"
+ },
+ "x": {
+ "type": "number"
+ },
+ "y": {
+ "type": "number"
+ }
+ },
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "score"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "time": {
+ "type": "number"
+ }
+ },
+ "required": [
+ "time",
+ "faces"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "rate": {
+ "type": "number"
+ }
+ },
+ "required": [
+ "rate",
+ "frames"
+ ],
+ "type": "object"
+ },
+ "fingerprint": {
+ "description": "Identity of the file (BLAKE3 of its size and first, middle and last 4 MB), as export.video gives",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "font_family": {
+ "description": "Fonts: the family; use font_media_id in a text style to set text in it",
+ "type": "string"
+ },
+ "fps": {
+ "anyOf": [
+ {
+ "properties": {
+ "den": {
+ "type": "number"
+ },
+ "num": {
+ "type": "number"
+ }
+ },
+ "required": [
+ "num",
+ "den"
+ ],
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "has_audio": {
+ "type": "boolean"
+ },
+ "has_video": {
+ "type": "boolean"
+ },
+ "height": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "job": {
+ "description": "media.get, while importing or being made: the job doing it",
+ "properties": {
+ "job_id": {
+ "description": "Job handle; the same value is the MCP task id",
+ "pattern": "^j_[0-9a-z]{26}$",
+ "type": "string"
+ },
+ "progress": {
+ "type": "number"
+ },
+ "seconds_left": {
+ "type": "number"
+ },
+ "status": {
+ "enum": [
+ "working",
+ "completed",
+ "failed",
+ "cancelled"
+ ],
+ "type": "string"
+ },
+ "status_message": {
+ "type": "string"
+ },
+ "tool": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "job_id",
+ "tool",
+ "status"
+ ],
+ "type": "object"
+ },
+ "kind": {
+ "anyOf": [
+ {
+ "enum": [
+ "video",
+ "audio",
+ "image",
+ "font",
+ "lut"
+ ],
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "look": {
+ "properties": {
+ "runs": {
+ "items": {
+ "properties": {
+ "frames": {
+ "items": {
+ "properties": {
+ "answers": {
+ "additionalProperties": {
+ "additionalProperties": {},
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "time": {
+ "type": "number"
+ }
+ },
+ "required": [
+ "time",
+ "answers"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "id": {
+ "type": "string"
+ },
+ "model": {
+ "type": "string"
+ },
+ "questions": {
+ "additionalProperties": {},
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "state": {
+ "additionalProperties": {},
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "with_previous": {
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "id",
+ "model",
+ "questions",
+ "with_previous",
+ "frames"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "runs"
+ ],
+ "type": "object"
+ },
+ "media_id": {
+ "description": "Media handle from media.import or a create.* tool",
+ "pattern": "^m_[0-9a-z]{26}$",
+ "type": "string"
+ },
+ "mime_type": {
+ "description": "Its MIME type, likewise",
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "origin": {
+ "description": "Where it came from, to tell one version from another: the import source, the export of which timeline, or the create.* tool and the media it was made from",
+ "properties": {
+ "attached": {
+ "description": "url: the file the user attached in the chat, passed as media.import file",
+ "type": "boolean"
+ },
+ "file_name": {
+ "description": "upload: the name the file was sent with",
+ "type": "string"
+ },
+ "frame": {
+ "description": "still: the frame",
+ "type": "number"
+ },
+ "from": {
+ "description": "upload: a file the user sent; url: downloaded; path: a media root; render: an export.video; created: a create.* tool; still: a frame of a video or an edit",
+ "enum": [
+ "upload",
+ "url",
+ "path",
+ "render",
+ "created",
+ "still"
+ ],
+ "type": "string"
+ },
+ "job_id": {
+ "description": "render: the export.video job; created: the create.* job",
+ "pattern": "^j_[0-9a-z]{26}$",
+ "type": "string"
+ },
+ "media_id": {
+ "description": "still: the video the frame is from",
+ "pattern": "^m_[0-9a-z]{26}$",
+ "type": "string"
+ },
+ "media_ids": {
+ "description": "created: the media it was made from (a cutout's source, a page's assets)",
+ "items": {
+ "description": "Media handle from media.import or a create.* tool",
+ "pattern": "^m_[0-9a-z]{26}$",
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "path": {
+ "description": "path: the file it was imported from",
+ "type": "string"
+ },
+ "preset": {
+ "description": "render: the export preset",
+ "type": "string"
+ },
+ "range": {
+ "description": "render: the frames exported, when not the whole timeline",
+ "properties": {
+ "end": {
+ "type": "number"
+ },
+ "start": {
+ "type": "number"
+ }
+ },
+ "required": [
+ "start",
+ "end"
+ ],
+ "type": "object"
+ },
+ "recipe": {
+ "description": "created: a hash of what it was made from; the same recipe makes the same media",
+ "type": "string"
+ },
+ "sources": {
+ "description": "render: where each stretch of this file comes from, per track, read from the timeline when it was exported (kept after the timeline expires). With a speed curve, source_in and source_out are the clip's whole source range",
+ "items": {
+ "properties": {
+ "end": {
+ "type": "number"
+ },
+ "kind": {
+ "enum": [
+ "video",
+ "audio"
+ ],
+ "type": "string"
+ },
+ "media_id": {
+ "description": "The media this stretch plays",
+ "pattern": "^m_[0-9a-z]{26}$",
+ "type": "string"
+ },
+ "source_in": {
+ "description": "Seconds into that media",
+ "type": "number"
+ },
+ "source_out": {
+ "type": "number"
+ },
+ "speed": {
+ "additionalProperties": {},
+ "description": "The clip's speed change, as clip.set_speed set it",
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "start": {
+ "description": "Seconds into this file",
+ "type": "number"
+ },
+ "track_id": {
+ "description": "Track of the timeline; outer/inner inside a nested one",
+ "type": "string"
+ }
+ },
+ "required": [
+ "track_id",
+ "kind",
+ "start",
+ "end",
+ "media_id",
+ "source_in",
+ "source_out"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "timeline_id": {
+ "description": "render: the timeline that was exported; still: the edit the frame is from",
+ "pattern": "^tl_[0-9a-f]{32}$",
+ "type": "string"
+ },
+ "tool": {
+ "description": "created: the create.* tool that made it",
+ "type": "string"
+ },
+ "upload_id": {
+ "description": "Upload handle from media.upload",
+ "pattern": "^u_[0-9a-z]{26}$",
+ "type": "string"
+ },
+ "url": {
+ "description": "url: the address it was downloaded from, without its query string",
+ "type": "string"
+ },
+ "via": {
+ "description": "upload: sent through a media.upload link, dropped on the cuttingfloor site, or a data: URI",
+ "enum": [
+ "media.upload",
+ "account_page",
+ "data_uri"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "from"
+ ],
+ "type": "object"
+ },
+ "page_url": {
+ "description": "media.get: a page that plays or shows the file in any browser, with no sign-in, to give a person; works until expires_at",
+ "type": "string"
+ },
+ "pages": {
+ "additionalProperties": {
+ "properties": {
+ "first": {
+ "description": "Index in the whole list of the first item returned (transcript: the word index clip.add source {words} takes)",
+ "type": "integer"
+ },
+ "list": {
+ "description": "The list paged: transcript.words, beats.beats, faces.frames, speech.probabilities (one per frame_seconds from `from`), speakers.turns, voice.frames, colour.frames, picture.columns (every column alike), or look runs[].frames (each run is cut the same way; first and the counts are the latest run's)",
+ "type": "string"
+ },
+ "matching": {
+ "description": "Items in the time range (the whole list without one)",
+ "type": "integer"
+ },
+ "next_offset": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "The offset that gives the next page of this range, or null at its end"
+ },
+ "returned": {
+ "type": "integer"
+ },
+ "total": {
+ "description": "Items in the whole list",
+ "type": "integer"
+ }
+ },
+ "required": [
+ "list",
+ "first",
+ "returned",
+ "matching",
+ "total",
+ "next_offset"
+ ],
+ "type": "object"
+ },
+ "description": "media.get with a range, offset or limit: per included analysis, which piece of its list came back",
+ "propertyNames": {
+ "enum": [
+ "transcript",
+ "beats",
+ "faces",
+ "look",
+ "speech",
+ "sounds",
+ "speakers",
+ "voice",
+ "colour",
+ "picture"
+ ],
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "probe": {
+ "description": "media.get: everything FFprobe read from the file, as it gives it: the format and every stream (codec, pix_fmt, color_space, color_primaries, color_transfer, color_range, bit depth, sample rate, channel layout, tags, side data). Not for fonts and LUTs",
+ "properties": {
+ "format": {
+ "additionalProperties": {},
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "streams": {
+ "items": {
+ "additionalProperties": {},
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "format",
+ "streams"
+ ],
+ "type": "object"
+ },
+ "sound_seconds": {
+ "description": "How long the sound runs; under duration_seconds, the end is soundless",
+ "type": "number"
+ },
+ "sounds": {
+ "description": "With include [\"sounds\"]: the latest media.analyze sounds run, every probability included",
+ "properties": {
+ "min_probability": {
+ "type": "number"
+ },
+ "model": {
+ "type": "string"
+ },
+ "peaks": {
+ "additionalProperties": {
+ "type": "number"
+ },
+ "description": "Per sound reported: the highest probability it reaches anywhere",
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "scores": {
+ "description": "Every probability, for your own cut-off or arithmetic",
+ "properties": {
+ "start_seconds": {
+ "description": "Where the first value starts: media seconds, or timeline seconds for a timeline",
+ "type": "number"
+ },
+ "step_seconds": {
+ "description": "Seconds each value covers: 0.04 (every frame) unless asked or too long",
+ "type": "number"
+ },
+ "values": {
+ "additionalProperties": {
+ "items": {
+ "type": "number"
+ },
+ "type": "array"
+ },
+ "description": "Per sound, the highest probability in each step, 0 to 1",
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ }
+ },
+ "required": [
+ "start_seconds",
+ "step_seconds",
+ "values"
+ ],
+ "type": "object"
+ },
+ "spans": {
+ "additionalProperties": {
+ "items": {
+ "properties": {
+ "end": {
+ "description": "Where it ends, on the same clock",
+ "type": "number"
+ },
+ "peak_probability": {
+ "type": "number"
+ },
+ "peak_seconds": {
+ "description": "The middle of the most likely frame",
+ "type": "number"
+ },
+ "start": {
+ "description": "Where the run of matching 40 ms frames starts: media seconds, or timeline seconds for a timeline",
+ "type": "number"
+ }
+ },
+ "required": [
+ "start",
+ "end",
+ "peak_seconds",
+ "peak_probability"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "description": "Per sound: the runs of 40 ms frames at or above min_probability, in time order; empty when it never is",
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ }
+ },
+ "required": [
+ "model",
+ "min_probability",
+ "spans",
+ "peaks"
+ ],
+ "type": "object"
+ },
+ "speech": {
+ "description": "With include [\"speech\"]: the speech probability of every 32 ms frame",
+ "properties": {
+ "frame_seconds": {
+ "description": "Each probability covers this long",
+ "type": "number"
+ },
+ "from": {
+ "description": "Seconds where the first probability starts",
+ "type": "number"
+ },
+ "model": {
+ "type": "string"
+ },
+ "probabilities": {
+ "description": "Speech probability 0–1, one per frame, in order",
+ "items": {
+ "type": "number"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "model",
+ "frame_seconds",
+ "from",
+ "probabilities"
+ ],
+ "type": "object"
+ },
+ "status": {
+ "description": "importing: not probed yet; processing: usable in edits, proxy still rendering; ready; failed",
+ "enum": [
+ "importing",
+ "processing",
+ "ready",
+ "failed"
+ ],
+ "type": "string"
+ },
+ "transcript": {
+ "description": "With include [\"transcript\"]: every word as {text, start, end, confidence}",
+ "properties": {
+ "aligned_by": {
+ "description": "The model that moved word edges to where the letters sound (English); null: the times are whisper's own, up to about a second off",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "from": {
+ "description": "The stretch transcribed, if not all",
+ "type": "number"
+ },
+ "language": {
+ "type": "string"
+ },
+ "model": {
+ "type": "string"
+ },
+ "text": {
+ "type": "string"
+ },
+ "until": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "words": {
+ "description": "Media seconds. Aligned words start and end within about 0.05 s of where their letters sound; an end on a soft consonant (s, t, k, f) or a breath can ring on up to about 0.1 s more. Short ums are often missing from the words; kind speech finds them as speech. A word \"-\" (or one starting with it) is whisper marking a new speaker, as subtitles do: a hint only; kind speakers measures who speaks when",
+ "items": {
+ "properties": {
+ "confidence": {
+ "description": "0–1: how sure whisper is of the word itself",
+ "type": "number"
+ },
+ "end": {
+ "type": "number"
+ },
+ "speaker": {
+ "description": "Who says it, from the latest speakers run",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "start": {
+ "type": "number"
+ },
+ "text": {
+ "type": "string"
+ },
+ "timing_confidence": {
+ "description": "0–1: how clearly the letters were heard between start and end; null: not aligned (digits, symbols, other languages), times fitted between neighbours",
+ "type": [
+ "number",
+ "null"
+ ]
+ }
+ },
+ "required": [
+ "text",
+ "start",
+ "end",
+ "confidence"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "model",
+ "language",
+ "text",
+ "words"
+ ],
+ "type": "object"
+ },
+ "upload": {
+ "description": "media.import {source: {upload}}: where to send the file. It imports once the last byte arrives (the PUT answers with the job_id); media.get says where it stands",
+ "properties": {
+ "expires_at": {
+ "type": "string"
+ },
+ "max_bytes": {
+ "type": "number"
+ },
+ "upload_id": {
+ "description": "Upload handle from media.upload",
+ "pattern": "^u_[0-9a-z]{26}$",
+ "type": "string"
+ },
+ "url": {
+ "description": "Signed: PUT the file here; no other credentials needed",
+ "type": "string"
+ }
+ },
+ "required": [
+ "upload_id",
+ "url",
+ "expires_at",
+ "max_bytes"
+ ],
+ "type": "object"
+ },
+ "url": {
+ "description": "media.get: a signed download of the file itself, once it has one",
+ "type": "string"
+ },
+ "warnings": {
+ "description": "create.motion and create.still: what went wrong in the page as it rendered (uncaught errors, console errors, files blocked or not found, tags never closed). It rendered anyway",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "width": {
+ "type": [
+ "number",
+ "null"
+ ]
+ }
+ },
+ "required": [
+ "media_id",
+ "name",
+ "status",
+ "kind",
+ "duration_seconds",
+ "fps",
+ "width",
+ "height",
+ "has_video",
+ "has_audio",
+ "codecs",
+ "conform",
+ "analysis"
+ ],
+ "type": "object"
+ },
+ {
+ "properties": {
+ "hint": {
+ "type": "string"
+ },
+ "job_id": {
+ "description": "Job handle; the same value is the MCP task id",
+ "pattern": "^j_[0-9a-z]{26}$",
+ "type": "string"
+ },
+ "media_id": {
+ "description": "The media it is making; usable in edits once processing",
+ "pattern": "^m_[0-9a-z]{26}$",
+ "type": "string"
+ },
+ "status": {
+ "enum": [
+ "working",
+ "completed",
+ "failed",
+ "cancelled"
+ ],
+ "type": "string"
+ },
+ "status_uri": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "job_id",
+ "status",
+ "status_uri",
+ "hint"
+ ],
+ "type": "object"
+ }
+]