- name
- arcads-ai-video-generator
- description
- Create AI marketing videos and static Meta image ads using the Arcads API with Seedance 2.0, Sora 2, Veo 3.1, Kling, Nano Banana, ChatGPT Image, and 37 static ad templates
- triggers
- ["generate an AI video ad","create a UGC video with Seedance","make a product reveal video","generate AI influencer images","create static Meta image ads","build a Pixar-style animated ad","animate a still image with Veo","generate YouTube thumbnails"]
# Arcads AI Video Generator
> Skill by [ara.so](https://ara.so) — Claude Code Skills collection.
Create AI marketing videos and images using the Arcads API. Supports the full creative stack: **Seedance 2.0** (flagship video), **Sora 2**, **Veo 3.1**, **Kling 3.0**, **Grok Video**, **Nano Banana 2/Pro/Edit**, **ChatGPT Image 2**, **OmniHuman**, **Audio-driven** models, plus a 37-template static Meta image-ad library and multi-step pipelines for Pixar-style and claymation animated ads.
## Installation
```bash
git clone https://github.com/krusemediallc/arcads-claude-code.git
cd arcads-claude-code
./scripts/setup.sh
```
The setup script will:
- Prompt for your Arcads API key (get it at [app.arcads.ai/settings/api](https://app.arcads.ai/settings/api))
- Save credentials to `.env`
- Verify API connection
- Create `MASTER_CONTEXT.md` workspace file
### Prerequisites
| Tool | Required for | Install |
|---|---|---|
| Python 3.10+ | Core API operations | `brew install python@3.12` |
| `ffmpeg` | Video stitching, chroma-key | `brew install ffmpeg` |
| `jq` | JSON parsing in bash scripts | `brew install jq` |
| Node.js | Caption burn-in (hyperframes) | `brew install node` |
| `whisper` | Caption transcription | `pip install openai-whisper` |
### Environment Setup
Create `.env` in the project root:
```bash
ARCADS_API_KEY=your_api_key_here
```
## Core API Patterns
### Video Generation (Seedance 2.0)
**Endpoint:** `POST https://api.arcads.ai/v1/seedance2/video`
```python
import requests
import os
import time
API_KEY = os.getenv('ARCADS_API_KEY')
BASE_URL = 'https://api.arcads.ai'
def generate_seedance_video(prompt, duration=12):
"""Generate a Seedance 2.0 video."""
headers = {
'Authorization': f'Bearer {API_KEY}',
'Content-Type': 'application/json'
}
payload = {
'prompt': prompt,
'duration': duration,
'shotStyle': 'ugc-selfie' # or 'premium-reveal', 'product-hero', etc.
}
# Start generation
response = requests.post(
f'{BASE_URL}/v1/seedance2/video',
headers=headers,
json=payload
)
job = response.json()
job_id = job['id']
# Poll until complete
while True:
status_response = requests.get(
f'{BASE_URL}/v1/jobs/{job_id}',
headers=headers
)
status = status_response.json()
if status['status'] == 'completed':
return status['videoUrl']
elif status['status'] == 'failed':
raise Exception(f"Generation failed: {status.get('error')}")
time.sleep(5)
# Example: UGC product review
video_url = generate_seedance_video(
prompt="""
[SCENE: NATURAL KITCHEN LIGHTING]
Medium shot, slight handheld motion.
Woman, early 30s, messy bun, casual tank top.
Holding [PRODUCT] at chest level, genuine smile.
[DIALOGUE]
"Okay so I used to buy [COMPETITOR] every month but then I found THIS—"
*lifts product slightly, direct eye contact*
"—and honestly? I'm never going back."
[VISUAL BEATS]
0-3s: Establishing shot, product reveal
3-7s: Close on face during key claim
7-12s: Pull back, casual product demo gesture
""",
duration=12
)
print(f"Video ready: {video_url}")
```
### Seedance 2.0 Prompt Formulas
Five battle-tested formulas ship with the skill:
#### 1. UGC Selfie-Style Review
```
[SCENE: NATURAL KITCHEN LIGHTING]
Medium shot, slight handheld motion.
Woman, early 30s, messy bun, casual tank top.
Holding [PRODUCT] at chest level, genuine smile.
[DIALOGUE]
"Okay so I used to buy [COMPETITOR] every month..."
[VISUAL BEATS]
0-3s: Establishing shot
3-7s: Close on face
7-12s: Product demo gesture
```
#### 2. Premium Product Reveal (No Person)
```
[SCENE: DARK VOID]
No human. Product only.
Black background, dramatic side lighting.
[TEXT OVERLAYS]
Beat 1 (0-3s): "Most [CATEGORY] products..."
Beat 2 (3-6s): "[PRODUCT] is different."
Beat 3 (6-9s): Hero rotation + key feature callout
[CAMERA]
Slow push-in, 360° rotation at beat 3
```
#### 3. Product Hero with Elements
```
[SCENE: ELEMENTAL SHOWCASE]
Product suspended mid-frame.
Water splash from below, mist rising.
Slow rotation (15°/sec).
[VISUAL FX]
0-2s: Water splash entry
2-5s: Mist buildup
5-8s: Light rays piercing mist
8-12s: Hero rotation + feature close-up
```
### Image Generation (Nano Banana)
**Endpoint:** `POST https://api.arcads.ai/v1/nano-banana/image`
```python
import base64
def generate_nano_banana_image(prompt, reference_image_path=None, model='nano-banana-2'):
"""Generate a Nano Banana image with optional reference."""
headers = {
'Authorization': f'Bearer {API_KEY}',
'Content-Type': 'application/json'
}
payload = {
'prompt': prompt,
'model': model, # 'nano-banana-2' or 'nano-banana' (Pro) or 'nano-banana-edit'
'aspectRatio': '9:16'
}
# Add reference image if provided
if reference_image_path:
with open(reference_image_path, 'rb') as f:
img_base64 = base64.b64encode(f.read()).decode('utf-8')
payload['refImageAsBase64'] = img_base64
response = requests.post(
f'{BASE_URL}/v1/nano-banana/image',
headers=headers,
json=payload
)
job = response.json()
job_id = job['id']
# Poll for completion
while True:
status_response = requests.get(
f'{BASE_URL}/v1/jobs/{job_id}',
headers=headers
)
status = status_response.json()
if status['status'] == 'completed':
return status['imageUrl']
elif status['status'] == 'failed':
raise Exception(f"Generation failed: {status.get('error')}")
time.sleep(3)
# Example: UGC selfie with product
image_url = generate_nano_banana_image(
prompt="""
iPhone selfie camera, natural bedroom lighting.
Woman, 22, freckles, golden hour glow.
Holding [PRODUCT] at chest level, genuine smile.
Messy hair, no makeup, casual tank top.
Slight camera shake, realistic skin texture.
Background: unmade bed, string lights, plants.
""",
reference_image_path='references/influencers/sofia_hero.jpg'
)
```
### Veo 3.1 (Start-Frame Animation)
**Endpoint:** `POST https://api.arcads.ai/v1/veo3/video`
```python
def animate_with_veo(start_frame_path, prompt, duration=8):
"""Animate a still image with Veo 3.1."""
headers = {
'Authorization': f'Bearer {API_KEY}',
'Content-Type': 'application/json'
}
# Load start frame
with open(start_frame_path, 'rb') as f:
img_base64 = base64.b64encode(f.read()).decode('utf-8')
payload = {
'prompt': prompt,
'startFrame': img_base64,
'duration': duration,
'dialogue': 'I switched to this product and never looked back'
}
response = requests.post(
f'{BASE_URL}/v1/veo3/video',
headers=headers,
json=payload
)
job = response.json()
return poll_job(job['id'])
def poll_job(job_id):
"""Generic job polling."""
headers = {'Authorization': f'Bearer {API_KEY}'}
while True:
response = requests.get(
f'{BASE_URL}/v1/jobs/{job_id}',
headers=headers
)
status = response.json()
if status['status'] == 'completed':
return status.get('videoUrl') or status.get('imageUrl')
elif status['status'] == 'failed':
raise Exception(f"Job failed: {status.get('error')}")
time.sleep(5)
```
### Sora 2 Video Generation
**Endpoint:** `POST https://api.arcads.ai/v1/sora2/video`
```python
def generate_sora_video(prompt, duration=16, reference_image_path=None):
"""Generate a Sora 2 video (up to 20s)."""
headers = {
'Authorization': f'Bearer {API_KEY}',
'Content-Type': 'application/json'
}
payload = {
'prompt': prompt,
'duration': duration
}
if reference_image_path:
with open(reference_image_path, 'rb') as f:
img_base64 = base64.b64encode(f.read()).decode('utf-8')
payload['styleReference'] = img_base64
response = requests.post(
f'{BASE_URL}/v1/sora2/video',
headers=headers,
json=payload
)
return poll_job(response.json()['id'])
# Example: Longer narrative scene
video_url = generate_sora_video(
prompt="""
Cozy coffee shop interior, warm afternoon light.
Camera tracks across table as woman opens laptop.
Smooth dolly shot, shallow depth of field.
Steam rising from coffee mug in foreground.
Natural color grading, 24fps cinematic feel.
""",
duration=16
)
```
### B-Roll / Scene Generation (Kling 3.0)
**Endpoint:** `POST https://api.arcads.ai/v1/b-roll` or `POST https://api.arcads.ai/v1/scene`
```python
def generate_broll(prompt, duration=5):
"""Generate b-roll footage with Kling 3.0."""
headers = {
'Authorization': f'Bearer {API_KEY}',
'Content-Type': 'application/json'
}
payload = {
'prompt': prompt,
'duration': duration
}
response = requests.post(
f'{BASE_URL}/v1/b-roll',
headers=headers,
json=payload
)
return poll_job(response.json()['id'])
# Example: Product environment b-roll
broll_url = generate_broll(
prompt="""
Close-up of coffee beans being poured into grinder.
Slow motion, 120fps.
Natural light from window, wooden countertop.
Shallow focus on falling beans.
"""
)
```
## Static Meta Image Ad Library
The repo includes **37 validated prompt templates** for static Meta image ads. Two primary generators:
### ChatGPT Image 2 (Typography/UI-Heavy)
**Best for:** Apple Notes lists, editorial layouts, comparison tables, UI mockups, text-heavy designs
```python
def generate_chatgpt_image_ad(template_name, product_details):
"""Generate static ad using ChatGPT Image 2."""
# Load template from library
template_path = f'shared/skills/image-ad-prompting/library/{template_name}.md'
with open(template_path, 'r') as f:
template = f.read()
# Fill template with product details
prompt = template.format(**product_details)
headers = {
'Authorization': f'Bearer {API_KEY}',
'Content-Type': 'application/json'
}
payload = {
'prompt': prompt,
'model': 'gpt-image-2',
'aspectRatio': '4:5' # Standard Meta image ad ratio
}
response = requests.post(
f'{BASE_URL}/v1/chatgpt-image/generate',
headers=headers,
json=payload
)
return poll_job(response.json()['id'])
# Example: Apple Notes style ad
image_url = generate_chatgpt_image_ad(
template_name='apple-notes-list',
product_details={
'product_name': 'FocusFlow',
'category': 'productivity app',
'benefits': [
'Blocks distractions automatically',
'AI suggests optimal focus times',
'Syncs across all devices'
],
'cta': 'Download free today'
}
)
```
### Nano Banana (Photoreal/Lifestyle)
عرض على GitHub