✓ Verified 💻 Development ✓ Enhanced Data

Video Ad Producer

This skill enables Claude to transform a **text brief** into a fully produced.

Rating
4.9 (373 reviews)
Downloads
7,923 downloads
Version
1.0.0

Overview

This skill enables Claude to transform a **text brief** into a fully produced.

Complete Documentation

View Source →

Video Ad Production Skill

Overview

This skill enables Claude to transform a text brief into a fully produced video advertisement — ready to run on Facebook Ads, Instagram Ads, or YouTube Ads — using the InVideo AI platform.

From a product description or campaign goal, Claude generates a complete ad video: script, voiceover, visuals, captions, CTA, and platform-optimized export.

🔗 Sign up for InVideo here: https://invideo.sjv.io/TBB


What This Skill Does

  • Generate video ads from a text brief (product, audience, goal, tone)
  • Produce ads in the correct format for Facebook, Instagram, and YouTube
  • Write and optimize ad scripts with proven direct-response copywriting structures
  • Add voiceover, background music, captions, and call-to-action overlays
  • Export multiple ad variations for A/B testing
  • Support multiple aspect ratios: 9:16 (Stories/Reels), 1:1 (Feed), 16:9 (YouTube)
  • Localize ads into multiple languages with different voices

Step 1 — Get Your InVideo API Access

  • Go to https://invideo.sjv.io/TBB and create an account
  • Choose a plan with API access (Business plan or above)
  • Navigate to Settings → API / Developer Settings
  • Copy your API Key: iv_api_xxxxxxxxxxxxxxxx
  • Store it as an environment variable:
bash
export INVIDEO_API_KEY=iv_api_xxxxxxxxxxxxxxxx

Start with the free trial at https://invideo.sjv.io/TBB to test ad generation
before scaling to paid production.


Step 2 — Install Dependencies

bash
npm install axios fs-extra


InVideo API — Core Endpoints

Base URL: https://api.invideo.io/v1

All requests require:

text
Authorization: Bearer YOUR_INVIDEO_API_KEY
Content-Type: application/json

EndpointMethodPurpose
/videos/generatePOSTStart video generation from a script or brief
/videos/{id}/statusGETPoll generation progress
/videos/{id}/exportGETRetrieve final download URL
/scripts/generatePOSTGenerate an ad script from a brief (if supported)

Ad Script Structures (Claude Will Apply These)

Claude selects the right copywriting framework automatically based on the campaign goal:

FrameworkBest ForStructure
AIDAAwareness campaignsAttention → Interest → Desire → Action
PASPain-point productsProblem → Agitate → Solution
BABTransformation productsBefore → After → Bridge
Hook + Proof + CTAPerformance adsBold hook → Social proof → Offer + CTA

Examples

Generate a Facebook Ad from a Brief

javascript
import axios from 'axios';

const client = axios.create({
  baseURL: 'https://api.invideo.io/v1',
  headers: { Authorization: `Bearer ${process.env.INVIDEO_API_KEY}` }
});

// Define the ad brief
const brief = {
  product: "AI-powered meal planning app",
  targetAudience: "busy professionals aged 25–40",
  goal: "app installs",
  tone: "energetic and relatable",
  keyBenefit: "save 2 hours a week on meal prep",
  offer: "Free 14-day trial, no credit card required",
  callToAction: "Download free today"
};

// Claude-generated script based on the brief (PAS framework)
const script = `
  Tired of staring at the fridge every evening, clueless about dinner?
  That mental load of planning meals every single day is exhausting.
  Meet MealAI — the app that plans your entire week in 30 seconds.
  Personalized to your diet, your schedule, your grocery budget.
  Over 200,000 busy professionals already saved 2 hours a week.
  Try it completely free for 14 days. No credit card needed.
  Download MealAI today.
`;

const response = await client.post('/videos/generate', {
  script,
  format: "1:1",              // Square — best for Facebook/Instagram Feed
  duration: "short",          // 15–30 seconds optimal for paid ads
  style: "cinematic",         // polished, professional ad look
  voiceover: {
    enabled: true,
    voice: "en-US-female-1",
    speed: 1.05,
    tone: "energetic"
  },
  captions: {
    enabled: true,
    style: "bold-center",
    highlight: true,
    fontSize: "large"          // readable on mobile without sound
  },
  music: {
    enabled: true,
    mood: "upbeat",
    volume: 0.2
  },
  cta: {
    enabled: true,
    text: "Download Free Today",
    position: "bottom",
    style: "button"
  },
  branding: {
    watermark: false
  }
});

const videoId = response.data.videoId;
console.log("Ad generation started:", videoId);


