# Story to Script Rewriter - Viral Short-Form Scripts (`dami_studio/story-to-script-rewriter`) Actor

Feed it a Reddit post, an article or a raw story and get back a script engineered to hold attention. Returns a scroll-stopping hook, tight narration in your chosen tone and target length, a title, alternate hooks to A/B test, plus word count and estimated runtime. For TikTok, Reels and Shorts.

- **URL**: https://apify.com/dami\_studio/story-to-script-rewriter.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** For creators, AI, Marketing
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 script rewrittens

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Story-to-Script Rewriter

Turns a story, article, or Reddit post into a short-form video script: a hook built to land in the first 3 seconds, narration written in the tone and length you ask for, plus a suggested title and a couple of alternate hooks. Built for people churning out TikTok, Reels, Shorts, and faceless-channel content who don't want to rewrite every source by hand.

### How it works

Each source goes through one chat completion that returns structured JSON. The prompt forces a curiosity-gap hook (no greetings), tightens the narration toward your target length (it budgets roughly 150 spoken words per minute), and strips out stage directions, hashtags, and emoji so the text is ready to read aloud.

### Input

You can pass a single `text`, an array of `sources`, or both. Sources can be plain strings or post objects, in which case it reads `selftext`, `scriptText`, `body`, `text`, or `title` in that order, so you can pipe a Reddit scraper's output straight in.

| Field | Required | Notes |
|-------|----------|-------|
| `text` | no\* | The story/article/post to rewrite. |
| `sources` | no\* | Array of strings or post objects. Batched, one script per item. |
| `tone` | no | `dramatic` (default), `casual`, `funny`, `emotional`, `educational`, `hype`. |
| `platform` | no | `tiktok` (default), `youtube shorts`, `instagram reels`, `youtube`. Tunes pacing and hook style. |
| `targetSeconds` | no | Approximate spoken length to aim for. Default `45`. |
| `pov` | no | `keep` (default), `first`, or `third` person. |
| `language` | no | Output language. Default `English`. |
| `openaiApiKey` | yes (at runtime) | Your OpenAI key. Stored as a secret. |
| `model` | no | Chat model. Default `gpt-4o-mini`. |
| `baseUrl` | no | OpenAI-compatible base URL if you're not using OpenAI directly. |

\*No field is marked required in the schema, but the run fails unless you provide either `text` or `sources`, and an OpenAI key.

### Output

One dataset record per source. The fields that matter are `title`, `hook`, `script` (the full narration, hook included), and `altHooks` (two alternates). Each record also carries `wordCount` and `estSeconds` so you can check the length came out close to your target, plus `ok` and, on failure, an `error` string.

### Example

```json
{
  "text": "My neighbor kept parking in my spot. I asked nicely three times. So I had his car towed, and it turned out the car wasn't even his.",
  "tone": "dramatic",
  "platform": "tiktok",
  "targetSeconds": 40,
  "pov": "first",
  "language": "English",
  "openaiApiKey": "sk-..."
}
```

### Pricing

$0.02 per script, pay per result, no subscription. You bring your own OpenAI key, so model usage is billed to your OpenAI account separately.

### Notes

A few sources will fail to parse or get refused by the model. Those are written to the dataset with `ok: false` and an error rather than stopping the whole run, so check that flag before you trust a batch.

# Actor input Schema

## `text` (type: `string`):

The story, article, or post to rewrite into a video script.

## `sources` (type: `array`):

Array of strings OR post objects (uses selftext/scriptText/body/text/title). Pipe the Reddit Scraper's output straight in.

## `tone` (type: `string`):

Voice/style of the rewritten script.

## `platform` (type: `string`):

Target platform — tunes pacing and hook style.

## `targetSeconds` (type: `integer`):

Approximate spoken length to aim for.

## `pov` (type: `string`):

Keep the original point of view, or rewrite in first/third person.

## `language` (type: `string`):

Language to write the script in.

## `openaiApiKey` (type: `string`):

Your OpenAI key. Kept private.

## `model` (type: `string`):

Chat model to use. Default gpt-4o-mini.

## `baseUrl` (type: `string`):

OpenAI-compatible base URL. Default https://api.openai.com/v1.

## Actor input object example

```json
{
  "text": "My neighbor kept parking in my spot. I asked nicely three times. So I had his car towed — turns out it wasn't even his car, and the owner showed up furious at HIM.",
  "tone": "dramatic",
  "platform": "tiktok",
  "targetSeconds": 45,
  "pov": "keep",
  "language": "English",
  "model": "gpt-4o-mini"
}
```

# Actor output Schema

## `results` (type: `string`):

Result rows / metadata are stored in the default dataset (one row per item).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "text": "My neighbor kept parking in my spot. I asked nicely three times. So I had his car towed — turns out it wasn't even his car, and the owner showed up furious at HIM."
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/story-to-script-rewriter").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "text": "My neighbor kept parking in my spot. I asked nicely three times. So I had his car towed — turns out it wasn't even his car, and the owner showed up furious at HIM." }

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/story-to-script-rewriter").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "text": "My neighbor kept parking in my spot. I asked nicely three times. So I had his car towed — turns out it wasn'\''t even his car, and the owner showed up furious at HIM."
}' |
apify call dami_studio/story-to-script-rewriter --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=dami_studio/story-to-script-rewriter",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/lAiO3ukVmgCSwnaev/builds/QjHgBPGUa5TxMLeT6/openapi.json
