Tools
media
Media
Images and videos for posts: make new ones with AI, on brand, or register ones that exist.
Actions
generate_image
generate_image prompt platform [logo] [reference_media_ids] [brand]
Make an image (OpenAI GPT Image) for one platform. platform sets its exact size (a LinkedIn post is 1080×1350, a Story 1080×1920, a YouTube thumbnail 1280×720…), keeps words and faces clear of the platform's own buttons and captions, and adds what works there (LinkedIn: credible, one idea, a short headline; Instagram: visual first, little text; TikTok: native, not an ad; X: bold and readable small). A post going to several channels gets one image per channel, each attached to its own variant. Write the prompt like an art director: subject, setting, composition, light, style and mood; put any words that must appear in the image in quotes, and keep them short. The brand profile (palette, type, feel, audience) is added for you unless brand=false. logo=true puts the company's real logo file in a corner clear of the platform's interface (leave it off a still you'll turn into a video). reference_media_ids are library images to work from: a product shot, a person, an avatar, or an earlier image to edit ("same image, warmer light"). About 40 seconds. Returns media_id.
generate_video
generate_video prompt platform [duration] [first_frame_media_id] [audio]
Make a short clip with sound (Google Veo) for one platform: vertical 1080×1920 for TikTok, Reels, Shorts, Stories and LinkedIn; landscape 1920×1080 for YouTube and X; with that platform's pacing and safe zones. Describe one continuous shot: subject, action, camera move, light, sound. Video models can't write text: leave words out. For the most on-brand clip, make an image of the opening shot first for the same platform and pass it as first_frame_media_id. One to three minutes; if it isn't done when the call returns, call action=status.
status
status generation_id
Wait for a generation; returns its media_id once done.
RESTGET/media/generations/{generation_id}·CLItracee media generation <generation_id>
add
add url=<https URL> (or urls=[…] for up to 20 at once, each answered on its own) [alt_text]
Add an image or video from the web (for example one found with web action=images). Images are copied into the library and converted to a format every network takes (AVIF, WebP and SVG become PNG or JPG); videos are linked. Returns its media_id.
list
list [query] [kind] [limit]
The media library, newest first: uploads, AI images and videos, designs, imports. query searches names and descriptions; kind=image|video. Each shows how many posts use it.
describe
describe media_id [name] [alt_text]
Rename a file or set its alt text (what screen readers say; networks that take it get it with the post).
RESTPATCH/media/{media_id}·CLItracee media describe <media_id>
clip
clip url=<link to the video> (or media_id=<a video in the library>) [clip_length] [layout] [captions] [caption_style]
Turn a long video (a talk, webinar, podcast, interview; up to 2 hours, 1 GB) into up to 12 vertical 1080×1920 clips. Every stretch of the transcript is scored on whether its first 2 seconds would stop a cold viewer; the best become clips, each with a viral score (0-100), a hook line over its first 5 seconds, word-by-word captions, and ready-made TikTok and Instagram descriptions and a YouTube Shorts title. Each shot is framed on its own: the camera follows the speaker, two people in one shot are stacked with the captions between them, screen recordings stay readable. url takes a video's page on YouTube (videos, Shorts, finished lives), Vimeo, TikTok, Instagram reels, Facebook, X, LinkedIn, Twitch (past broadcasts, clips), Dailymotion, Loom, Reddit, Streamable, Wistia, Vidyard, Rumble, Kick, Bilibili, TED or Bluesky; a Google Drive, Dropbox, OneDrive/SharePoint or Box share link (shared with anyone who has the link); or a direct https link to a video file. A private, members-only or sign-in-only video can't be fetched: then ask the person to upload the file on the Clips page (/clips). Runs in the background for a few minutes; returns job_id at once.
RESTPOST/clips·CLItracee clips create
clip_status
clip_status job_id
Wait for a clipping job (up to about 45 seconds) and see its stage and progress; once done, each clip's clip_id, media_id, score, hook, title, copy and what's said in it, best first. Without job_id: the recent clipping jobs. Attach a clip to a post with posts action=draft variants[].media_ids=[media_id], starting from its copy.
RESTGET/clips·CLItracee clips list
clip_edit
clip_edit job_id clip_id [start] [end] [hook] [captions] [caption_style] [effects=auto|none]
Make one clip again: trim it (start and end in seconds of the source video, within a few seconds of the original cut), change the hook line (empty removes it), the captions, or let a model add zooms, colour pops, black-and-white moments and flashes on the right words. Takes under a minute in the background; clip_status shows the new media_id when done.
RESTPATCH/clips/{job_id}/clips/{clip_id}·CLItracee clips edit <job_id> <clip_id>
clip_dub
clip_dub job_id clip_id language [voice]
Dub one clip into another language (es, pt, fr, de, it, ja, hi…): translated, spoken by an ElevenLabs voice in the original timing, with captions and the hook in that language. A new video next to the clip (clip_status shows it under dubs).
RESTPOST/clips/{job_id}/clips/{clip_id}/dubs·CLItracee clips dub <job_id> <clip_id>
clip_youtube
clip_youtube job_id [title]
Package the long video for YouTube: without title, ten titles (best first, each with words for its thumbnail; two recommended); with title, a description with chapters and three thumbnails (the presenter from the video, the headline burned in), as media.
RESTPOST/clips/{job_id}/youtube·CLItracee clips youtube <job_id>
ai_actor
ai_actor (url=<product page> and/or prompt=<what it is>) [language] [style] [gender] [voice]
A 20-25 second vertical ad with an AI actor talking about the product: three scripts are written (hook, problem, solution, demo, call to action), the first is cast, voiced (ElevenLabs) and lip-synced (HeyGen), with b-roll, captions and the hook. About 5 minutes and about $1.50; returns ai_video_id. action=ai_actor_status ai_video_id (as job_id): where it is, and the media_id when done.
browse_app_files
browse_app_files app [folder_id] [query] [cursor]
The files in a connected app — googledrive, dropbox, one_drive, box, canva, figma (pictures and videos) or googledocs, googledrive, notion, confluence (docs). Without folder_id it lists the top folder; query searches by name across the app (find a folder by its name, then pass its id as folder_id). Each item has id, name and kind (folder, image, video, doc, design, frame). figma has no file list: pass a Figma file link as folder_id to see its frames. An app that isn't connected says so: send the person to Connections.
RESTGET/media/apps/{app}/files·CLItracee media app-files <app>
import_from_app
import_from_app app file_ids=[…] (up to 20)
Bring pictures and videos (or Canva designs and Figma frames, as PNG) into the media library like an upload; returns each file's media_ids for posts action=draft variants[].media_ids. A file brought in before isn't copied again. Pictures up to 15 MB, videos up to 100 MB (MP4, MOV, WebM); for a longer video, clip it with action=clip after importing, or have the person pick it on the Clips page.
RESTPOST/media/apps/{app}/import·CLItracee media import-from-app <app>
read_app_doc
read_app_doc app doc_id
A doc's text (googledocs, a Google Doc or text file in googledrive, notion, confluence), to write posts from or to update the brand with brand action=update. When someone names a doc by its title, find it first with browse_app_files query=<title>.
RESTGET/media/apps/{app}/docs/{doc_id}·CLItracee media read-doc <app> <doc_id>
Attach media to a post with posts action=draft (or update) variants[].media_ids.
Inputs
Every call takes action and the fields that action names above.
actionstringrequiredWhat to do: generate_image, generate_video, status, add, list, clip, clip_status, clip_edit, clip_dub, clip_youtube, ai_actor, ai_actor_status, describe, browse_app_files, import_from_app or read_app_doc. Each is described in the tool description.
Available options:
generate_imagegenerate_videostatusaddlistclipclip_statusclip_editclip_dubclip_youtubepromptstringFor generate_image and generate_video
3–4,000 characters
platformstringFor generate_image and generate_video: where it will be posted. The channel's platform (linkedin, instagram, facebook, x, threads, tiktok, youtube, pinterest, reddit, google_business, devto, hashnode) or a placement: instagram_story, facebook_story, youtube_short. youtube alone is a thumbnail (image) or a landscape video
Available options:
linkedininstagraminstagram_storyfacebookfacebook_storyxthreadstiktokyoutubeyoutube_shortaspect_ratiostringOnly without platform: 1:1 square (default for images), 4:5 portrait, 9:16 vertical (default for video), 16:9 landscape
Available options:
1:14:53:49:1616:9logobooleangenerate_image: put the brand's real logo in the bottom-right corner
reference_media_idsstring[]generate_image: library images to work from, from action=list
up to 6 itemseach uuid
brandbooleanFollow the brand profile; default true. false for an off-brand image
durationintegergenerate_video: seconds, default 8
2–15
first_frame_media_idstringgenerate_video: an image to start from and bring to life. From media action=generate_image.
uuid
audiobooleangenerate_video: with sound; default true
generation_idstringFor status. From media action=generate_image or generate_video.
uuid
urlstringFor add; for clip, a link to the video (YouTube, Vimeo, TikTok, Instagram, X, LinkedIn, Loom…, a Google Drive/Dropbox/OneDrive/Box share link, or a direct file link)
uri
urlsstring[]add: several images or videos at once; each gets its own media_id or error
1–20 itemseach uri
media_idstringclip: a video already in the library; describe: the file to change. From media action=list (or the media_id media action=add / generate_image returns).
uuid
job_idstringFor clip_status, from action=clip (leave out to list recent jobs); for clip_edit, the clip's job
uuid
clip_idstringclip_edit: the clip, from clip_status. From media action=clip_status job_id=<job_id>.
uuid
clip_lengthstringclip: auto 15-60s (default), short 15-30s, medium 30-60s, long 60-90s
Available options:
autoshortmediumlonglayoutstringclip: auto (default, picked per shot), track (follow the speaker), split (stack two speakers), fit (whole frame over blur)
Available options:
autotracksplitfitcaptionsbooleanclip, clip_edit: burn captions in; default true
caption_stylestringclip, clip_edit: the caption look
Available options:
defaulthormozipilllimeonewordcleanglowbeasthookstringclip_edit: the line over the first 5 seconds; empty string removes it
up to 120 characters
startnumberclip_edit: new start, seconds into the source video
endnumberclip_edit: new end, seconds into the source video
effectsstringclip_edit: auto lets a model place zooms, colour pops and flashes; none removes them
Available options:
autononelanguagestringclip_dub: ISO 639-1 code (es, pt, fr, de…); ai_actor: the script's language
2–5 characters
voicestringclip_dub, ai_actor: an ElevenLabs voice id (default by gender)
up to 40 characters
titlestringclip_youtube: the title to write the description and thumbnails for
up to 200 characters
genderstringai_actor: the actor
Available options:
femalemalestylestringai_actor: the script's style; default ugc
Available options:
ugceducationalshockstorycomparisonnamestringdescribe: the file's new name
up to 120 characters
alt_textstringFor describe and add: the alt text.
up to 1,000 characters
querystringlist: search names and descriptions
up to 100 characters
kindstringlist: only images or videos
Available options:
imagevideolimitintegerFor list: the limit.
1–100
appstringbrowse_app_files, import_from_app, read_app_doc: the connected app
Available options:
googledrivedropboxone_driveboxcanvafigmagoogledocsnotionconfluencefolder_idstringbrowse_app_files: a folder's id from an earlier browse (figma: a file link). From media action=browse_app_files (an item with kind=folder).
up to 500 characters
file_idsstring[]import_from_app: ids from browse_app_files. From media action=browse_app_files (items[].id).
1–20 itemseach 1–500 characters
doc_idstringread_app_doc: the doc's id from browse_app_files. From media action=browse_app_files (an item with kind=doc).
up to 500 characters
cursorstringbrowse_app_files: next_cursor from the last page
up to 4,000 characters