# Muse Image

Muse Image is the image model from Meta Superintelligence Labs. One request makes one image from a prompt, or from a prompt plus up to 9 reference images, in one of seven aspect ratios. Send the request, keep the returned task ID, and read the finished image from the task. Reference images go in as URLs.

## Model IDs

| Model ID     | Inputs           | Aspect ratios                                     | Images per request |
| ------------ | ---------------- | ------------------------------------------------- | ------------------ |
| `muse-image` | text, 0–9 images | `1:1`, `16:9`, `9:16`, `4:3`, `3:4`, `3:2`, `2:3` | 1                  |

See the [model page](https://seedrouter.ai/models/muse-image#pricing) for current prices.

## Quick example

```bash
curl https://api.seedrouter.ai/v1/images/generations \
  -H "Authorization: Bearer $SEEDROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "muse-image",
    "prompt": "A red ceramic mug on a white table, soft studio light, product photography. No text, no logos.",
    "aspect_ratio": "1:1"
  }'
```

```python
import os
import requests

response = requests.post(
    "https://api.seedrouter.ai/v1/images/generations",
    headers={"Authorization": f"Bearer {os.environ['SEEDROUTER_API_KEY']}"},
    json={
        "model": "muse-image",
        "prompt": "A red ceramic mug on a white table, soft studio light, product photography. No text, no logos.",
        "aspect_ratio": "1:1",
    },
    timeout=60,
)
response.raise_for_status()
task_id = response.json()["id"]
```

```javascript
const response = await fetch('https://api.seedrouter.ai/v1/images/generations', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SEEDROUTER_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: 'muse-image',
    prompt: 'A red ceramic mug on a white table, soft studio light, product photography. No text, no logos.',
    aspect_ratio: '1:1',
  }),
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const { id: taskId } = await response.json();
```

```go
package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "os"
    "strings"
    "time"
)

func main() {
    body := strings.NewReader(`{
      "model": "muse-image",
      "prompt": "A red ceramic mug on a white table, soft studio light, product photography. No text, no logos.",
      "aspect_ratio": "1:1"
    }`)
    req, err := http.NewRequest("POST", "https://api.seedrouter.ai/v1/images/generations", body)
    if err != nil { panic(err) }
    req.Header.Set("Authorization", "Bearer " + os.Getenv("SEEDROUTER_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    client := &http.Client{Timeout: 60 * time.Second}
    res, err := client.Do(req)
    if err != nil { panic(err) }
    defer res.Body.Close()
    if res.StatusCode != http.StatusOK { panic(res.Status) }
    var task struct { ID string `json:"id"` }
    if err := json.NewDecoder(res.Body).Decode(&task); err != nil { panic(err) }
    fmt.Println(task.ID)
}
```

## Endpoint

```text
POST https://api.seedrouter.ai/v1/images/generations
```

| Header        | Value                 |
| ------------- | --------------------- |
| Authorization | `Bearer YOUR_API_KEY` |
| Content-Type  | `application/json`    |

The response is a task (`{"id": "task_...", "status": "processing"}`), not the finished image. Poll `GET /v1/tasks/{task_id}` for the result. Keep API keys in server-side code. References go in the same request through `image_urls`; `/v1/images/edits` is not used for this model.

## Parameters

| Field          | Type     | Default  | Notes                                                                                                                                                             |
| -------------- | -------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `model`        | string   | required | `muse-image`                                                                                                                                                      |
| `prompt`       | string   | required | Must not be empty after trimming. Required with references too.                                                                                                   |
| `image_urls`   | URL list | none     | 0–9 public image URLs, 11 MB in total. Without them the request is text to image.                                                                                 |
| `aspect_ratio` | enum     | auto     | `1:1`, `16:9`, `9:16`, `4:3`, `3:4`, `3:2` or `2:3`. Leave it out for auto: references set the shape; text only gives `1:1`. Do not send `"auto"`.                |
| `size`         | enum     | none     | Compatibility alias of `aspect_ratio`: one of the ratios above, or `auto`. Pixel sizes such as `1024x1024` are refused. When both are valid, `aspect_ratio` wins. |
| `n`            | integer  | `1`      | Only `1`. Each request returns one image.                                                                                                                         |

Fields outside this list are dropped before the request is forwarded; they never cause an error and never change the output. There is no resolution, seed, negative prompt, mask or output format setting. `callback_url` is not available; poll the task instead.

## Reference images

Pass up to 9 images in `image_urls` and say in `prompt` what to keep and what to change. Muse Image uses them as references for a new picture; with `aspect_ratio` left out, the result follows their shape.

```json
{
  "model": "muse-image",
  "prompt": "Keep this exact jacket; show it folded in a flat lay of hiking gear on pine boards, soft morning light.",
  "image_urls": ["https://example.com/jacket.png"],
  "aspect_ratio": "9:16"
}
```

## Media inputs

Each reference is a public HTTP(S) URL. Base64 data URIs are not accepted: upload the file to your own storage and pass its URL. Use PNG, JPEG or WebP images; the original files must total 11 MB or less across all references. A set over that limit fails after acceptance and is not charged.

## Pricing dimensions

Check the [model pricing section](https://seedrouter.ai/models/muse-image#pricing) for current rates. Muse Image has one price per image:

```text
cost = price per image × 1
```

Text-only and reference requests, and every aspect ratio, cost the same. The amount reserved when the task is accepted is the amount charged. View final charges in your account usage history. Failed tasks are not charged.

## Output schema

Submission returns the task:

```json
{"id": "task_...", "model": "muse-image", "status": "processing", "created_at": 1789689600}
```

### Get the task

```text
GET https://api.seedrouter.ai/v1/tasks/{task_id}
```

Poll every 10–20 seconds until `status` is `completed` or `failed`. A network timeout while polling does not mean generation failed: keep the task ID and resume checking it. Do not create another task to check progress.

### Completed task

```json
{
  "id": "task_...",
  "model": "muse-image",
  "status": "completed",
  "created_at": 1789689600,
  "finished_at": 1789689680,
  "output": {
    "created": 0,
    "data": [
      { "url": "https://static.seedrouter.ai/media/tasks/task_example/0.webp" }
    ]
  }
}
```

The image is delivered as WebP, the model's own format; there is no output format setting. The model sets the pixel size. In our tests a text-only request came back at 1600 × 1600, `16:9` at 2048 × 1152, `3:4` at 1344 × 1792 and `9:16` at 1152 × 2048, about 50–180 seconds after submission.

## Errors

Requests rejected before a task is created return an HTTP error with an `error` object and are not charged. A task that fails after acceptance returns HTTP 200 when queried, with `status: "failed"` and an `error` object.

See the [shared error catalog](https://seedrouter.ai/docs/api/errors) for codes, HTTP statuses, and retry guidance.

```json
{
  "id": "task_...",
  "model": "muse-image",
  "status": "failed",
  "error": {
    "code": 60001,
    "message": "The request was rejected by the content policy. Please revise the prompt or input images."
  }
}
```

If submission itself times out, check your tasks before submitting again: the first request may have been accepted.

## Tips

* Name the subject, setting, light and framing; Muse Image follows a specific brief closely.
* With references, say exactly what must stay the same, such as the product's color or shape.
* Leave `aspect_ratio` out to match a reference's shape; set it to crop for a channel.
* Add `no text, no logos` to keep invented marks out.

## Related

* [Muse Image Playground and pricing](https://seedrouter.ai/models/muse-image)
* [Muse Video API reference](https://seedrouter.ai/docs/muse-video)
* [Download OpenAPI](https://seedrouter.ai/docs/muse-image.openapi.json)
* [Copyable Markdown](https://seedrouter.ai/docs/muse-image.md)
