# Stream Console

> Manage live streams and VOD: go live, publish assets, mint API keys, and watch analytics.

The Stream console is the ready-made web app that runs live video and
video-on-demand. You do not have to write code first. From the console, you
can:

- Create live inputs.
- Give encoders an ingest endpoint.
- Record and manage VOD assets.
- Mint the API keys and signing keys that your apps use.
- Configure webhooks.
- Watch delivery quality across the edge relay network in real time.

The console is for operators and developers who own an org's streaming. Open
it at `https://streams.firstbyte.fast` and pick the **Stream** product.

> **NOTE:**
> Stream is a plan-gated product. If your org's plan does not include it,
>   the create buttons (New live stream, Create API key, and others) show as
>   disabled with an "upgrade" tooltip. Ask an org admin to upgrade, or see
>   **Usage & billing**.

## What's in the console

  - **Overview** — Your streaming home: concurrent viewers, glass-to-glass latency, 24h egress,
    a "Go live in 3 calls" quickstart, your ingest/playback endpoints, live-now
    list, and recent webhook events.
  - **Live streams** — The table of persistent live inputs: status, viewers, egress, latency. It
    has search, filters, bulk actions, and a **New live stream** button.
  - **Assets** — Your VOD library: recordings auto-captured from live inputs plus direct
    uploads, each with a playback id, quality, duration, and 24h play count.
  - **Relay network** — The edge map: active PoPs, per-region cache-hit ratio, origin→edge fan-out,
    and viewers per relay.
  - **Analytics** — Unique viewers, watch time, latency percentiles, rebuffer ratio,
    first-frame, the viewers-vs-latency twin chart, and a by-region breakdown.
    You can export the data to CSV.
  - **API keys** — Bearer API keys, signing keys for signed playback and webhook signatures,
    and a recent event-delivery table.
  - **Webhooks** — Register endpoints for signed event POSTs. Pause or resume them. View the
    signing key that signs every delivery.
  - **Logs** — The full webhook event-delivery log: response codes, attempts, timing, and
    one-click resend.
  - **Usage & billing** — Your plan and metered pools (delivery minutes, egress, storage) for the
    current cycle, with a daily delivery chart.

## Go live: create a live stream

A live input is a persistent endpoint that you point an encoder at. Create
one. Save the stream key that the console shows you once. Then publish.

  1. **Open the create dialog**
On **Overview** or **Live streams**, click **New live stream** in the top-right.
  2. **Name it and choose a relay region**
Enter a **Name**. The name shows on the live-streams table and on any
    recordings. Pick a **Relay region**. Leave it on **auto (anycast)** to
    route each viewer to the nearest healthy PoP, or pin a specific region
    from the dropdown.
  3. **Set the ingest and recording options**
- **Low-latency mode** (on by default) — WebTransport ingest, MoQT delivery
      for sub-second glass-to-glass.
    - **Record automatically to a VOD asset** (on by default) — the system
      captures every broadcast as an asset that you can replay later.
  4. **Create and save the stream key**
Click **Create**. The console shows the cleartext **stream key exactly
    once** in a dialog. Copy it and store it securely before you close the
    dialog. You cannot view it again later.

    > **WARNING:**
> The console shows the stream key only at creation (and after a reset).
>       If you lose the key, you must reset it. A reset invalidates the old key.
  5. **Point your encoder at the ingest endpoint**
Open the input's detail page (click its row). The **Ingest** panel gives
    you the endpoint to set in your encoder, together with your stream key.
    WebTransport encoders publish over MoQ. Encoders without WebTransport
    fall back to RTMP/SRT automatically with the same key.

> **TIP:**
> When the relay sees your first publish, the input changes to
>   **Active/Live**. Its viewers, bitrate, dropped-frame %, and glass-to-glass
>   latency then populate on the detail page.

## Manage a live input

The **stream detail** page (click any row in **Live streams**) is where you
operate a single input. It has tabs across the top: **Setup**, **Analytics**,
**Embed**, **Recordings**, and **Logs**.

  1. **Watch the live preview and QoE**
