Vidmoat
The agent-first video editor.
- Category
- Pending
- Primary Subcategory
- Pending
Integration details
Description
Vidmoat is an AI video editor built for agents. Tell the built-in AI what you want—or plug in Claude or Cursor—and it automatically cuts dead air, writes karaoke captions, removes backgrounds, and reframes your video for every platform.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Category
- Pending
- Primary Subcategory
- Pending
- Secondary Subcategories
- None listed
- Brand
- Vidmoat
- Access
- Account required
- First tracked
- 2026-09-25
- Tool count
- 53
- Geography
- US
The broad Category that contains the Primary Subcategory.
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Get alerts for Vidmoat
Get updates when Vidmoat’s Discoverability Score or category rank changes.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competitive lineup
53 tools agents can invoke
HEAR the audio cheaply: classical waveform analysis (no speech model, no AI credits) of a video/audio src — windowed loudness (dBFS), silence regions, clipping/distortion detection, dynamic range. The returned silenceRegions match Clip.silenceRegions exactly, so pass them straight to edit_project updateClip (field silenceRegions) then call trimSilence — no need to detect silence yourself. Cheap and fast — call it freely, it never costs credits.
WHAT IS THIS AUDIO, WHO IS TALKING, AND HOW DO THEY SOUND. Per-second labels (speech / music / speech-over-music / ambience / silence / noise) with overall ratios, plus shouldTranscribe, needsAutoDuck and originalAudioReplaceable as direct answers rather than facts you have to interpret. Also speaker turns (SPEAKER_1, SPEAKER_2...) with per-speaker talk time, and per-utterance arousal and valence from prosody. Use it before spending a transcription on a file with no speech in it, and to decide whether music needs ducking under a voice. IMPORTANT LIMITS, stated in the payload too: diarisation has no neural embedder, so it will not reliably separate two similar voices and errs toward 1 or null — treat speakerCount 2 as a hint to confirm, never as grounds for an automatic split-screen. Valence is a relative lean, not an emotion, and is capped at low confidence.
THE JUMP-CUT EDIT, PRECOMPUTED. Finds pauses, breaths, filler words, hedges and false starts, and returns removalRanges[] RANKED BY CONFIDENCE with secondsSaved and pctSaved. Take the top of the list and stop when you have tightened enough — a long silence is near-certain, a possible restart is not, and they are not presented as equals. Each range already leaves ~120ms of air on each side, because removing a pause entirely is what makes a jump-cut edit feel breathless. Pass `words` (word timings from the transcribe tool) to enable filler and restart detection; without them you get pauses and breaths only and transcriptReason says so rather than quietly returning less. The speech gate adapts to the recording rather than assuming -40dB, so a quiet take is not read as silence.
WHERE THE FACES ARE, SO TEXT NEVER COVERS ONE. YuNet face tracking (small pretrained model, no AI credits) sampled every 0.25s. Returns faceBoxes (normalised 0-1, so they survive any resize or reframe), facePresencePct, max/median face count, unionFaceBox (every face position over the whole clip, unioned) and captionSafeZones — the bands of the frame no face EVER occupies, which is where a caption or lower third can go without covering someone at some moment you did not check. Also punchInTarget for a reframe or punch-in, lipActivity over time, and isTalkingHead (with a reason when false) to tell the talking-head plate from b-roll that merely has a person in it. Call this before placing captions on footage with people in it.
THE GOOD BITS, FOR AUTO-SHORTS. A per-second interest score combining audio energy, visual motion, lip activity, face presence and transcript keywords, returning the top N moments as ranges — each carrying its COMPONENT scores so you can see why it ranked, and with starts snapped to a nearby shot boundary so a clip looks chosen rather than sliced. Also returns avSync (lip movement against speech energy, in ms — fix an out-of-sync source BEFORE cutting, because every cut inherits the drift) and, when you pass words, transcriptToShots: which shots each sentence spans and whether the speaker is on screen, with a suggestion about staying on the face or cutting away to b-roll. Pass words from transcribe to enable keywords and sentence alignment.
IS THIS CLIP ALIVE, AND WHERE. Per-second visual activity plus dead-frame detection (no model, no credits). Returns motionCurve, meanMotion, a motionClass (static/gentle/active/frenetic), frozenRanges, blackRanges, flashTimes, duplicateFramePct, and — the useful part — deadHeadSec, deadTailSec and a trimSuggestion [start, end] you can pass straight to a trim. Use it to cut the rolling-before-the-action head and the walk-away tail without watching the file, to pick b-roll that actually moves, and to catch strobes before they ship. A static shot is the one that takes a Ken Burns move well; a frenetic one does not. Times are source-file seconds.
WHERE NOT TO PUT CAPTIONS. Finds on-screen text regions with their timing (normalised boxes), logos and watermarks, and whether the clip is a screen recording. A caption placed over existing on-screen text is unreadable and you cannot see that you have done it — call this before placing captions on footage you did not create. Returns captionAvoidBands and a recommendedCaptionBand directly. Two honest limits it reports itself: at the 320px working width, text under about 2.8% of frame height is invisible (minDetectableTextHeightPct says so), and OCR is unavailable on this server, so regions come back WITHOUT their text content — which still answers the placement question. Logo detection declines on locked-off tripod shots rather than guessing, because a motionless prop and a composited watermark are not separable by temporal variance.
CAN THIS SHOT TAKE THE MOVE YOU WANT? Per shot: camera motion (static / pan with direction / tilt / zoom / dolly) and a handheld shake level, shot scale (extreme-wide to extreme-close-up) with the subject cell and headroom, focus, noise, and — the one nothing else tells you — EFFECTIVE RESOLUTION, so a 4K file that is really an upscaled 720p is flagged before you crop into it. Returns kenBurnsCandidates (the static shots), stabilisationCandidates, adjacentSameDirectionMoves (two pans the same way back to back, which reads as a mistake) and the top 5 thumbnail frames with their component scores. Shot scale WITHOUT a face is a genuine estimate capped near 0.35 confidence — check the method field before building variety logic on it. No model, no credits.
TURN A LANDSCAPE CLIP INTO A VERTICAL ONE WITHOUT LOSING THE SUBJECT. Returns a per-second horizontal crop window as a SMOOTHED x-offset curve (normalised 0-1) plus ready-to-use keyframes, the crop size for the target aspect, and movementCount so you can see how busy the result is. Smoothing matters more than precision here: a window that chases every micro-movement looks broken, and a still one rarely does — the curve only moves when the subject genuinely leaves a dead zone. Falls back to a saliency centroid when no face is present and marks those samples with a lower confidence and a method field; with two competing subjects it centres between them rather than choosing, which meanConfidence exposes.
WHERE THE CUTS ALREADY ARE, and what each shot looks like. Classical pixel analysis (no vision model, no AI credits). Returns cuts[] (hard cuts, refined to a real source frame), gradualTransitions[] (dissolves/fades), shots[] with per-shot avgLuma, luma histogram, clipped-highlight and crushed-shadow percentages, approximate colour temperature, dominant colour, saturation and contrast, plus cutDensityPer10s and a pacing verdict (even vs burst-and-hold). Use it BEFORE cutting footage you have not seen: a clip you think is one shot may already contain six, and trimming across an existing cut is the most common way an auto-edit looks broken. crossShotConsistency scores how well the shots match each other and names the worst offender — that is the clip that needs a matching grade before it can sit in the sequence. Also runs on a REFERENCE video the user uploads, to learn its pacing. Every time is in source-file seconds. IT ALSO READS THE SCOPES FOR YOU: colourReadout gives a one-line summary plus specific findings — clipped highlights or crushed shadows with the exact percentage, colour casts with the channel imbalance, exposure and saturation problems, and shots that do not match each other across a cut. Each finding names the control that fixes it. USE IT TO CHECK YOUR OWN GRADE: call this again after setColor or applyFilterPreset and the findings tell you whether what you did helped, which is the only way to grade footage you cannot see. An empty findings list is a real answer meaning nothing is measurably wrong.
WHERE THE MUSIC PEAKS AND WHERE IT HITS. Energy curve, brightness and onset density over time; sections detected by self-similarity (intro / build / drop or chorus / breakdown / outro) with a relative energy score; the single highest-energy moment; and the biggest energy jump. Plus an IMPACT MAP: hits, whooshes, risers and sub-bass drops with peak dB and decay length. Land your reveal on peakEnergyMoment or biggestEnergyJump, and align a title pop to an IMPACT rather than to the nearest beat — a hit is what the ear actually marks. hasMusicalStructure is conservative and declines on dense mixes; when it declines you still get correct boundaries and energy numbers, just unlabelled sections. No model, no credits.
SEE the video cheaply: classical pixel-math analysis (no vision model, no AI credits) of a video src — shot/cut boundaries, per-shot brightness/saturation/dominant color/motion score/sharpness, face presence + bounding box (YuNet, a small pretrained model — check faceDetectionAvailable if you need to know whether detection actually ran), letterbox detection, and overall "is this static/talking-head" signal. Use this BEFORE editing footage you have not seen — to find where cuts already are, avoid trimming into a blurry shot, know if a shot has heavy motion (steady it or lean into it), or center a reframe/crop on a detected face. Cheap and fast — call it freely, it never costs credits. ALSO RETURNS THE TEMPO GRID for music: bpm, beatOffset (seconds to the first beat), beatTimes, barTimes and beatConfidence. Cutting to arbitrary timings instead of to the beat is the loudest tell that a video was assembled rather than edited — analyze the music you placed, then pass bpm and beatOffset to edit_project snapToBeat to move your cuts onto the grid in one call. bpm is null when nothing periodic is there, and beatReason then says WHY - so you can tell a track with no pulse (swap it) from a file too short to read (use a longer one). TRUST THE NUMBER ACCORDING TO TWO FIELDS. bpmSource: "loop-length" means the file is an exact whole number of bars and the tempo is exact - trust it. "onset" means it was read from the audio alone. beatConfidence: at or above 0.6 treat it as reliable; BELOW 0.6 treat bpm as a hint and verify before retiming a whole film - check it against the file duration (a loop is a whole number of bars) or the filename, which often states the tempo.
Find real dead air with an actual voice-activity model (Silero VAD — pretrained, no AI credits), not just an amplitude threshold — so quiet speech is never mistaken for silence. Returns speechSegments and deadAir ({start, end, confidence, reason}) gaps between them. Use this instead of analyze_audio_context's silenceRegions when the footage has soft-spoken sections a plain loudness threshold would misflag as pauses (or vice versa). Slightly slower than analyze_audio_context (real inference, not just math) — prefer that one for a quick loudness/clipping check.
FLATTEN clips into one real video file — a pre-comp. Two things need this. (1) Transforming or grading a GROUP as one unit: without a bake, a "camera shake" has to be keyframed onto every layer by hand and they drift apart. (2) Splitting a composite: a live split keeps each half sampling its own patch of the ORIGINAL footage as it travels, so parting halves visibly drain of colour — bake first and each half carries the picture it was cut from. Costs no export quota and is never watermarked; this is an editing step, not a delivery. Returns a jobId — poll get_bake_status, which performs the swap for you when it finishes.
Stop waiting on an AI video generation and free the one-at-a-time slot so a new generate_video can start. Omit jobId to cancel whatever is currently running. The generation provider may still finish the original request, and credits already spent are not returned.
Create a new empty video project and return its id. Pass `workspace` to file it in a folder as it is created — see list_workspaces.
Apply timeline editing commands to a project (add/trim/split/style clips, captions, keyframes, effects, transitions, and more). Commands are `{ op, ...params }` objects — discover them with get_command_schema. Returns per-command results PLUS layout lint warnings (overlapping text, offscreen elements, unreadable sizes) — always fix lint warnings before rendering. Pass previewAt:[times] to get rendered frames back as images in this same response and SEE your edit immediately. Omit projectId to edit the most recent project; set dryRun=true to preview without saving. Pass a requestId you invent to make the batch idempotent — a retry with the same id after a timeout will not double-apply.
START HERE on any file you have not edited before. ONE call that answers what an editor answers in the first ten seconds of opening something: is this a talking head, is there music already, is it noisy, is it multi-shot, does it need reframing for vertical, how many seconds of dead air are removable — each as a fact WITH the evidence beside it, so you can disagree with a conclusion rather than taking it on faith, and null WITH a reason wherever it could not be measured. Then recommendedFirstOps: the first three operations, ordered by how much they change the edit, each naming the tool that performs it. Cheap (it composes the other analysers), no credits. It samples a window rather than the whole file and says so in coversWholeFile.
Generate original music or a song with Google Lyria (Studio). Describe mood, instruments, tempo and structure; optionally specify instrumental only or desired vocals/lyrics. Never use speech generation to read a musical brief as a substitute. Returns an audio URL and measured duration when available; inspect the sound before claiming musical content. Add the URL as an audio clip and duck only under verified speech.
Generate a transparent AI sticker from a text prompt (premium feature, uses AI credits). Returns a url to use as an image clip src via edit_project addClip. Styles: cartoon, kawaii, retro, neon, 3d, minimal. Pass rigReady:true to get an ANIMATABLE character instead of a flat sticker — see that parameter.
Start generating a short AI video using Grok/xAI or Alibaba HappyHorse (paid Studio only; trials and fully waived promotions excluded;, very expensive in AI credits). From a text prompt, or — by passing imageUrl — BY ANIMATING A STILL THE PROJECT ALREADY HAS, which is how you move a real logo, product shot or frame rather than inventing a lookalike. Asynchronous: returns a jobId; poll get_generation_status until status is COMPLETED. Only one generation can run at a time per account.
Get the full timeline command schema — every operation edit_project accepts, with parameters. Call this once before your first edit_project call.
Get one approved community effect by id, including its full GLSL shaderSource — pass effectId from list_community_effects. Apply the result with edit_project: addEffect{ clipId, type:"custom-shader", shader:<shaderSource>, marketplaceEffectId:<id>, colorA:<colorA.default if present> }.
Read the authenticated creator’s optional onboarding defaults, suggested editing briefs and usual output format. Read before planning; explicit current instructions and existing project settings override these defaults. This grants no permission to spend or edit. Disabled personalization returns no active defaults.
How many AI credits are left on this account, and what the expensive operations cost. Check this BEFORE starting work you might not be able to finish: a long render or a batch of generations that runs out halfway leaves a half-edited project and a spent balance. Returns remaining credits, the plan, when the allowance resets, and a costs map.
Poll the status of an AI video generation job started with generate_video. Returns status PENDING/PROCESSING/COMPLETED/FAILED and, once COMPLETED, outputUrl.
How the owner's posts are actually doing: views, likes, comments, watch time. A metric that could not be read comes back as null with a reason, NEVER as zero — treat null as "nobody counted", not as "nobody watched". The totals say how many posts they cover, because most platforms have not approved our app yet and their posts are genuinely unmeasured.
Get a project: settings, tracks, and a per-clip summary (id, type, name, start, duration, trackIndex). Pass full=true for the complete editor document including keyframes, effects and text styles.
Check a render job: status (PENDING/PROCESSING/COMPLETED/FAILED), progress 0-100, and the download URL when completed.
The Vidmoat editing craft manual: pacing and shot-length targets, title dwell-time formulas, audio levels and what our audio controls actually do, colour rules, and the mechanics that cost other agents whole runs (clips are top-level not under tracks, setColor is 0-200 absolute, a background rectangle must go on the bottom track). READ THIS ONCE at the start of a session before planning an edit. The tool schema teaches you the controls; this teaches you what to do with them.
Get a professional craft brief from one of the Vidmoat skilled agents — a film editor, colourist, sound designer, motion designer, short-form strategist, retention editor, documentary storyteller, ad creative director, interview editor, accessibility lead, brand guardian, music-video editor, trailer editor or explainer producer. Call this BEFORE planning an edit whose goal falls in one of those domains ("make it cinematic", "cut this for TikTok", "the audio sounds amateur"). Each brief carries the order of operations, the actual numbers professionals work to (loudness targets, safe zones in pixels, hold times, frames per beat, contrast ratios), a DO-NOT list, and an acceptance test you can verify from a preview frame. Omit `id` to list every specialist with what it is for.
Import a user-provided vector Lottie JSON, GIF or animated WebP as a timeline animated sticker. No AI generation credits. Lottie: animationData object; GIF/WebP: base64 file bytes. Limits: 5 MB file (1 MB Lottie), 6 seconds, 180 frames; compiled at up to 256 px/30 fps, 2 MB embedded output. No external assets, expressions, images or fonts inside Lottie. Requires explicit projectId and requestId. Use search_editor_catalogue kind:elements query:animated for free built-in artwork instead. Playback controls use edit_project setStickerPlayback.
Fetch a public media URL (video, audio, or image) into the Vidmoat media store. Returns a durable url to pass as `src` to edit_project addClip, plus the probed duration in seconds. Use this to bring footage, music, or images into a project.
Inject a large, self-contained HTML/CSS element into a Vidmoat project as a new clip — for designed graphics too complex for the standard shape/text commands (lower thirds, title cards, stat blocks, gradient backgrounds). HOW IT RENDERS: the element is wrapped in an SVG <foreignObject>, rasterized ONCE to a still bitmap, and that same bitmap is drawn on every frame. It is never a live DOM node, so it obeys the rules of SVG-as-image, not the rules of a page. ANIMATING IT: two CSS variables are set by the rasterizer on every frame, so an element CAN move without being baked as N duplicated clips. --vm-p is clip progress (0 on the first frame of the clip, 1 on its last) and --vm-t is clip-relative seconds. Both are unitless, so compose them with calc(): a trim-path graph reveal is stroke-dashoffset:calc((1 - var(--vm-p)) * 1000); a radial chart wipe or donut is conic-gradient(... calc(var(--vm-p) * 360deg) ...); a spinner is transform:rotate(calc(var(--vm-t) * 360deg)); a count-up is a row of digit strips translated by calc(var(--vm-p) * -100%). Purely opt-in: mention either variable and the element is re-rasterized per frame, ignore them and it keeps its single cached bitmap and costs exactly what it did before. Drive the SHAPE of the motion with a keyframed scale/opacity on the clip if you want easing — --vm-p is linear. DOES NOT WORK (fails silently, no error): CSS animations and transitions — @keyframes never advance, so the graphic renders permanently at its starting state and anything beginning at opacity:0 stays invisible for its whole duration; animate the CLIP with addKeyframe on opacity/scale/x/y instead. backdrop-filter (nothing to sample — frosted glass comes out as a flat translucent panel; bake the tint into the background instead). mix-blend-mode (set the clip's blend mode with updateClip instead). position:fixed (falls back to static and the element reflows out of place — use position:absolute inside a position:relative parent). Web fonts, @font-face, and remote <img>/url() (no network during rasterization — use system font stacks and inline SVG or data: URIs). <script>, event handlers, and iframe/link/@import are stripped outright. WORKS: flexbox and grid, linear/radial/conic gradients, border-radius, box-shadow, text-shadow, filter (blur, drop-shadow), transform, clip-path, -webkit-background-clip:text, CSS custom properties, system fonts, inline SVG. EMOJI: supported, but each machine supplies its own emoji font (Segoe UI Emoji on Windows, Apple Color Emoji on macOS, Noto Color Emoji on the render server) — so the exported video will NOT match what the preview showed. They are also glossy shaded pictographs, which clash beside flat 2D vector shapes and single-weight icons; do not mix the two registers in one graphic. Prefer inline <svg> for iconography — it renders identically everywhere and inherits the design's stroke weight and palette — and reserve emoji for when a colour pictograph is genuinely the subject. Every one of these is checked after the edit and reported back in lint[].
What is scheduled to post, and what already went out. Returns each entry with its time, timezone, channels, status and — for anything published — the live URLs. Use this before scheduling so you do not double-book a slot the owner already filled.
List approved GLSL shader effects submitted by creators on fx.vidmoat.com (id, name, description, category, usage count), ordered most-used first. These render through the same sandboxed custom-shader pipeline as any hand-written effect — apply one with get_community_effect + edit_project addEffect. Applying one credits its creator toward a usage-based payout.
List this account's AI video generations, running first. Use when generate_video says one is already running: it returns the jobId to poll with get_generation_status, or to free with cancel_generation.
List the 20 most recently edited Vidmoat video projects (id, name, updatedAt, workspace). ALSO RETURNS `total`, `returned` and `truncated`: when truncated is true the list is a WINDOW, not the whole account, so never answer a "how many" question from its length. Pass `workspace` (a workspace name or id from list_workspaces) to list only what is filed there — on a busy account that is far more useful than the 20 most recent of everything, and it makes `total` meaningful again because it counts that folder only.
List the workspaces (folders) projects are organised into, with how many projects are in each. A workspace is NOT a team: a team decides who can see a project, a workspace decides what it is part of. Call this before create_project if the user mentioned a client, a series or a campaign — filing new work in the right place is the difference between a tidy account and 124 loose projects.
File a project into a workspace, or (workspace omitted) take it out of the one it is in. Moving a project between folders never changes who can see it and never touches the timeline.
A plan for the owner's next week, built from THEIR posting history and numbers — what did well, what times worked, which connected channel they have been ignoring. Each idea carries a prompt you can act on directly and, where one fits, a Recipe slug to build it from. When there is little history it says so; do not present a thin plan as a data-driven one.
SEE the video: renders the project frame at a timestamp exactly as the editor/export pipeline draws it (clips, keyframes, effects, captions) and returns the image. Use it after edits to check composition, overlap, readability and color before rendering. Takes a few seconds.
SEE THE TIMELINE: renders frames as ONE labelled contact sheet. Called with just a projectId it samples at what CHANGES — every clip in and out, markers, and the peaks of keyframed moves — each cell labelled with why it was picked, so you can follow what the edit actually does and tell which frames are worth a closer look with preview_frame. Even sampling across a range misses cuts entirely; this does not. For anything with timing in it — a ramp, a hit, a reveal, a transition — a single still answers almost nothing, and this costs roughly what one preview_frame costs because the browser is launched once and then seeked. Use it to check that an effect ramp actually ramps, that a move lands on the beat, or that a reveal reads. Pass from+to (with optional count), or explicit times[]. Max 12 frames.
Prepare a scope and price for human video editing. Creates an estimate only: never books an editor or charges money. Ask the user for footage length, output duration/count and desired changes. Share any clarification and send the user to the reviewUrl to explicitly choose paid or optional volunteer help.
Queue a video export (render) of a project. Returns a jobId to poll with get_render_status. Plan limits (resolution cap, watermark, export quota) apply.
READ BACK WHAT THE RENDERER WILL ACTUALLY DRAW: the computed value of the animated properties on a clip at chosen times, from the same function the compositor calls. get_project returns the keyframes you WROTE — your own input echoed back — so it cannot tell you whether an interpolation is doing what you meant. This can. Every property comes back with values, deltas, and a `shape` (linear / accelerating / decelerating / accelerating-then-decelerating), plus `linearityError`: 0.000 means dead linear, a cubic ease-out is around 0.15. USE IT TO VERIFY AN EASE INSTEAD OF EYEBALLING FRAMES — at 8 frames across half a second you cannot see the difference between easeOutQuart and linear on a small move, and a silent interpolation bug stays invisible until a person says the video feels wrong. Omit times to sample evenly across the clip. Omit props to get whatever is keyframed on it. Costs nothing and hits no model.
Put a finished export on the calendar. Vidmoat posts it at the time you give, on every connected channel whose platform app is approved; the rest appear as a reminder for the owner to post by hand. Render the project first (render_project, then get_render_status until COMPLETED) and pass that render job id. Channels may be named by platform ("youtube") or by account id; omitting them means every connected channel.
DOES THIS EDIT FEEL MUSICAL OR ASSEMBLED? Give it your cut times and a beat grid; it returns the fraction landing within 60ms of a beat, the mean deviation, a verdict (musical / mostly-on / assembled) and the worst offenders WITH the beat each should move to, so the fix is mechanical. No media is decoded, so it is instant — re-run it after every adjustment. READ systematicOffset FIRST: when nearly every cut misses in the same direction by a similar amount, the beat GRID phase is wrong and one beatOffset correction fixes the whole edit; moving each cut individually would be the wrong action entirely. Also runs on a reference video the user admires — analyse its cuts and its music, score them here, and you have measured how that editor cuts.
Search Vidmoat editing capabilities by name, category or purpose. Read-only; no generation, download, edit or credit charge. Returns exact supported names, usage, font weights, access requirements and pagination. Search before choosing unfamiliar fonts/styles; these results never bypass execution permissions. Empty query browses a category. Stock media has its own search_stock_media tool.
Search royalty-free stock video/photos (configured Pexels, Pixabay, and optional Wikimedia Commons CC0/public-domain metadata) or stock audio (Freesound, CC0 only — no attribution needed) by keyword. Returns candidates with a downloadUrl and source/license metadata — pass the one you want to import_media with optional provenance {sourceUrl, license, licenseUrl}, then addClip with the url it returns (type: "audio" for music/SFX results). Use when a project needs b-roll, an image, or a music bed/SFX the user did not supply themselves. AUDIO SEARCH IS TAG-MATCHED AND NARROW: the provider ANDs every word, so a full brief like "clean minimal tech corporate loop upbeat" matches nothing on its own. One or two concrete words work far better. If a multi-word query would come back empty it is automatically retried term by term and the results merged, ranked by matchedTerms (how many of your words each one actually matched) — so check that field rather than assuming the top hit answers the whole brief. Audio results also carry bpm when the filename or tags state one, and you can filter by it.
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.