# Midjourney

This reference describes the implemented API contract. Paid integration checks on October 18, 2026 completed imagine requests for all nine listed versions, V8.2 Raw on/off, HD, Draft, V7 Omni Reference, describe, grid selection, and V6.1 inpaint → modal. These checks do not certify every parameter combination or visual effect. V8.2 HD+Draft failed in two checks but remains available; a tested remix failed because its original execution context lacked capacity. Unsupported combinations return an error before submission. Failed requests are not charged.

## Start with one image request

Set `SEEDROUTER_API_KEY` on your server. Submit **once**, save the returned public task ID, then poll that ID. The simplest request needs only `model` and `prompt`. Its default action is `imagine` and its default speed is `fast`.

```bash
curl https://api.seedrouter.ai/v1/images/generations \
  -H "Authorization: Bearer $SEEDROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"midjourney-v8.2","prompt":"A red paper boat on a calm pond at sunrise"}'
```

Copy `id` from the response into `TASK_ID`. Keep calling GET until `status` is `completed` or `failed`:

```bash
TASK_ID='task_ID_FROM_THE_RESPONSE'
curl "https://api.seedrouter.ai/v1/tasks/$TASK_ID" \
  -H "Authorization: Bearer $SEEDROUTER_API_KEY"
```

Read completed images from `output.data[].url`. If a POST times out or its outcome is uncertain, check task history instead of repeating it. A poll timeout does not cancel the task or justify a second POST.

### Runnable Python example