The **Live preview** panel shows a LIVE/OFFLINE indicator and live
    mini-stats: concurrent **Viewers**, **Glass-to-glass** p50, delivered
    **Bitrate**, and **Dropped** %. The stats refresh every few seconds.
  2. **Copy playback details for viewers**
In the **Playback** panel, copy the **Playback id** and the low-latency
    MoQ subscribe URL. Give them to viewers or to your player.
  3. **Generate a signed playback URL**
Click **Generate signed playback URL** to mint a short-lived (1-hour)
    token bound to your org's active playback signing key. The relay checks
    this token before it permits playback. The URL itself is the auth.

    > **NOTE:**
> Signing requires an active **playback** signing key. If you did not
>       create one, create it first on the **API keys** screen.
  4. **Grab the embed snippet**
On the **Embed** tab / snippet panel, toggle options (**Low-latency**,
    **Autoplay (muted)**, **Signed URL only**, **Show viewer count**) and
    click **Copy embed** to get an `<iframe>` that you can paste into any
    page.
  5. **Reset the stream key or delete the input**
Use **Reset stream key** (top-right) to rotate the key. The console shows
    the new cleartext once. Any encoder on the old key stops immediately. Use
    **Delete** to soft-delete the input. The system keeps existing recording
    assets.

> **TIP:**
> You can also run bulk actions from the **Live streams** table. Select rows.
>   Then use the bulk bar to **Start recording**, **Stop recording**, or
>   **Reset key** across many inputs at once.

## Publish and manage VOD assets

The **Assets** screen is your on-demand library. Assets come from two places:
recordings auto-captured from live inputs, and files that you upload
directly.

  1. **Upload a video**
Click **Upload** (top-right) and pick a video file (`.mp4`, `.mov`,
    `.mkv`, `.webm`). Uploads are resumable. Progress shows on the button and
    as a live tile in the grid. An upload that started on another device also
    appears here.
  2. **Wait for processing**
New assets move through **Uploading → Processing → Ready**. The tile
    shows a progress bar, then a "Transcoding…" state, then a playable
    thumbnail with its quality (for example, 1080p) and duration.
  3. **Find and filter assets**
Use the search box (name / id / playback id) and the **Status** and
    **Quality** filter chips to narrow the grid. The KPI strip shows totals:
    Assets, Ready, Processing, Storage, and Plays · 24h.
  4. **Play or delete an asset**
Click a **Ready** tile to open its playback. Use the small delete (×)
    button on a tile to remove the asset and its stored video. The console
    asks you to confirm.

> **NOTE:**
> Recordings from a live input also show under that input's **Recordings**
>   tab on its detail page, with a live count badge.

## Mint and rotate API keys

The **API keys** screen holds the credentials that your server-side code
uses to call the Streams API.

  1. **Create an API key**
Click **Create API key** (or **New key**). In the dialog, set a **Name**
    (for example, "Production server"). Choose an **Environment** (**live**
    or **test**). Select the **Scopes** you want: `read`, `ingest`,
    `playback`, `write`.
  2. **Save the token once**
Click **Create**. The console shows the bearer token **once**. Copy it
    and set it as `Authorization: Bearer <token>` in your app. After that,
    the table shows only a masked preview.

    > **WARNING:**
> You cannot show a full token later. To get a fresh cleartext value, you
>       must **revoke** the old key and create a new one.
  3. **Rotate or revoke**
Use **Revoke** on a key's row to stop its authentication immediately.
    Deployed clients on that key will break until you swap in a new key. To
    rotate a key:

    1. Create the replacement key.
    2. Deploy it.
    3. Revoke the old key.

### Signing keys (for signed playback and webhooks)

  1. **Generate a signing key**
In the **Signing keys** panel, click **Generate signing key**. Choose
    what it is **Used for**: **Signed playback URLs** or **Webhook
    signature**. All keys are Ed25519. Click **Generate**. The console then
    lists the public key.
  2. **Retire a key safely**
