Generate Pinterest-optimized vertical videos using JSON2Video API. Supports AI-generated or URL-based images, AI-generated or provided voiceovers, optional subtitles, and zoom effects. Use when creating video content for Pinterest affiliate marketing, creating vertical social media videos, automating video production with JSON2Video API, or generating videos with voiceovers and subtitles.
Generate vertical videos (1080x1920) optimized for Pinterest using the JSON2Video API.
export JSON2VIDEO_API_KEY="your_api_key_here"
Create a video using a JSON configuration file:
python3 scripts/generate_video.py --config my-video.json --wait
The video is defined as an array of scenes. Each scene contains:
| Property | Type | Description |
|---|---|---|
image | object | Image configuration (AI-generated or URL) |
voice | object | Voice configuration (generated TTS or URL) |
text_overlay | string | Optional text displayed on scene |
subtitles | boolean | Enable/disable subtitles |
zoom_effect | boolean | Add Ken Burns zoom effect |
duration | number | Override scene duration (seconds) |
AI-Generated Image:
{
"image": {
"source": "ai",
"ai_provider": "flux-schnell",
"ai_prompt": "A minimalist workspace with laptop..."
}
}
Available AI Providers:
flux-pro - Highest quality, realistic imagesflux-schnell - Fast generation, good qualityfreepik-classic - Digital artwork styleURL-Based Image:
{
"image": {
"source": "https://example.com/image.jpg"
}
}
AI-Generated Voice (TTS):
{
"voice": {
"source": "generated",
"text": "Your voiceover text here",
"voice_id": "en-US-EmmaMultilingualNeural",
"model": "azure"
}
}
Provided Audio File:
{
"voice": {
"source": "https://example.com/voiceover.mp3"
}
}
Note on Scene Duration: The voiceover determines scene length automatically. Each scene's duration matches its audio length. For provided audio files, ensure they match your intended scene timing.
{
"resolution": "instagram-story",
"quality": "high",
"cache": true,
"scenes": [
{
"image": {
"source": "ai",
"ai_provider": "flux-schnell",
"ai_prompt": "Affiliate marketing workspace with laptop and coffee"
},
"voice": {
"source": "generated",
"text": "Here's how to make money with affiliate marketing",
"voice_id": "en-US-Neural2-F"
},
"text_overlay": "Affiliate Marketing 101",
"subtitles": true,
"zoom_effect": true
}
]
}
For long scripts, split into multiple scenes with shorter voice segments:
{
"scenes": [
{
"image": { "source": "ai", "ai_prompt": "Hook image" },
"voice": { "source": "generated", "text": "Attention-grabbing hook..." },
"zoom_effect": true
},
{
"image": { "source": "ai", "ai_prompt": "Step 1 image" },
"voice": { "source": "generated", "text": "Step one is to..." },
"zoom_effect": true
},
{
"image": { "source": "ai", "ai_prompt": "CTA image" },
"voice": { "source": "generated", "text": "Click the link in bio..." },
"zoom_effect": false
}
]
}
Create video from config:
python3 scripts/generate_video.py --config video.json --wait
Create without waiting:
python3 scripts/generate_video.py --config video.json --no-wait
Check status of existing project:
python3 scripts/generate_video.py --project-id YOUR_PROJECT_ID
| Resolution | Dimensions | Use Case |
|---|---|---|
instagram-story | 1080x1920 | Pinterest/Reels/Stories (recommended) |
instagram-feed | 1080x1080 | Square posts |
full-hd | 1920x1080 | Landscape YouTube |
hd | 1280x720 | Standard HD |
custom | Any | Custom dimensions |
Voice format: en-US-EmmaMultilingualNeural
Common Azure voices:
en-US-EmmaMultilingualNeural - Female, natural (recommended)en-US-GuyNeural - Male, professionalen-US-JennyNeural - Female, friendlyen-GB-SoniaNeural - British femaleen-GB-RyanNeural - British maleSee Microsoft Azure Speech Voices for full list.
Voice names: Natural names like Bella, Antoni, Nova, Shimmer
Available voices: Daniel, Serena, Antoni, Bella, Nova, Shimmer, and more.
See ElevenLabs Voice Library for full list.
JSON2VIDEO_API_KEYscripts/example-config.json - Basic example with one scenescripts/example-advanced.json - Multi-scene affiliate marketing videoSee ADVANCED.md for:
Error: "JSON2VIDEO_API_KEY environment variable not set"
→ Run: export JSON2VIDEO_API_KEY="your_key"
Error: "Render failed" → Check: Image URLs are publicly accessible → Check: AI prompts don't violate content policies → Check: Audio files are valid MP3/WAV
Video takes too long
→ Enable cache: true in config
→ Use flux-schnell instead of flux-pro for faster generation
→ Pre-generate AI images and use URLs instead
For programmatic use in other scripts:
from scripts.generate_video import create_pinterest_video
scenes = [
{
"image": {"source": "ai", "ai_prompt": "..."},
"voice": {"source": "generated", "text": "..."},
"subtitles": True,
"zoom_effect": True
}
]
video_url = create_pinterest_video(scenes, wait=True)
print(f"Video ready: {video_url}")