Download the [complete Python submit-and-poll example](https://seedrouter.ai/examples/midjourney-v8-2.py). It uses only Python's standard library and saves the task ID to a local file. Save the JSON request above as `request.json`, then run:

```bash
python3 midjourney-v8-2.py submit request.json --state image-task.json
python3 midjourney-v8-2.py poll --state image-task.json
```

The submit command refuses to overwrite its state file. Resume a long-running task by running `poll` again with the same file. The script never retries POST automatically. Change the `model` and parameters in `request.json` using the version examples below; use a new state-file name only for an intentionally new generation.

## Choose a model version

These tables describe the **implemented API contract**, based on the API services' own documented inputs and exclusions. A field listed in a general API parameter table is accepted where a compatible request can be executed; that does **not** establish its visual effect on every model version. Documented support and live verification are separate. The API never changes the requested version or silently upgrades Relax to Fast.

| Model ID          | Generation speeds  | Quality values     | HD / Draft                            | Character / Omni reference             | Depth / personalization                         |
| ----------------- | ------------------ | ------------------ | ------------------------------------- | -------------------------------------- | ----------------------------------------------- |
| `midjourney-v8.2` | Relax, Fast, Turbo | 0.25, 0.5, 1, 2    | HD; Draft on compatible Fast requests | `cref`; no `oref`                      | Depth; explicit profile conditionally available |
| `midjourney-v8.1` | Relax, Fast, Turbo | 0.25, 0.5, 1, 2    | HD; Draft on compatible Fast requests | `cref`; no `oref`                      | Depth; explicit profile conditionally available |
| `midjourney-v7`   | Relax, Fast, Turbo | 0.25, 0.5, 1, 2, 4 | HD is a no-op; Draft supported        | `cref`; `oref` conditionally available | Depth; explicit profile conditionally available |
| `midjourney-v6.1` | Relax, Fast, Turbo | 0.25, 0.5, 1, 2, 4 | HD is a no-op; no Draft               | `cref`; no `oref`                      | Depth; explicit profile conditionally available |
| `midjourney-v6`   | Fast, Turbo        | 0.25, 0.5, 1, 2, 4 | HD is a no-op; no Draft               | `cref`; no `oref`                      | No depth; explicit profile                      |
| `midjourney-v5.2` | Relax, Fast, Turbo | 0.25, 0.5, 1, 2    | Neither                               | `cref`; no `oref`                      | Depth; no profile                               |
| `midjourney-v5.1` | Relax, Fast, Turbo | 0.25, 0.5, 1, 2    | Neither                               | `cref`; no `oref`                      | Depth; no profile                               |
| `niji-v7`         | Relax, Fast, Turbo | 0.25, 0.5, 1, 2    | Neither                               | `cref`; no `oref`                      | Depth; no profile                               |
| `niji-v6`         | Relax, Fast, Turbo | 0.25, 0.5, 1, 2, 4 | HD is a no-op; no Draft               | `cref`; no `oref`                      | Depth; explicit profile conditionally available |

All nine versions accept Raw, tile, `iw` 0–3, one style-reference URL, and the common numeric controls below. Character/style/depth inputs listed in the general API table have not been proven effective on every version. Never substitute one reference type for another.

“Conditionally available” means the **complete combination** must be executable. V8 Draft, quality 4, Omni Reference and explicit profiles cannot satisfy `nsfw_check: true`; they require API or administrator access. V6 also cannot satisfy that additional check. V8 character/depth/quality inputs can be combined with the extra check, but cannot be combined with fields that require an incompatible request path. For example, V8 `quality: 1` plus `stop: 100` currently has no compatible execution path, even though each field is individually supported.

### Defaults and common bounds

New generations default only `action` to `imagine` and `speed` to `fast`. Version and family come from `model`. Omitted generation fields remain omitted; a billing label of quality `1` does not insert `quality` into the image request. Explicit zero and false are preserved. All numeric parameters stay within ±9,007,199,254,740,991 as a JSON/JavaScript transport safeguard; this is not a claimed model-specific range.

| Field             | Validation and availability                                                                                                                                                               | Omitted value                 |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
| `prompt`          | A text description is required for imagine, including when images are supplied; no `{permutations}`                                                                                       | No text                       |
| `size`            | Positive finite `W:H`; decimal ratios have narrower availability. V6 requires integer ratios no wider than 14:1 or 1:14                                                                   | No aspect-ratio setting added |
| `seed`            | Finite JSON number within ±9,007,199,254,740,991 for exact transport. Integers outside 0–4,294,967,295 have narrower availability; fractional seeds require that nonnegative 32-bit range | No seed added                 |
| `stylize`         | Number 0–1,000                                                                                                                                                                            | Model default retained        |
| `chaos`           | Number 0–100                                                                                                                                                                              | Model default retained        |
| `weird`           | Number 0–3,000                                                                                                                                                                            | Model default retained        |
| `raw`, `tile`     | Boolean; false never becomes a literal `--raw false` or `--tile false`                                                                                                                    | No flag added                 |
| `negative_prompt` | Nonempty text; no embedded flags or permutations                                                                                                                                          | No exclusions                 |
| `image_urls`      | Public HTTP(S) URLs; order and duplicates retained                                                                                                                                        | No reference images           |
| `metadata`        | JSON object; not an image-generation setting                                                                                                                                              | No metadata                   |

Fractional `seed`, `stylize`, `chaos`, `weird`, `cw`, `sw` and `stop` values require a compatible request without `nsfw_check: true`. Whole-number `sw` values from 0–1,000 have wider availability; other finite style weights are supported only on narrower combinations. These distinctions come from API number/integer contracts, not inferred model capabilities.

### Midjourney V8.2 and V8.1

Applies to &#x2A;*`midjourney-v8.2` and `midjourney-v8.1`**. Standard generation supports Relax, Fast and Turbo. Quality is optional and accepts 0.25, 0.5, 1 or 2. Character reference (`cref`/`cw`), style reference (`sref`/`sw`) and depth reference (`dref`/`dw`) are documented inputs; their effect with each version is still to be verified. `iw` is 0–3.

HD is a definition switch, separate from an upscale action. &#x2A;*HD + Turbo remains unavailable because its price is not configured.** Fast HD has a compatible request path. Integer ratios no wider than 4:1 work across the available HD contracts; other positive ratios have narrower availability and need live verification. Draft has a Fast-only path with up to 24 image choices and cannot satisfy the extra content check. HD + Draft is a separate configured mode, still awaiting combination verification.

`stop` 10–100 and a nonempty personalization `profile` have a Fast-only path without the extra content check. That path does not accept `quality` or `cref`, so combining those fields fails before submission. `style: "raw"` is normalized to Raw; other style strings have a separate compatible path and are not assumed to be visually effective. `oref`/`ow` are unavailable on V8.

Explicit `sd: true`, `sv`, `exp`, and `edit` currently have no established execution contract. `edit` is not an alias for image prompts, inpaint, or modal. V8 variation, grid selection, reroll and remix depend on the parent's available actions. Real upscale mode semantics are unverified. Zoom and pan have narrower parent-dependent Fast paths without the extra content check; inpaint is unavailable.

### Midjourney V7

Applies to &#x2A;*`midjourney-v7`**. Quality accepts 0.25, 0.5, 1, 2 or 4; quality 4 requires a non-Relax request without the extra content check. Character and depth references use a different compatible request path from Omni Reference. Ordinary image prompts use `iw` 0–3.

Omni Reference uses one `oref` URL and optional finite `ow`. `ow` requires the URL so the correct reference price can be determined. Quality 4 with Omni Reference is accepted by the documented contract. **Omni Reference + Draft remains blocked because the combined price is unresolved**, not because a model-level incompatibility has been established.

Draft is supported. `hd: true` is accepted only as a documented no-op on the compatible path: it leaves standard output unchanged and adds no HD charge. Stop and explicit profiles require a non-Relax request without the extra check. `sv`, `exp`, `edit`, and explicit `sd: true` remain unavailable. See the action matrix for parent-specific operations.

### Midjourney V6.1, V6 and Niji 6

Applies to &#x2A;*`midjourney-v6.1`, `midjourney-v6`, and `niji-v6`**. Quality accepts 0.25, 0.5, 1, 2 or 4. `iw` accepts 0–3; character weight `cw` accepts 0–100. Character and style references each use one HTTP(S) URL. Stop accepts 10–100. No generation default is inferred from the selected version.

V6.1 and Niji 6 support Relax/Fast/Turbo and depth inputs on compatible requests; V6 has only Fast/Turbo generation, no depth input, integer ratios up to 14:1, and no extra content-check path. All three accept a nonempty profile on compatible non-Relax requests. Quality 4 and fractional numeric controls have narrower availability. `hd: true` is a standard-output no-op with no HD charge. Draft and Omni Reference are unavailable.

For Niji 6, a negative prompt cannot be combined with fields that need its alternate request path, such as quality 4 or a profile. V6.1 and Niji 6 can begin inpaint when a valid parent permits it; V6 cannot. V6 parent actions require Fast. Real upscales use `subtle`/`creative`, not V5's `2x`/`4x`; available parent buttons remain authoritative.

### Midjourney V5.2 and V5.1

Applies to &#x2A;*`midjourney-v5.2` and `midjourney-v5.1`**. Both accept quality 0.25, 0.5, 1 or 2, `iw` 0–3, integer `stop` 10–100, character/style/depth references, Raw, tile and style strings. These inputs appear in the general API contract; version-specific visual effects remain unverified. Numeric controls documented as integers must be whole numbers here, including seed, stylize, chaos, weird, cw, sw and stop. Style weight is 0–1,000.

HD, Draft, Omni Reference, personalization and quality 4 have no current compatible path. Explicit `sd: true`, `sv`, `exp`, `edit`, repeat and prompt permutations are unavailable. Parent real upscales use `2x`/`4x` and require the corresponding returned operation. They are distinct from free grid selection.

### Niji 7

Applies to &#x2A;*`niji-v7`**. It has its own model ID and availability rules. Quality accepts 0.25, 0.5, 1 or 2, and image weight accepts 0–3. Character/style/depth references are listed in the general API input table; effects with Niji 7 remain to be verified. Numeric integer fields and style-weight bounds match the V5.1/V5.2 request path above.

Stop, quality 4, HD, Draft, Omni Reference and personalization have no current compatible path. Niji Draft output count and pricing have not been established. V8 remix is not an available Niji 7 action. Real upscale command semantics are unverified; grid selection and other actions still depend on a valid parent.

### One valid generation example per model

These JSON bodies pass local model validation and have an implemented execution candidate. They are not records of paid success. Enable the model and its matching price before submitting. The examples deliberately set `speed: "fast"` for consistent cross-version use; omitting speed also uses Fast. Set `speed: "relax"` explicitly only when you want Relax and the version supports that path.

```json
{"model":"midjourney-v8.2","prompt":"A red paper boat on a calm pond","speed":"fast","size":"16:9","raw":true,"hd":true}
```

```json
{"model":"midjourney-v8.1","prompt":"A red paper boat on a calm pond","speed":"fast","size":"4:3","raw":true,"stylize":100}
```

```json
{"model":"midjourney-v7","prompt":"A red paper boat on a calm pond","speed":"fast","quality":2,"size":"16:9","raw":true}
```

```json
{"model":"midjourney-v6.1","prompt":"A red paper boat on a calm pond","speed":"fast","quality":1,"stylize":100,"stop":100}
```

```json
{"model":"midjourney-v6","prompt":"A red paper boat on a calm pond","speed":"fast","quality":1,"size":"4:3","raw":true}
```

```json
{"model":"midjourney-v5.2","prompt":"A red paper boat on a calm pond","speed":"fast","quality":0.5,"stylize":100,"stop":100}
```

```json
{"model":"midjourney-v5.1","prompt":"A red paper boat on a calm pond","speed":"fast","quality":1,"size":"1:1","raw":true}
```

```json
{"model":"niji-v7","prompt":"An illustrated red paper boat on a calm pond","speed":"fast","size":"16:9","raw":true}
```

```json
{"model":"niji-v6","prompt":"An illustrated red paper boat on a calm pond","speed":"fast","quality":1,"stylize":100,"raw":true}
```

## More language examples

These examples show the request format for an enabled deployment. Keep API keys in server-side code.

```bash
curl https://api.seedrouter.ai/v1/images/generations \
  -H "Authorization: Bearer $SEEDROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "midjourney-v8.2",
    "prompt": "A red paper boat on a calm pond at sunrise, soft mist, no lettering",
    "speed": "fast",
    "size": "16:9",
    "raw": true
  }'
```

```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": "midjourney-v8.2",
        "prompt": "A red paper boat on a calm pond at sunrise, soft mist, no lettering",
        "speed": "fast", "size": "16:9", "raw": True,
    },
    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: 'midjourney-v8.2',
    prompt: 'A red paper boat on a calm pond at sunrise, soft mist, no lettering',
    speed: 'fast', size: '16:9', raw: true,
  }),
});
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":"midjourney-v8.2",
      "prompt":"A red paper boat on a calm pond at sunrise, soft mist, no lettering",
      "speed":"fast","size":"16:9","raw":true
    }`)
    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")
    res, err := (&http.Client{Timeout:60*time.Second}).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 and task result

