- Brand
- Flashloop
- Category
- Content & Design
- Primary Subcategory
- Multi-Modal Generative Media Platforms
Integration details
Description
Flashloop turns ChatGPT into an AI video and image studio. Describe what you want, and Flashloop makes it right in the chat with a choice of video and image models, using your Flashloop account. What you can do: - Generate short videos from a text prompt or a reference image, with control over length, aspect ratio, resolution and sound on models that support them. - Create up to 4 images per prompt. - Keep characters, places and props consistent across a series with saved references. - Turn a script into a voiceover in more than 70 languages, change the voice of existing audio, or translate spoken audio while keeping the voice. - Clone your own voice and use it in voiceovers. - Upscale existing images and videos 2x or 4x. - Assemble clips and voiceovers into one captioned video. - Browse, download and delete your past generations. How it works: Connect your Flashloop account once. While a generation renders, a live card shows its progress, then plays the finished video or shows the images. Everything you make is saved to your Flashloop library, so you can keep working on it at flashloop.app or in the Flashloop app. Generations draw on your existing Flashloop account, and you can check your balance or estimate a job before you start. Prompts and uploads go through Flashloop's content moderation, and requests that break the Flashloop AI Safety Policy are blocked. You need a Flashloop account to use this plugin.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Multi-Modal Generative Media Platforms
- Secondary Subcategories
- None listed
- Brand
- Flashloop
- Access
- Account required
- First tracked
- 2026-10-29
- Tool count
- 34
- Market
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Your score is coming
ChatGPT now suggests Plugins on its own when they match a user's request.Your Plugin Discovery Score measures how often yours appears, and it will show here as soon as it’s ready.
What discovery looks like

