Skip to main content

Episode Creation Guide

This guide covers all the ways to create podcast episodes with WackyPod, including content sources, presets, voice options, and real-time progress streaming.

Content sources

WackyPod accepts three types of input:

URL input

Provide a URL and WackyPod will fetch, parse, and convert the content:

curl -X POST https://api.wackypod.com/api/episodes \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/article",
"preset": "standard"
}'

Supported content: articles, blog posts, documentation pages, news stories, and most text-heavy web pages.

Text input

Provide raw text content directly:

curl -X POST https://api.wackypod.com/api/episodes \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"content": "Your article or content text goes here. WackyPod will generate a podcast script from this text and synthesize professional audio.",
"preset": "standard"
}'

File upload

Upload a document file (PDF, DOCX, TXT, or MD):

curl -X POST https://api.wackypod.com/api/episodes/upload \
-H "Authorization: Bearer YOUR_TOKEN" \
-F "file=@document.pdf" \
-F "preset=standard" \
-F "hostMode=multi"

File size limits by tier:

TierMax File Size
Free5 MB
Creator20 MB
Professional50 MB
Enterprise100 MB

Presets

Presets control episode duration and depth:

PresetDurationDescriptionAvailability
quick~3 minBrief summary, key pointsAll tiers
standard~7 minBalanced overviewCreator+
deep~15 minThorough explorationCreator+
extended~30 minComprehensive deep-diveProfessional+
{
"content": "...",
"preset": "deep"
}

Host modes

Choose between a single narrator or a conversational format:

Single host

One narrator presents the content in a structured monologue:

{
"content": "...",
"hostMode": "single"
}

Multi-host

Two speakers discuss the content in a natural conversational format:

{
"content": "...",
"hostMode": "multi",
"voicePair": "expert-curious"
}

Voice pair options for multi-host:

Voice PairDescription
expert-curiousOne knowledgeable host explains, the other asks questions
debateTwo hosts present different perspectives
interviewInterview-style with host and guest

Voice styles

Control the personality and tone of the narration:

StyleDescription
professionalClear, authoritative, news-anchor quality
casualRelaxed, conversational, podcast-native
educationalPatient, explanatory, teacher-like
enthusiasticEnergetic, engaging, startup-pitch energy
{
"content": "...",
"voiceStyle": "casual"
}
info

Free tier users are limited to professional voice style and single host mode.

TTS engine selection

WackyPod offers multiple text-to-speech engines:

EngineQualitySpeedCost
kokoroHighFast$0.001/episode
chatterboxPremiumModerate$0.005/episode
autoVariesVariesVaries

In auto mode, free tier users get Kokoro and paid tier users get Chatterbox.

{
"content": "...",
"ttsEngine": "chatterbox"
}

Script review

For greater control, you can pause the pipeline after script generation to review and edit the script before audio synthesis:

{
"content": "...",
"reviewScript": true
}

The episode will enter review_script status. You can then:

  1. Get the script: GET /api/episodes/:id -- the scriptText field contains the generated script
  2. Edit and approve: PUT /api/episodes/:id/script with your changes
  3. Audio generation resumes automatically after approval

SSE progress streaming

Monitor episode generation in real-time using Server-Sent Events:

const eventSource = new EventSource(
`https://api.wackypod.com/api/episodes/${episodeId}/stream`,
{
headers: { 'Authorization': `Bearer ${token}` }
}
);

eventSource.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log(`Status: ${data.status}, Progress: ${data.progressPercent}%`);

if (data.status === 'ready') {
console.log(`Audio URL: ${data.audioUrl}`);
eventSource.close();
}

if (data.status === 'error') {
console.error(`Error: ${data.error}`);
eventSource.close();
}
};

Generation flow

The full episode generation pipeline:

1. Content Ingestion
URL fetch / text parse / file extract
|
2. Script Generation (Gemini 2.5 Flash)
Content --> structured podcast script
|
3. [Optional] Script Review
Pause for user edits
|
4. Audio Synthesis (Modal GPU)
Script --> Kokoro or Chatterbox TTS
|
5. Storage (Cloudflare R2)
Audio uploaded, CDN URL generated
|
6. Ready
Episode available for playback

Python SDK example

from wackypod import WackyPod

client = WackyPod(api_key="wp_your_key")

# Create from URL
episode = client.episodes.create(
input_type="url",
input_source="https://example.com/article",
preset="standard",
host_mode="multi",
voice_style="casual"
)

# Wait for completion (polls automatically)
episode = client.episodes.wait_for_completion(
episode.id,
timeout=300,
poll_interval=5
)

print(f"Title: {episode.title}")
print(f"Audio: {episode.audio_url}")
print(f"Duration: {episode.audio_duration_seconds}s")

Error handling

Common creation errors:

ErrorCauseSolution
Monthly quota exceededTier limit reachedUpgrade tier or wait for monthly reset
Content too shortLess than 100 wordsProvide more content
Invalid URLURL cannot be fetchedCheck URL is accessible
File too largeExceeds tier file size limitCompress file or upgrade tier
Unsupported file typeNot PDF, DOCX, TXT, or MDConvert to a supported format