Use `POST https://api.seedrouter.ai/v1/images/generations` with `Authorization: Bearer YOUR_API_KEY` and `Content-Type: application/json`. All image operations use this endpoint. The response contains an `id`, `model`, `status: "processing"`, and `created_at`. Keep that ID and poll:

```bash
curl "https://api.seedrouter.ai/v1/tasks/$TASK_ID" \
  -H "Authorization: Bearer $SEEDROUTER_API_KEY"
```

A task has `processing`, `completed`, or `failed` status. Completed images are in `output.data`, as objects containing `url` and an optional one-based `index`. `output.action` identifies the operation; `output.seed` may be present. Describe results use `output.text`, an array of descriptions. An editing step may finish with `output.awaiting_input: true` and no images; submit a subsequent `modal` action using that task as its parent. Grid selection (`upscale` with `mode: "select"`) has zero image-job usage because it retrieves an existing choice. Opening the input-only inpaint step also has zero usage; the final successful modal generation is charged once. A configured model price is still required. Image URLs point to delivered results. No monetary fields are returned.

When `output.grid` is `true`, one delivered file contains a grid of image choices; it is not expanded into individual image URLs. Parent actions can address the grid’s image positions even when `output.data` has one URL.

Neither a fixed number of descriptions nor English output is guaranteed. Display the returned text as supplied.

