WAW Media Talk to us
Ingest · Transcode · Deliver

Stream infrastructure that stops being your problem

Push a feed in, get adaptive renditions and a player-ready manifest out. We handle the encoders, the origin, the failover and the boring parts of delivery — you keep the product.

1.9 s
median glass-to-glass, LL-HLS
6
ingest regions in the EU
99.95%
origin availability, rolling 90d
14 PB
egress delivered in 2025

What you get

Three services that fit together, each usable on its own. No SDK lock-in — everything is reachable over plain HTTP or gRPC.

IN

Ingest

SRT, RTMP and WebRTC endpoints with per-key auth. Automatic reconnect windows, contribution redundancy across two regions, and a health feed you can graph.

TR

Transcode

Ladder presets from 240p to 2160p, per-title bitrate tuning, AV1 and H.264 side by side. Jobs are idempotent and resumable — retries never double-bill.

DL

Delivery

LL-HLS and DASH from a shielded origin, signed URLs, and a stream API for clients that want frames instead of files.

Built for people who already know video

No dashboards you have to babysit. The control plane is an API; the console is a thin client on top of it. Every object — channel, ladder, key, manifest — has a stable ID and an audit trail.

  • Terraform provider and an OpenAPI 3.1 spec, both versioned with the API
  • Per-channel egress accounting exported to your billing pipeline
  • EU-only processing and storage by default; DPA on request
# create a channel and start pushing
curl -X POST https://waw-media.bulsan.site/v1/channels \
  -H "Authorization: Bearer $WAW_TOKEN" \
  -d '{"name":"studio-a","ladder":"web-1080p","region":"eu-waw"}'

# → ingest URL, stream key and manifest base
{
  "id": "ch_8f21c0d4",
  "ingest": "srt://ingest.eu-waw.waw-media.bulsan.site:9000",
  "manifest": "https://waw-media.bulsan.site/p/ch_8f21c0d4/index.m3u8",
  "state": "idle"
}

The stream API

When a manifest is the wrong shape — analytics pipelines, ML tagging, second-screen apps — subscribe to the frame stream directly over gRPC instead of polling segments.

// media/stream/v1/stream.proto
service MediaStream {
  rpc Subscribe(SubscribeRequest) returns (stream Frame);
  rpc Ack(stream AckRequest) returns (AckSummary);
}

Served on grpc-media-stream over HTTP/2 with per-token flow control. Backpressure is honoured: slow consumers get dropped keyframe-aligned, never mid-GOP.

Why not websockets

Because half our customers already speak protobuf, and the other half want a stream that survives a proxy hop without a reconnect storm. gRPC gives us both, plus deadlines and typed errors for free. The full stream contract is in the docs.

Ready when you are

Trial accounts include 500 GB of egress and two concurrent channels — enough to run a real pilot, not a toy.