# OpenRouter APIs — TBC: Mischief 1 (tbc/mischief-1)

Guide for calling every confirmed OpenRouter API that serves `tbc/mischief-1`.

Model page: https://openrouter.ai/tbc/mischief-1
Create an API key: https://openrouter.ai/settings/keys

## EU in-region routing

`tbc/mischief-1` is not currently available through EU in-region routing.

Docs: https://openrouter.ai/docs/guides/features/in-region-routing

## Authentication

Send this header with every request:

- Authorization: Bearer $OPENROUTER_API_KEY

## Video API

Generate videos with `tbc/mischief-1` through OpenRouter's Video API.

Docs: https://openrouter.ai/docs/guides/overview/multimodal/video-generation
Model discovery API: https://openrouter.ai/api/v1/videos/models

### Endpoint

POST https://openrouter.ai/api/v1/videos

Headers:
- Content-Type: application/json

Generation is asynchronous: the submit call returns a job, which is polled until it
finishes. The finished video is downloaded from the job, not returned inline.

### Request fields (tbc/mischief-1)

- model: string (required) — `"tbc/mischief-1"`
- prompt: string (optional when frame_images is set, otherwise required) — text description of the desired video
- duration: 3 | 5 (optional) — length of the video in seconds
- size: "854x480" | "1280x720" (optional) — exact pixel dimensions, as WIDTHxHEIGHT
- resolution: "480p" | "720p" (optional) — resolution tier; interchangeable with size when paired with aspect_ratio
- aspect_ratio: "16:9" (optional) — aspect ratio of the generated video
- frame_images: array of frame references (optional) — images to condition the named frame on, as `{ "type": "image_url", "image_url": { "url": "…" }, "frame_type": "first_frame" }` entries; frame_type is one of "first_frame", and the url is an https URL or a base64 data URL
- input_references: array of reference assets (optional) — images to guide the generation, as `{ "type": "image_url", "image_url": { "url": "…" } }` entries
- seed: integer (optional) — sample deterministically; determinism is not guaranteed for every provider
- callback_url: string (optional) — https URL notified by webhook when the job finishes, instead of polling

These are the generation parameters this model accepts between its providers; an unlisted
value is rejected, and a listed one can still be refused by whichever provider serves the
call. `provider` (routing preferences) is accepted on every request.

### Response

The submit call returns `202` with the job:

```json
{
  "id": "job-abc123",
  "generation_id": "gen-xyz789",
  "polling_url": "/api/v1/videos/job-abc123",
  "status": "pending"
}
```

Poll `GET https://openrouter.ai/api/v1/videos/{id}` with the same Authorization header while `status` is
`pending` or `in_progress`, and stop once it is `completed`, `failed`, `cancelled`, or
`expired`:

```json
{
  "id": "job-abc123",
  "status": "completed",
  "unsigned_urls": ["https://storage.example.com/video.mp4"],
  "usage": { "cost": 0.5 }
}
```

Download the bytes from `GET https://openrouter.ai/api/v1/videos/{id}/content` (`?index=N` selects a clip
when the job produced more than one). `usage.cost` is the USD charge for the call.

### Examples

#### Image to Video

```bash
curl -X POST https://openrouter.ai/api/v1/videos \
  -H "Authorization: Bearer $OPENROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "tbc/mischief-1",
  "prompt": "Camera: slow, steady sideways drift to the right, at sidewalk height, keeping the window on the left of frame. At about half a second in, a single, VERY small, furry dark brown rat with enters from the bottom edge of the frame, just below the shop window. It runs to the right along the sidewalk, close to the curb, then follows the curve of the curb away from the camera down the street. It keeps moving at a steady scurry the whole time, never stopping, turning back, or leaving the sidewalk, and grows smaller as it disappears into the fog by the end of the shot. Only one rat. The sign reading OpenRouter stays legible throughout. Desaturated, matte palette of slate, bone, olive and muted amber, with the pink neon as the only saturated accent. Soft fog haze, shallow depth of field. Moody, quiet, gently playful, cinematic, 16:9.",
  "duration": 5,
  "aspect_ratio": "16:9",
  "frame_images": [
    {
      "type": "image_url",
      "image_url": {
        "url": "https://model-assets.openrouter.ai/model-examples/tbc/mischief-1-20261023/bec28940-0936-4a37-baa6-0ee62254938e/input-0.jpg"
      },
      "frame_type": "first_frame"
    }
  ]
}'
```

#### Image to Video 2

```bash
curl -X POST https://openrouter.ai/api/v1/videos \
  -H "Authorization: Bearer $OPENROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "tbc/mischief-1",
  "prompt": "a slow cinematic push-in on a glowing neon sign that reads \"OpenRouter\" in the window of a cozy coffee shop on a rainy night, rain streaking down the glass, reflections rippling on wet pavement",
  "duration": 5,
  "aspect_ratio": "16:9",
  "frame_images": [
    {
      "type": "image_url",
      "image_url": {
        "url": "https://model-assets.openrouter.ai/model-examples/tbc/mischief-1-20261023/efc6946a-a95d-44ba-992f-4e50b6a14d49/input-0.jpg"
      },
      "frame_type": "first_frame"
    }
  ]
}'
```

### Error differences

- 404 also covers an unknown video job
- 500 — the job could not be submitted

A job that fails after acceptance reports `status: "failed"` with an `error` message rather than
an HTTP error, since the submit call already succeeded.

## Errors

Failures return `{"error": {"code": <number>, "message": <string>}}` with the HTTP status:

- 400 — malformed request or an unsupported parameter
- 401 — missing or invalid API key
- 402 — insufficient credits
- 403 — spend limit reached, key disabled, or access blocked
- 404 — unknown model or no provider can serve the request
- 429 — rate limited; retry with backoff
- 502 — the operation failed upstream; failed generations are not billed

---

Canonical version of this document: https://openrouter.ai/tbc/mischief-1/llms.txt