Do not assume every task has four images: ordinary generation usually yields four; a V8 draft set can contain 24; an upscale yields one; describe or an editing-input step can have no images. Read the returned array.

## Generation parameters

Known fields do not accept `null`. Unknown JSON fields are discarded; unknown native flags are errors. This API uses URL references, public task IDs and polling, with no arbitrary image count or automatic batch expansion. Read the version and combination rules above in addition to this union table.

| Field             | Type                     | Default    | Constraints                                                                                                                                                   |
| ----------------- | ------------------------ | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `model`           | string                   | required   | One of the nine explicit IDs.                                                                                                                                 |
| `action`          | string                   | `imagine`  | See actions below.                                                                                                                                            |
| `prompt`          | string                   | none       | Imagine requires a text description, also with image prompts. Some compatible requests have an 8,192-character limit after flags and image URLs are compiled. |
| `image_urls`      | URL array                | none       | Public HTTP(S) images; leading prompt URLs precede this array. Order and repeated URLs are preserved.                                                         |
| `speed`           | string                   | `fast`     | Relax, Fast or Turbo. Complete version/parameter/action combinations apply. No automatic speed change.                                                        |
| `size`            | string                   | omitted    | Positive finite `W:H`, not pixel dimensions. Integer ratios up to 14:1 have wider compatibility; V8 HD's narrower integer-ratio path allows up to 4:1.        |
| `quality`         | number or numeric string | omitted    | 0.25, 0.5, 1 or 2 across all versions; 4 additionally for V7/V6.1/V6/Niji 6 on compatible requests.                                                           |
| `seed`            | number                   | omitted    | Finite and within ±9,007,199,254,740,991; integer and range restrictions depend on the complete request, as described above.                                  |
| `stylize`         | number                   | omitted    | 0–1,000; fractional values have narrower availability.                                                                                                        |
| `chaos`           | number                   | omitted    | 0–100; fractional values have narrower availability.                                                                                                          |
| `weird`           | number                   | omitted    | 0–3,000; fractional values have narrower availability.                                                                                                        |
| `raw`             | boolean                  | omitted    | `style: "raw"` is an alias. An explicit structured `raw: false` overrides it.                                                                                 |
| `style`           | string                   | omitted    | Other nonempty style strings use documented compatible paths; no guarantee of visual effect on every version.                                                 |
| `tile`            | boolean                  | omitted    | Repeatable tile input.                                                                                                                                        |
| `negative_prompt` | string                   | none       | Exclusions; no embedded flags or permutations. Niji 6 has narrower combinations.                                                                              |
| `iw`              | number                   | omitted    | 0–3 for every version. No image or guessed default is inserted.                                                                                               |
| `cref`            | URL                      | none       | One character-reference URL; documented general input, version effects await verification.                                                                    |
| `cw`              | number                   | omitted    | 0–100; integer values have wider availability. No hard dependency is inferred beyond documented request behavior.                                             |
| `sref`            | string                   | none       | Exactly one plain HTTP(S) URL is currently executable.                                                                                                        |
| `sw`              | number                   | omitted    | Integer 0–1,000 has wider availability; other finite values need a compatible request.                                                                        |
| `dref`            | URL                      | none       | One depth-reference URL, except V6. Version effects remain unverified.                                                                                        |
| `dw`              | number                   | omitted    | 0–100, except V6. No undocumented default or mandatory `dref` dependency is inserted.                                                                         |
| `oref`            | URL                      | none       | Midjourney V7 Omni Reference. Combined Draft billing remains unresolved.                                                                                      |
| `ow`              | number                   | omitted    | Finite Omni weight. Requires `oref` to determine correct reference billing.                                                                                   |
| `draft`           | boolean                  | omitted    | Midjourney V7 or V8, with output-count and speed restrictions above. Niji Draft is unavailable.                                                               |
| `hd`              | boolean                  | omitted    | V8 high definition. On supported earlier versions it is a documented standard-output no-op with no HD charge.                                                 |
| `stop`            | number                   | omitted    | 10–100. Not available for Niji 7; other version/extra-check/integer combinations apply.                                                                       |
| `profile`         | string                   | none       | Explicit nonempty profile code on compatible non-Relax requests; no default profile is assumed.                                                               |
| `nsfw_check`      | boolean                  | omitted    | Additional content check where available. Normal safety checks cannot be disabled.                                                                            |
| `version`         | string                   | from model | Optional consistency check; must match the model ID.                                                                                                          |
| `niji`            | boolean                  | from model | Optional consistency check; must match the model family.                                                                                                      |
| `extra`           | string                   | none       | Native parameters only, no prose.                                                                                                                             |
| `metadata`        | object                   | none       | Client metadata retained with the task; not an image-generation parameter.                                                                                    |