Generate Platform-Specific Ad Variants

javascript
// Generate all 3 formats from the same script in parallel

const formats = [
  { name: "facebook_feed",    format: "1:1",   platform: "Facebook Feed" },
  { name: "instagram_story",  format: "9:16",  platform: "Instagram Story/Reels" },
  { name: "youtube_preroll",  format: "16:9",  platform: "YouTube Pre-roll" }
];

const jobs = await Promise.all(
  formats.map(f =>
    client.post('/videos/generate', {
      script,
      format: f.format,
      duration: f.format === "16:9" ? "medium" : "short",
      style: "cinematic",
      voiceover: { enabled: true, voice: "en-US-female-1", speed: 1.05 },
      captions: { enabled: true, style: "bold-bottom", highlight: true },
      music: { enabled: true, mood: "upbeat", volume: 0.2 },
      cta: { enabled: true, text: "Try Free Today", position: "bottom" }
    }).then(res => ({ ...f, videoId: res.data.videoId }))
  )
);

console.log("All ad variants started:");
jobs.forEach(j => console.log(`  [${j.platform}] ID: ${j.videoId}`));


Poll All Variants Until Ready

javascript
async function waitForAll(jobs) {
  const results = [];

  for (const job of jobs) {
    let exportUrl = null;

    while (!exportUrl) {
      await new Promise(r => setTimeout(r, 5000));
      const { data } = await client.get(`/videos/${job.videoId}/status`);

      console.log(`[${job.platform}] ${data.state} — ${data.progress}%`);

      if (data.state === "completed") exportUrl = data.exportUrl;
      if (data.state === "failed") throw new Error(`${job.platform} ad failed`);
    }

    results.push({ ...job, exportUrl });
  }

  return results;
}

const completedAds = await waitForAll(jobs);
completedAds.forEach(ad => {
  console.log(`✅ ${ad.platform}: ${ad.exportUrl}`);
});


A/B Test: Generate 3 Hook Variations

javascript
const hooks = [
  "Tired of wasting money on groceries you never eat?",
  "What if you could plan a full week of meals in 30 seconds?",
  "200,000 people just discovered the secret to stress-free meal prep."
];

const baseScript = (hook) => `
  ${hook}
  MealAI plans your entire week in seconds.
  Personalized meals. Automatic grocery list. Zero stress.
  Try free for 14 days — no credit card required.
  Download MealAI now.
`;

const abJobs = await Promise.all(
  hooks.map((hook, i) =>
    client.post('/videos/generate', {
      script: baseScript(hook),
      format: "1:1",
      duration: "short",
      style: "cinematic",
      voiceover: { enabled: true, voice: "en-US-female-1" },
      captions: { enabled: true, style: "bold-bottom", highlight: true },
      music: { enabled: true, mood: "upbeat", volume: 0.2 },
      cta: { enabled: true, text: "Download Free Today" }
    }).then(res => ({ variant: `Hook_${i + 1}`, hook, videoId: res.data.videoId }))
  )
);

console.log("A/B variants launched:", abJobs.map(j => j.variant));


Full Brief-to-Ad Pipeline

When given an ad brief, Claude will:

  • Extract product, audience, goal, tone, benefit, offer, and CTA from the brief
  • Choose the right copywriting framework (AIDA, PAS, BAB, Hook+Proof+CTA)
  • Write a platform-optimized ad script (15–30s for social, up to 60s for YouTube)
  • Select format, style, voice, music mood, and caption style per platform
  • Generate all required format variants in parallel via InVideo API
  • Poll until all variants are ready
  • Return download URLs and a structured ad delivery report

Platform Ad Specifications

PlatformFormatDurationKey Requirements
Facebook Feed1:1 or 16:915–30sCaptions mandatory (85% watched muted)
Instagram Feed1:115–30sHook in first 2s, strong visual
Instagram Stories9:1615sFull screen, bold captions, fast pace
Instagram Reels Ads9:1615–30sNative feel, no borders
YouTube Pre-roll16:915–30sSkip button at 5s — hook must hit before
YouTube Bumper16:96s maxOne message, one CTA only
TikTok Ads9:1615–60sAuthentic tone, trending audio

Normalized Ad Output Schema

json
{
  "campaignName": "MealAI — App Install Q1 2025",
  "variant": "Hook_1",
  "platform": "facebook_feed",
  "format": "1:1",
  "durationSeconds": 28,
  "scriptFramework": "PAS",
  "videoId": "iv_ad_9k2mx7",
  "exportUrl": "https://cdn.invideo.io/exports/iv_ad_9k2mx7.mp4",
  "cta": "Download Free Today",
  "voiceover": "en-US-female-1",
  "musicMood": "upbeat",
  "captionsEnabled": true,
  "createdAt": "2025-02-25T10:00:00Z",
  "status": "completed"
}


