> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mediamonster.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Run a line

> Run a saved recipe or an inline line of steps. Same placement rules as the Workbench. Each skill is charged as it starts.

`POST /api/v1/runs`

Run a line of steps on one file — a recipe saved on the Workbench, or one written inline.

Same rules as the Workbench: a step in the wrong place, an option a skill does not have, or a paid skill the account cannot afford is refused before anything is charged. Each skill step is charged as it starts and refunded if it fails.

There is no list endpoint. Start with `POST`, read one back with `GET /api/v1/runs/{id}`.

```bash theme={"theme":{"light":"github-dark","dark":"github-dark"}}
curl -X POST https://mediamonster.app/api/v1/runs \
  -H "Authorization: Bearer mm_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/shoe.jpg",
    "steps": [
      {"tool": "background-remover"},
      {"tool": "resize", "options": {"aspect": "1:1"}}
    ],
    "output": {"format": "webp", "quality": "85"}
  }'
```

| Field    | Type    | What it does                             |
| -------- | ------- | ---------------------------------------- |
| `url`    | string  | Public URL of the source file            |
| `file`   | file    | Multipart upload instead of `url`        |
| `job_id` | string  | Reuse a previous upload                  |
| `steps`  | array   | `{ "tool": "<slug>", "options": { … } }` |
| `recipe` | string  | Saved recipe id, instead of `steps`      |
| `output` | object  | `{ "format": "webp", "quality": "85" }`  |
| `wait`   | boolean | Default `true`. Set `false` to poll      |

Workbench and saved recipes drop unknown options. The API does not — an unknown option is an error.

See [Recipes](/recipes) for the six catalogue lines.
