Switch to WAVE with enhanced protocols, lower latency, and significant cost savings
See how WAVE enhances every Cloudflare Stream feature
| Cloudflare Stream | WAVE | Status | Details |
|---|---|---|---|
| RTMP/WebRTC Ingest | Multi-Protocol (RTMP, WebRTC, SRT, OMT, NDI) | Enhanced | WAVE supports 5 ingest protocols including professional-grade SRT and ultra-low latency OMT (<16ms) |
| HTTP Live Streaming (HLS) | HLS + DASH + LL-HLS + WebRTC WHEP | Enhanced | Multiple delivery formats including sub-second latency WebRTC playback |
| Global CDN | Edge Mesh Network (380+ PoPs) | Enhanced | 40% more edge locations with intelligent routing and regional failover |
| Basic Recording | DVR + Clipping + Instant Replay | Enhanced | Live DVR with instant replay, real-time clipping, and automated highlights |
| Per-Video Analytics | Real-time + Predictive Analytics | Enhanced | ML-powered viewer insights, engagement predictions, and churn analysis |
| Webhook Notifications | Webhooks + Real-time Events API | Enhanced | WebSocket subscriptions for instant updates, batched webhooks for efficiency |
| Basic Transcoding | Adaptive Bitrate + AI Encoding | Enhanced | Content-aware encoding reduces bandwidth 40% while maintaining quality |
| Video on Demand | VOD + Live2VOD + Smart Archives | Enhanced | Automatic archival with intelligent compression and tiered storage |
| Stream Access Control | Zero-Trust DRM + Geo-Fencing | Enhanced | Hardware-backed DRM, regional restrictions, and device fingerprinting |
| Basic API | REST + GraphQL + SDK | Enhanced | Full-featured SDKs for 8 languages with GraphQL for complex queries |
| Signed URLs | Multi-Layer Auth (JWT + Signed + Session) | Enhanced | Flexible authentication including rotating tokens and session-based access |
| Stream Keys | Dynamic Stream Keys + Auto-Rotation | Enhanced | Ephemeral keys with automatic rotation and usage analytics |
Detailed scripts and commands for each migration phase
Use the Cloudflare Stream API to export all existing videos, live input configurations, and webhook settings for migration.
#!/bin/bash
# Step 1: Export Cloudflare Stream content
# Install dependencies
npm install @cloudflare/stream axios
# Export script (export-cloudflare.js)
const axios = require('axios');
const fs = require('fs');
const CF_API_TOKEN = process.env.CLOUDFLARE_API_TOKEN;
const CF_ACCOUNT_ID = process.env.CLOUDFLARE_ACCOUNT_ID;
async function exportCloudflareContent() {
const baseUrl = `https://api.cloudflare.com/client/v4/accounts/${CF_ACCOUNT_ID}/stream`;
const headers = { Authorization: `Bearer ${CF_API_TOKEN}` };
// Export all videos
console.log('Exporting videos...');
const videos = await axios.get(baseUrl, { headers });
fs.writeFileSync('cf-videos.json', JSON.stringify(videos.data.result, null, 2));
console.log(`Exported ${videos.data.result.length} videos`);
// Export live inputs
console.log('Exporting live inputs...');
const liveInputs = await axios.get(`${baseUrl}/live_inputs`, { headers });
fs.writeFileSync('cf-live-inputs.json', JSON.stringify(liveInputs.data.result, null, 2));
console.log(`Exported ${liveInputs.data.result.length} live inputs`);
// Export webhooks
console.log('Exporting webhooks...');
const webhooks = await axios.get(`${baseUrl}/webhook`, { headers });
fs.writeFileSync('cf-webhooks.json', JSON.stringify(webhooks.data.result, null, 2));
console.log('Export complete!');
return {
videos: videos.data.result,
liveInputs: liveInputs.data.result,
webhooks: webhooks.data.result,
};
}
exportCloudflareContent().catch(console.error);Direct mapping from Cloudflare Stream API to WAVE API
| Category | Cloudflare API | WAVE API | Notes |
|---|---|---|---|
Streams | POST /stream | POST /v1/streams | Create live stream |
Streams | GET /stream/:id | GET /v1/streams/:id | Get stream details |
Streams | PATCH /stream/:id | PATCH /v1/streams/:id | Update stream settings |
Streams | DELETE /stream/:id | DELETE /v1/streams/:id | Delete stream |
Streams | GET /stream/:id/embed | GET /v1/streams/:id/embed | Get embed code |
VOD | POST /stream/copy | POST /v1/vod | Upload video |
VOD | GET /stream/:id/downloads | GET /v1/vod/:id/downloads | Get download links |
Captions | POST /stream/:id/captions | POST /v1/streams/:id/captions | Upload captions |
Captions | DELETE /stream/:id/captions/:lang | DELETE /v1/streams/:id/captions/:lang | Delete captions |
Auth | GET /stream/:id/token | POST /v1/streams/:id/tokens | Generate signed token |
Ingest | POST /live_inputs | POST /v1/ingest | Create ingest endpoint |
Ingest | GET /live_inputs/:id/outputs | GET /v1/ingest/:id/outputs | Get simulcast outputs |
Webhooks | POST /webhooks | POST /v1/webhooks | Create webhook endpoint |
Analytics | GET /analytics/views | GET /v1/analytics/views | Get view analytics |
Analytics | GET /analytics/storage | GET /v1/analytics/storage | Get storage usage |
curl -X POST \
https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/stream/live_inputs \
-H "Authorization: Bearer {API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"meta": {
"name": "My Live Stream"
},
"recording": {
"mode": "automatic"
}
}'Update your webhook handlers to WAVE events
| Cloudflare Event | WAVE Event | Description | Payload Changes |
|---|---|---|---|
| stream.live_input.connected | stream.started | Encoder connected and streaming | Includes protocol and bitrate info |
| stream.live_input.disconnected | stream.ended | Stream ended or encoder disconnected | Includes duration and viewer stats |
| stream.recording.ready | recording.ready | Recording available for playback | Includes multiple quality URLs |
| stream.recording.error | recording.failed | Recording failed | Includes error code and retry info |
| stream.ready_to_stream | vod.ready | VOD processing complete | Includes all rendition details |
| stream.error | stream.error | Stream error occurred | Includes error classification |
| stream.deletionRequest | stream.deleted | Stream was deleted | Includes deletion reason |
| stream.caption.ready | captions.generated | Auto-captions ready | Includes confidence scores |
Calculate your savings with WAVE
Proven strategies for zero-downtime migration
Common migration issues and diagnostic commands
Companies that successfully migrated from Cloudflare Stream
"We evaluated multiple platforms when optimizing our ingest infrastructure. WAVE's multi-protocol support and sub-100ms latency with OMT gave us the flexibility we needed. The migration from our Cloudflare-based regional ingest took just 3 weeks with zero viewer-facing issues."
"Our Go Live feature demands ultra-low latency for gaming streams. WAVE's WebRTC implementation and edge mesh architecture reduced our glass-to-glass latency from 3 seconds to under 200ms. The API compatibility made the Cloudflare migration seamless."
"Live sports demand perfection - every millisecond matters. We migrated our secondary ingest infrastructure from Cloudflare to WAVE for redundancy. The SRT protocol support and automatic failover have made our broadcasts bulletproof."
Dedicated endpoints for Cloudflare Stream migration
| Method | Endpoint | Description | Auth |
|---|---|---|---|
POST | /v1/migration/cloudflare/connect | Connect Cloudflare account for automated migration | API Key |
GET | /v1/migration/cloudflare/videos | List videos available for migration | API Key |
POST | /v1/migration/cloudflare/import | Import videos from Cloudflare Stream | API Key |
GET | /v1/migration/cloudflare/status | Check migration job status | API Key |
POST | /v1/migration/cloudflare/webhooks/sync | Sync webhook configurations | API Key |
GET | /v1/migration/cloudflare/comparison | Compare feature parity | API Key |
POST | /v1/migration/cloudflare/validate | Validate migrated content integrity | API Key |
DELETE | /v1/migration/cloudflare/cleanup | Clean up migration artifacts | API Key |