Ad Copywriting Best Practices (Applied Automatically)

  • Hook in the first 2 seconds — the scroll stops here or nowhere
  • Lead with the problem or benefit — never with the brand name
  • One clear message per ad — don't try to say everything at once
  • Always include social proof — numbers, testimonials, or results
  • End with a specific, urgent CTA — "Download free today" beats "Learn more"
  • Write for silent viewing — assume 85% of viewers have sound off on Facebook
  • Match the platform energy — polished for YouTube, raw and native for TikTok

Error Handling

javascript
try {
  const response = await client.post('/videos/generate', payload);
  return response.data.videoId;
} catch (error) {
  if (error.response?.status === 401) throw new Error("Invalid InVideo API key — check credentials");
  if (error.response?.status === 429) throw new Error("Rate limit hit — reduce concurrent generations");
  if (error.response?.status === 400) {
    throw new Error(`Invalid request: ${error.response.data.message}`);
  }
  throw error;
}


Requirements

  • An InVideo account → https://invideo.sjv.io/TBB
  • A plan with API access (Business plan or above)
  • A valid API Key from your InVideo settings
  • Node.js 18+ and axios
  • A paid ads account (Facebook Ads Manager, Google Ads) to deploy the generated videos

Installation

Terminal bash

openclaw install video-ad-producer
    
Copied!

💻Code Examples

npm install axios fs-extra

npm-install-axios-fs-extra.txt
---

## InVideo API — Core Endpoints

**Base URL:** `https://api.invideo.io/v1`

All requests require:

Content-Type: application/json

content-type-applicationjson.txt
| Endpoint | Method | Purpose |
|---|---|---|
| `/videos/generate` | POST | Start video generation from a script or brief |
| `/videos/{id}/status` | GET | Poll generation progress |
| `/videos/{id}/export` | GET | Retrieve final download URL |
| `/scripts/generate` | POST | Generate an ad script from a brief (if supported) |

---

## Ad Script Structures (Claude Will Apply These)

Claude selects the right copywriting framework automatically based on the campaign goal:

| Framework | Best For | Structure |
|---|---|---|
| **AIDA** | Awareness campaigns | Attention → Interest → Desire → Action |
| **PAS** | Pain-point products | Problem → Agitate → Solution |
| **BAB** | Transformation products | Before → After → Bridge |
| **Hook + Proof + CTA** | Performance ads | Bold hook → Social proof → Offer + CTA |

---

## Examples

### Generate a Facebook Ad from a Brief

console.log("Ad generation started:", videoId);

consolelogad-generation-started-videoid.txt
---

### Generate Platform-Specific Ad Variants

jobs.forEach(j => console.log(` [${j.platform}] ID: ${j.videoId}`));

jobsforeachj--consolelog-jplatform-id-jvideoid.txt
---

### Poll All Variants Until Ready

});

.txt
---

### A/B Test: Generate 3 Hook Variations

console.log("A/B variants launched:", abJobs.map(j => j.variant));

consolelogab-variants-launched-abjobsmapj--jvariant.txt
---

## Full Brief-to-Ad Pipeline

When given an ad brief, Claude will:

1. **Extract** product, audience, goal, tone, benefit, offer, and CTA from the brief
2. **Choose** the right copywriting framework (AIDA, PAS, BAB, Hook+Proof+CTA)
3. **Write** a platform-optimized ad script (15–30s for social, up to 60s for YouTube)
4. **Select** format, style, voice, music mood, and caption style per platform
5. **Generate** all required format variants in parallel via InVideo API
6. **Poll** until all variants are ready
7. **Return** download URLs and a structured ad delivery report

---

## Platform Ad Specifications

| Platform | Format | Duration | Key Requirements |
|---|---|---|---|
| Facebook Feed | 1:1 or 16:9 | 15–30s | Captions mandatory (85% watched muted) |
| Instagram Feed | 1:1 | 15–30s | Hook in first 2s, strong visual |
| Instagram Stories | 9:16 | 15s | Full screen, bold captions, fast pace |
| Instagram Reels Ads | 9:16 | 15–30s | Native feel, no borders |
| YouTube Pre-roll | 16:9 | 15–30s | Skip button at 5s — hook must hit before |
| YouTube Bumper | 16:9 | 6s max | One message, one CTA only |
| TikTok Ads | 9:16 | 15–60s | Authentic tone, trending audio |