### Recognized syntax with no current execution path

These fields remain visible so their status is explicit. They return an unavailable-combination error instead of being dropped, approximated or treated as already verified capabilities.

| Field or form                                             | Current status                                                                                                                                        |
| --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `sv`                                                      | Finite numeric input recognized; no established execution contract. No model-vendor range is imposed as an API fact.                                  |
| Multiple/weighted `sref`, numeric style codes or `random` | Recognized syntax; the executable API contract currently requires one plain URL.                                                                      |
| Bare `--p` / empty `profile`                              | A specific profile code is required; an account's default is not substituted.                                                                         |
| `exp`                                                     | Finite numeric input recognized; execution semantics remain unverified.                                                                               |
| `edit`                                                    | HTTP(S) reference URL tokens recognized; no established execution mapping. Distinct from ordinary image prompts and the modal action.                 |
| `sd: true`                                                | Explicit standard-definition selection has no verified equivalent. Omit it for standard generation. `sd: false` has narrower compatible availability. |
| `repeat`                                                  | Integer 2–40 recognized; multiple jobs require a separate billing/delivery contract. Prompt permutations are also unavailable.                        |
| HD + Turbo; Omni Reference + Draft                        | No approved combination price. A supported individual field does not make an unpriced combination submit-ready.                                       |

