# Go Quickstart

> Create a live input, push a broadcast, in a few lines of Go.

## 1. Install

```bash
go get github.com/clutchcall/clutchcall-sdk/go@latest
```

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

```go
package main

import (
  "context"
  "fmt"
  "os"
  "github.com/clutchcall/clutchcall-sdk/go/pkg/streams"
)

func main() {
  ctx := context.Background()
  s, _ := streams.New(streams.Config{
    BaseURL: "https://app.clutchcall.dev",
    APIKey:  os.Getenv("CLUTCHCALL_API_KEY"),
    OrgID:   "org_abc",
  })

  input, streamKey, _ := s.LiveInputs.Create(ctx, streams.CreateLiveInput{
    Name: "My First Stream",
  })
  fmt.Println("inputId:", input.ExternalInputID, "streamKey:", streamKey)

  signed, _ := input.SignedPlaybackURL(ctx, 3600, nil)
  fmt.Println("playback URL:", signed.URL)
}
```

## 3. Push a broadcast

```go
pub, _ := streams.OpenBroadcastPublisher(ctx, streams.PublisherArgs{
  InputID:   input.ExternalInputID,
  StreamKey: streamKey,
  Codecs:    streams.Codecs{Video: "avc1.42E01F", Audio: "opus"},
})
// pub.Write(chunk)  for every fMP4 segment
pub.Close("finished")
```

## 4. Subscribe (server-side tap)

```go
viewer, _ := streams.OpenBroadcastViewer(ctx, signed.URL, streams.ViewerOpts{
  OnChunk: func(init, chunk []byte) { file.Write(chunk) },
  OnClose: func(reason string) { fmt.Println("closed:", reason) },
})
defer viewer.Close()
```

## Other modalities

  - **[Voice](/modalities/voice/details)** — `voice.New` + `Calls.Originate` + `AudioBridge.Attach`
  - **[Robotics](/modalities/robotics/details)** — `robotics.New` + `PublishTelemetry` / `SubscribeCommand`
  - **[Games](/modalities/games/details)** — `games.New` + `PublishState` / `SubscribeInputs`
  - **[Data](/modalities/data/details)** — `data.New` + `Publish` / `Subscribe`
