# Instagram Reel Script Extractor — AI Hook, CTA & Beats (`lergassy/instagram-reel-script-extractor`) Actor

Break Instagram Reels down into a reusable script with AI: hook and why it works, beats with what is on screen, call to action, topic, format and a fill-in script template, plus our timestamped transcript. No login.

- **URL**: https://apify.com/lergassy/instagram-reel-script-extractor.md
- **Developed by:** [Matvey](https://apify.com/lergassy) (community)
- **Categories:** Marketing, For creators, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 videos

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**Instagram Reel Script Extractor** turns a public Instagram Reel into a **reusable script**: the **hook** and why it works, the **beats** with what is on screen in each one, the **call to action**, topic, format, audience and a **fill-in script template** — the full **viral reel breakdown**, written by AI, next to our own timestamped transcript. Paste Reel links or a profile, press Start, get one row per Reel. No login, no cookies, no API key.

How it works, honestly: the AI does not "watch" the video as a film. We take **one frame every 2 seconds** (at most 12 per Reel), send those frames to the model together with **our own speech-to-text transcript** and the caption, and the model writes the breakdown. That is why it catches on-screen text hooks and visual hooks that audio-only tools miss.

### Tested head-to-head — 24 October 2026

![Reel script Actors tested on the same 3 public Reels: this Actor returned a full breakdown for all 3 with why the hook works and a fill-in script template, at $0.059 per Reel on the Free plan](https://raw.githubusercontent.com/lergassy/apify-actor-assets/main/benchmarks/reelscript-tested-2026-10-24.png)

The same three public Reels (10 s, 24 s and 61 s) through the most-used Reel transcript Actor and the three most-used Reel script-breakdown Actors on the Apify Store, each on its default settings with its breakdown switched on.

| | This Actor | The four others |
|---|---|---|
| Script breakdown for all 3 Reels | **Yes** | 2 of 4 (one gives a transcript only, one stopped at 2 Reels on the Free plan) |
| Says why the hook works | **Yes** | 1 of 4 |
| Fill-in script template | **Yes** | 0 of 4 |
| Price per Reel with a breakdown, Free plan | **$0.059** | $0.066–$0.10 |

### What is Instagram Reel Script Extractor?

A **reel script extractor** and **reel hook analysis** tool for marketers, creators and agencies who study what works and want to reuse it. For every Reel you get:

- the **hook** — its words, where it comes from (`speech`, `on-screen`, `visual`, `caption`), its type (`question`, `statement`, `number`, `how-to`, `pov`, `shock`, `story`) and **why it works**;
- **beats** — 2 to 8 consecutive parts with start and end seconds, a label (`hook`, `setup`, `value`, `proof`, `twist`, `cta`, `outro`), what is on screen and what is said;
- the **call to action** and its type (`link_in_bio`, `follow`, `comment`, `dm`, `book`, `shop`, `save`, `share`);
- **topic, format, audience, emotion**, whether the audio is a **song** rather than the author talking, and the text the model reads on the frames;
- a **script template** with `[placeholders]` you can fill in for your own brand;
- our **transcript with timestamps**, language, author, likes, comments, caption and publish date.

Need only the transcript, at $0.003 per Reel plus seconds of speech? Use our general [Instagram Reels Transcript Scraper](https://apify.com/lergassy/instagram-reels-transcript-scraper) — same engine, the AI breakdown off by default. This Actor is the same engine with the AI breakdown **on**, because here it is the product.

### What data does it extract?

| Field | What it holds |
|---|---|
| `ai.hook` | `text`, `source`, `type`, `whyItWorks` |
| `ai.beats` | `[{startSeconds, endSeconds, label, visual, text}]` |
| `ai.cta` | `text`, `type` |
| `ai.topic`, `ai.format`, `ai.audience`, `ai.emotion` | One line each, in English |
| `ai.scriptTemplate` | The script as a fill-in template |
| `ai.speechIsSong` | True when the audio is song lyrics |
| `ai.onScreenText` | Lines of text the model reads on the frames, verbatim |
| `transcriptText`, `transcript` | Our speech-to-text, plain and as timestamped segments |
| `firstThreeSecondsSpeech` | What is said in the first 3 seconds |
| `hookText`, `ctaText`, `beats`, `wordsPerMinute` | Rule-based hook, CTA and timeline (no AI), free |
| `author`, `likes`, `comments`, `caption`, `hashtags`, `mentions`, `postedAt`, `durationSeconds`, `language` | Reel details |
| `views` | Play count — filled when you give a **profile** (Instagram shows it in the profile's Reels tab); empty for single Reel links |
| `vsAuthorMedian`, `isOutlier` | How the Reel did against the author's usual (4+ Reels of one author in a run) |
| `aiModel`, `aiError` | The model used, and why a breakdown is missing when it is |
| `chargedEvents`, `chargeUsd` | What this row cost you |

Spoken and on-screen words are quoted in the Reel's own language; descriptions are in English.

#### Real output, shortened

A 10-second Reel of a brow artist (run of 24 Oct 2026, `DckEW9NNVsJ`):

```json
{
  "url": "https://www.instagram.com/reel/DckEW9NNVsJ/",
  "durationSeconds": 10.4,
  "ai": {
    "hook": { "text": "Some people call me Kara", "source": "on-screen", "type": "statement",
              "whyItWorks": "The on-screen text opens with a name intro that feels personal and curiosity-sparking — viewers wait to learn what the name is for, while the walking selfie keeps the frame moving so they stay." },
    "beats": [
      { "startSeconds": 0, "endSeconds": 3, "label": "hook", "visual": "Handheld selfie walking past a modern building…", "text": "Some people call me Kara" },
      { "startSeconds": 3, "endSeconds": 5.5, "label": "setup", "visual": "She keeps walking, adjusts sunglasses…", "text": "Some people call me Kara Ann" },
      { "startSeconds": 5.5, "endSeconds": 8, "label": "value", "visual": "She turns, smiles, and waves at the lens", "text": "But you can call me when you want the best brows" }
    ],
    "cta": { "text": "Link in bio to book", "type": "link_in_bio" },
    "topic": "Brow artist personal branding / booking intro",
    "format": "Talking-text selfie walk with name-and-nickname wordplay",
    "scriptTemplate": "Some people call me [formal name]. Some people call me [nickname or full name]. But you can call me when you want the [your signature result / service]. 🔗 Link in bio to [booking action]. 📍[city]",
    "speechIsSong": true,
    "onScreenText": ["Some people call me Kara", "Some people call me Kara Ann", "But you can call me when you want the best brows"]
  },
  "transcriptText": "In a room full of people I look for you Would you avoid me or would you look for me too?",
  "author": "themidwesti", "likes": 8092, "comments": 111,
  "aiModel": "deepseek-flash", "aiError": null
}
```

Note what happened there: the audio is a song, so a transcript-only tool would call the lyrics the "hook". The breakdown sees the text on the frames and says the hook is on screen.

A 24-second National Geographic Reel (`De1S3KpCXf0`) came back with the hook `"You are looking at nudibranchs."` (source `speech`), six beats, on-screen title `"My Love Letter to Nudibranchs"` and the call to action `"Which animal do you want to see next?"` (type `comment`).

### How much does it cost?

Pay per event, no subscription, no fee per run.

| Event | Free plan | Bronze | Silver | Gold and above |
|---|---|---|---|---|
| `ai-analysis` — the AI script breakdown of one Reel | $0.05 | $0.045 | $0.04 | $0.035 |
| `reel-processed` — one Reel: transcript, details, rule-based hook | $0.003 | $0.0028 | $0.0026 | $0.0025 |
| `audio-10-seconds` — each started 10 seconds of speech recognised | $0.0015 | $0.0014 | $0.0013 | $0.0012 |
| `on-screen-text` — optional exact OCR of burned-in text (off by default) | $0.06 | $0.054 | $0.048 | $0.042 |

What a Reel costs with the default settings (AI on, OCR off):

| Reel length | Free plan, per Reel | Per 1,000 Reels | Gold, per 1,000 |
|---|---|---|---|
| No speech (music only) | $0.053 | $53 | $37.50 |
| 15 s | $0.056 | $56 | $39.90 |
| 30 s | $0.0575 | $57.50 | $41.10 |
| 60 s | $0.062 | $62 | $44.70 |
| 90 s | $0.0665 | $66.50 | $48.30 |

**Never charged:** private, deleted or broken links, Reels above your duration limit, and a breakdown that fails — the row then carries `aiError` and the `ai-analysis` event is not taken. Every row shows in `chargedEvents` and `chargeUsd` exactly what it cost.

### How to break down a Reel

1. Click **Try for free**.
2. Paste Reel links into **🔗 Instagram Reel URLs** (or a profile into **👤 Instagram profiles**). The form comes with a working example.
3. Press **Start**. Open the **AI breakdown** tab of the results: hook, hook type, why it works, CTA, topic, format, audience, emotion and the script template, one row per Reel.

### ⬇️ Input

```json
{
  "videoUrls": ["https://www.instagram.com/reel/DckEW9NNVsJ/"],
  "aiAnalysis": true,
  "includeOnScreenText": false
}
```

- **🔗 Instagram Reel URLs** — `instagram.com/reel/...` links. TikTok and YouTube Shorts links work too.
- **👤 Instagram profiles** — a profile link or a username (`natgeo`) gives its newest Reels, up to 12 (all Instagram shows without a login). A TikTok `@handle` or a YouTube channel also works.
- **🤖 AI script breakdown** — on by default. Switch off and you get only the transcript and the rule-based fields.
- **🖼️ Exact on-screen text, frame by frame** — off by default, because the AI already reads text on its frames. Switch on when you need every burned-in line with timestamps (OCR at 1.5 frames per second); the AI then gets that text too.
- **📈 Compare with the author's usual** — with 4+ Reels of one author in a run, each Reel gets `vsAuthorMedian` and `isOutlier` (3× the author's median likes or more). Free.
- Also: maximum Reels per run, only Reels newer than a date, only Reels not processed before (for schedules, with separate watch lists), a time limit, a free summary row, and links taken from another Actor's dataset.

### ⬆️ Output

One row per Reel in the dataset, three table views: **AI breakdown** (opens first), **Overview** and **Hooks and calls to action**. A link that fails gives a free row with `type: "error"`, `errorCode` and a plain-English `errorMessage`. Export as JSON, CSV, Excel or HTML, or read it through the API.

### Use cases

#### Swipe file of hooks

Run a competitor's profile once a week with **only new Reels** on and collect every hook, its type and why it works in one sheet.

#### Script templates for your own Reels

Feed `scriptTemplate` and `beats` to your writer or to your own LLM and adapt the structure that already worked.

#### Viral reel breakdown for clients

Agencies: put a client's best Reels (`isOutlier: true`) next to their weakest and show in the beats where attention drops.

#### AI agents and RAG

Each row is clean JSON with the transcript and the structure apart, ready for an index or an agent's context.

### Integrations

Run it from the [Apify API](https://docs.apify.com/api/v2), the [Python](https://docs.apify.com/api/client/python/) or [JavaScript](https://docs.apify.com/api/client/js/) client, Make, Zapier, n8n or Google Sheets, on a schedule, or from an AI agent through the [Apify MCP server](https://mcp.apify.com).

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("lergassy/instagram-reel-script-extractor").call(run_input={
    "videoUrls": ["https://www.instagram.com/reel/DckEW9NNVsJ/"],
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    ai = item.get("ai") or {}
    print(ai.get("hook", {}).get("text"), "|", ai.get("cta", {}).get("type"))
```

### ❓ FAQ

#### Is it legal to scrape Instagram Reels?

It reads only public Reels that anyone can open without logging in and does not collect personal profiles beyond the author's public name. Laws differ by country and by use; ask a lawyer before building a commercial product on scraped data.

#### Does the AI watch the whole video?

No. It looks at still frames taken every 2 seconds (at most 12; longer Reels are sampled evenly) and reads our transcript and the caption. It does not hear the sound itself — the sound reaches it as our transcript. A model can misread a frame, so treat the breakdown as a strong first draft.

#### Why is the hook sometimes in square brackets?

When a Reel opens with no words at all — a striking shot, a reveal — the hook is described, for example `[close-up of a baby pangolin]`, and `hook.source` is `visual`.

#### How is this different from your Instagram Reels Transcript Scraper?

Same engine and the same prices per event. There the AI breakdown is an add-on that is off by default; here it is on, the AI breakdown table opens first and the form starts with the breakdown switches.

#### What does a failed breakdown cost?

Nothing for the breakdown. You still get the transcript row ($0.003 plus seconds of speech), with the reason in `aiError`.

#### Which languages?

Speech recognition is multilingual; quoted words stay in the Reel's language and descriptions are in English.

#### Can I get the exact on-screen text?

Yes: switch on **🖼️ Exact on-screen text** ($0.06 per Reel on the Free plan). The text arrives in `onScreenText` with timestamps, separated from what the author says.

### Run health

When a run ends with many error rows, the Actor sends its developer the counts (rows, error types, run ID) so the cause gets fixed fast; your input and results are never sent.

### You might also like

| Actor | What it does |
|---|---|
| [Instagram Reels Transcript Scraper](https://apify.com/lergassy/instagram-reels-transcript-scraper) | Reels, TikTok and Shorts to text, transcript only, from $0.003 per video |
| [TikTok Transcript Scraper](https://apify.com/lergassy/tiktok-transcript-scraper) | TikTok videos and profiles to text |
| [YouTube Shorts, TikTok & Reels Transcript Scraper](https://apify.com/lergassy/tiktok-reels-shorts-transcript-scraper) | Three platforms in one run |

### Your feedback

Found a Reel it breaks down badly? Open an issue on the **Issues** tab with the link — every issue gets a reply.

# Changelog

This Actor's version history is a separate document: https://apify.com/lergassy/instagram-reel-script-extractor/changelog.md

# Actor input Schema

## `videoUrls` (type: `array`):

Public Reel links (instagram.com/reel/...) to break down into a script. No login or cookies needed. TikTok and YouTube Shorts links work too. Give this or a profile below.

## `profiles` (type: `array`):

Instead of links: an Instagram profile link (https://www.instagram.com/natgeo/) or username (natgeo) gives its newest Reels, at most 12 (all Instagram shows without a login). A TikTok handle with @ (@duolingo) or a YouTube channel also works. A private or unknown profile returns one free error row.

## `resultsLimitPerProfile` (type: `integer`):

How many of the newest videos to take from each profile. Instagram profiles give at most 12 (all Instagram shows without a login).

## `aiAnalysis` (type: `boolean`):

On by default: the main product of this Actor. AI returns the hook and why it works, the beats with what is on screen, the call to action, topic, format, audience, emotion and a fill-in script template. The model (DeepSeek V4.1 Flash) looks at frames taken every 2 seconds (at most 12 per video) together with our transcript and the caption; not the moving video. $0.05 per video on the Free plan, less on paid plans; a failed breakdown is free. Switch off to get only the transcript.

## `includeOnScreenText` (type: `boolean`):

Off by default: the AI breakdown already reads the text it sees on its frames. Switch on for an exact, timestamped list of burned-in text (caption cards, title cards, hard subtitles) read by OCR at 1.5 frames per second and split from what the author says. Billed separately ($0.06 per video on the Free plan) and takes a few minutes per video.

## `compareWithAuthor` (type: `boolean`):

Adds author, views, likes, comments, caption and publish date to every video, and when you send 4 or more videos from the same author it compares each one with that author's median (vsAuthorMedian: 5 means five times the author's usual). Videos at 3× or more are flagged isOutlier — the ones that went viral for that account. TikTok is compared on views; Instagram on likes, because Instagram hides view counts from logged-out visitors. Free: no extra charge.

## `maxVideos` (type: `integer`):

A hard ceiling for the whole run, across links and profiles together. Useful when you paste a long list or several profiles and want a predictable bill. Leave empty for no ceiling; the per-profile limit still applies.

## `onlyPostsNewerThan` (type: `string`):

Skip anything published before this date. Leave empty to take the newest videos whatever their date.

## `onlyNewVideos` (type: `boolean`):

For scheduled runs: remembers the videos this account has already broken down and skips them free of charge, so a daily watch on a creator only pays for what was published since the last run. The memory lives in your own key-value store 'reel-script-seen' — clear it there to start over.

## `watchlistName` (type: `string`):

Keeps separate memories of what was already processed. Give each scheduled task its own name — for example 'competitors' and 'my-brand' — and they will not skip each other's videos. Empty means one shared list.

## `includeRunSummary` (type: `boolean`):

One extra free row with the run's totals: how many videos were asked for, transcribed, skipped as already processed, skipped by the ceiling, and how many failed with the reason counts. Handy for scheduled runs and dashboards.

## `maxRunSeconds` (type: `integer`):

A soft deadline: when it passes, no new video is taken, everything already transcribed is delivered and the run ends green with an explanation. Nothing is charged for videos that were not taken.

## `fromDatasetId` (type: `string`):

Dataset of a previous run (yours or another Actor's). Every row is scanned for an Instagram, TikTok or YouTube link in the usual fields (url, postUrl, videoUrl, link, shortCode) and those videos are transcribed. Lets you chain a scraper to this Actor without writing code.

## `datasetItems` (type: `array`):

Rows from another Actor as JSON, when you do not want to share a dataset. The same fields are scanned for video links. Works together with the dataset field above.

## `transcriptionMode` (type: `string`):

Instagram Reels never carry captions of their own, so on this Actor the transcript almost always comes from speech recognition. <b>Captions first</b> is the default and the right choice here: it looks for captions, finds none on a Reel, and recognises the speech. <b>Speech recognition only</b> does the same while skipping the lookup. <b>Captions only</b> returns nothing for Instagram Reels — it is kept for links from other platforms, where captions do exist.

## `quality` (type: `string`):

Only used when a video has no captions of its own. Fast is enough for clear speech in short video; accurate helps with noise, accents and music.

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

Leave on Auto unless the video is short and the language is being guessed wrong.

## `maximumVideoDurationSeconds` (type: `integer`):

Videos longer than this are skipped with a free error row, before anything is downloaded. 0 means no limit. Useful when a profile mixes Shorts with hour-long uploads.

## `ocrFps` (type: `string`):

How often frames are read when “Read on-screen text” is on. On our labelled test video 1.5 frames per second found every caption card, while 1 lost three of six. Higher values cost more time, not more accuracy.

## `includeTranscriptSegments` (type: `boolean`):

Return the transcript as timestamped segments in addition to the plain text. Turn off for a flatter table.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.instagram.com/reel/DckEW9NNVsJ/"
  ],
  "profiles": [],
  "resultsLimitPerProfile": 10,
  "aiAnalysis": true,
  "includeOnScreenText": false,
  "compareWithAuthor": true,
  "onlyNewVideos": false,
  "includeRunSummary": false,
  "transcriptionMode": "captions-first",
  "quality": "fast",
  "language": "auto",
  "maximumVideoDurationSeconds": 300,
  "ocrFps": "1.5",
  "includeTranscriptSegments": true
}
```

# Actor output Schema

## `aiBreakdown` (type: `string`):

Hook, beats, call to action, topic, format, audience and script template written by AI for every Reel.

## `dataset` (type: `string`):

One row per Reel: the AI script breakdown (field ai), our transcript with timestamps, rule-based hook and CTA fields, author and likes.

## `overview` (type: `string`):

Table view with the spoken and on-screen hooks side by side.

## `hooks` (type: `string`):

Hook text and type, call to action and speaking pace for every video (rule-based, no AI).

## `summary` (type: `string`):

Videos requested, processed and failed, plus bytes downloaded directly and through residential traffic.

# 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 = {
    "videoUrls": [
        "https://www.instagram.com/reel/DckEW9NNVsJ/"
    ],
    "profiles": [],
    "resultsLimitPerProfile": 10,
    "aiAnalysis": true,
    "includeOnScreenText": false,
    "compareWithAuthor": true,
    "transcriptionMode": "captions-first",
    "quality": "fast",
    "language": "auto",
    "maximumVideoDurationSeconds": 300,
    "ocrFps": "1.5",
    "includeTranscriptSegments": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("lergassy/instagram-reel-script-extractor").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 = {
    "videoUrls": ["https://www.instagram.com/reel/DckEW9NNVsJ/"],
    "profiles": [],
    "resultsLimitPerProfile": 10,
    "aiAnalysis": True,
    "includeOnScreenText": False,
    "compareWithAuthor": True,
    "transcriptionMode": "captions-first",
    "quality": "fast",
    "language": "auto",
    "maximumVideoDurationSeconds": 300,
    "ocrFps": "1.5",
    "includeTranscriptSegments": True,
}

# Run the Actor and wait for it to finish
run = client.actor("lergassy/instagram-reel-script-extractor").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "videoUrls": [
    "https://www.instagram.com/reel/DckEW9NNVsJ/"
  ],
  "profiles": [],
  "resultsLimitPerProfile": 10,
  "aiAnalysis": true,
  "includeOnScreenText": false,
  "compareWithAuthor": true,
  "transcriptionMode": "captions-first",
  "quality": "fast",
  "language": "auto",
  "maximumVideoDurationSeconds": 300,
  "ocrFps": "1.5",
  "includeTranscriptSegments": true
}' |
apify call lergassy/instagram-reel-script-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lergassy/instagram-reel-script-extractor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/UaZZFRrFfUze1W0QR/builds/08wSDq7DmUhb8gNuL/openapi.json