## Native parameter translation

The order of precedence is **structured field → `extra` → prompt suffix**. This example uses a final aspect ratio of `16:9` and stylization of `80`:

```json
{
  "model": "midjourney-v8.2",
  "prompt": "A paper boat --ar 1:1 --s 50",
  "extra": "--ar 4:3 --s 80",
  "size": "16:9",
  "speed": "fast"
}
```

Aliases include `--ar`/`--aspect` → `size`, `--s` → `stylize`, `--c` → `chaos`, `--w` → `weird`, `--q` → `quality`, `--no` → `negative_prompt`, and `--p` → `profile`. `--v` and `--niji` must agree with the model ID. `--fast`, `--relax` and `--turbo` are speed switches. `--raw`, `--tile`, `--draft`, `--hd` and `--sd` take no value.

Conflicting aliases in a single source, such as `--s 50 --stylize 80`, are rejected. Boolean JSON `false` omits that switch; it does not become a literal native `false` argument. Ordinary quoted prose and URL query strings are preserved. Known control flags inside quotes, such as `"--hd"`, `"--q 2"` or `"--turbo"`, are rejected rather than allowed to bypass version, task-count or pricing checks. Structured string parameters also reject quoted embedded flags. Structured reference and negative-prompt fields cannot contain embedded `--parameters`. Ordinary `::` prompt text is preserved. Compatibility still depends on the complete request; the API never rewrites a multiprompt into a different prompt.

## Image actions and parent tasks

Use your returned SeedRouter `parent_task_id`, the same model, and an image `index` where required. Indices start at 1. Do not supply external task IDs, `task_id`, or private button IDs. A parent must belong to your account, remain usable, and have the required completed result. Its original generation context is preserved; expiration is checked before a child task starts.

**A follow-up stays attached to its original task.** If that task's original execution context is unavailable, expired or changed, the action is rejected or fails; the system does not transfer the task ID or recreate its parent elsewhere. This applies to variation, upscale, reroll, remix, zoom, pan, inpaint and modal continuations. Keep using each returned public task ID for the next supported step.

### Action availability by version

`Parent` means an implemented path exists **only if your completed parent exposes the corresponding action**; it is not a guarantee that any image can use it. `Conditional` adds the restrictions below. No cell claims a paid action has passed live acceptance. All actions still require a configured price and the requested speed.

