AI Thumbnail Generator - Faces + Hook Headlines
Pricing
Pay per event
AI Thumbnail Generator - Faces + Hook Headlines
Make a video thumbnail from your title or story: an AI close-up face showing the story's emotion, with a short all-caps hook burned on in a real font so it stays sharp. PNG in 9:16, 16:9 or 1:1. Runs on your own OpenAI key. $150.00 per 1,000 thumbnails ($0.15 each).
Pricing
Pay per event
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
4 days ago
Last modified
Categories
Share
Make an AI video thumbnail from your title, with a close-up face and a hook headline: give it a video title, or the whole story. It works out the emotion, writes a short all-caps hook, draws a close-up face with that expression, then burns the headline on with a real font so the words stay sharp. You get a PNG in 9:16, 16:9 or 1:1.
The image is drawn on your own OpenAI key, which you paste into the input. The $0.15 below is what this actor charges per thumbnail; the image generation itself is billed to you by OpenAI. Leave the key out and the run writes a free sample record showing the exact output shape, with no image and no thumbnail charged.
| Input | A title, or a title plus the story text |
| Output | One thumbnail PNG per run, and a row with its link, the emotion drawn and the hook burned on |
| Ceiling | One thumbnail per run |
| Account needed | Your own OpenAI key |
| Price | $150.00 per 1,000 thumbnails, so $0.15 a thumbnail on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 33. OpenAI bills your key separately |
🔍 What AI Thumbnail Generator does
It reads your title or story and picks an emotion: betrayal, rage, shock, disgust, heartbreak, fear, guilt or defiance. That emotion becomes an explicit facial description in the image prompt, which is why the face reads at phone size instead of looking mildly concerned. The pick comes from English keyword rules, so you can override it.
It then pulls a short hook out of your text, in all caps, and keeps the bottom quarter of the image deliberately plain so the words have somewhere to sit.
Finally the headline is drawn on afterwards with Montserrat ExtraBold, not asked for inside the image prompt. Image models are bad at letters. Burning the text on with a real font is the difference between a headline and a smear of glyph-shaped noise.
Sizes follow the ratio: 9:16 gives 1024x1536, 16:9 gives 1536x1024, 1:1 gives 1024x1024.
📋 What data you get from each thumbnail
| What you get | Field |
|---|---|
| The finished PNG in the run's key-value store, and a link to it | output.imageKey, output.imageUrl |
| The emotion it drew, read from your text or forced by you | emotion |
| The headline as burned on, uppercased | hookText |
| The shape and pixel size | aspectRatio, size |
| Your title and subreddit, echoed back | title, subreddit |
| How long the run took | processingSeconds |
▶️ How to make a thumbnail from a video title
- Open AI Thumbnail Generator and click Try for free.
- Put your video title into Title / headline. Paste the story into Story / script if you have one.
- Pick an Aspect ratio.
- Paste your key into OpenAI API key (BYO). It is stored as a secret.
- Click Start, then open the Storage tab and download
thumbnail-*.png.
Start it with no key and you get the free sample record, with the emotion, hook and prompt it would have used.
💰 How much does it cost to make a thumbnail?
$0.15 per thumbnail on the Free plan. Paid plans pay a little less: $0.148 on Starter, $0.146 on Scale and $0.144 on Business. One run makes one thumbnail, so a run is one charge, and on the free plan the $5 Apify gives you each month covers about 33.
A keyless run is not charged for a thumbnail, because no thumbnail is made and nothing is written to
the dataset. Image generation is billed to you by OpenAI on your own key and does not appear here.
imageQuality changes that side of the bill, not this one.
📥 What you give it
{"title": "AITA for refusing to pay for my sister's wedding?","aspectRatio": "9:16","openaiApiKey": "sk-...","burnText": true}
| Field | Default | What it is |
|---|---|---|
title | none | The video title or story headline. This drives both the emotion and the hook. The box starts with an example, which is a prefill. |
story | none | The full story or script. Longer text gives the emotion detection more to work with. |
subreddit | none | Informs the hook style. amitheasshole fixes the hook to AM I THE A-HOLE ?. |
aspectRatio | 9:16 | 9:16 for Shorts, Reels and TikTok, 16:9 for YouTube, 1:1 for square. |
emotion | none, detected | Force one of the eight instead of letting it read the text. |
hookText | none, derived | Force the burned-in headline word for word. |
gender | none | Bias the face, for example feminine or masculine. |
burnText | true | Turn it off to get the raw face with no headline on it. |
openaiApiKey | none | Your OpenAI key, stored as a secret. Without it you get the sample record. |
imageModel | gpt-image-2.5-flare | The image model name. |
imageQuality | high | low, medium or high. This changes what OpenAI bills you, not what this charges. |
imageBaseUrl | none | An OpenAI-compatible images endpoint of your own, if you use one. Empty means OpenAI's own. |
Leave both Title / headline and Story / script empty and the run fails straight away, key or no key, because there is nothing to read.
📤 What you get back
One dataset row per thumbnail, with the PNG itself in the run's key-value store under
thumbnail-<timestamp>.png.
Below is the real record a keyless run wrote, cut short where the note and the prompt run long. A
real run returns the same fields with output.imageKey and output.imageUrl filled in, and no
_sample, sampleData or note:
{"ok": true,"_sample": true,"sampleData": true,"note": "SAMPLE OUTPUT ...","title": "AITA for refusing to pay for my sister's wedding?","subreddit": null,"emotion": "shock","hookText": "REFUSING TO PAY","aspectRatio": "9:16","size": "1024x1536","imagePrompt": "Generate one ultra-high-quality viral YouTube thumbnail image. VERTICAL 9:16 portrait (1024x1536). ...","output": { "imageKey": null, "imageUrl": null },"processingSeconds": 0}
| Field | How to read it |
|---|---|
imagePrompt | The whole prompt that was sent, on the sample record. Worth reading once: it is how you learn what to change. |
hookText | The headline as it was burned on, already uppercased. |
emotion | Which of the eight it read out of your text, or the one you forced. |
subreddit | Echoed back as null when you left it empty. |
🧾 Reading the output
Only a delivered thumbnail is written to the dataset. Everything else goes somewhere it cannot bill.
| Row | Where it lands | Charged |
|---|---|---|
| A thumbnail | the dataset, one row | yes |
| The sample record | the key-value store, under SAMPLE_AND_NOTICES | no |
A TIME_LIMIT record, when the run's time limit came before the image was made (the run is then marked failed) | the key-value store, under SAMPLE_AND_NOTICES | no |
That split is deliberate: this actor is billed per dataset row, so a sample is never written there.
A keyless run leaves your dataset empty and the sample in SAMPLE_AND_NOTICES.
If the headline overlay fails for any reason, the run still hands you the image without the text rather than failing, and says so in the log. That image is charged like any other.
If the image itself cannot be made, a refused key or a rate limit for example, the run fails with the reason in the log and no thumbnail is charged.
💡 What people use it for
- Covers for Reddit story channels, where the hook and the face are the whole click.
- Testing three emotions on the same title to see which one gets the click, by forcing
emotion. - Making the 16:9 and the 9:16 version of one cover so a long video and its short match.
- Getting the raw face with
burnTextoff, then setting your own type in an editor.
From a story to a cover, in three runs:
- Rewrite the story with
Story to Script Rewriter. Each row has a
title, ahookand twoaltHooks. - Paste those lines into Texts / variants on Hook & Virality Scorer and take the top-ranked one.
- Put that line into Title / headline here, with the story in Story / script.
🚧 What it does not do
- One thumbnail per run. There is no batch mode.
- It draws a face, not your face. No photo upload, no likeness of a real person, no face swap.
- No logos, no brand assets, no product shots. The prompt asks for a clean image with no text, no watermark and no UI.
- The model still decides what it draws. Two runs on the same title give you two different faces, which is useful for testing and annoying if you wanted the same one twice.
- No editing after the fact. To change the headline, set
hookTextand run it again. - The headline is one line in one typeface, Montserrat ExtraBold, lower third, uppercase, with
no wrapping. A derived hook stays short, but a long
hookTextof your own runs off the edges. - Emotion detection is English word lists. On other languages, or when it guesses wrong, set
emotionyourself. - It is not an official tool of any platform or company named on this page. Dami's Studio is independent and is not affiliated with or endorsed by any of them.
🧭 Which creator tool do you need?
| If you want | Use |
|---|---|
| A thumbnail with a face and a hook | This one |
| Titles, descriptions and hashtags for the post | Social Metadata Generator |
| A hook scored before you shoot it | Hook & Virality Scorer |
| Captions burned into the video | Auto Caption Burner |
| A whole faceless short built from a script | AI Faceless Video Generator |
| A long video cut into short clips | AI Viral Clip Cutter |
❓ Questions people ask
Why do I need my own OpenAI key for thumbnails?
The image is generated on your key, so the usage and the cost of generation stay on your account.
Can I use my own face on the thumbnail?
No. It generates a person, it does not edit a photo you upload.
Can I force the exact headline?
Yes, put it in hookText and it is used word for word, uppercased. Keep it short, since there is
no wrapping.
What does the emotion actually change?
It swaps in a specific facial description, like a dropped jaw and raised eyebrows for shock. That
is the bit that makes a thumbnail readable at phone size.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has
ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP
client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/viral-thumbnail-generator.
Either way the run happens on your Apify account at the same price, and OpenAI bills your key as
usual.
🆘 If something breaks
Open the Issues tab on the actor page. Send the run ID and the title you used. Read
imagePrompt on the sample record first: most surprises are the prompt doing exactly what the
title asked for.
