Story to Script Rewriter
Turn a story, article or Reddit post into a short-form script. You get a hook, tight narration, a title and extra hooks. $0.02 per script.
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,tone(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.02 per script rewritten = $20 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Script rewritten | One rewritten video script. | $0.02 |
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 story, article, or post to rewrite into a video script. | string |
sources | Array of strings OR post objects (uses selftext/scriptText/body/text/title). Pipe the Reddit Scraper's output straight in. | array |
tone | Voice/style of the rewritten script. | string |
platform | Target platform, tunes pacing and hook style. | string |
targetSeconds | Approximate spoken length to aim for. | integer |
pov | Keep the original point of view, or rewrite in first/third person. | string |
language | Language to write the script in. | string |
openaiApiKey | Your OpenAI key. Kept private. | string |
model | Chat model to use. 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:
titlehookscriptwordCountestSecondsaltHooksExport 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.
Subtitle Translator
Translate SRT and VTT subtitles into many languages in one run, or transcribe a video first. Timings stay exact. $0.05 per language, flat rate.
AI Thumbnail Generator
Generate video thumbnails with AI. A close-up face plus a bold hook headline. Sizes 9:16, 16:9 and 1:1. For YouTube, Shorts, Reels and ads.
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).
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).
Where this tool sits
- Categories
- AI Video & Content Studio
Story to Script Rewriter: turn a post or article into a spoken short-form script
Paste a Reddit post, an article or any block of text and get back a script written to be read out loud: a hook that opens it, the narration itself, a title, two alternate hooks, the word count and roughly how many seconds it runs. You choose the tone, the platform, the point of view, the language and the target length.
It runs on your own OpenAI key, which you paste into the input. Without one the run still finishes, but it writes a clearly labelled canned sample instead of a real rewrite, so you can see the shape of the output before committing anything.
| Input | A story, article or post. One, or a batch |
| Output | One script row per source |
| Ceiling | Each source is read up to 8,000 characters |
| Account needed | Your own OpenAI key for real output |
| Price | $0.02 per script, flat on every plan |
🔍 What Story to Script Rewriter does
Reading well and holding a viewer are different jobs. A Reddit post can be a great read and still open with three sentences of setup that nobody watches past. This rewrites the same story so the turn lands in the first line and the rest earns its seconds.
Each source becomes one model call and one row. tone picks the voice: dramatic, casual, funny, emotional, educational or hype. platform shifts the pacing and the hook style for tiktok, youtube shorts, instagram reels or youtube. targetSeconds sets the length, worked as roughly 150 spoken words a minute. pov keeps the original voice or moves it to first or third person. language writes the output in whatever you name.
sources takes a batch: plain strings, or objects, in which case it reads selftext, then scriptText, then body, then text, then title. That last part matters because it means a Reddit scraper's rows go straight in with no reshaping.
📥 What you give it
{
"text": "My neighbor kept parking in my spot. I asked nicely three times.",
"tone": "dramatic",
"platform": "tiktok",
"targetSeconds": 45,
"openaiApiKey": "sk-..."
}
| Field | Default | What it is |
|---|---|---|
text | none | One story. The Console prefills an example, but that is a prefill, so an API call has to send its own. |
sources | none | A batch. Strings, or objects read in the order above. Added before text, so you can use both. |
tone | dramatic | dramatic, casual, funny, emotional, educational or hype. |
platform | tiktok | tiktok, youtube shorts, instagram reels or youtube. |
targetSeconds | 45 | Aimed at, not enforced. It has no floor or ceiling, so a silly number gets a silly script. |
pov | keep | keep, first or third. |
language | English | Free text. The prompt wording is tuned for English, so other languages vary. |
openaiApiKey | none | Your key. Secret field, never written to the log. Without it you get samples. |
model | gpt-4o-mini | Any chat model your key can reach. |
baseUrl | none | An OpenAI-compatible endpoint, if you are not using OpenAI's own. |
Send something. With a key set and both text and sources empty, the run rewrites a built-in example story and that row is charged like any other. It is the one way to pay for a script you did not ask for.
Never paste your key into a published Apify task. Task inputs are readable by anyone who opens the page. Put it in the run input, or supply it per call.
📤 What you get back
Every run of this actor so far has been keyless, so what follows is the real labelled sample row from run T02XHkNtR8DzTbAbR, trimmed for length. With your key set, the same fields are filled by the model instead of the canned text, and _sample and _notice are not there.
{
"ok": true,
"source": "My neighbor kept parking in my spot. I asked nicely three times. ...",
"title": "Sample Viral Short Script",
"hook": "I thought this tiny mistake was over, but then the twist hit.",
"script": "I thought this tiny mistake was over, but then the twist hit. My neighbor kept parking in my spot. I asked nicely three times. ...",
"altHooks": [
"This looked like a normal day until one detail changed everything.",
"Nobody expected the ending to come from such a small mistake."
],
"wordCount": 58,
"estSeconds": 23,
"_sample": true,
"_notice": "SAMPLE OUTPUT - provide openaiApiKey for a real AI rewrite.",
"tone": "dramatic",
"platform": "tiktok",
"requestedSeconds": 45
}
| Field | What it is |
|---|---|
script | The whole narration, hook included. Read it top to bottom and you have the voiceover. |
hook | The opening line on its own, so you can test openings without splitting the script. |
altHooks | Two more openings for the same story. Useful when you are posting the same piece twice. |
wordCount, estSeconds | The actual length, worked at 150 words a minute. Compare it against what you asked for. |
source | The first 2,000 characters of what you sent, so a batch row can be traced back. |
tone, platform | Echoed back, which keeps a mixed batch sortable. |
🧾 Reading the output
Rows land in two places, and which one tells you what happened.
| Where | What it is | Charged |
|---|---|---|
| The dataset | A real script, ok: true | yes |
Key-value store, SAMPLE_AND_NOTICES | A keyless sample, _sample: true with a _notice | no |
Key-value store, SAMPLE_AND_NOTICES | A source that failed, ok: false with an error | no |
So an empty dataset after a run with a key means every source failed. Open the key-value store tab and read the error on each one: it carries the status your provider returned, or a note that the model's answer could not be read as JSON.
One source failing does not stop the others, and the run still finishes green either way, so check the dataset row count rather than the run status.
▶️ How to run it
1. Open Story to Script Rewriter and click Try for free. 2. Run it once with no key and look at SAMPLE_AND_NOTICES to see the output shape. 3. Paste your key into OpenAI API key. 4. Put your story into Text / story, or a batch into Sources, then set the tone, platform and target length. 5. Click Start, then read the dataset or export it.
💰 How much does it cost?
$0.02 per script. Flat on every Apify plan, no volume tiers.
You pay per script row that reaches the dataset. Keyless samples and sources that failed go to the key-value store instead and are not charged as scripts. Your OpenAI usage is billed by OpenAI on your own key, separately from this.
💡 What people use it for
- Piping a Reddit scraper's rows straight into
sourcesand getting a week of narration in one run. - Testing three tones on the same story, then picking the one that reads best out loud.
- Turning a long blog post into a 45-second version for Shorts without rewriting it by hand.
- Building an A/B test out of
hookand the twoaltHookson a piece that underperformed.
🚧 What it does not do
- No voiceover, no video, no images. It writes text. The routing table below points at the rest.
- No fact checking. It rewrites what you gave it, including anything wrong in the source.
- No length guarantee.
targetSecondsis an instruction to the model, not a limit, so check
estSeconds on the row.
- Long sources are cut at 8,000 characters. Anything past that is not seen, so trim a long
article to the part that matters.
- No retry. If your provider refuses one source, that source fails and the run moves on.
- No scraping. It does not fetch a URL. Send the text.
- The prompt is tuned for English. Other languages work, but the pacing advice is written for
English rhythm.
🧭 Which short-form video tool do you need?
| If you want | Use |
|---|---|
| A story rewritten into a spoken script | This one |
| A finished faceless short from a script | AI Faceless Short Generator |
| A score on how well a hook is likely to land | Hook Virality Scorer |
| Titles, descriptions and hashtags for the post | Social Metadata Generator |
| The Reddit posts to feed it in the first place | Reddit Scraper |
❓ Questions people ask
Do I need my own OpenAI key? For real output, yes. Your key, your OpenAI bill, and nothing goes through ours.
What happens without a key? You get a labelled sample in the key-value store. Nothing reaches the dataset, so there is no script row to charge for.
Can I use a different provider? Yes, if it speaks the OpenAI chat format. Put its address in baseUrl and its model name in model.
Can I batch a whole subreddit? Yes. Put the scraper's rows into sources and every post becomes its own row.
Why is my script shorter than I asked for? targetSeconds steers the model, it does not bind it. Raise it, or send a richer source.
Where did my failed sources go? The SAMPLE_AND_NOTICES record in the run's key-value store, with the error on each one.
🆘 If something breaks
Open the Issues tab on the actor page. Send the run id and the tone, platform and target length you used. Never send your key. The error text in SAMPLE_AND_NOTICES usually names the problem by itself.