Get alerts for Flashloop
Get updates when Flashloop’s Discoverability Score or category rank changes.
Competing in ChatGPT Multi-Modal Generative Media Platforms
View Category34 tools agents can invoke
Join 1 to 24 clips into one MP4 where every block gets the same fixed window, each with an optional voiceover take and a burned caption line; free, no credits. Use it for simple explainer videos built from equal blocks. For anything richer (per-clip lengths and trims, voice or captions spanning clips, music, other aspect ratios, a quick preview) use flashloop_edit_video instead. A take shorter than its window is centered; a longer one is sped up without changing pitch (a warning above 1.35x). With `voice_generation_id` the caption words follow the speech; with only `audio_url` they are spread evenly. Clips and audio must be your own Flashloop results or files on the Flashloop CDN. Returns {job_id, video_id, status, credits_used: 0, estimated_wait_seconds}; flashloop_wait_for_job returns the MP4 and `warnings` (squeezed takes, short clips). Example: {"blocks": [{"video_url": "https://cdn.flashloop.app/...mp4", "voice_generation_id": "voice_generation:<id>", "subtitle_text": "Octopuses have three hearts."}], "block_duration": 8}.
flashloop_assemble_video
Re-speak existing speech audio in a different voice, keeping the words and timing (voice conversion). Use it when the user has a recording and wants it in another voice; to speak new text use flashloop_generate_voiceover, and to change the language use flashloop_translate_audio. Send the exact `duration_seconds` of the audio; that field says where to get it, never estimate it. Spends credits per second. Returns {job_id, kind: 'change_voice', status}; call flashloop_wait_for_job for the new audio in `output.url`. Example: {"audio_url": "https://cdn.flashloop.app/...mp3", "voice_id": "<id from flashloop_list_voices>", "duration_seconds": 24.5}.
flashloop_change_voice
Create a new voice for the user from a clear recording of one speaker. Only clone the user's own voice or a voice they have clear permission to use; the voice of a public figure, or of someone else taken from a public link, is not permitted. Use it when the user wants narration in their own voice; to pick an existing voice use flashloop_list_voices. A recording the user attached or made in a sandbox must first be uploaded with flashloop_upload_media (kind 'audio'), and the URL it returns goes in `audio_url`. Returns {voice: {id, name, status}}; the `id` is a `voice_id` for flashloop_generate_voiceover (eleven models) and flashloop_change_voice. Example: {"name": "Ana narrator", "audio_url": "https://cdn.flashloop.app/...mp3"}.
flashloop_clone_voice
Create the Faceless video project of each episode in the user's Faceless Studio. Free: it creates the project folders only, and no video shows as generating. It saves these settings as /workspace/brief.json in each project's sandbox; flashloop_finish_video records them with the video, so never delete or edit that file. Call it once per video, after flashloop_get_instructions; the finished video is registered later with flashloop_finish_video. Returns {series_id, episodes: [{episode, project_id}], style: {id, title, reference_video_url} or null}. Next, pass each project_id to flashloop_exec (that episode's own sandbox) and to flashloop_generate_voiceover, flashloop_create_image and flashloop_upload_media, so their files appear in the project as they are made, then to flashloop_finish_video. Refuses with insufficient_credits when the balance cannot pay the voiceover of every episode, and with invalid_input when the user already has 8 videos in progress (started in the last 24 hours and not finished). Example: {"prompt": "What if the moon were made of glass", "duration_seconds": 60, "episodes": 1, "style_id": "bold-flat"}.
flashloop_create_project
Generate a reusable place (kind 'location') or object (kind 'element') from a description and save it to the user's references. Spends credits for one image. Use it only for something that will recur across shots or videos; a place seen once belongs in that shot's prompt, and a curated or saved one from flashloop_list_references costs nothing to reuse. The framing is fixed: a location renders as a wide empty establishing shot (16:9, no people), an element as one object centered on a plain background (1:1), so describe the subject, not the shot. Not for people: to save a person, make the portrait with flashloop_create_image and keep it with flashloop_upload_reference (free and instant). To save an object the user already has a picture of, use flashloop_upload_reference too. Returns {job_id, reference_id, kind, name, status, credits_remaining, estimated_wait_seconds, warnings}; call flashloop_wait_for_job before using reference_id, because until the image lands there is nothing to attach. Example: {"kind": "location", "prompt": "a neon-lit ramen bar on a rainy Tokyo side street at night"}.
flashloop_create_reference
Start a generation of 1 to 4 images from a text prompt, optionally guided by reference images or saved references, and return a `job_id` per image. Use it for new images and for edits of an existing image (pass it as a reference and describe the change); to enlarge an existing image without changing it, use flashloop_upscale. `model_id` is one of the listed ids; call flashloop_list_models type 'image' first only when you need a model's price, aspect ratios or reference limit. `reference_image_urls` takes https URLs: a public https URL, such as one on cdn.flashloop.app, goes in as is; a chat attachment or a sandbox file must first be uploaded with flashloop_upload_media (or picked by the user in flashloop_upload_widget), and the URL it returns goes here. Saved people, places and objects from flashloop_list_references go in `character_ids`, `location_ids` and `element_ids`. Uploads and saved references share the model's `capabilities.max_reference_images` budget: extras are dropped, not rejected, and `warnings` says which. Spends credits per image (price: flashloop_estimate_cost kind 'image'). Returns {job_id, job_ids (one per image), image_id, image_ids, status, credits_remaining, estimated_wait_seconds, warnings}; call flashloop_wait_for_job with each job_id for the image URL. The card shows progress to the user. Example: {"prompt": "a red fox reading a newspaper in a cozy cafe, film photo", "model_id": "nano-banana-pro", "image_count": 1, "aspect_ratio": "1:1"}.
flashloop_create_image
Mint a single-use upload URL for a file in the chat's own code-execution environment (some hosts write chat attachments there as a real file). Returns `put_url`, a ready-to-run curl `command` (replace <FILE_PATH> with the file's path) and the limits. Bytes travel over the network (up to 30MB in seconds, no token cost), unlike base64 which streams through the model's output. The curl response JSON contains the asset `url`, which `reference_image_urls` in flashloop_create_image and flashloop_create_video accepts. The URL expires in 10 minutes and accepts exactly one upload. A network or connection error from the curl means the environment cannot reach this domain; flashloop_upload_widget is the alternative that needs no network access.
flashloop_create_sandbox_upload_url
Start a video generation from a text prompt, from images (first frame, end frame, references) or from a reference video, and return a `job_id`. Use it for new clips; to join finished clips with voice, captions and music use flashloop_edit_video, and to enlarge an existing video use flashloop_upscale. Pick `model` from flashloop_list_models type 'video' and send only what its `capabilities` allow: the `duration` range, sound, resolution, speed, first frame (`requires_first_frame`), image, video and audio references (`max_reference_images`, `reference_support`), saved references (`supports_characters`), `multi_shot` and `draft_support`. Image URLs must be https: a public https URL, such as one on cdn.flashloop.app, goes in as is; a chat attachment or a sandbox file must first be uploaded with flashloop_upload_media (or picked by the user in flashloop_upload_widget), and the URL it returns goes here. Saved people, places and objects from flashloop_list_references go in `character_ids`, `location_ids` and `element_ids`. MULTI-SHOT (kling-3.0, kling-4.0): `multi_shots: true` plus either `multi_shots_auto: true` with a `prompt` (the server splits it into shots) or your own `multi_prompt` shots. kling-4.0 (3 to 30 s, prompt up to 8000 characters, audio always on) has two modes that never combine: FRAMES (first_frame_image_url, optional end_frame_image_url, optional keyframe_image_urls, or multi-shot) and REFERENCES (reference_image_urls up to 10, reference_video_urls up to 5, reference_audio_urls up to 3, kling_elements up to 7, 15 in total, a prompt required, aspect_ratio may be 'auto'). MOTION CONTROL (kling-*-motion-control): reference_video_url + first_frame_image_url + reference_video_duration_seconds. Spends credits (price: flashloop_estimate_cost kind 'video'). Returns {job_id, video_id, status, credits_remaining, estimated_wait_seconds, warnings}; `warnings` lists references that were dropped and why. Call flashloop_wait_for_job with the job_id for the video URL; a video takes minutes, so expect 'timeout' results before it completes. The card shows progress to the user. Example: {"prompt": "slow dolly-in on a lighthouse at dusk, waves crashing on the rocks", "model": "kling-3.0", "duration": 5, "aspect_ratio": "16:9"}.
flashloop_create_video
Permanently delete one of the user's own saved references; this cannot be undone. Curated library rows cannot be deleted. Past generations that used it keep their output; only the reusable row goes away. Confirm with the user first when `usage_count` in flashloop_list_references shows the reference is used across a series. Deleting a base character also deletes its variants. Returns {deleted: true, kind, reference_id, deleted_variants (characters only)}. Example: {"kind": "element", "reference_id": "<id from flashloop_list_references>"}.
flashloop_delete_reference
Permanently delete one of the user's generated images by id. This cannot be undone, so do it only when the user asks to delete that image. Returns {deleted, image_id}. Example: {"image_id": "6f1c2d3e-4b5a-4c6d-8e7f-9a0b1c2d3e4f"}.
flashloop_delete_image
Permanently delete one of the user's videos by id. This cannot be undone, so do it only when the user asks to delete that video. Returns {deleted, video_id}. Example: {"video_id": "6f1c2d3e-4b5a-4c6d-8e7f-9a0b1c2d3e4f"}.
flashloop_delete_video
Edit clips, voiceover takes, burned captions and music into one MP4 on a timeline; free, no credits. Use it to finish a video from parts you already have; to create new footage use flashloop_create_video. `clips` play in order with hard cuts; each is one of your completed videos (`video_id`, or its `video:<id>` job_id) or a Flashloop CDN `src`. A clip's slot is its own length unless `duration` is set; `fit` decides what a shorter clip does and `scale` how it fills the canvas. Anchors (`at`) place voice, captions and music: {clip: i} spans clip i, {clips: [i, j]} spans clips i through j, {start, end} are seconds on the output timeline. A take longer than its window is sped up to `max_speed`, then fails the job with VOICE_TOO_LONG unless `overflow` is 'trim'. A caption with `voice: k` follows take k, and when that take is a voice_generation_id its words are synced to the speech. Music ducks under the voice. `canvas.quality: 'preview'` renders a quick half-resolution draft for checking timing. Submitting an edited timeline again makes a new video and re-renders only the clips that changed. Returns {job_id, video_id, status, credits_used: 0, estimated_wait_seconds}; flashloop_wait_for_job returns the MP4 and `warnings` (such as a clip shorter than its slot). A failed job's message starts with a code such as VOICE_TOO_LONG, SOURCE_DOWNLOAD_FAILED or RENDER_FAILED that names what to change. flashloop_assemble_video is the simpler fixed-block form. Example: {"clips": [{"video_id": "video:<uuid>"}, {"video_id": "video:<uuid>"}], "voice": [{"voice_generation_id": "voice_generation:<uuid>", "at": {"clips": [0, 1]}}], "captions": [{"text": "Octopuses have three hearts.", "voice": 0}]}.
flashloop_edit_video
Estimate the credits a planned generation will cost, without running it or charging anything. Optional: use it when the user asks about price or before an expensive call, then compare the result with flashloop_get_credits; the server price is final and may differ slightly. Pass the same model and options you plan to send. kind 'video' and 'image' read the model's catalog pricing (`duration` accepts any whole second inside the model's `capabilities.duration` range; for a multi-shot video pass the total of all shot durations). kind 'voiceover' needs `text_characters` and prices it per character. kind 'music' is a flat price per song (1050 credits, 2000 with `max_mode`). kind 'assembly' (flashloop_assemble_video, flashloop_edit_video) is always 0. An upscale model returns `estimated_credits: null`: its price comes from the source file, so read credits_used from the finished job instead. Returns {estimated_credits (a number, or null when it cannot be known), basis, approximate, notes}. Example: {"kind": "video", "model": "kling-3.0", "duration": 10, "resolution": "1080p"}.
flashloop_estimate_cost
Register the finished video of one Faceless project in a single call. Pass exactly one of two forms. For a video rendered remotely with flashloop-motion-remote, pass the render_job_id (its printed jobId) alone: the render must be completed, whole (no --range) and at --quality final, and its video and thumbnail are taken from that render, so nothing is uploaded. For a video rendered in the project's sandbox (the /workspace of flashloop_exec with the same project_id), pass video_path and thumbnail_path once the final mp4 and thumbnail are written there: the files are checked and copied from the sandbox, so do not upload them with flashloop_upload_media first. The video must be an MP4 with H.264 video at 1080x1920 and an AAC audio track; the thumbnail a 1080x1920 JPEG or PNG under 10 MB. If anything is wrong, nothing is saved and the invalid_input error lists every problem with its exact fix: fix them all, then call once more. It also refuses with invalid_input when /workspace/brief.json, saved by flashloop_create_project, is missing, and says how to restore it. Returns {project_id, status: completed, video_url, thumbnail_url, studio_url, title}; studio_url opens the video in the user's Faceless Studio, so give it to the user. Safe to call again on a finished project. Examples: {"project_id": "0f8e2b9c-3a51-4d0e-9a7b-6c2d1e4f5a60", "render_job_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7", "title": "What if the moon were glass"}, or {"project_id": "0f8e2b9c-3a51-4d0e-9a7b-6c2d1e4f5a60", "video_path": "/workspace/what-if/moon/edit/renders/out.mp4", "thumbnail_path": "/workspace/what-if/moon/thumbnail.jpg", "title": "What if the moon were glass"}.
flashloop_finish_video
Generate a full song with Flashloop Music, with vocals or instrumental, from a description (mode 'simple') or from your own style and lyrics (mode 'custom'). Use it for background music or a song the user asks for; spoken narration is flashloop_generate_voiceover instead. Every generation makes two different tracks, each as an mp3 preview and a wav download. Costs 1050 credits, or 2000 with max_mode, both tracks and wav files included. Returns {job_id, kind: 'music', status, credits_used, credits_remaining}; flashloop_wait_for_job then returns `output.tracks`: [{index, mp3_url, wav_url, title, duration_seconds}]. Example: {"mode": "simple", "prompt": "calm lo-fi beat for a study video", "instrumental": true}.
flashloop_generate_music
Turn a script into speech with one voice, or a two-speaker dialogue, and return a `job_id`. Use it for narration and voiceover takes; to re-voice existing audio use flashloop_change_voice, and to translate speech use flashloop_translate_audio. Pick `voice_id` from flashloop_list_voices: a voice tagged with a `model` works only with that `model_id`, and a voice without one works only with the eleven models. Models: eleven-v3-voiceover (default; up to 5000 characters; cloned voices), eleven-v4-voiceover (most expressive, audio tags such as [whispered]; up to 10000; cloned voices; `stability`, `language_code`), eleven-v4-turbo-voiceover (faster, half the price; up to 10000; `stability`, `language_code`), gemini-3-1-voiceover (70+ languages, half the price; up to 10000), gemini-3-8-flash-voiceover and gemini-3-8-flash-lite-voiceover (up to 5000 spoken characters; the text is read literally, so delivery goes in `style`; accepted tags <laugh>, <sigh>, <short pause>, <breath>, <cough>; a dialogue sends `speakers` and `turns` instead of `text` and `voice_id`). Spends credits per character (price: flashloop_estimate_cost kind 'voiceover' with text_characters). Returns {job_id, kind, status, credits_remaining}. Generation takes from seconds to several minutes with the script length: flashloop_wait_for_job returns the audio in `output.url`, word timings in `output.words` and the length in `output.raw.duration_seconds`. Pass the job_id as `voice_generation_id` to flashloop_edit_video for captions synced to the speech. A result that already has `audio_url` is finished and has no job. Example: {"text": "Did you know octopuses have three hearts?", "voice_id": "<id from flashloop_list_voices>", "model_id": "eleven-v4-voiceover", "stability": 0.45, "language_code": "en"}.
flashloop_generate_voiceover
Read the Flashloop Faceless video guide before making a video. Call it first: it explains the full flow with flashloop_list_styles, flashloop_create_project, flashloop_exec, flashloop_generate_voiceover and flashloop_finish_video. Without `path` it returns the main instructions and the list of extra files. With `path` it returns that one file as text. Example: {"path": "references/what-if-voiceover.md"}.
flashloop_get_instructions
Turn a generation's cdn.flashloop.app URL (the `url` of a flashloop_list_generations row or flashloop_wait_for_job output) into a time-limited direct-download URL (Content-Disposition: attachment, expires in about 1 hour). Use it when the user wants to SAVE a video, image or voiceover to their device; to just show it, use the cdn URL itself. Returns {download_url, expires_in_seconds}: give download_url to the user. Calls the Flashloop API (https://www.flashloop.ai/mcp). Example: {"url": "https://cdn.flashloop.app/videos/123/1730000000000_out.mp4", "filename": "moon.mp4"}.
flashloop_get_download_url
Check one async Flashloop job once, without waiting, and return its state. Use it to peek at a job while doing other work; to block until it finishes, use flashloop_wait_for_job. Returns the same shape as flashloop_wait_for_job: status 'completed' with `output`, 'failed' with `error`, or 'timeout', which here means the job is still running. Example: {"job_id": "image:7d2e4f10-1a2b-4c3d-8e9f-0a1b2c3d4e5f"}.
flashloop_get_job
Return the user's current credit balance as {credits_balance}, a whole number of credits. Use it before a paid generation to check that the balance covers the price from flashloop_estimate_cost, or after a batch to see what it spent. Takes no input, costs nothing and changes nothing. For the account email and plan, use flashloop_whoami.
flashloop_get_credits
Show the Faceless video styles as a gallery the user can pick from, and return them as {styles: [{id, title, summary, preview_url, thumbnail_url, reference_video_url}]}. Free. This list is the one source of style ids: after the user picks one, pass its `id` as `style_id` to flashloop_create_project. Takes no arguments: {}.
flashloop_list_styles
List the user's past videos and images, newest first, and show them as a gallery. Use it for history requests (show my videos, find the image I made yesterday) and to get the id or URL of an earlier result: a completed `url` can be passed as a reference to flashloop_create_image or flashloop_create_video, and `id` is the video_id or image_id for flashloop_delete_video, flashloop_delete_image or flashloop_edit_video. Voiceovers, music and saved references are not listed here (saved references: flashloop_list_references). A generation made in this conversation is already shown by its own card, so do not list it again. Returns {generations: [{job_id, kind, id, status, url, thumbnail_url, output_urls, model_name, created_at, failure_category}], page, limit, has_more}; when has_more is true, call again with page + 1. Example: {"type": "video", "status": "completed", "limit": 9}.
flashloop_list_generations
List the video, image, upscale and music models with their ids, pricing and a `capabilities` block. Call it before flashloop_create_video, flashloop_create_image, flashloop_upscale, flashloop_generate_music or flashloop_estimate_cost to pick a valid model id and learn which options that model accepts; pass `type` to list one kind only, which keeps the result short. Voiceover models are not listed here: they are the `model_id` values of flashloop_generate_voiceover. Read every limit from `capabilities`: `duration` (mode "range" accepts any whole second from min_seconds to max_seconds and `values` are only presets; mode "enum" accepts only `values`), `max_reference_images`, `reference_support` (reference video and audio caps), `supports_characters` and `character_cap` (saved references), `requires_first_frame`, `multi_shot`, `draft_support`, upload limits (`max_image_size_mb`, `max_video_size_mb`, `accepted_upload_formats`) and `typical_seconds` (usual render time). The top-level `supported_durations` is a legacy preset list; `capabilities.duration` wins. Returns {models: [{id, name, type, description, supported_aspect_ratios, supported_resolutions, defaults, pricing, capabilities}]}. Example: {"type": "video"}.
flashloop_list_models
List the saved references the user can attach to a generation: characters (people), locations (places) and elements (objects and props), from both the curated public library and the user's own rows (`owned_by_me`). Use it when the user mentions a saved character, place or object, or asks what they have saved; a subject with no saved reference is simply described in the prompt. Pass a row's `id` to flashloop_create_image or flashloop_create_video in the field for its kind: `character_ids`, `location_ids` or `element_ids`. A wrong field attaches nothing, with no error, and the render still costs full price. Copy ids from rows; never derive them from a name. Only rows with status 'ready' can be attached. The library cannot be paged server-side, so narrow it with `kind`, `search` and `owner`; `counts`, `total_matched` and `truncated` show what was left out. Shows the rows as a gallery card. Returns {references: [{id, kind, name, description, image_url, status, owned_by_me, origin, role, category, usage_count, variant_of}], universes, counts, total_matched, truncated, warnings}. Example: {"kind": "character", "owner": "me", "search": "ana"}.
flashloop_list_references
List the voices the user can speak with: built-in presets and the user's own cloned voices. Call it before flashloop_generate_voiceover, flashloop_change_voice or flashloop_translate_audio to get a valid `voice_id`. A voice with a `model` field (gemini-3-1-voiceover, gemini-3-8-flash-voiceover, gemini-3-8-flash-lite-voiceover) works only with that flashloop_generate_voiceover model_id; a voice without one works only with the eleven models; cloned voices (owner 'user') never work with the gemini models. Takes no input and costs nothing. Returns {voices: [{id, name, description, preview_audio_url, status, owner ('builtin' or 'user'), model, gender}]}; play preview_audio_url to let the user choose.
flashloop_list_voices
Open an interactive upload widget where the user picks one or more reference images from their device. Use it when the image is only on the user's device or in a chat attachment you cannot reach, or when the curl `command` of flashloop_upload_media is blocked; a file in the Flashloop sandbox goes through flashloop_upload_media `sandbox_path` instead. `model_id` (from flashloop_list_models) sets the widget's limits: how many images, accepted formats and max file size for that model. Each file is uploaded and moderated immediately; when the batch finishes the widget posts all resulting URLs into the conversation by itself (a 'Done' button appears only when the host refuses that post). Pass those URLs in `reference_image_urls` of flashloop_create_image or flashloop_create_video. Images only; a video or audio reference goes through flashloop_upload_media. Returns {message, max_files, max_bytes, accepted, model_reference_max, session}; wait for the URLs the widget posts. Example: {"model_id": "nano-banana-pro"}.
flashloop_upload_widget
Rename one of the user's own saved references, change a character's `role` or an element's `category`. Curated library rows and other people's rows cannot be edited. The picture cannot be changed: a different look is a new reference, saved with flashloop_upload_reference. Send at least one of name, role or category. Returns {reference: row as in flashloop_list_references}. Example: {"kind": "character", "reference_id": "<id from flashloop_list_references>", "name": "Detective Ana"}.
flashloop_update_reference
Run a bash command in a persistent Linux sandbox for building media and documents. /workspace keeps its files between calls; pass a `project_id` from flashloop_create_project to work in that video project's own sandbox, or leave it out for the general one. Preinstalled: bash, curl, git, jq, zip, ffmpeg and ffprobe, Node.js with npm, Bun, Python 3 with pillow, matplotlib, pandas, openpyxl, python-docx, python-pptx, reportlab, pypdf and faster-whisper, and `flashloop-motion`, which renders JSX motion scenes to mp4 (run `flashloop-motion --help`). The network reaches package registries, web fonts and the Flashloop CDN only: register any other public file with flashloop_upload_media `url` and download the returned url here. To hand a file made here to the user or to a generation, call flashloop_upload_media with `sandbox_path` (and the same `project_id`); a finished Faceless video goes to flashloop_finish_video by path. Foreground commands wait up to `timeout_seconds` (120 at most); longer work goes in `background`. Returns {exit_code, stdout, stderr, timed_out, truncated, sandbox_created, project_id}; sandbox_created true means a fresh sandbox, so earlier files are gone. Example: {"command": "ffprobe -v error -show_entries format=duration -of csv=p=0 out.mp4", "project_id": "0f8e2b9c-3a51-4d0e-9a7b-6c2d1e4f5a60"}.
flashloop_exec
Save an image the user already has as a reusable reference: a person (kind 'character') or an object or prop (kind 'element'). Free and instant: nothing is generated, and the row comes back ready to use. Use it to keep a portrait or object the user liked, for example right after flashloop_create_image. A character needs a `name` (how the user will refer to them) and exactly one image. Elements save a batch of up to 20 images in one call, each named and filed automatically; every image is moderated and one blocked image rejects the whole batch. There is no upload path for places: generate one with flashloop_create_reference. A chat attachment or a sandbox file must first be uploaded with flashloop_upload_media; pass the URL it returns. Returns {references: [rows as in flashloop_list_references], created}; pass a row's `id` in `character_ids` or `element_ids` of flashloop_create_image or flashloop_create_video. Example: {"kind": "character", "image_urls": ["https://cdn.flashloop.app/...png"], "name": "Ana", "role": "The detective"}.
flashloop_upload_reference
Translate the speech in an audio file into another language (dubbing). The translation always keeps the source speaker's voice; for another voice, pass the translated `output.url` to flashloop_change_voice next. Use it when the user wants existing speech in another language; to speak a new script use flashloop_generate_voiceover with a translated `text`. Send the exact `duration_seconds` of the audio; that field says where to get it, never estimate it. Spends credits per second. Returns {job_id, kind: 'translate', status}; call flashloop_wait_for_job for the translated audio in `output.url`. Example: {"audio_url": "https://cdn.flashloop.app/...mp3", "target_language": "es", "duration_seconds": 42}.
flashloop_translate_audio
Bring a media file into Flashloop and return its `url`, which flashloop_create_image and flashloop_create_video accept in `reference_image_urls` and flashloop_create_project accepts as `reference_url`. Pick the input by where the file is: (1) a file in the Flashloop sandbox, made or processed with flashloop_exec (a chart, a frame, an edited clip): pass `sandbox_path` and, if the file was made under a project, the same `project_id`; one call copies it server-side, registers and moderates it. A finished Faceless video goes to flashloop_finish_video instead. (2) a direct public URL of a media file that needs no processing: pass `url` with `kind` and `content_type`. To process a public file, register it this way first and download the returned `url` inside flashloop_exec: the sandbox reaches only the Flashloop CDN and package registries. (3) a file only in the chat's own code-execution environment, such as an attachment written there: pass `filename` + `content_type`, run the returned curl `command` there, then call this tool again with `url` set to the returned `public_url`, `kind` and `content_type`. When that environment blocks the curl, use flashloop_upload_widget. (4) files the host passes as file parameters arrive in `files`. (5) a tiny file (up to 100KB) with no other way in: `base64` + `content_type`; base64 is written token by token, so it stalls above ~100KB and fails past 500KB. With a `project_id` from flashloop_create_project the registered file is also filed under that Faceless project; a `sandbox_path` file uploaded that way stays in the project and out of the user's Uploads library. Returns {asset_id, url, moderation_status, ...}: `files` returns {assets, failed} and `filename` returns {upload_url, public_url, command, next_step}. Uploaded media is moderated; rejected media cannot be used. Calls the Flashloop API (https://www.flashloop.ai/mcp). Example: {"sandbox_path": "/workspace/charts/revenue.png"}.
flashloop_upload_media
Upscale an existing image or video 2x or 4x for a sharper, larger file, without generating new content. Use it when the user asks to enhance, upscale or enlarge a file they already have; to make a new image or video use flashloop_create_image or flashloop_create_video. Pick `model_id` from flashloop_list_models type 'upscale': its `upscale_input_type` says whether it takes an image or a video, and the source must match. `source_url` must be a reachable https URL; a chat attachment or a sandbox file must first be uploaded with flashloop_upload_media, and the URL it returns goes here. Spends credits, priced from the source's real duration or resolution, so no estimate exists up front: compare credits_remaining before and after, or read credits_used from the finished job. Returns {job_id, kind, id, status, credits_remaining, estimated_wait_seconds}; call flashloop_wait_for_job for the upscaled file's URL. Example: {"model_id": "topaz-image-upscale", "source_url": "https://cdn.flashloop.app/...png", "upscale_factor": "2"}.
flashloop_upscale
Wait for one async Flashloop job to finish and return its result. Every tool that starts work returns a `job_id` (flashloop_create_image, flashloop_create_video, flashloop_generate_voiceover, flashloop_generate_music, flashloop_upscale, flashloop_assemble_video, flashloop_edit_video, flashloop_change_voice, flashloop_translate_audio, flashloop_create_reference); pass it here when the next step needs the output. It waits up to `timeout_ms` (default 90000, 90 seconds). Videos often take several minutes, so a result with status 'timeout' means the job is still running, not that it failed: call this tool again with the same job_id, which costs nothing and loses nothing. Returns {status: 'completed', job_id, output: {url, urls (every image), thumbnail_url, tracks (music: mp3_url, wav_url, title, duration_seconds), words (voiceover word timings in seconds), raw: {credits_used, duration_seconds, warnings, ...}}}, or {status: 'failed', job_id, error: {error, message}}, or {status: 'timeout', job_id, waited_ms, hint}. The create tool's card already shows progress to the user. For one check without waiting, use flashloop_get_job. Example: {"job_id": "video:3f1c9a2e-8b7d-4c1a-9e2f-5d6b7a8c9d0e"}.
flashloop_wait_for_job
Return the signed-in Flashloop account: its email, credit balance and subscription plan. Use it to confirm which account is connected or to answer a question about the plan. For the balance alone before a paid call, flashloop_get_credits is enough. Takes no input and changes nothing. Returns {email, credits_balance, subscription: {tier, status, current_period_end} or null when there is no plan}.
flashloop_whoami
Flashloop ChatGPT Plugin FAQ
How the directory, categories and Discoverability Score work.
Read the methodologyHow do I improve Flashloop's ChatGPT Plugin 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.
What are Flashloop alternatives on ChatGPT?
As of 2026-11-02, Flashloop competes with Abracadabrax Images & Video, Ad Army, Animx, Arcads, Artlist, Atlas Cloud, AutoContent API, AutoSprite and 43 more in ChatGPT Multi-Modal Generative Media Platforms, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.