Social Metadata Generator
Write titles, captions, hashtags, SEO tags and a pinned comment. For YouTube, TikTok, Reels, Shorts and X. $15.00 per 1,000 packs ($0.015 each).
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
text,sources,platform(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.015 per metadata pack = $15 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Metadata pack | One metadata pack (titles, hashtags, SEO). | $0.015 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-08, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
text | The video topic, title idea, or full script to generate metadata for. | string |
sources | Array of strings OR objects (uses title/script/scriptText/text/selftext). Pipe the Script Rewriter / Reddit Scraper in. | array |
platform | Platform to tune titles, limits, and hashtag counts for. | string |
titleCount | How many title variations to generate. | integer |
keywords | Comma-separated SEO keywords to weave in. | string |
language | Output language. | string |
openaiApiKey | Your OpenAI key. Kept private. | string |
model | Chat model. Default gpt-4o-mini. | string |
baseUrl | OpenAI-compatible base URL. Default https://api.openai.com/v1. | string |
What you get
A structured dataset — each result includes fields like:
platformtitlesdescriptionhashtagstagsExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in AI Video & Content Studio
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
Hook & Virality Scorer
Score any title, hook or script for viral potential. You get 0-100 with a grade, a breakdown and rewrite tips. No AI key. $3.00 per 1,000 hooks.
AI Viral Clip Cutter — Long Video to Shorts
Turn a long podcast or interview into ranked vertical clips. AI scores each moment and captions follow every word. $0.20 per clip row, samples included.
AI Text-to-Speech Voiceover
Turn any script into an AI voiceover file: MP3, WAV, Opus or AAC. Pick the voice, speed and format. $40.00 per 1,000 voiceovers ($0.04 each).
Video & Audio Transcriber — Word-Level + SRT/VTT
Transcribe any video or audio URL with word-level timestamps. Download SRT, VTT and TXT. The language is found for you. $0.02 per transcribed minute.
AI Character Reference Bank
Make a consistent AI character reference set. You get portrait, 3/4, full body, side and expression sheets, plus a character-bible prompt.
AI Faceless Video Generator
Make a faceless short video from a subreddit, story or topic. You get a 9:16 MP4 with script, voiceover, AI scenes and captions.
Where this tool sits
- Categories
- AI Video & Content Studio
Social Metadata Generator: titles, captions, hashtags and SEO tags for a video
Give it a topic, a title idea or the whole script. It writes back a pack: several title options, a description, hashtags, 10 to 15 keyword tags and a pinned comment, written for the platform you picked.
Two things to know up front. You bring your own OpenAI key, so the writing is on your account and your bill, not hidden inside a markup. And the platform rules are asked of the model rather than trimmed afterwards, so a title can still come back longer than YouTube will show. Read them before you post.
| Input | A topic, a title idea or a full script |
| Output | One pack per source: titles, description, hashtags, tags, pinned comment |
| Ceiling | One platform per run, source text read up to 6,000 characters |
| Account needed | Your own OpenAI key |
| Price | $15.00 per 1,000 packs, which is $0.015 each |
✍️ What Social Metadata Generator does
Every platform wants something different from the same video. YouTube rewards a title that reads like a search, TikTok wants the first three words to land, Reels leans on the caption, X has almost no room at all. Pick the platform in platform and the pack is written for that one.
A pack is five things: titles with as many options as you asked for, a description you can paste as the caption, hashtags already normalised with the # and no spaces, tags as bare keywords for the YouTube tag box, and a pinnedComment to drop under your own video.
Run it with sources to do a batch. One pack per item, all on the platform you chose.
📥 What you give it
{
"text": "A 60-second video explaining why cats knock things off tables, with funny examples.",
"platform": "youtube shorts",
"titleCount": 5,
"keywords": "cat behaviour, why cats do that",
"language": "English"
}
| Field | Default | What it is |
|---|---|---|
text | none | One topic, title idea or script. |
sources | none | A batch. Strings, or objects carrying title, script, scriptText, text or selftext. |
platform | youtube | youtube, youtube shorts, tiktok, instagram reels or twitter. One per run. |
titleCount | 5 | Title options to write. 1 to 15. |
keywords | none | Comma separated terms to work in. Useful when you already know what you rank for. |
language | English | Output language. Write the language name in plain words. |
openaiApiKey | none | Your own key. Held as a secret field, never written into the results. |
model | gpt-4o-mini | Any chat model your key can reach. |
baseUrl | OpenAI | Point it at any OpenAI-compatible endpoint instead. |
An object in sources is read title first. If it has a title, that is what gets used and the script alongside it is ignored. When you want the whole script considered, pass it as a plain string.
📤 What you get back
Real output from run klZSQrDLaGg65VZEK. That run had no key on it, so this is the free sample pack the actor writes rather than model output, which is why the text says so. A real pack has the same fields without _sample and note:
{
"ok": true,
"_sample": true,
"note": "SAMPLE output ... Add your OpenAI key (openaiApiKey or the OPENAI_API_KEY env var) to generate real, AI-written metadata.",
"source": "A 60-second video explaining why cats knock things off tables, with funny examples.",
"platform": "youtube",
"titles": [
"A 60-second video explaining why cats knock things off table ... You Won't Believe #3",
"The Truth About A 60-second video explaining why cats knock things off table",
"A 60-second video explaining why cats knock things off table: A Quick Guide"
],
"description": "[SAMPLE] Hook line about A 60-second video explaining why cats knock things off table...",
"hashtags": ["#sample", "#demo", "#metadata", "#contentcreator", "#socialmedia"],
"tags": ["sample", "demo", "metadata generator", "titles", "hashtags", "seo tags"],
"pinnedComment": "[SAMPLE] Drop a comment below ... this is example engagement bait."
}
The title list and hashtag list are cut short above so the block stays readable.
| Field | What it is |
|---|---|
titles | Your options, in the order the model wrote them. Pick one, they are not ranked. |
description | The caption or video description, as one block of text. |
hashtags | Already carrying the # with the spaces taken out, so they paste straight in. |
tags | Bare keywords, no #. This is the YouTube tag box, not the caption. |
pinnedComment | A comment to pin under your own video. Hidden in the default table view, so open the JSON or export to see it. |
source | The first 1,000 characters of what you sent, so you can tell packs apart in a batch. |
🧾 Reading the output
A dataset row is a finished pack, and every dataset row is charged. Two other things the actor writes never reach the dataset at all, so they never bill:
| What | Where it goes | Charged |
|---|---|---|
| A finished pack | The dataset, ok: true | yes |
| The sample pack, when no key was supplied | Key-value store, SAMPLE_AND_NOTICES, flagged _sample | no |
| An item the model could not write | Key-value store, same key, ok: false with the reason | no |
So if you ran a batch of 20 and the dataset holds 17 rows, the other three are in Storage under SAMPLE_AND_NOTICES with the reason attached. A run where every item failed still finishes green with an empty dataset, which is why the row count is the thing to check rather than the run status.
With a key on the run and nothing in text or sources, the run fails outright rather than writing an empty dataset.
▶️ How to run it
1. Open Social Metadata Generator and click Try for free. 2. Paste your topic or script into Topic / script. 3. Pick the Platform. This is the one setting that changes the output most. 4. Put your key into OpenAI API key. Without it you get the sample pack instead. 5. Click Start, then take the pack from the dataset or read it from the API.
💰 How much does it cost?
$15.00 per 1,000 packs, which is $0.015 per pack. Flat on every Apify plan, no volume tiers.
One source in, one pack out, one charge. The sample pack and any item the model could not write go to the key-value store instead of the dataset, so neither is billed here.
Your OpenAI usage is separate and goes to OpenAI on your own key. gpt-4o-mini is the default because it is cheap for this kind of short writing job.
💡 What people use it for
- Writing the title, caption and tags for a batch of shorts in one pass instead of one video at a
time.
- Getting five title options to choose from, which is more useful than one confident guess.
- Rewriting the same video's metadata for a second platform by running it again with
platform
changed.
- Keeping a house set of keywords in
keywordsso every upload leans the same way.
🚧 What it does not do
- It does not enforce the platform limits. Lengths, hashtag counts and the 10 to 15 tag range
are asked for, not trimmed afterwards. Check a title before you paste it.
- No trend or search-volume data. The tags are written from your topic, not from what is
currently being searched.
- One platform per run. Two platforms means two runs, and two packs to pay for.
- It reads an object's title, not its script. Pipe rows in and you may be generating from a
headline. Pass the script as a string when the body is what matters.
- Long scripts are trimmed. Roughly the first 6,000 characters are what the model sees.
- No key, no writing. A run without one produces the sample pack so you can see the shape, and
nothing more.
- It does not post anything. For that, see the uploader linked below.
🧭 Which social actor do you need?
| If you want | Use |
|---|---|
| Titles, captions, hashtags and tags for a video | This one |
| To find someone's profiles from a name, domain or email | Social Profile Finder |
| To post the finished video from your AI client | Social Media Uploader Pro |
| Public LinkedIn posts matching a keyword | LinkedIn Post Search Scraper |
❓ Questions people ask
Why do I need my own OpenAI key? Because the writing happens on your account, at your model choice, and nothing about your script passes through a key of ours.
Can I use a model that is not OpenAI's? Yes, if it speaks the OpenAI chat format. Put the endpoint in baseUrl and the model name in model.
Where is my pinned comment? On the row. The default table view does not show that column, so open the JSON or export the dataset.
Can I batch a whole channel's worth? Yes, put them all into sources. One pack per item, all on the same platform, one charge each.
Will the titles be under the YouTube limit? Usually, but it is not guaranteed. The length is requested from the model and not cut afterwards.
What language can it write in? Whatever you put in language. Write the name of the language, not a code.
🆘 If something breaks
Open the Issues tab on the actor page. Send the run ID and the topic you used. If rows are missing, look in Storage under SAMPLE_AND_NOTICES first, because the reason is usually written there.