| Model             | Variation | Grid select | Real upscale    | Remix       | Reroll / Zoom | Pan         | Inpaint → Modal | Describe    |
| ----------------- | --------- | ----------- | --------------- | ----------- | ------------- | ----------- | --------------- | ----------- |
| `midjourney-v8.2` | Parent    | Parent      | Unverified      | Parent      | Conditional   | Conditional | Unavailable     | Fast only   |
| `midjourney-v8.1` | Parent    | Parent      | Unverified      | Parent      | Conditional   | Conditional | Unavailable     | Fast only   |
| `midjourney-v7`   | Parent    | Parent      | Parent          | Unavailable | Parent        | Parent      | Parent          | Fast only   |
| `midjourney-v6.1` | Parent    | Parent      | Parent          | Unavailable | Parent        | Parent      | Parent          | Fast only   |
| `midjourney-v6`   | Parent    | Unavailable | Parent          | Unavailable | Parent        | Conditional | Unavailable     | Fast only   |
| `midjourney-v5.2` | Parent    | Parent      | Parent: 2x / 4x | Unavailable | Parent        | Parent      | Parent          | Unavailable |
| `midjourney-v5.1` | Parent    | Parent      | Parent: 2x / 4x | Unavailable | Parent        | Parent      | Parent          | Unavailable |
| `niji-v7`         | Parent    | Parent      | Unverified      | Unavailable | Parent        | Parent      | Parent          | Unavailable |
| `niji-v6`         | Parent    | Parent      | Parent          | Unavailable | Parent        | Parent      | Parent          | Fast only   |

* **Remix:** V8 has a compatible parent-dependent operation. Other versions remain unavailable because the required parent execution mode and follow-up price have not both been established. A returned action hint alone does not establish a priced operation.
* **Pan:** V8 and V6 currently require Fast, explicit `scale` 1.1–3, and no extra `nsfw_check: true`. Other models may either accept the parent path's built-in scale or require explicit scale. A replacement prompt is supported only on the explicit-scale path.
* **Prompt and ordinary parameter edits:** compatible Fast parent contexts accept replacement text and ordinary generation parameters for `variation`, `pan`, and `zoom`. The same model version is retained. Other parent contexts accept only inherited settings. HD, Draft or Omni Reference overrides that change the billing mode remain unpriced and blocked; earlier-version HD no-ops do not add an HD charge. Parent identity and inherited parameters are checked by the owner-scoped quote. A Turbo parent is never silently billed as a Fast follow-up.
* **Real upscale:** V5 uses `2x`/`4x`; other versions use `subtle`/`creative`. `select` only retrieves a grid choice and has zero image-job usage. An available Select operation does not establish a real upscale operation. V8 and Niji 7 real upscale command semantics remain unverified; their Select availability does not change that status.
* **Inpaint → Modal:** start `inpaint` with the parent and no mask, replacement prompt or generation-parameter overrides. When it returns `awaiting_input: true`, use its returned public task ID for `modal`, optionally adding `prompt` and `mask_url`. The input stage has zero jobs; a successful final modal generation is one charged job. A final modal with a mask is priced as inpainting, while a final modal without a mask is priced as outpainting. These price categories are derived from `mask_url`, not extra values you can pass in `mode`. V8 and V6 do not currently have this sequence.
* **Describe:** needs exactly one independent image URL and returns text. Available with Fast speed for V8.2, V8.1, V7, V6.1, V6 and Niji 6. Omit `nsfw_check` or use `false`; `true`, Relax and Turbo are unavailable. Describe requires API or administrator access because the signed-in form retains its additional content check. The selected model ID does not make Describe a generation in that image-model version. Incompatible combinations are rejected before submission; inputs are never silently changed.
* **Blend:** unavailable for every version because the current execution contract cannot preserve the selected version. Use `imagine` with a text description and image prompt URLs when that is the operation you intend; Blend is not automatically rewritten.

