# Instagram Reels & TikTok Hooks and Scripts (`seasons-ai/competitor-content-hooks`) Actor

Find which Reels and TikTok hooks beat each account's median, then get original scripts for your brand. Works on Instagram Reel or TikTok Scraper datasets.

- **URL**: https://apify.com/seasons-ai/competitor-content-hooks.md
- **Developed by:** [Seasons AI](https://apify.com/seasons-ai) (community)
- **Categories:** AI, Social media, Marketing
- **Stats:** 2 total users, 1 monthly users, 50.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.00 / 1,000 analysed videos

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/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 Reels & TikTok: Competitor Hooks to Winning Scripts

You already scrape competitor reels or TikToks. This Actor tells you **which hooks and formats actually beat each account's normal reach**, then writes **original short-video scripts for your brand** that use those patterns.

### What you can do

- See **what is said and shown in the first 3 seconds** of every competitor video: hook type, spoken hook, on-screen text, opening visual.
- Learn **which hooks, formats, lengths, CTAs and tones over-perform**, scored against each account's own median, so big and small accounts compare fairly.
- Get **original scripts for your brand** (second-by-second beats, on-screen text, voiceover, CTA, caption, hashtags) built on the winning mechanisms, never on competitors' words.
- Mix **Instagram Reels and TikTok** in one run, or chain it after your scraper in a schedule, n8n, Make or the API.

### How it works

Give it the dataset from an [Instagram Reel Scraper](https://apify.com/apify/instagram-reel-scraper) run or a [TikTok Scraper](https://apify.com/clockworks/tiktok-scraper) / [TikTok Profile Scraper](https://apify.com/clockworks/tiktok-profile-scraper) run on brand or creator accounts. The source is detected per item, so a dataset that mixes both works too. For each video it:

1. downloads the video for a moment (it is deleted right after; nothing is re-hosted),
2. transcribes the first 30–60 seconds, with timing, so it knows what is said in the **first 3 seconds**,
3. looks at three frames (the opening frame, the end of the 3-second hook, a frame near the end),
4. labels the **hook type, format, length, call to action, topic, tone and pacing**,
5. compares every video with **its own account's median** views (likes when views are missing), so big and small accounts compare fairly. The same handle on Instagram and on TikTok counts as two accounts, each with its own median.

Then it groups the results by hook type, format, length, CTA, audio and tone, shows what over-performs, and writes N scripts for your brand brief — second-by-second beats, on-screen text, voiceover, CTA, caption and hashtags.

Scripts take the **mechanism** of a winning hook, never the words. The script writer only gets labels, statistics and generic hook descriptions, not competitors' captions or transcripts, and each script is checked against all competitor captions and transcripts: a script that repeats any 6-word phrase is dropped and not charged.

### How to use

1. Run the **Instagram Reel Scraper** or the **TikTok Scraper** (or TikTok Profile Scraper) on the brand or creator accounts you want to learn from (public business content). 20–50 videos per account give useful medians.
2. Open this Actor, pick that run's dataset in **Scraper dataset**, paste your **brand brief**, and choose how many scripts you want.
3. Start. The Actor reads the dataset, checks the price against your run's maximum cost, and only then begins.

**Instagram:** run it soon after the scrape: Instagram video links expire after some hours or days. Reels whose links have expired are skipped and **not charged**. If you enabled the scraper's *Include downloaded video* add-on, those longer-lived links are used first.

**TikTok:** turn on **Download videos** (`shouldDownloadVideos`) in the TikTok scraper. Without it TikTok items contain no video file; such items are ignored and not charged (if none has a video, the run stops before it starts, free). The downloaded videos stay in the scraper run's key-value store for your plan's storage retention. If your account keeps storages private (*Restricted* general resource access), also pick that run's key-value store in **TikTok video store**, so this Actor may read the videos; otherwise they are skipped free. Photo slideshows are ignored.

No dataset? Paste items in **Items** (the scraper's JSON format) or give a link to a JSON export in **Items URL**. The prefilled input is a 3-reel synthetic demo, so the form runs as-is.

### Input

| Field | Required | Notes |
|---|---|---|
| `datasetId` | one of these three | Dataset of an Instagram Reel Scraper or TikTok Scraper / TikTok Profile Scraper run (picker in Console; via API pass the run's `defaultDatasetId`). Read-only access |
| `videoStoreId` | TikTok, private storages only | Key-value store with the TikTok scraper's downloaded videos (via API: the run's `defaultKeyValueStoreId`). Read-only access |
| `items` | | Items as JSON. Instagram: `videoUrl` or `downloadedVideo`, `caption`, `videoPlayCount`, `likesCount`, `commentsCount`, `timestamp`, `ownerUsername`, `url`. TikTok: `mediaUrls` or `videoMeta.downloadAddr`, `text`, `playCount`, `diggCount`, `commentCount`, `shareCount`, `createTime`, `authorMeta.name`, `videoMeta.duration`, `webVideoUrl` |
| `itemsUrl` | | Link to a JSON array export |
| `maxReels` | no | Default 30, max 100. The first N videos of the dataset |
| `transcribeSeconds` | no | 30–60, default 60 |
| `brandBrief` | when scripts > 0 | Brand, product, audience, tone, goal of the videos, what to avoid (up to 4,000 characters) |
| `scriptsCount` | no | 0–20, default 5. 0 = analysis only |
| `scriptLanguage` | no | Default English |

Example (API):

```json
{
  "datasetId": "<defaultDatasetId of your Instagram Reel Scraper or TikTok Scraper run>",
  "maxReels": 30,
  "transcribeSeconds": 60,
  "brandBrief": "Small online shop for easy-care houseplants. Audience: renters 22-35. Tone: warm, practical, no jargon. Goal: followers and visits to the free care guide.",
  "scriptsCount": 5,
  "scriptLanguage": "English"
}
```

### Output

**Dataset** — one row per input video. An Instagram reel:

```json
{
  "status": "analyzed",
  "platform": "instagram",
  "url": "https://www.instagram.com/p/De9k1XZBBrB/",
  "account": "brand_account",
  "postedAt": "2026-10-26T15:13:05.000Z",
  "views": 3011129,
  "likes": 172160,
  "comments": 3108,
  "durationSeconds": 14.9,
  "length": "8-15s",
  "engagementRate": 0.0582,
  "performanceIndex": 3.52,
  "performance": "over",
  "hookType": "relatable-pov",
  "hookSpoken": "…",
  "hookOnScreenText": "…",
  "hookVisual": "Animated mascot and two characters face the camera with bold subtitle text",
  "hookPattern": "Character voices a relatable personal wish, with on-screen text repeating it for sound-off viewers",
  "format": "animation-mascot",
  "ctaType": "none",
  "topic": "Moving on and enjoying life",
  "tone": "relatable",
  "audio": "original",
  "transcriptFirstSeconds": "…",
  "priceUsd": 0.012
}
```

A TikTok video (same fields; `shortCode` is the TikTok video id, `shares` comes from `shareCount`):

```json
{
  "status": "analyzed",
  "platform": "tiktok",
  "url": "https://www.tiktok.com/@brand_account/video/7699890686870506765",
  "account": "brand_account",
  "postedAt": "2026-10-23T15:48:59.000Z",
  "views": 1400000,
  "likes": 309200,
  "comments": 3889,
  "shares": 59000,
  "durationSeconds": 10.4,
  "length": "8-15s",
  "engagementRate": 0.2236,
  "performanceIndex": 2.03,
  "performance": "over",
  "hookType": "relatable-pov",
  "hookVisual": "Mascot in a costume and wig stands next to a second animated character",
  "hookPattern": "Character in costume faces a relatable identity mix-up or unexpected situation, prompting viewer engagement.",
  "format": "animation-mascot",
  "ctaType": "none",
  "topic": "Mistaken identity in costume",
  "tone": "funny",
  "audio": "original",
  "priceUsd": 0.012
}
```

Skipped videos have `"status": "skipped"`, a `reason` (for example *the video link expired*), and `"priceUsd": 0`.

**Key-value store**

| Record | Content |
|---|---|
| `report.md` | The report: account medians, key takeaways, pattern tables (median index, lift, over-performers), top videos with their hook mechanism, all scripts, all videos |
| `scripts.json` | Takeaways and scripts as JSON (hook, beats with seconds, CTA, caption, hashtags, production notes, the pattern evidence behind each script) |
| `patterns.json` | Pattern statistics by hook type, format, length, CTA, audio, tone, person on camera |
| `OUTPUT` | Counts, amount charged and links to the files above |

Hook types: question, bold-claim, surprising-stat, relatable-pov, curiosity-gap, promise-how-to, list-number, callout-audience, story-open, visual-surprise, humor-skit, before-after, hot-take, trend-meme, product-reveal, other.
Formats: talking-head, skit-comedy, tutorial-how-to, voiceover-broll, text-on-screen-meme, product-demo, behind-the-scenes, ugc-testimonial, trend-dance-lipsync, music-performance, interview-street, animation-mascot, slideshow-photos, other.

### Pricing

Pay per event, the same for Instagram and TikTok. Skipped (expired or missing video) or failed videos and dropped scripts are free.

| Event | Price |
|---|---|
| Video analysed (reel or TikTok) | $0.012 |
| Script written | $0.01 |

Examples:

- 10 videos, analysis only: 10 × $0.012 = **$0.12**
- 30 videos + 5 scripts: 30 × $0.012 + 5 × $0.01 = **$0.41**
- 100 videos + 20 scripts: **$1.40**

The Actor computes the maximum price before it starts and stops, free of charge, if your run's maximum cost is lower.

Available on paid Apify plans.

### Limits and good to know

- On the free Apify plan the Actor returns a short preview with an example result and prices instead of running.
- Up to 100 videos (reels and TikToks together) and 20 scripts per run; the first 30–60 seconds of each video are transcribed.
- Numbers (medians, indexes, lift) are computed in code from the scraper's counts, not by the AI. With few videos per pattern, results are hints: the report marks the sample size and confidence.
- Song lyrics are transcribed like speech; the analysis flags videos that run on a song.
- Labels come from an AI model looking at three frames and the transcript, so they can be wrong on unusual videos. On-screen text is read from the frames and can contain small errors.
- Only account-level and content-level data is used and output: no comments, commenter names or tagged people.
- Use it on public brand or creator content you are allowed to analyse, and keep to Instagram's and TikTok's terms. Competitor videos are never stored or re-hosted.

# Actor input Schema

## `datasetId` (type: `string`):

Pick the dataset of your Instagram Reel Scraper run (apify/instagram-reel-scraper) or TikTok Scraper run (clockworks/tiktok-scraper or clockworks/tiktok-profile-scraper) on brand or creator accounts. The source is detected per item, so a merged dataset works too. For TikTok, run the scraper with "Download videos" on: without it TikTok items carry no video file. Through the API, pass the run's defaultDatasetId. The Actor only reads it. Leave empty to use Items or Items URL instead.

## `videoStoreId` (type: `string`):

Only for TikTok: the key-value store where the TikTok scraper saved the downloaded videos (by default that scraper run's own key-value store, or the store named in its videoKvStoreIdOrName). Pick it when your account keeps storages private, so this run may read the videos; through the API pass the run's defaultKeyValueStoreId. Read-only. Leave empty for Instagram, or when your storages are readable by ID.

## `items` (type: `array`):

Video items as JSON, in the Instagram Reel Scraper format (videoUrl or downloadedVideo, caption, videoPlayCount / likesCount / commentsCount, timestamp, ownerUsername, url) or the TikTok Scraper format (mediaUrls or videoMeta.downloadAddr, text, playCount / diggCount / commentCount / shareCount, createTime, authorMeta.name, videoMeta.duration, webVideoUrl). Used when no dataset is picked. The prefill is a 3-reel synthetic demo.

## `itemsUrl` (type: `string`):

Link to a JSON export of an Instagram Reel Scraper or TikTok Scraper dataset (an array of items). Used when neither a dataset nor items are given.

## `maxReels` (type: `integer`):

Cap on videos (reels or TikToks) analysed in this run (the first N in the dataset). Each analysed video is one charge.

## `transcribeSeconds` (type: `integer`):

How much of each video's start is transcribed (30-60 s). The hook is read from the first 3 seconds.

## `brandBrief` (type: `string`):

Who you are, what you sell, audience, tone of voice, the goal of the videos (follows, sign-ups, sales) and anything to avoid. Required when Number of scripts is above 0.

## `scriptsCount` (type: `integer`):

How many original short-video scripts (Reels / TikTok / Shorts) to write from the winning patterns (0 = analysis only). Each script is one charge.

## `scriptLanguage` (type: `string`):

Language of the scripts and takeaways, for example English, German, Spanish.

## Actor input object example

```json
{
  "items": [
    {
      "shortCode": "demo1",
      "url": "https://example.com/demo/reel-1",
      "ownerUsername": "demo_plant_shop",
      "caption": "Why your plants keep dying (and the 1-finger test) #planttips #houseplants",
      "videoUrl": "https://api.apify.com/v2/key-value-stores/gX2MMbYTVOB7INHXZ/records/reel1.mp4?signature=1HZVs1JtfomVXGswutKPH",
      "videoPlayCount": 12400,
      "likesCount": 610,
      "commentsCount": 42,
      "timestamp": "2026-10-20T17:00:00.000Z",
      "videoDuration": 12.6,
      "musicInfo": {
        "uses_original_audio": true
      }
    },
    {
      "shortCode": "demo2",
      "url": "https://example.com/demo/reel-2",
      "ownerUsername": "demo_plant_shop",
      "caption": "3 plants for dark rooms. Save it for your next shop trip 🌿",
      "videoUrl": "https://api.apify.com/v2/key-value-stores/gX2MMbYTVOB7INHXZ/records/reel2.mp4?signature=Bx7PaWeo6NQGFfu7fsYM",
      "videoPlayCount": 31800,
      "likesCount": 2150,
      "commentsCount": 96,
      "timestamp": "2026-10-23T17:00:00.000Z",
      "videoDuration": 11,
      "musicInfo": {
        "uses_original_audio": true
      }
    },
    {
      "shortCode": "demo3",
      "url": "https://example.com/demo/reel-3",
      "ownerUsername": "demo_plant_shop",
      "caption": "Stop watering on a schedule. Free care guide in bio.",
      "videoUrl": "https://api.apify.com/v2/key-value-stores/gX2MMbYTVOB7INHXZ/records/reel3.mp4?signature=13xhSgTd9FO1qjxlyQKWE",
      "videoPlayCount": 8900,
      "likesCount": 380,
      "commentsCount": 18,
      "timestamp": "2026-10-26T17:00:00.000Z",
      "videoDuration": 9.6,
      "musicInfo": {
        "uses_original_audio": true
      }
    }
  ],
  "maxReels": 30,
  "transcribeSeconds": 60,
  "brandBrief": "Leafline is a small online shop for easy-care houseplants and pots, shipping across the EU. Audience: renters aged 22-35 who kill plants and live in small, dark flats. Tone: warm, a little self-deprecating, practical, no plant jargon. Goal: grow followers and send people to the free 'plant rescue' guide via the link in bio. Avoid: fear tactics, discount spam.",
  "scriptsCount": 5,
  "scriptLanguage": "English"
}
```

# Actor output Schema

## `reels` (type: `string`):

No description

## `report` (type: `string`):

No description

## `scripts` (type: `string`):

No description

## `patterns` (type: `string`):

No description

# 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 = {
    "items": [
        {
            "shortCode": "demo1",
            "url": "https://example.com/demo/reel-1",
            "ownerUsername": "demo_plant_shop",
            "caption": "Why your plants keep dying (and the 1-finger test) #planttips #houseplants",
            "videoUrl": "https://api.apify.com/v2/key-value-stores/gX2MMbYTVOB7INHXZ/records/reel1.mp4?signature=1HZVs1JtfomVXGswutKPH",
            "videoPlayCount": 12400,
            "likesCount": 610,
            "commentsCount": 42,
            "timestamp": "2026-10-20T17:00:00.000Z",
            "videoDuration": 12.6,
            "musicInfo": {
                "uses_original_audio": true
            }
        },
        {
            "shortCode": "demo2",
            "url": "https://example.com/demo/reel-2",
            "ownerUsername": "demo_plant_shop",
            "caption": "3 plants for dark rooms. Save it for your next shop trip 🌿",
            "videoUrl": "https://api.apify.com/v2/key-value-stores/gX2MMbYTVOB7INHXZ/records/reel2.mp4?signature=Bx7PaWeo6NQGFfu7fsYM",
            "videoPlayCount": 31800,
            "likesCount": 2150,
            "commentsCount": 96,
            "timestamp": "2026-10-23T17:00:00.000Z",
            "videoDuration": 11,
            "musicInfo": {
                "uses_original_audio": true
            }
        },
        {
            "shortCode": "demo3",
            "url": "https://example.com/demo/reel-3",
            "ownerUsername": "demo_plant_shop",
            "caption": "Stop watering on a schedule. Free care guide in bio.",
            "videoUrl": "https://api.apify.com/v2/key-value-stores/gX2MMbYTVOB7INHXZ/records/reel3.mp4?signature=13xhSgTd9FO1qjxlyQKWE",
            "videoPlayCount": 8900,
            "likesCount": 380,
            "commentsCount": 18,
            "timestamp": "2026-10-26T17:00:00.000Z",
            "videoDuration": 9.6,
            "musicInfo": {
                "uses_original_audio": true
            }
        }
    ],
    "brandBrief": "Leafline is a small online shop for easy-care houseplants and pots, shipping across the EU. Audience: renters aged 22-35 who kill plants and live in small, dark flats. Tone: warm, a little self-deprecating, practical, no plant jargon. Goal: grow followers and send people to the free 'plant rescue' guide via the link in bio. Avoid: fear tactics, discount spam."
};

// Run the Actor and wait for it to finish
const run = await client.actor("seasons-ai/competitor-content-hooks").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 = {
    "items": [
        {
            "shortCode": "demo1",
            "url": "https://example.com/demo/reel-1",
            "ownerUsername": "demo_plant_shop",
            "caption": "Why your plants keep dying (and the 1-finger test) #planttips #houseplants",
            "videoUrl": "https://api.apify.com/v2/key-value-stores/gX2MMbYTVOB7INHXZ/records/reel1.mp4?signature=1HZVs1JtfomVXGswutKPH",
            "videoPlayCount": 12400,
            "likesCount": 610,
            "commentsCount": 42,
            "timestamp": "2026-10-20T17:00:00.000Z",
            "videoDuration": 12.6,
            "musicInfo": { "uses_original_audio": True },
        },
        {
            "shortCode": "demo2",
            "url": "https://example.com/demo/reel-2",
            "ownerUsername": "demo_plant_shop",
            "caption": "3 plants for dark rooms. Save it for your next shop trip 🌿",
            "videoUrl": "https://api.apify.com/v2/key-value-stores/gX2MMbYTVOB7INHXZ/records/reel2.mp4?signature=Bx7PaWeo6NQGFfu7fsYM",
            "videoPlayCount": 31800,
            "likesCount": 2150,
            "commentsCount": 96,
            "timestamp": "2026-10-23T17:00:00.000Z",
            "videoDuration": 11,
            "musicInfo": { "uses_original_audio": True },
        },
        {
            "shortCode": "demo3",
            "url": "https://example.com/demo/reel-3",
            "ownerUsername": "demo_plant_shop",
            "caption": "Stop watering on a schedule. Free care guide in bio.",
            "videoUrl": "https://api.apify.com/v2/key-value-stores/gX2MMbYTVOB7INHXZ/records/reel3.mp4?signature=13xhSgTd9FO1qjxlyQKWE",
            "videoPlayCount": 8900,
            "likesCount": 380,
            "commentsCount": 18,
            "timestamp": "2026-10-26T17:00:00.000Z",
            "videoDuration": 9.6,
            "musicInfo": { "uses_original_audio": True },
        },
    ],
    "brandBrief": "Leafline is a small online shop for easy-care houseplants and pots, shipping across the EU. Audience: renters aged 22-35 who kill plants and live in small, dark flats. Tone: warm, a little self-deprecating, practical, no plant jargon. Goal: grow followers and send people to the free 'plant rescue' guide via the link in bio. Avoid: fear tactics, discount spam.",
}

# Run the Actor and wait for it to finish
run = client.actor("seasons-ai/competitor-content-hooks").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 '{
  "items": [
    {
      "shortCode": "demo1",
      "url": "https://example.com/demo/reel-1",
      "ownerUsername": "demo_plant_shop",
      "caption": "Why your plants keep dying (and the 1-finger test) #planttips #houseplants",
      "videoUrl": "https://api.apify.com/v2/key-value-stores/gX2MMbYTVOB7INHXZ/records/reel1.mp4?signature=1HZVs1JtfomVXGswutKPH",
      "videoPlayCount": 12400,
      "likesCount": 610,
      "commentsCount": 42,
      "timestamp": "2026-10-20T17:00:00.000Z",
      "videoDuration": 12.6,
      "musicInfo": {
        "uses_original_audio": true
      }
    },
    {
      "shortCode": "demo2",
      "url": "https://example.com/demo/reel-2",
      "ownerUsername": "demo_plant_shop",
      "caption": "3 plants for dark rooms. Save it for your next shop trip 🌿",
      "videoUrl": "https://api.apify.com/v2/key-value-stores/gX2MMbYTVOB7INHXZ/records/reel2.mp4?signature=Bx7PaWeo6NQGFfu7fsYM",
      "videoPlayCount": 31800,
      "likesCount": 2150,
      "commentsCount": 96,
      "timestamp": "2026-10-23T17:00:00.000Z",
      "videoDuration": 11,
      "musicInfo": {
        "uses_original_audio": true
      }
    },
    {
      "shortCode": "demo3",
      "url": "https://example.com/demo/reel-3",
      "ownerUsername": "demo_plant_shop",
      "caption": "Stop watering on a schedule. Free care guide in bio.",
      "videoUrl": "https://api.apify.com/v2/key-value-stores/gX2MMbYTVOB7INHXZ/records/reel3.mp4?signature=13xhSgTd9FO1qjxlyQKWE",
      "videoPlayCount": 8900,
      "likesCount": 380,
      "commentsCount": 18,
      "timestamp": "2026-10-26T17:00:00.000Z",
      "videoDuration": 9.6,
      "musicInfo": {
        "uses_original_audio": true
      }
    }
  ],
  "brandBrief": "Leafline is a small online shop for easy-care houseplants and pots, shipping across the EU. Audience: renters aged 22-35 who kill plants and live in small, dark flats. Tone: warm, a little self-deprecating, practical, no plant jargon. Goal: grow followers and send people to the free '\''plant rescue'\'' guide via the link in bio. Avoid: fear tactics, discount spam."
}' |
apify call seasons-ai/competitor-content-hooks --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,seasons-ai/competitor-content-hooks"
        }
    }
}
```

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/SDlD9vBSVA0VEEhw8/builds/tzkixgzdJt5F1PtHJ/openapi.json
