Thumbnail Generation
Generate and edit thumbnails, swap in real faces, extract references, and compose prompts.
Default entry point for a brand-new thumbnail. Searches Algrow's database for topically-similar videos with proven outlier performance and renders them as a clickable grid in the thumbnail studio widget. Requires a specific YouTube niche or video title (2+ meaningful words) — generic single words like 'thumbnail' or 'video' are rejected.
| Parameter | Type | Default | Description |
|---|---|---|---|
| topic | string | required | Algrow semantic search query — must be a specific YouTube niche or video title (2+ meaningful words). Pass the exact same string as title when both are present. |
| title | string | null | The user's video title. The widget pre-fills its TITLE field with this. Always pass when known. |
| content_type | string | longform | longform or shorts. Default longform. |
| limit | integer | 12 | Max thumbnails per page. Default 12, capped at 24. |
| min_outlier_score | number | 2.0 | Floor on outlier multiplier. Default 2.0. |
| page | integer | 1 | 1-indexed Algrow page. Default 1. |
Use a specific YouTube video as the reference for a new thumbnail. Pulls the video's title and best-quality thumbnail via youtubei.js and mounts the widget with the reference preselected. If user_title is passed, the widget auto-runs the full pipeline (compose engineered prompt → generate image) with stage-by-stage progress.
| Parameter | Type | Default | Description |
|---|---|---|---|
| url_or_id | string | required | YouTube URL or bare 11-character video ID. |
| user_title | string | null | The user's NEW video title — what THEIR thumbnail is for. Always pass when known so the widget auto-runs compose + generate. |
| model | string | nano-banana-pro | Image-gen backend — nano-banana-pro (default), gpt-image-2, seedream-5.0-lite, or seedream-4.5-edit. |
| channel_preset | string | null | |
| wait | boolean | false |
Use a direct image URL (not a YouTube video) as the reference for a new thumbnail — R2 mirrors, raw .jpg/.png/.webp URLs, screenshots the user uploaded, etc. Mounts the widget with the reference preselected and, when user_title is provided, auto-runs the full compose + generate pipeline.
| Parameter | Type | Default | Description |
|---|---|---|---|
| image_url | string | required | Direct image URL. Must be http(s). R2 mirrors, raw .jpg / .png / .webp are all fine. |
| user_title | string | null | The user's NEW video title. Widget pre-fills its title field and triggers the auto-pipeline. Always pass when known. |
| reference_title | string | null | Optional. What the reference image is of / what it was made for. Helps the compose step reason about WHY the reference works. |
| model | string | nano-banana-pro | Image-gen backend — nano-banana-pro (default), gpt-image-2, seedream-5.0-lite, or seedream-4.5-edit. |
| channel_preset | string | null | |
| wait | boolean | false |
Use a whole channel's design system as the reference. Resolves the @handle or UC id via Algrow, fetches the channel's top 10 thumbnails by view count, vision-analyzes them in parallel, and synthesizes a 'channel DNA' (palette, typography, composition, lighting, effects) plus a tailored prompt applying that DNA to the user's title. ~90–120s first time, ~5s on cache hit (30-day cache).
| Parameter | Type | Default | Description |
|---|---|---|---|
| channel | string | required | YouTube @handle (e.g. @fern-tv) or channel ID (UCxxxxxxxxxxxxxxxxxxxxxx). Leading @ is optional. |
| user_title | string | null | The user's NEW video title. Channel DNA is applied to this title. Always pass when known. |
| model | string | nano-banana-pro | Image-gen backend. Default nano-banana-pro. Channel-style generates WITHOUT a reference image, so seedream-4.5-edit (img2img) is a poor fit. |
Submit a thumbnail generation request to the configured image backend (Nano Banana Pro, gpt-image-2, or a Seedream variant). Returns immediately with a task_id; the inline widget polls for the result automatically. Default aspect ratio 16:9. Accepts up to 8 reference URLs (YouTube links, bare video IDs, i.ytimg.com URLs, direct image URLs). Costs 1 credit per image regardless of model.
| Parameter | Type | Default | Description |
|---|---|---|---|
| prompt | string | required | Describe the subject and scene — who's on camera (or what the visual is about), what's happening, key props, and any text overlay the user wants. |
| aspect_ratio | string | 16:9 | 16:9 / 9:16 / 1:1 / 4:5 / 4:3 / 3:2 / 21:9 / auto. Default 16:9. |
| resolution | string | 2K | 1K / 2K / 4K. Default 2K. |
| reference_urls | array | null | Up to 8 reference inputs. Each can be a YouTube URL, bare video ID, i.ytimg.com URL, or direct image URL. |
| reference_images | array | null | Alias for reference_urls, accepted for back-compat. |
| find_outliers_first | boolean | false | Auto-pick path: fetch viral references from Algrow and use the top 3. Only set True when the user explicitly opts into auto-pick. |
| outlier_topic | string | null | Topic to search Algrow for when find_outliers_first=True. Keep short (2–3 words). |
| analyze_references | boolean | true | When True (default) and reference_urls are provided, the server runs Gemini vision on the references to extract a design breakdown and folds it into the prompt. |
| model | string | gpt-image-2 | Image-gen backend: gpt-image-2 (default), seedream-5.0-lite (permissive filter), seedream-4.5-edit (image-to-image), or nano-banana-pro (requires BYOK Gemini key). All models cost 1 credit per image. |
| use_own_key | boolean | true | |
| fast | boolean | false | |
| compose_task_id | string | null | |
| num_variants | integer | 1 | |
| channel_preset | string | null | |
| custom_instructions | string | null | |
| video_script | string | null | |
| realistic | boolean | false | |
| character_refs | array | null | |
| wait | boolean | false |
Apply a plain-English edit to an already-generated thumbnail — a surgical img2img pass, not a regeneration. The finished image goes back to the image model as the canvas plus the instruction; everything the instruction doesn't cover stays identical, and the result lands as a NEW version in the widget's version strip (earlier versions are never overwritten). Returns immediately with a task_id; the widget polls check_thumbnail_status. Powers the widget's Edit box, but Claude may also call it directly when the user asks for a specific edit to an existing render — base_image_url must be a real URL from a completed generation, never invented.
| Parameter | Type | Default | Description |
|---|---|---|---|
| base_image_url | string | required | URL of the generated thumbnail to edit — must come from a completed generation (never invented). Sent to the image model as image 1 (the canvas). |
| instruction | string | required | Plain-English description of the change to make, e.g. 'make the text yellow'. Max 2000 chars. |
| reference_urls | array | null | Optional extra source images for the change (a product, face, or logo to insert/swap). Sent as images 2+; the canvas plus these are capped at 8 total. |
| model | string | nano-banana-pro | Image-gen backend. Default nano-banana-pro. gpt-image-2 is force-remapped to nano-banana-pro — its img2img copy tendency fights instruction edits. |
| aspect_ratio | string | 16:9 | 16:9 / 9:16 / etc. Default 16:9 — keep it matching the base image. |
| use_own_key | boolean | true | Same semantics as generate_thumbnail: when True (default) and the user has a BYOK Gemini key, nano-banana-pro edits on THEIR key (no Algrow credits). When False, Algrow credits. |
| fast | boolean | false | Fast-mode toggle — same semantics as generate_thumbnail (dedicated fast render path, flat 3 credits/image). |
| wait | boolean | false |
Page through a channel's LONGFORM upload catalogue (shorts excluded) — newest first, 50 per page. Each video carries its thumbnail, title, and view count, plus the channel's recent-median view baseline (median_views) so any video scores as view_count / median_views. Use to hand-pick a specific channel thumbnail as a style reference, or to see what performs on a channel. Pass next_page_token AND playlist_id from the previous response for the next page. Free — no credits.
| Parameter | Type | Default | Description |
|---|---|---|---|
| channel | string | required | @handle, channel URL, or UC id. |
| page_token | string | null | next_page_token from the previous page. |
| playlist_id | string | null | playlist_id from the previous page — page tokens are playlist-specific. |
Manage the user's saved channel styles (the bookmarks in the thumbnail studio's Channel Style tab). action='list' returns them; action='save' bookmarks a channel; action='remove' deletes one. Saves store identity only — the catalogue is always fetched live via list_channel_thumbnails, so new uploads always appear. Free.
| Parameter | Type | Default | Description |
|---|---|---|---|
| action | string | list | list | save | remove. Default list. |
| channel | string | null | @handle / URL / UC id — required for action='save'. |
| channel_id | string | null | UC id from the list — required for action='remove'. |
Manage the user's reusable custom-instruction presets for thumbnail generation (e.g. 'dark moody palette, no extra text'). action='list' returns them; action='save' creates or updates by name; action='remove' deletes by id. Apply a preset by passing its instructions as custom_instructions to compose/generate. Free.
| Parameter | Type | Default | Description |
|---|---|---|---|
| action | string | list | list | save | remove. Default list. |
| name | string | null | Preset name — required for action='save'. Saving an existing name updates it. |
| instructions | string | null | The custom-instructions text — required for action='save'. Max 2000 chars. |
| preset_id | integer | null | Preset id from the list — required for action='remove'. |
Manage presets for your OWN channels — one saved bundle per channel so you don't re-specify your look every time. Keyed by a free-form label (e.g. 'Marion Vale hair'), a preset bundles custom instructions, a subject face that is auto-added as the on-camera person on every generation, and default model / aspect_ratio / resolution. How it differs: instruction_presets holds only reusable TEXT; saved_channel_styles bookmarks OTHER channels to borrow a look from; this is the full recipe for YOUR channel. action='list' returns them; action='save' creates or updates by label; action='remove' deletes by id. Apply one by passing its label as channel_preset to generate_thumbnail / compose_thumbnail_prompt / extract_reference_from_video / extract_reference_from_image: the face becomes reference 1 (the person), the picked reference supplies the style, and instructions + defaults fold in. Free.
| Parameter | Type | Default | Description |
|---|---|---|---|
| action | string | list | list | save | remove. Default list. |
| label | string | null | Free-form preset label (the channel name) — required for action='save'. |
| instructions | string | null | Custom brand/style instructions applied to every thumbnail for this channel. |
| face_url | string | null | Public URL of the subject face put in every thumbnail (an audio.algrow.online R2 URL or a direct image URL). |
| face_image_b64 | string | null | Base64 image bytes of the subject face — uploaded to R2 and stored as face_url. Use when the face isn't already hosted. |
| style_reference_urls | array | null | Style-reference thumbnail(s) whose look the channel copies (the Studio's step-2 style pick). Applied as extra references, after the face, on every generation. |
| channel_style | string | null | Optional channel (@handle / UC id) whose design language this channel borrows (the 'Channel style' tab). Stored for reference. |
| model | string | null | Default image-gen backend for this channel. |
| aspect_ratio | string | null | Default aspect ratio (16:9 / 9:16 / …). |
| resolution | string | null | Default resolution (1K / 2K / 4K). |
| preset_id | integer | null | Preset id from the list — required for action='remove'. |
Internal poll for the thumbnail studio widget — looks up the status of a generation task by task_id. The widget calls this on a loop while a generation is in flight; Claude should not normally invoke it from chat.
| Parameter | Type | Default | Description |
|---|---|---|---|
| task_id | string | required | The task_id returned by generate_thumbnail. |
| prompt | string | Original prompt (echoed back to the widget). | |
| aspect_ratio | string | 16:9 | Echoed back to the widget. |
| resolution | string | 2K | Echoed back to the widget. |
| reference_urls | array | null | Echoed back to the widget. |
| outliers | array | null | Echoed back to the widget. |
| outlier_topic | string | null | Echoed back to the widget. |
| model | string | nano-banana-pro | Echoed back to the widget. |
| compose_task_id | string | null |
Check whether a reference image has a person in it, so you can offer to put the user's own face in the render instead of a stranger's. Cheaper and faster than a full thumbnail analysis, and cached per image for six hours. Free — no credits.
| Parameter | Type | Default | Description |
|---|---|---|---|
| image_url | string | required | Reference image to inspect — a YouTube URL, bare video id, i.ytimg.com URL, or direct image URL. |
Find photos of a person by name so one can be used as an identity reference — either as a character reference when generating, or as the face for swap_face. Returns candidate image URLs; run the chosen one through import_face before rendering with it. Free — no credits.
| Parameter | Type | Default | Description |
|---|---|---|---|
| query | string | required | The person's name, optionally with a disambiguator — e.g. Elias Yoder, MrBeast 2024. |
Copy a face image into Algrow storage and return a stable URL the render pipeline can always fetch. Always run an external face URL through this before using it as a character reference or in swap_face — hotlinked sources can start refusing the download at render time. Free — no credits.
| Parameter | Type | Default | Description |
|---|---|---|---|
| image_url | string | required | Direct URL of the face image to import. |
| fallback_url | string | null | Second URL to try when the first can't be fetched — e.g. the search result's smaller thumbnail. |
Put a real person's face onto a thumbnail you already generated, leaving everything else in the image untouched. base_image_url must come from a completed generation; face_url is the person's photo (run external URLs through import_face first). Costs 1 credit, or 3 with fast. Returns a pending task_id — the inline widget polls it, so pass wait=true from clients without one.
| Parameter | Type | Default | Description |
|---|---|---|---|
| base_image_url | string | required | URL of the finished thumbnail to put the face onto (from a completed generation). |
| face_url | string | required | Photo of the person whose face to use — identity is preserved exactly. |
| aspect_ratio | string | 16:9 | Keep this matching the base image. |
| fast | boolean | false | Prioritised render. Flat 3 credits instead of 1. |
| wait | boolean | false | Block until the swap finishes and return the images in one call. Use from clients with no inline widget. |
Record a thumbs up or down on a generated thumbnail, with an optional note. Sending the same task_id again updates the existing rating rather than adding a second one. Free — no credits.
| Parameter | Type | Default | Description |
|---|---|---|---|
| rating | string | required | up or down. |
| task_id | string | null | The generation's task_id — anchors the rating so a re-rate updates it. |
| image_url | string | null | URL of the rated image, when you don't have the task id. |
| feedback | string | null | Free-text note (max 2,000 characters). |
Algrow
Shorts Channels