Endpoint
Setup
- ChatGPT
- Claude Code
- Claude Desktop
- Cursor
- Codex
- Open Settings → Apps & Connectors, then enable Developer mode under Advanced settings.
- Create a connector named Tella and paste the MCP server URL:
- Connect it and finish signing in to Tella. ChatGPT uses your existing Tella workspace permissions.
Authentication
The MCP server uses OAuth 2.1 for authentication. When you first connect, you’ll be redirected to Tella to authorize access. The connection uses your Tella account permissions — you can only access videos and playlists in workspaces you belong to.Get started with Skills
Alongside the MCP, the Tella Skills directory offers open-source, ready-made workflows built and tested for Claude Code (some also run on other agents). The MCP connects your agent to your Tella library; the skills teach it video editing on local files — cutting videos, adding zooms, dropping in B-roll, and publishing your latest Tella recording to YouTube.Browse the Skills directory
Managing videos
Organize and share your workspace: list and update videos, manage playlists, tags, and webhook subscriptions, control access, and export finished videos.Videos
list_videos
list_videos
cursor(optional): Pagination cursor from previous responselimit(optional): Items per page (1-100, default: 20)playlistId(optional): Filter videos by playlisttagIds(optional): Filter videos by tag IDs, comma-separated. Multiple tags are combined with AND. Ignored whenplaylistIdis set
search_videos
search_videos
searchIn to restrict the search to title or transcript; otherwise title results are returned before transcript results. Results include ordinary video summaries, plain-text snippets, matched tokens, and cursor pagination. Transcript matches also carry startSeconds and endSeconds, so you can jump straight to the moment a phrase was spoken. To keep latency predictable, each transcript search considers the 2,000 highest-relevance matching sentences.Parameters:query(required): Search text, 1-200 characterssearchIn(optional):all,title, ortranscript(default:all)limit(optional): Results per page, 1-100 (default: 20). An upper bound, not a guarantee: a page can come back shorter once results the caller cannot see are removed. Keep paging whilehasMoreis true.cursor(optional): Opaque cursor returned by the previous page
get_video
get_video
id(required): Video IDincludeTranscript(optional): Include transcript textincludeChapters(optional): Include chapter markersincludeThumbnails(optional): Include thumbnail URLsincludeExports(optional): Include export status
create_video
create_video
create_source first (kind: "video"), PUT the bytes to the returned uploadUrl, then pass the sourceId here — it becomes the new video’s first clip.Parameters:sourceId(required): Source ID fromcreate_source(kind: "video")- Video settings —
name,description,playbackRate,captionsEnabled,subtitlesEnabled,captionStyle,captionSize,captionGrouping,captionPosition,transcriptEnabled,commentsEnabled,downloadsEnabled,linkScope,password,searchEngineIndexingEnabled,studioSound, anddimensions— to configure the new video in the same call. Subtitle settings use the same values asupdate_video. Whendimensionsis omitted, the video is sized from the uploaded source.
update_video
update_video
id(required): Video IDname(optional): Video titledescription(optional): Video descriptionplaybackRate(optional): Default playback speed (0.5-2.0)captionsEnabled(optional): Show subtitles to viewers by defaultsubtitlesEnabled(optional): Allow viewers to enable subtitlescaptionStyle(optional): Subtitle style, used if subtitles are enabled on the video. Use{ name: "backdrop", backgroundColor, textColor, wordLevelHighlights },{ name: "highlight", primaryTextColor, secondaryTextColor, highlightColor },{ name: "mono", textColor, highlightColor },{ name: "cannes", textColor, shadowColor }, or{ name: "classic", textColor, outlineColor }. Every listed field is required; colors accept#RRGGBBor#RRGGBBAA.captionSize(optional): Subtitle size (small,medium, orlarge), used if subtitles are enabled on the videocaptionGrouping(optional): Subtitle grouping (chunkedorsingleWord), used if subtitles are enabled on the videocaptionPosition(optional): Normalized subtitle{ x, y }coordinates from 0 to 1, ornullfor automatic placement; used if subtitles are enabled on the videotranscriptEnabled(optional): Show transcript tabcommentsEnabled(optional): Allow commentsdownloadsEnabled(optional): Allow downloadslinkScope(optional): Access level —public,private,password, orembedonlypassword(optional): Password for protected videossearchEngineIndexingEnabled(optional): Allow search engine indexingstudioSound(optional): Studio Sound (AI audio enhancement) master switch. Enabling it also starts generating the enhanced audio tracks in the background; playback and exports fall back to raw audio until they are ready. Individual clips can opt out viaupdate_clip’sstudioSound.dimensions(optional): Canvas size in pixels as{ width, height }(each 16–4096). Changing it remaps every clip and section layout to a ratio-appropriate equivalent — the same transform as switching size in the editor’s Setup → Size. Editor presets:1920x1080(16:9),1920x1200(16:10),1440x1080(4:3),1080x1080(1:1),1080x1350(4:5),1080x1920(9:16). No-op when the video already has the requested size.
get_captions_file
get_captions_file
format, fileName, and content.Parameters:id(required): Video IDformat(optional):srt(default) orvtt
delete_video
delete_video
id(required): Video ID
duplicate_video
duplicate_video
id(required): Video ID to duplicatename(optional): Name for the duplicatestartTime(optional): Trim start time in seconds (use with endTime)endTime(optional): Trim end time in seconds (use with startTime)chapterIndex(optional): Extract a specific chapter by 0-based index (cannot be combined with startTime/endTime)
export_video
export_video
get_export_status to poll until the export completes or fails.Returns an export object. Pass its exportId value to get_export_status.Parameters:id(required): Video IDgranularity(optional):video(full video, default),clips(one composed file per clip),tracks(camera and screen files per clip with timeline cuts applied), orraw(original recordings without cuts)resolution(optional):4kfor 4K; omit for defaultfps(optional): Frames per second —30or60subtitles(optional): Burn in subtitlesspeed(optional): Playback speed —0.5,0.75,1,1.25,1.5,1.75, or2
get_export_status
get_export_status
export_video until export.status is completed or failed; export.downloadUrl appears when the export is ready.Parameters:id(required): Video IDexportId(required): Theexport.exportIdvalue returned byexport_video
add_collaborator_to_video
add_collaborator_to_video
id(required): Video IDemail(required): Email address of the user to addrole(required): Role to grant —editororviewer
update_collaborator_on_video
update_collaborator_on_video
id(required): Video IDuserId(required): User ID of the collaboratorrole(required): New role —editororviewer
remove_collaborator_from_video
remove_collaborator_from_video
id(required): Video IDuserId(required): User ID of the collaborator to remove
update_collaborator_on_video and remove_collaborator_from_video reject those calls with a 403. To hand off ownership, use the transfer ownership flow in the app.Playlists
list_playlists
list_playlists
visibility(optional): Filter bypersonalororgcursor(optional): Pagination cursorlimit(optional): Items per page (1-100, default: 20)
create_playlist
create_playlist
name(required): Playlist namedescription(optional): Playlist descriptionemoji(optional): Emoji iconvisibility(optional):personalororglinkScope(optional): Access level —public,private, orpasswordpassword(optional): Password for protected playlists
get_playlist
get_playlist
id(required): Playlist ID
update_playlist
update_playlist
id(required): Playlist IDname(optional): Playlist namedescription(optional): Playlist descriptionemoji(optional): Emoji iconlinkScope(optional): Access levelpassword(optional): Password for protected playlistssearchEngineIndexingEnabled(optional): Allow search engine indexing
delete_playlist
delete_playlist
id(required): Playlist ID
add_video_to_playlist
add_video_to_playlist
playlistId(required): Playlist IDvideoId(required): Video ID to add
remove_video_from_playlist
remove_video_from_playlist
playlistId(required): Playlist IDvideoId(required): Video ID to remove
list_playlist_groups
list_playlist_groups
visibility(optional): Filter bypersonalororg
create_playlist_group
create_playlist_group
name(required): Group nameemoji(optional): Emoji iconvisibility(optional):personalororg. Defaults topersonal
update_playlist_group
update_playlist_group
id(required): Playlist group IDname(optional): New group nameemoji(optional): Emoji iconposition(optional): 0-based position in the sidebar section
delete_playlist_group
delete_playlist_group
id(required): Playlist group ID
move_playlist_to_group
move_playlist_to_group
playlistId(required): Playlist IDgroupId(optional): Target playlist group ID. Omit it to remove the playlist from its groupposition(optional): 0-based position in the target group, or in the ungrouped sidebar section whengroupIdis omitted
Tags
Tags categorize videos across your library. Workspace tags are shared with everyone in the workspace; private tags are only visible to you. Filter your library by tag withlist_videos’ tagIds parameter.
create_tag
create_tag
name(required): Tag namescope(optional): Tag visibility —workspace(default) orprivatecolor(optional): Tag color as a hex value, e.g.#6366f1description(optional): Tag description
update_tag
update_tag
id(required): Tag IDname(optional): New tag namecolor(optional): New tag color as a hex value, e.g.#6366f1description(optional): New tag description
delete_tag
delete_tag
id(required): Tag ID
add_video_tag
add_video_tag
videoId(required): Video IDtagId(required): Tag ID
remove_video_tag
remove_video_tag
videoId(required): Video IDtagId(required): Tag ID
Webhooks
Manage webhook subscriptions, which are scoped to your user rather than shared with your whole workspace. Your endpoint receivesvideo.created events for videos you create through MCP, plus activity on videos you own, like views and milestones, even when someone else (a teammate or an anonymous viewer) triggers them. Playlist events are currently emitted only for actions performed in the Tella web app. See the Webhooks guide to create an endpoint, retrieve its signing secret, or delete it.
list_webhooks
list_webhooks
cursor(optional): Pagination cursor from previous responselimit(optional): Items per page (1-100, default: 20)
update_webhook
update_webhook
url, filterTypes, or disabled.Parameters:id(required): Webhook endpoint IDurl(optional): New delivery URLfilterTypes(optional): New event types to deliver, as a non-empty array (it cannot be[]). Passnullto clear the filter and deliver every event type. To stop delivery entirely, usedisabled: trueinsteaddisabled(optional): Pause (true) or resume (false) webhook delivery
Editing videos
Build and refine the video itself: upload sources, add and cut clips, apply layouts, crop screen recordings, and add zooms, blurs, highlights, overlays, and sound effects.Sources
A source is an uploaded file (video, audio, or image) that can be turned into a new video or clip, or referenced as B-roll media, an overlay, a clip background, background music, or a sound effect. Create a source, upload the bytes to the returned pre-signed URL, then reference thesourceId from create_video, upload_clip, add_layout / update_layout, add_overlay, update_clip, set_background_music, or add_sound_effect.
create_source
create_source
sourceId and a pre-signed uploadUrl — PUT the file bytes to uploadUrl (the URL expires after 1 hour). Once uploaded, the sourceId can be used by create_video (video only, to create a new video), by upload_clip (video only, to add a new clip), by add_layout / update_layout (as B-roll media), by add_overlay, by update_clip (as an image/video background), by set_background_music (audio only), or by add_sound_effect (audio only).Upload the file as-is: any common container is accepted (MP4, MOV, WebM, MP3, WAV, M4A, …). The .mp4 in the upload URL is just the storage key, not a container requirement — there’s no need to remux or re-encode before uploading.For audio files, set kind: "audio" with the audio’s duration and omit width / height.For images, set kind: "image" and omit duration. Tella hosts the uploaded image for rendering — you never deal with raw image URLs.Parameters:kind(optional): Source kind —video(default),audio, orimagewidth(video/image): Width in pixels — required forvideoandimage, omit foraudioheight(video/image): Height in pixels — required forvideoandimage, omit foraudioduration(video/audio): Duration in seconds — required forvideoandaudio, ignored forimage
Library
The library is where reusable media lives — images, videos, sound effects, music and LUTs — and it’s the same set the editor’s Media library and Sound effects panels show. Saving a source here is what makes it findable later: a source you never add to the library is only reachable through the clips that already reference it, so deleting the video takes the last handle on it with it.list_library
list_library
sourceId you can pass straight to add_overlay, add_layout, add_sound_effect or upload_clip — images included, alongside their hosted url. Items added in the editor have no source and expose only a url, so they can’t be placed through the API. Media still being generated is omitted.Parameters:scope(required):private(only you) orworkspace(shared with the workspace)type(optional): Only returnimage,video,sound-effect,music, orlutitemscursor(optional): Cursor from a previous response — keep paging whilecursoris presentlimit(optional): Items per page (1-60, default 24). A target rather than an exact count: a page is read before unlistable items are filtered out, so a response may hold somewhat more. Page untilcursoris absent rather than counting items.
workspace item’s sourceId works for every member of the workspace, not just whoever uploaded it.add_library_item
add_library_item
create_source first, PUT the bytes to the returned uploadUrl, then pass the sourceId here.Parameters:sourceId(required): Source ID fromcreate_source, already uploadedname(optional): Display name shown in the library — defaults to the item’s typescope(optional):private(default) orworkspaceto share it with everyone in the workspace —workspacerequires an owner or member roletype(optional): Expected item type — the type is taken from the source’s own kind, and supplying a value that disagrees is an error
remove_library_item
remove_library_item
id(required): Library item ID fromlist_libraryscope(required): The library the item lives in —privateorworkspace
Backgrounds
Use Tella’s background catalog to choose from your personal uploads, workspace uploads, and Tella’s default image and animated backgrounds. Pass an item’s returnedbackground object directly to update_clip.
list_backgrounds
list_backgrounds
thumbnailUrl for previewing and a background object for applying to a clip.Parameters:scope(optional): Filter backgrounds bypersonal,workspace, ordefaultcategoryId(optional): Filter to a returned category, such aspersonal,workspace,default:tella,default:macos, ordefault:animated
Chapters
Chapter timestamps use seconds on the final video timeline. Chapter IDs are not stable, so chapter updates always replace the complete list rather than targeting individual chapters.get_chapters
get_chapters
videoId(required): Video ID
set_chapters
set_chapters
chapters array to clear all chapters.Parameters:videoId(required): Video IDchapters(required): Complete replacement array of{timestampSeconds, title, description}objects
Clips
A clip is a section of a video — Tella videos are made up of one or more clips. Each clip has its own cuts, layouts, transcript, and editing tools.get_transcript and thumbnails. No conversions needed. The one exception is stored cut definitions (get_clip’s cuts / update_clip’s cuts), which describe removed ranges of the raw recording; cuts are always undoable by replacing them with [].upload_clip
upload_clip
create_source first, PUT the bytes to the returned uploadUrl, then pass the sourceId here.Parameters:videoId(required): Video IDsourceId(required): Source ID returned bycreate_sourcename(optional): Clip name. Defaults to the nextClip N.
list_clips
list_clips
videoId(required): Video ID
get_clip
get_clip
videoId(required): Video IDid(required): Clip ID
update_clip
update_clip
videoId(required): Video IDid(required): Clip IDname(optional): New clip nameorder(optional): New position within the videocuts(optional): Replaces the clip’s full cut set. Each cut is{startTimeMs, durationMs}in ms of the raw recording (the playback timeline you’d get after clearing all cuts). Pass[]to clear all cuts. To cut what you currently see, usecut_clipinstead.background(optional): Background{type, color?, sourceId?, imageUrl?, videoUrl?, videoDurationSeconds?, gradientColor1?, gradientColor2?, gradientAngle?}.typeis one ofsolid,image,video,gradient. For your own image or video, pass asourceIdfromcreate_source(kind: "image"orkind: "video"). To use a catalog background, pass the exactbackgroundobject returned bylist_backgrounds; arbitrary image and video URLs are rejected.studioSound(optional): Per-clip Studio Sound opt-out.falsedisables enhanced audio for this clip while the video-level switch (update_video’sstudioSound) stays on;truere-enables it.
delete_clip
delete_clip
videoId(required): Video IDid(required): Clip ID
duplicate_clip
duplicate_clip
videoId(required): Video IDid(required): Clip ID to duplicatename(optional): Name for the new cliporder(optional): Position for the new clip
reorder_clip
reorder_clip
videoId(required): Video IDid(required): Clip IDorder(required): New 0-based position
cut_clip
cut_clip
update_clip with cuts: [].Parameters:videoId(required): Video IDid(required): Clip IDcuts(required): Array of{fromMs, toMs}ranges to cut, in ms on the clip’s playback timeline (what you currently see and hear — the same timeline asget_transcriptandget_silences). All ranges are resolved against the playback timeline as it is when the call starts, so send every range in one call instead of issuing manycut_clipcalls.
cut_clip_by_transcript
cut_clip_by_transcript
get_transcript to look up word indices.Parameters:videoId(required): Video IDid(required): Clip IDwordRanges(required): Array of{fromWordIndex, toWordIndex}ranges. Both indices are inclusive and come from the clip’s transcript (indices are stable — already-cut words are simply absent).
get_silences
get_silences
cut_clip. Silences already removed by cuts are not reported.Parameters:videoId(required): Video IDid(required): Clip IDminDurationMs(optional): Minimum silence length to report, in ms. Defaults to 200.
remove_fillers
remove_fillers
videoId(required): Video IDid(required): Clip ID
remove_silences
remove_silences
videoId(required): Video IDid(required): Clip IDmode(optional): How aggressively to remove silences —naturalcuts pauses longer than 800ms,fastlonger than 500ms,fasterlonger than 300ms. Defaults tonatural.
list_sources
list_sources
videoId(required): Video IDid(required): Clip ID
get_clip_thumbnail
get_clip_thumbnail
mp4 returns a URL only.Parameters:videoId(required): Video IDid(required): Clip IDformat(optional):jpg(default),png,webp,gif, ormp4inpointMs(optional): Frame offset in ms on the clip’s playback timeline, cuts applied (default 0)durationMs(optional): Duration of the animated preview. Only valid whenformatisgiformp4.width(optional): Output width in pixels (default 320). The thumbnail keeps the video’s aspect ratio.height(optional): Output height in pixels. Derived from the video’s aspect ratio when omitted.download(optional): Suggest a download disposition on the signed URL
code: "thumbnail_not_ready" and status: "processing" instead of an image — retry once the video finishes processing. Other upstream failures return code: "thumbnail_fetch_failed" with a signed URL to fetch manually.get_video_thumbnail
get_video_thumbnail
get_clip_thumbnail. It also returns the same thumbnail_not_ready processing result while the video is still being processed.Parameters:id(required): Video IDformat(optional):jpg,png,webp,gif, ormp4inpointMs(optional): Frame offset in ms from the video’s playback start (cumulative across clips, cuts applied)durationMs(optional): Duration of the animated preview (gif/mp4 only)width/height(optional): Output dimensions
set_video_thumbnail
set_video_thumbnail
- Uploaded image: call
create_sourcewithkind: "image", HTTP PUT the image bytes to the returneduploadUrl, then pass thesourceIdhere. - Frame from the video: pass
inpointMs, a time on the video’s playback timeline (cuts applied, cumulative across clips). Preview candidate frames first withget_video_thumbnailusing the sameinpointMs.
id(required): Video IDsourceId(optional): Uploaded image source IDinpointMs(optional): Thumbnail frame time in ms
remove_video_thumbnail
remove_video_thumbnail
id(required): Video ID
get_source_thumbnail
get_source_thumbnail
videoId(required): Video IDclipId(required): Clip IDsourceId(required): Source recording IDformat(optional):jpg,png,webp,gif, ormp4inpointMs(optional): Frame offset from the source’s startdurationMs(optional): Duration of the animated preview (gif/mp4 only)width/height(optional): Output dimensions
get_source_waveform
get_source_waveform
videoId(required): Video IDclipId(required): Clip IDsourceId(required): Source recording ID
get_transcript
get_transcript
cut_clip_by_transcript; they don’t shift when cuts change. To see words that were cut out, clear the cuts first (update_clip with cuts: []) — cuts are always undoable.Parameters:videoId(required): Video IDid(required): Clip ID
Layouts
A layout decides how a clip’s camera and screen layers are composed at a given time. Apply a layout to the whole clip (nostartTimeMs/durationMs) or to a specific time range. Times are in ms on the clip’s playback timeline (cuts applied). Read the clip first to see its layoutSceneType — that determines which kind values are valid.
The layout field is a structured object discriminated by kind:
list_layouts
list_layouts
videoId(required): Video IDid(required): Clip ID
add_layout
add_layout
startTimeMs + durationMs for a time range, or omit both for a clip-spanning layout. To add b-roll, give a time range and set media — you can omit layout and the server applies a full-frame b-roll layout suited to the clip automatically (screen-only for combi clips, fullscreen for basic/camera-subject clips). To use a specific layout instead, pass layout with a kind valid for the clip’s scene type (see the table above).Parameters:-
videoId(required): Video ID -
id(required): Clip ID -
layout(optional): Structured layout object (see table above). Omit it to apply the default full-frame b-roll layout for the clip’s scene type. -
startTimeMs(optional): Start time in ms on the clip’s playback timeline (cuts applied) -
durationMs(optional): Duration in ms. Minimum 200ms. -
transitionStyle(optional): Transition into the layout —springorhardCut. Only valid on time-ranged layouts. When omitted, the user’s saved layout intro transition is used; the saved outro transition is applied when the following layout begins or resumes. -
media(optional): B-roll content displayed during the layout. Only valid on time-ranged layouts. Either:{type: "image", sourceId}for an image, or{type: "video", sourceId}for a video.
sourceIdcomes fromcreate_source(kind: "image"orkind: "video") after you upload the bytes. Add an optionalslotto choose which slot the media fills:screen(the main subject frame — the default) orcamera(the bubble/presentation slot, a media bubble shown over the recording behind it). Each slot needs a layout that renders it: thescreenslot (default) requires a layout that shows the screen frame — notcamera-onlyor any*-camera-only-*variant — and thecameraslot requires a layout that renders the camera (e.g.camera-bubble,side-by-side,tv-presenter). Pointing media at a slot the layout doesn’t show is rejected. One call fills one slot; a section can hold media in both slots by adding to one slot here and the other withupdate_layout.
update_layout
update_layout
videoId(required): Video IDid(required): Clip IDlayoutId(required): Layout ID (usebasefor the clip-spanning layout)layout(optional): New structured layoutstartTimeMs(optional): New start time in ms on the clip’s playback timeline (cuts applied)durationMs(optional): New duration in ms. Minimum 200ms.transitionStyle(optional):springorhardCut. Rejected on the base layout.media(optional): Set the layout’s B-roll content for one slot. Rejected on the base layout. Same shape asadd_layout’smedia, including the optionalslotfield. Additive per slot: media in the other slot is preserved, and media already in the targeted slot is replaced.
remove_layout
remove_layout
update_layout to change the base layout.Parameters:videoId(required): Video IDid(required): Clip IDlayoutId(required): Layout ID
generate_auto_layouts
generate_auto_layouts
style), sets the clip’s base layout, and adds time-ranged layout changes. Generation watches the actual video, so this can take on the order of a minute for longer clips.Parameters:videoId(required): Video IDid(required): Clip IDstyle(optional): Editing style guiding the AI’s layout choices — one ofproduct-demo-portrait,product-demo-round,product-demo-square,product-demo-wide,presentation-tv-show,presentation-portrait,tutorial-round,tutorial-square,intro,outro,intro-and-outro. Omit to let the AI pick one based on the clip’s content.instructions(optional): Free-form guidance for the AI, e.g. “keep the camera visible the whole time” or “punch in whenever a menu is opened”.
Cropping
Detect the visible content at a selected frame and apply the recommended crop to a clip’s screen recording. Tella adjusts existing masks and custom-layout geometry to fit the crop.auto_crop
auto_crop
videoId(required): Video IDid(required): Clip IDinpointMs(optional): Frame time in ms on the clip’s playback timeline, with cuts applied. Defaults to 0.
Background Music
Set one story-level audio track that loops over the whole video and is included in exports. This is separate from per-clip sound effects. Volume ranges from 0 to 1 and defaults to 0.2.set_background_music
set_background_music
create_source first (kind: "audio" with the track’s duration), PUT the audio bytes to the returned uploadUrl, then pass the sourceId here.Parameters:videoId(required): Video IDsourceId(required): Audio source ID fromcreate_source(kind: "audio")volume(optional): Volume from 0 to 1 (default 0.2)name(optional): Display name for the track
remove_background_music
remove_background_music
videoId(required): Video ID
Zooms
Zoom into a specific point on the clip’s screen layer for a time range (the camera is unaffected). UsemanualZoom for a fixed focus point or trackingZoom to follow the cursor in the screen recording. Times are in ms on the clip’s playback timeline (cuts applied).
list_zooms
list_zooms
videoId(required): Video IDid(required): Clip ID
add_zoom
add_zoom
videoId(required): Video IDid(required): Clip IDtype(required):manualZoomortrackingZoomstartTimeMs(required): Start time in ms on the clip’s playback timeline (cuts applied)durationMs(required): Duration in msfocusPoint: Required formanualZoom(rejected if missing); ignored fortrackingZoom. Percentages —{xPct, yPct}(0-100).scale(required): Magnification factor (1 = no zoom, 3.5 = max). A zoom without a scale cannot be rendered.
update_zoom
update_zoom
videoId(required): Video IDid(required): Clip IDzoomId(required): Zoom IDtype(optional):manualZoomortrackingZoomstartTimeMs(optional): New start time in ms on the clip’s playback timeline (cuts applied)durationMs(optional): New durationfocusPoint(optional): New focus pointscale(optional): New magnification
remove_zoom
remove_zoom
videoId(required): Video IDid(required): Clip IDzoomId(required): Zoom ID
generate_auto_zooms
generate_auto_zooms
videoId(required): Video IDid(required): Clip IDintensity(optional): How aggressively to zoom —slow,medium(default), orfast.slowopens fewer, longer windows;fastopens shorter, tighter ones at a higher scale.scale(optional): Override the magnification factor (1 = no zoom, 3.5 = max). Defaults to the intensity preset’s scale (1.5 for slow/medium, 2 for fast).replaceExisting(optional): Defaults totrue— existing tracking zooms are removed first. Passfalseto keep them.
Blurs and highlights
Mask a rectangular region of the clip’s screen layer to either blur it (hide sensitive info) or highlight it (draw attention). Both share the same shape: a rectangle defined by a top-leftpoint and dimensions, both in percentages. Times are in ms on the clip’s playback timeline (cuts applied).
list_blurs
list_blurs
videoId(required): Video IDid(required): Clip ID
add_blur
add_blur
videoId(required): Video IDid(required): Clip IDstartTimeMs(required): Start time in ms on the clip’s playback timeline (cuts applied)durationMs(required): Duration in mspoint(required): Top-left corner —{xPct, yPct}(0-100)dimensions(required): Rectangle size —{widthPct, heightPct}(0-100)
update_blur
update_blur
videoId(required): Video IDid(required): Clip IDmaskId(required): Mask IDstartTimeMs(optional): New start time in ms on the clip’s playback timeline (cuts applied)durationMs(optional): New durationpoint(optional): New top-leftdimensions(optional): New size
remove_blur
remove_blur
videoId(required): Video IDid(required): Clip IDmaskId(required): Mask ID
list_highlights
list_highlights
videoId(required): Video IDid(required): Clip ID
add_highlight
add_highlight
videoId(required): Video IDid(required): Clip IDstartTimeMs(required): Start time in ms on the clip’s playback timeline (cuts applied)durationMs(required): Duration in mspoint(required): Top-left corner —{xPct, yPct}(0-100)dimensions(required): Rectangle size —{widthPct, heightPct}(0-100)
update_highlight
update_highlight
videoId(required): Video IDid(required): Clip IDmaskId(required): Mask IDstartTimeMs(optional): New start time in ms on the clip’s playback timeline (cuts applied)durationMs(optional): New durationpoint(optional): New top-leftdimensions(optional): New size
remove_highlight
remove_highlight
videoId(required): Video IDid(required): Clip IDmaskId(required): Mask ID
Overlays
Place an image or video on top of a clip for a time range. Both reference asourceId from create_source (kind: "image" or kind: "video" — upload the bytes first); the overlay type follows the source’s kind. Position uses a percentage point (so it survives ratio changes) and a pixel dimensions box (so the shape never distorts).
startTimeMs and durationMs are milliseconds on the clip’s playback timeline (with cuts applied) — the same timeline as the cut transcript. A start at or past the end of the clip is rejected with a 400.list_overlays
list_overlays
videoId(required): Video IDid(required): Clip ID
add_overlay
add_overlay
create_source first (kind: "image" or kind: "video"), PUT the bytes, then pass the returned sourceId — the overlay type follows the source’s kind. When point/dimensions are omitted, a centered box is computed from the source.Parameters:videoId(required): Video IDid(required): Clip IDstartTimeMs(required): Start time in ms on the clip playback timeline (with cuts applied), the same timeline as the cut transcriptdurationMs(required): Duration in mssourceId(required): Source ID fromcreate_sourcename(optional): Overlay namepoint(optional): Top-left corner —{xPct, yPct}(0-100), as a percentage of the story canvasdimensions(optional): Overlay size in artboard pixels —{width, height}
update_overlay
update_overlay
videoId(required): Video IDid(required): Clip IDoverlayId(required): Overlay IDstartTimeMs(optional): New start time in ms on the clip playback timeline (with cuts applied)durationMs(optional): New duration in msname(optional): Overlay namepoint(optional): New top-left —{xPct, yPct}(0-100)dimensions(optional): New size in artboard pixels —{width, height}
remove_overlay
remove_overlay
videoId(required): Video IDid(required): Clip IDoverlayId(required): Overlay ID
Sound effects
Add an audio clip to play over a clip for a time range. Upload the audio withcreate_source first (kind: "audio" with the audio’s duration), then reference the returned sourceId. Upload the audio file as-is — MP3, WAV, M4A, and other common formats are accepted; no need to wrap it in an MP4.
startTimeMs and durationMs are milliseconds on the clip’s playback timeline (with cuts applied) — the same timeline as the cut transcript. A start at or past the end of the clip is rejected with a 400.list_sound_effects
list_sound_effects
videoId(required): Video IDid(required): Clip ID
add_sound_effect
add_sound_effect
create_source first (kind: "audio" with the audio’s duration), PUT the audio file as-is (MP3, WAV, M4A, …) to the returned uploadUrl, then pass the sourceId here.Parameters:videoId(required): Video IDid(required): Clip IDsourceId(required): Source ID for the audio (fromcreate_source)startTimeMs(required): Start time in ms on the clip playback timeline (with cuts applied), the same timeline as the cut transcriptdurationMs(required): Duration in msname(optional): Sound effect namevolume(optional): Playback volume (0 = muted, 1 = original). Defaults to 1.
update_sound_effect
update_sound_effect
videoId(required): Video IDid(required): Clip IDsoundEffectId(required): Sound effect IDstartTimeMs(optional): New start time in ms on the clip playback timeline (with cuts applied)durationMs(optional): New duration in msname(optional): Sound effect namevolume(optional): Playback volume (0 = muted, 1 = original)
remove_sound_effect
remove_sound_effect
videoId(required): Video IDid(required): Clip IDsoundEffectId(required): Sound effect ID
Example prompts
Once connected, you can ask your AI assistant things like:- “List all my Tella videos”
- “Get the transcript for video xyz”
- “Create a playlist called ‘Product Updates’ and add my latest 3 videos”
- “Create a ‘Customer facing’ tag and add it to my demo videos”
- “Show me all videos tagged ‘Onboarding’”
- “Make my onboarding video public and enable downloads”
- “Trim the first 5 seconds off the intro clip”
- “Add a side-by-side layout to the demo clip from 10s to 20s with the camera on the left”
- “Add a B-roll image of our product logo at 30s for 4 seconds”
- “Upload this video file as a new clip at the end of my onboarding video”
- “Add this product demo clip as B-roll between 12s and 20s of the intro”
- “Find the silent gaps in my latest clip longer than 1.5 seconds”
- “Remove all the filler words from the keynote clip”
- “Blur the email address in the bottom-left of the screen between 12s and 18s”
- “Zoom into the top-right of the screen at 25s for 3 seconds”
- “Generate zooms for my demo clip wherever I clicked”
- “Auto-layout my tutorial clip and keep the camera visible the whole time”
- “Turn on Studio Sound for my latest video”
- “Add my logo as an overlay in the top-right corner from 5s to 10s”
- “Play this whoosh sound effect at 8s when the transition happens”
- “List my webhook subscriptions”
- “Pause delivery on my webhook endpoint”
- “Update my webhook to only send video.created and export.ready events”