Complete migration guide with API mapping, cost savings, and automated tools
How Mux features map to WAVE equivalents
| Mux Feature | WAVE Equivalent | Compatibility | Notes |
|---|---|---|---|
| Live Streams | Live Streams | 100% | Full compatibility with enhanced protocols |
| Video on Demand | Recordings + VOD | 100% | Auto-convert live to VOD |
| Data API | Analytics API | 95% | Enhanced metrics available |
| Webhooks | Webhooks | 100% | Same event structure |
| Player Embed | Player Embed | 100% | Drop-in replacement |
| HLS Playback | HLS Playback | 100% | Industry standard |
| RTMP Ingest | RTMP + SRT + WebRTC | 100%+ | More protocol options |
| Thumbnail Generation | Thumbnail Generation | 100% | Automatic + custom |
| Signed URLs | Signed URLs | 100% | JWT-based security |
| Low-Latency | Ultra-Low Latency | 100%+ | <100ms with OMT |
Estimated savings when migrating from Mux to WAVE
| Service | Mux Pricing | WAVE Pricing | Savings |
|---|---|---|---|
| Streaming (per GB) | $0.01 | $0.006 | 40% |
| Encoding (per minute) | $0.01 | $0.007 | 30% |
| Storage (per GB/month) | $0.03 | $0.02 | 33% |
| Delivery (per GB) | $0.15 | $0.09 | 40% |
| Live streaming viewers | Included (100) | Unlimited | Unlimited |
Direct API equivalents for easy migration
Mux API:
POST https://api.mux.com/video/v1/live-streams
{
"playback_policy": ["public"],
"new_asset_settings": {
"playback_policy": ["public"]
}
}WAVE API:
POST https://api.wave.inc/v1/streams
{
"title": "My Stream",
"protocol": "rtmp",
"recording": { "enabled": true }
}Mux API:
GET https://api.mux.com/video/v1/live-streams/{STREAM_ID}WAVE API:
GET https://api.wave.inc/v1/streams/{STREAM_ID}Mux API:
DELETE https://api.mux.com/video/v1/live-streams/{STREAM_ID}WAVE API:
DELETE https://api.wave.inc/v1/streams/{STREAM_ID}Follow these steps to migrate from Mux to WAVE
Use Mux API to export your current streams, assets, and configuration:
# Export all live streams curl https://api.mux.com/video/v1/live-streams \ -H "Authorization: Basic $(echo -n MUX_TOKEN_ID:MUX_TOKEN_SECRET | base64)" \ > mux-streams.json # Export all assets curl https://api.mux.com/video/v1/assets \ -H "Authorization: Basic $(echo -n MUX_TOKEN_ID:MUX_TOKEN_SECRET | base64)" \ > mux-assets.json
Create your WAVE account and generate API keys:
streams:write scopeUse our migration script to recreate streams in WAVE:
import { WaveClient } from '@wave/api-client';
import muxStreams from './mux-streams.json';
const wave = new WaveClient({ apiKey: 'wave_live_xxxxx' });
for (const muxStream of muxStreams.data) {
const waveStream = await wave.streams.create({
title: muxStream.id, // or custom title
protocol: 'rtmp', // or 'webrtc' for lower latency
recording: { enabled: muxStream.new_asset_settings !== null }
});
console.log(`Migrated ${muxStream.id} -> ${waveStream.id}`);
console.log(`New RTMP URL: ${waveStream.ingest.rtmp.url}`);
}Transfer existing video assets to WAVE:
import muxAssets from './mux-assets.json';
import { DesignTokens, getContainer, getSection } from '@/lib/design-tokens';
for (const asset of muxAssets.data) {
// Download from Mux (or use direct playback URL)
const playbackUrl = `https://stream.mux.com/${asset.playback_ids[0].id}.m3u8`;
// Upload to WAVE
const waveAsset = await wave.vod.create({
source_url: playbackUrl,
title: asset.id
});
console.log(`Migrated asset ${asset.id} -> ${waveAsset.id}`);
}Configure WAVE webhooks to match your Mux webhook handlers:
await wave.webhooks.create({
url: 'https://yourapp.com/webhooks/wave',
events: [
'stream.started', // was: video.live_stream.active
'stream.ended', // was: video.live_stream.idle
'recording.ready', // was: video.asset.ready
'recording.failed' // was: video.asset.errored
]
});Verify everything works before switching production:
Once validated, update your application to use WAVE:
VOD assets need time to transcode. Check the asset status via the API before sharing playback URLs.
const status = await wave.vod.get(assetId);
console.log(status.state); // 'processing' or 'ready'WAVE provides more detailed metrics. Map Mux's aggregated metrics to WAVE's granular analytics.
WAVE uses JWT-based signed URLs instead of Mux's signing scheme. Update your URL generation logic.
→ See Signed URLs guide
Need help? Contact our migration team