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

Rewrite any story, article, or Reddit post into a punchy short-form video script — strong 3-second hook, tight retention-optimized narration, your tone and length. Returns the script, title, and alternate hooks. For TikTok, Reels, Shorts, and faceless channels.

- **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, 60.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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Story-to-Script Rewriter — Viral Video Scripts",
        "description": "Rewrite any story, article, or Reddit post into a punchy short-form video script — strong 3-second hook, tight retention-optimized narration, your tone and length. Returns the script, title, and alternate hooks. For TikTok, Reels, Shorts, and faceless channels.",
        "version": "0.1",
        "x-build-id": "QjHgBPGUa5TxMLeT6"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/dami_studio~story-to-script-rewriter/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-dami_studio-story-to-script-rewriter",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/dami_studio~story-to-script-rewriter/runs": {
            "post": {
                "operationId": "runs-sync-dami_studio-story-to-script-rewriter",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/dami_studio~story-to-script-rewriter/run-sync": {
            "post": {
                "operationId": "run-sync-dami_studio-story-to-script-rewriter",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "text": {
                        "title": "Text / story",
                        "type": "string",
                        "description": "The story, article, or post to rewrite into a video script."
                    },
                    "sources": {
                        "title": "Sources (batch)",
                        "type": "array",
                        "description": "Array of strings OR post objects (uses selftext/scriptText/body/text/title). Pipe the Reddit Scraper's output straight in."
                    },
                    "tone": {
                        "title": "Tone",
                        "enum": [
                            "dramatic",
                            "casual",
                            "funny",
                            "emotional",
                            "educational",
                            "hype"
                        ],
                        "type": "string",
                        "description": "Voice/style of the rewritten script.",
                        "default": "dramatic"
                    },
                    "platform": {
                        "title": "Platform",
                        "enum": [
                            "tiktok",
                            "youtube shorts",
                            "instagram reels",
                            "youtube"
                        ],
                        "type": "string",
                        "description": "Target platform — tunes pacing and hook style.",
                        "default": "tiktok"
                    },
                    "targetSeconds": {
                        "title": "Target length (seconds)",
                        "type": "integer",
                        "description": "Approximate spoken length to aim for.",
                        "default": 45
                    },
                    "pov": {
                        "title": "Point of view",
                        "enum": [
                            "keep",
                            "first",
                            "third"
                        ],
                        "type": "string",
                        "description": "Keep the original point of view, or rewrite in first/third person.",
                        "default": "keep"
                    },
                    "language": {
                        "title": "Output language",
                        "type": "string",
                        "description": "Language to write the script in.",
                        "default": "English"
                    },
                    "openaiApiKey": {
                        "title": "OpenAI API key (BYO)",
                        "type": "string",
                        "description": "Your OpenAI key. Kept private."
                    },
                    "model": {
                        "title": "Model (advanced)",
                        "type": "string",
                        "description": "Chat model to use. Default gpt-4o-mini.",
                        "default": "gpt-4o-mini"
                    },
                    "baseUrl": {
                        "title": "API base URL (advanced)",
                        "type": "string",
                        "description": "OpenAI-compatible base URL. Default https://api.openai.com/v1."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