| Action                         | Inputs and constraints                                                                                                                                                                                                                                                                                                                                         |
| ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `imagine`                      | No parent. Text, image prompts and generation parameters.                                                                                                                                                                                                                                                                                                      |
| `variation`                    | Parent and index. `mode: "subtle"` (default) or `"strong"`. Replacement text and ordinary generation parameters are accepted only where the parent supports them.                                                                                                                                                                                              |
| `upscale`                      | Parent and index. `mode: "select"` (default) extracts an existing grid image with zero image-job usage; `subtle`/`creative` perform a real upscale. V5 real upscale modes are `2x`/`4x`. Availability depends on the parent's available actions. No prompt or generation parameters.                                                                           |
| `remix-strong`, `remix-subtle` | Parent and index, optional replacement prompt; `remix` aliases `remix-strong`. If `mode` is supplied it must match the action. Generation-parameter edits are currently unavailable for Remix.                                                                                                                                                                 |
| `reroll`                       | Parent; inherits prompt. No generation parameters.                                                                                                                                                                                                                                                                                                             |
| `zoom`                         | Parent and index. `zoom_ratio` 1.1–2, default 2; the value is preserved. Some parents accept only exact 1.5 or 2, while compatible parents accept continuous values. The API never rounds the request to fit another operation. Replacement text and ordinary generation parameters are accepted only for a compatible parent; no rounding or speed downgrade. |
| `pan`                          | Parent, index and `direction` (`left`, `right`, `up`, `down`). Optional `scale` 1.1–3 is required by some supported contexts. Replacement text and ordinary generation parameters are context-dependent.                                                                                                                                                       |
| `describe`                     | Exactly one `image_urls` URL; Fast only for the six models above. No parent, prompt or generation parameters; `nsfw_check` must be omitted or false. Returns text.                                                                                                                                                                                             |
| `blend`                        | Recognized but unavailable pending version-preserving execution. 2–5 images, no text; only `size` as a generation parameter.                                                                                                                                                                                                                                   |
| `inpaint`                      | Parent; starts an editing-input step where available. Editing masks are not converted between incompatible coordinate systems.                                                                                                                                                                                                                                 |
| `modal`                        | Parent awaiting input; optional replacement prompt and HTTP(S) PNG `mask_url` where supported. Transparent areas are redrawn; white areas are preserved. No generation-parameter edits.                                                                                                                                                                        |

`index` ranges from 1 to the parent's available image choices, with a maximum of 24 for V8 draft and 4 for other versions. Some actions only support indices 1–4. Child actions do not accept `image_urls`; only imagine, blend and describe accept independent images. `direction`, `scale`, `zoom_ratio` and `mask_url` belong only to the actions described above.

```json
{
  "model": "midjourney-v8.2",
  "action": "variation",
  "parent_task_id": "task_YOUR_COMPLETED_TASK",
  "index": 1,
  "mode": "subtle",
  "speed": "fast"
}
```

## Reference images and editing masks

Use publicly accessible HTTP(S) URLs that return the image itself. For broad request compatibility, use PNG, JPEG or WebP files no larger than **12 MiB (12,582,912 bytes) each**. These are documented image formats, not an exclusive format list. The 12 MiB limit applies to some supported requests, including their image prompts, reference images and editing masks; it is not a universal limit for every available model and request combination. Keeping each file within it avoids that size restriction when changing parameters.

For a supported `modal` request, `mask_url` must return a **PNG mask**: transparent areas are redrawn and white areas are preserved. Use the same dimensions as the parent image to avoid unintended alignment; this is preparation guidance, not an enforced universal dimension constraint. Start `inpaint` without a mask, then pass the mask in the subsequent `modal` request. The API does not convert between different mask conventions.

Submission checks reject a confirmed oversized file where the limit applies, a confirmed non-image response, or a confirmed non-PNG modal mask. A URL, filename suffix or successful quote alone does not prove that the remote image is readable or that its pixels form the intended mask. Files are not silently converted; inspect the image and mask before submitting. Other image formats and individual parameter effects remain subject to the supported request's behavior.

## Errors and verification status

Invalid fields, version mismatches and unavailable combinations return an error before acceptance. A task accepted successfully can later fail; read its final status and error instead of resubmitting automatically. See the [error reference](https://seedrouter.ai/docs/api/errors) for the public error format. Failed requests are not charged.

The October 18 paid checks established the output counts and completed workflows summarized at the top of this page. A completed operation does not guarantee that its images satisfy the prompt: the illustrated V6.1 masked edit returned images but did not show the requested clothing change. See the [editing walkthrough](https://seedrouter.ai/blog/midjourney-v8-2-edit-model). Other version/action combinations, individual reference effects and expiration boundaries still require separate verification. A local serializer or mocked test does not establish those results.

## Contract scope

This reference defines SeedRouter's supported JSON and task contract, including the version-specific limits and request combinations listed above. The available API operations are assessed independently of the Midjourney website and Discord interface; a website feature does not establish API availability, and a website-only restriction is not automatically an API restriction. SeedRouter is not a Midjourney-operated API. Documented request support does not establish the visual effect of every parameter on every version; the remaining live checks are identified above.