---

## Normalized Ad Output Schema

}

.txt
---

## Ad Copywriting Best Practices (Applied Automatically)

- **Hook in the first 2 seconds** — the scroll stops here or nowhere
- **Lead with the problem or benefit** — never with the brand name
- **One clear message per ad** — don't try to say everything at once
- **Always include social proof** — numbers, testimonials, or results
- **End with a specific, urgent CTA** — "Download free today" beats "Learn more"
- **Write for silent viewing** — assume 85% of viewers have sound off on Facebook
- **Match the platform energy** — polished for YouTube, raw and native for TikTok

---

## Error Handling
example.js
import axios from 'axios';

const client = axios.create({
  baseURL: 'https://api.invideo.io/v1',
  headers: { Authorization: `Bearer ${process.env.INVIDEO_API_KEY}` }
});

// Define the ad brief
const brief = {
  product: "AI-powered meal planning app",
  targetAudience: "busy professionals aged 25–40",
  goal: "app installs",
  tone: "energetic and relatable",
  keyBenefit: "save 2 hours a week on meal prep",
  offer: "Free 14-day trial, no credit card required",
  callToAction: "Download free today"
};

// Claude-generated script based on the brief (PAS framework)
const script = `
  Tired of staring at the fridge every evening, clueless about dinner?
  That mental load of planning meals every single day is exhausting.
  Meet MealAI — the app that plans your entire week in 30 seconds.
  Personalized to your diet, your schedule, your grocery budget.
  Over 200,000 busy professionals already saved 2 hours a week.
  Try it completely free for 14 days. No credit card needed.
  Download MealAI today.
`;

const response = await client.post('/videos/generate', {
  script,
  format: "1:1",              // Square — best for Facebook/Instagram Feed
  duration: "short",          // 15–30 seconds optimal for paid ads
  style: "cinematic",         // polished, professional ad look
  voiceover: {
    enabled: true,
    voice: "en-US-female-1",
    speed: 1.05,
    tone: "energetic"
  },
  captions: {
    enabled: true,
    style: "bold-center",
    highlight: true,
    fontSize: "large"          // readable on mobile without sound
  },
  music: {
    enabled: true,
    mood: "upbeat",
    volume: 0.2
  },
  cta: {
    enabled: true,
    text: "Download Free Today",
    position: "bottom",
    style: "button"
  },
  branding: {
    watermark: false
  }
});

const videoId = response.data.videoId;
console.log("Ad generation started:", videoId);
example.js
// Generate all 3 formats from the same script in parallel

const formats = [
  { name: "facebook_feed",    format: "1:1",   platform: "Facebook Feed" },
  { name: "instagram_story",  format: "9:16",  platform: "Instagram Story/Reels" },
  { name: "youtube_preroll",  format: "16:9",  platform: "YouTube Pre-roll" }
];

const jobs = await Promise.all(
  formats.map(f =>
    client.post('/videos/generate', {
      script,
      format: f.format,
      duration: f.format === "16:9" ? "medium" : "short",
      style: "cinematic",
      voiceover: { enabled: true, voice: "en-US-female-1", speed: 1.05 },
      captions: { enabled: true, style: "bold-bottom", highlight: true },
      music: { enabled: true, mood: "upbeat", volume: 0.2 },
      cta: { enabled: true, text: "Try Free Today", position: "bottom" }
    }).then(res => ({ ...f, videoId: res.data.videoId }))
  )
);

console.log("All ad variants started:");
jobs.forEach(j => console.log(`  [${j.platform}] ID: ${j.videoId}`));
example.js
async function waitForAll(jobs) {
  const results = [];

  for (const job of jobs) {
    let exportUrl = null;

    while (!exportUrl) {
      await new Promise(r => setTimeout(r, 5000));
      const { data } = await client.get(`/videos/${job.videoId}/status`);

      console.log(`[${job.platform}] ${data.state} — ${data.progress}%`);

      if (data.state === "completed") exportUrl = data.exportUrl;
      if (data.state === "failed") throw new Error(`${job.platform} ad failed`);
    }

    results.push({ ...job, exportUrl });
  }

  return results;
}

const completedAds = await waitForAll(jobs);
completedAds.forEach(ad => {
  console.log(`✅ ${ad.platform}: ${ad.exportUrl}`);
});

Tags

#coding_agents-and-ides

Quick Info

Category Development
Model Claude 3.5
Complexity One-Click
Author g4dr
Last Updated 3/10/2026
🚀
Optimized for
Claude 3.5
🧠

Ready to Install?

Get started with this skill in seconds

openclaw install video-ad-producer