> For the complete documentation index, see [llms.txt](https://bountyv.gitbook.io/vdocs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bountyv.gitbook.io/vdocs/stream-tools-api/stream-kit.md).

# Stream Kit

Generate a complete Twitch/Kick streamer branding kit from a single brief.

```
POST /api/v1/stream/kit
```

Synchronous. One brief — channel name, vibe, and a few optional details — produces a full set of banners, an offline screen, stream-transition screens, an avatar, info panels, an X/Twitter header, and a webcam overlay, each sized to its platform's exact dimensions. Every output is a sharp composite of two AI-generated art plates (a "wide" and a "square" plate), so you're billed **once per kit, not per asset**.

## Authentication

Standard header:

```
Authorization: Bearer sk_live_...
```

See [Authentication](/vdocs/authentication.md) for details. Requires the `gamedev` product on your account.

## Request

**Content-Type:** `multipart/form-data`

| Field          | Type          | Required | Default       | Description                                                                                                                                                                                                     |
| -------------- | ------------- | -------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `channel_name` | string        | ✅        | —             | Your channel/handle. Max 60 characters.                                                                                                                                                                         |
| `vibe`         | string        | ✅        | —             | Style brief describing the look you want (e.g. "neon cyberpunk, purple and teal"). Max 500 characters.                                                                                                          |
| `content`      | string        | —        | —             | What you stream — folds into the art direction.                                                                                                                                                                 |
| `colors`       | string        | —        | —             | Preferred colour palette, free text.                                                                                                                                                                            |
| `extra`        | string        | —        | —             | Any additional direction (mascot, props, mood, etc.).                                                                                                                                                           |
| `platforms`    | string        | —        | `twitch,kick` | Comma-separated list; each entry must be `twitch` or `kick`. Determines which platform-specific assets (banners) are produced — shared assets (avatar, panels, screens, overlay, X header) are always included. |
| `only`         | string        | —        | —             | Comma-separated asset `id`s to restrict the kit to (see the asset table below). Omit to generate the full set for the chosen `platforms`.                                                                       |
| `panel_labels` | string (JSON) | —        | —             | A JSON-encoded object mapping panel asset ids to a custom label, e.g. `{"panel_about":"ABOUT ME"}`. Unknown ids are ignored; labels are trimmed to 24 characters.                                               |
| `font`         | string        | —        | `clean`       | One of the font ids below. Invalid values return `400`.                                                                                                                                                         |
| `text_color`   | string        | —        | `#ffffff`     | Hex colour (`#rgb` or `#rrggbb`) for burned-in text. Invalid values return `400`.                                                                                                                               |

### Asset ids (`only` / `panel_labels`)

| id                | Label                                      | Size      | Platform |
| ----------------- | ------------------------------------------ | --------- | -------- |
| `banner_twitch`   | Twitch Channel Banner                      | 1200×480  | twitch   |
| `banner_kick`     | Kick Channel Banner                        | 1546×423  | kick     |
| `social_header`   | X / Twitter Header                         | 1500×500  | both     |
| `avatar`          | Profile Picture                            | 256×256   | both     |
| `offline`         | Offline Banner                             | 1920×1080 | both     |
| `panel_about`     | About Panel                                | 320×160   | both     |
| `panel_socials`   | Socials Panel                              | 320×160   | both     |
| `panel_donate`    | Donate Panel                               | 320×160   | both     |
| `panel_schedule`  | Schedule Panel                             | 320×160   | both     |
| `panel_rules`     | Rules Panel                                | 320×160   | both     |
| `screen_starting` | Starting Soon Screen                       | 1920×1080 | both     |
| `screen_brb`      | Be Right Back Screen                       | 1920×1080 | both     |
| `screen_ending`   | Stream Ending Screen                       | 1920×1080 | both     |
| `webcam`          | Webcam Overlay (transparent facecam frame) | 1920×1080 | both     |

Only the five `panel_*` ids accept a custom label via `panel_labels`.

### Font ids (`font`)

| id                | Label       | Feel         |
| ----------------- | ----------- | ------------ |
| `clean` (default) | Clean       | Modern sans  |
| `impact`          | Impact      | Tall & bold  |
| `condensed`       | Condensed   | Narrow caps  |
| `techno`          | Techno      | Futuristic   |
| `arcade`          | Arcade      | Retro pixel  |
| `playful`         | Playful     | Fun & chunky |
| `handwritten`     | Handwritten | Script       |

## Response

```json
{
  "channel_name": "nightowlplays",
  "assets": [
    {
      "id": "banner_twitch",
      "label": "Twitch Channel Banner",
      "filename": "nightowlplays-twitch-channel-banner.png",
      "width": 1200,
      "height": 480,
      "image": "https://…signed…"
    }
  ],
  "zip": "data:application/zip;base64,UEsDBBQ...",
  "skipped": [],
  "warnings": [],
  "charged_cents": 79,
  "balance_cents": 4921
}
```

| Field           | Type    | Description                                                                                                                                                   |
| --------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `channel_name`  | string  | Echoes the request's `channel_name`.                                                                                                                          |
| `assets`        | array   | One entry per generated asset — `id`, `label`, `filename`, `width`, `height`, and `image` (a 1-hour signed URL, or a `data:` URL fallback if signing failed). |
| `zip`           | string  | A base64 `data:application/zip` URL containing every asset in `assets` as individual PNGs.                                                                    |
| `skipped`       | array   | Asset ids that were requested (via `only`) but could not be produced.                                                                                         |
| `warnings`      | array   | Non-fatal notices from the build (e.g. a label was too long and got truncated).                                                                               |
| `charged_cents` | integer | Amount deducted from your balance for this call — the whole kit, one charge.                                                                                  |
| `balance_cents` | integer | Remaining balance.                                                                                                                                            |

## Example

```bash
curl -X POST https://substance-api.com/api/v1/stream/kit \
  -H "Authorization: Bearer sk_live_..." \
  -F "channel_name=nightowlplays" \
  -F "vibe=neon cyberpunk, purple and teal, moody city skyline" \
  -F "content=variety gaming and just-chatting" \
  -F "platforms=twitch,kick" \
  -F "font=impact" \
  -F "text_color=#39ff14"
```

```js
const form = new FormData();
form.set("channel_name", "nightowlplays");
form.set("vibe", "neon cyberpunk, purple and teal, moody city skyline");
form.set("platforms", "twitch,kick");
form.set("panel_labels", JSON.stringify({ panel_about: "ABOUT ME", panel_donate: "TIP JAR" }));

const res = await fetch("https://substance-api.com/api/v1/stream/kit", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.SUBSTANCE_API_KEY}` },
  body: form,
});
const kit = await res.json();
console.log(kit.assets.length, "assets, charged", kit.charged_cents, "cents");
```

## Errors

| Status | When                                                                                                                                                                                                         |
| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `400`  | Missing/too-long `channel_name` or `vibe`; `platforms` has no valid entries; `only` contains an unknown asset id; `panel_labels` isn't valid JSON; unknown `font`; or `text_color` isn't a valid hex colour. |
| `401`  | Missing/invalid API key.                                                                                                                                                                                     |
| `402`  | Insufficient balance.                                                                                                                                                                                        |
| `403`  | Your account doesn't have the `gamedev` product enabled.                                                                                                                                                     |
| `500`  | The pipeline isn't configured (missing image-model credentials) server-side.                                                                                                                                 |
| `502`  | Generation failed, or every asset failed to render — nothing is charged.                                                                                                                                     |
| `503`  | Pipeline temporarily offline.                                                                                                                                                                                |

See [Errors](/vdocs/errors.md) for full details.

## Pricing

Billed per call — see [Credits & pricing](/vdocs/account/credits.md) for current rates.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://bountyv.gitbook.io/vdocs/stream-tools-api/stream-kit.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