Click **Retire** on an active key. The key stays valid for 30 more days,
    so existing signed URLs and webhook signatures continue to verify. Then
    the system removes the key. Mint a replacement before that window closes.

## Configure webhooks

The **Webhooks** screen registers HTTPS endpoints that receive signed event
POSTs with automatic retry and backoff.

  1. **Add an endpoint**
Click **Add endpoint**. Enter the **URL** and the **Event types** to
    subscribe to. Event types are comma-separated, and `*` matches everything
    (for example, `video.live_stream.*`).
  2. **Store the signing secret**
On create, the console shows the **HMAC signing secret once**. Save it.
    Set it on your endpoint to check the signature header on every delivery.

    > **WARNING:**
> The console shows the signing secret only once, at creation. Store it
>       before you close the dialog.
  3. **Pause, resume, or delete**
Each endpoint row shows a health state (**Healthy**, **Paused**, or
    **Failing (Nx)**). Use **Pause**/**Resume** to stop or restart
    deliveries. Use **Delete** to remove an endpoint. Its delivery history
    stays in the logs.

> **NOTE:**
> The console mints a webhook signing key automatically with your first
>   endpoint. You can see it in the **Signing keys** panel on this screen.

## Monitor delivery live

  1. **Read the Overview KPIs**
**Overview** shows the top-line numbers, which refresh on a timer:
    **Concurrent viewers**, **Live streams**, **P50 glass-to-glass** (target
    250 ms), **Egress · 24h**, and edge **Cache hit**. The **Live now** panel
    lists active inputs with per-stream viewers and latency.
  2. **Dig into Analytics**
Open **Analytics** for a 24-hour view: **Unique viewers**, **Watch
    time**, latency percentiles (P50/P90/P95/P99), **Rebuffer ratio**, and
    **First frame**. The twin chart overlays concurrent viewers against p50
    latency. The **By edge region** table divides the data per PoP.
  3. **Export a report**
Click **Export CSV** on Analytics to download the loaded 24h
    viewers-vs-latency series (one row per 10-minute bucket).
  4. **Check the Relay network**
Open **Relay network** to see active PoPs on the edge map, per-region
    **cache-hit ratio**, the **origin → edge fan-out** (one upstream, N
    relays), and viewers per relay. Click **Refresh** to get the latest PoP
    health.

> **TIP:**
> A telemetry health banner appears at the top of Overview, Analytics, and
>   Relay network if the metrics rollup is degraded. The banner tells you when
>   numbers can be stale.

## Inspect webhook deliveries

  1. **Open Logs**
Go to **Logs** for the full event-delivery table (most recent
    100): event type, object, endpoint, response code, attempt number, and
    time.
  2. **Filter by outcome**
Use the **All / Delivered / Failed** buttons in the header to narrow to
    successful or failed deliveries (the Failed button shows the failure
    count).
  3. **Resend a delivery**
Click **Resend** on any row to re-queue that event for delivery. This is
    useful after you repair an endpoint that returned errors.

## Track usage and billing

  1. **Review your plan and pools**
On **Usage & billing**, the **Current plan** card shows your tier and
    status. It also shows usage meters for **Delivery minutes**, **Egress**,
    **Encoding minutes** (passthrough — no transcode), and **Storage (VOD)**
    against your plan pools.
  2. **See the cycle estimate and daily chart**
The **Estimated this cycle** card summarizes metered usage. The
    **Delivery minutes · this cycle** chart plots per-day delivery over the
    last 30 days.
  3. **Upgrade when you hit a cap**
Click **Upgrade plan** to review pricing. Invoices appear in the
    **Invoices** table at the end of each billing cycle.

## Next steps

- [Streams — Details](/modalities/streams/details) — how ingest, packaging, and
  signed playback work end to end.
- [SDK Methods](/modalities/streams/sdk-methods) — the control-plane and
  data-plane APIs behind the console actions.
- [Recipes](/modalities/streams/recipes) and [Cookbook](/modalities/streams/cookbook)
  — copy-paste flows for going live, uploading VOD, and playing back in code.
