# Python Quickstart

> Create a live input, push a broadcast, watch it back — under five minutes.

## 1. Install

```bash
pip install clutchcall
```

## 2. Create a live input + mint a playback URL

```python
import os
from clutchcall.streams import Streams

streams = Streams(base_url="https://app.clutchcall.dev",
                  api_key=os.environ["CLUTCHCALL_API_KEY"],
                  org_id="org_abc")

input_, stream_key = streams.live_inputs.create(name="My First Stream")
print("inputId:", input_.external_input_id, "streamKey:", stream_key)

signed = streams.live_inputs.get(id=input_.external_input_id) \
                            .signed_playback_url(ttl_seconds=3600)
print("playback URL:", signed["url"])
```

## 3. Push a broadcast

```python
from clutchcall.streams import BroadcastPublisher

pub = BroadcastPublisher.open(
    input_id=input_.external_input_id,
    stream_key=stream_key,
    codecs={"video": "avc1.42E01F", "audio": "opus"},
)
with open("clip.mp4", "rb") as f:
    while chunk := f.read(64 * 1024):
        pub.write(chunk)
pub.close(reason="finished")
```

## 4. Watch the broadcast

```python
from clutchcall.streams import BroadcastViewer

viewer = BroadcastViewer.open(
    signed["url"],
    on_chunk=lambda init, chunk: open("out.mp4", "ab").write(chunk),
    on_close=lambda reason:      print("closed:", reason),
)
```

## Other modalities

  - **[Voice](/modalities/voice/details)** — `Voice.calls.originate` + `Voice.audio_bridge.attach`
  - **[Robotics](/modalities/robotics/details)** — `Robotics.publish_telemetry` + `subscribe_command`
  - **[Games](/modalities/games/details)** — `Games.publish_state` + `subscribe_inputs`
  - **[Data](/modalities/data/details)** — `Data.publish` + `subscribe` with MQTT-style filters
