# AI Character Reference Sheet Generator

Turn an idea or an approved image into a character reference sheet for your next comic, storyboard or video. Start with four views, compare the details, and keep the version you want.

Generator: https://seedrouter.ai/tools/ai-character-reference-sheet-generator
Prompts and repairs: https://seedrouter.ai/blog/ai-character-reference-sheet-prompts

## Scene preset

Default model: `gpt-image-2.5-flare`. One reference sheet is one output image, not one image per view. The four-view prompt below is prefilled; size=auto, quality=auto, n=1, background=auto, output_format=png, moderation=auto. Optional reference images preserve an existing character. The prompt and model parameters remain editable.

## Workflow

1. Define the character: Upload a clear reference or replace the example description. Set the face, hair, clothing and important accessories, and keep the background simple so the character reference sheet is easy to inspect.
2. Choose the views and generate: Choose a character reference sheet preset. Review the canvas, quality and output count, then check the price before generating; one output is the starting point for one complete board.
3. Review, download and reuse: Compare each view in your character reference sheet for identity and outfit changes. Download the result you want to keep; request a faulty angle separately using the approved reference.

## Output

A character reference sheet can focus on body angles or facial expressions. Start with one output for one complete board: the image count requests additional outputs, not additional views.

Sample: https://static.seedrouter.ai/media/blog/2026-10-12-ai-character-reference-sheet-prompts/four-views.webp
Generated with GPT Image 2.5 Flare Standard: 1536 × 1024, high quality, PNG, one output. The prompt is available in the four-view preset above. This is one generated result; future results may differ.

Expression sample: https://static.seedrouter.ai/media/blog/2026-10-12-ai-character-reference-sheet-prompts/expressions.webp
GPT Image 2.5 Flare Standard · 1536 × 1024 · high · PNG · one output. Six head-and-shoulders portraits keep the curly hair and ochre jacket while changing the expression.
Single-profile sample: https://static.seedrouter.ai/media/blog/2026-10-12-ai-character-reference-sheet-prompts/profile.webp
GPT Image 2.5 Flare Standard · 1024 × 1536 · high · PNG · one output. This creates a separate side-view image; it does not replace a panel inside the original sheet.

Compare the small details: Check the face, colors, proportions and accessories in every view of your character reference sheet. Angles can be missing or repeated, so approve the panels that fit your brief before using them again.
Define what the camera cannot see: A front portrait leaves unseen details on your character reference sheet open to interpretation. Add a reference or describe the back of a hairstyle or jacket when those details matter.
Leave room for a readable face: Every panel shares the character reference sheet’s canvas. For fine facial detail, create a separate portrait or single-view image; downloaded boards remain complete images rather than automatically cropped files.
Choose the next model’s input: A video model may see your character reference sheet as several people. Pick one view when its reference guidance calls for it; movement and audio need separate instructions or media.

## Use one character in a video

Choose a view, adjust the crop to include one character, then send it to a character slot. The other character, motion and audio stay unchanged. No video is generated automatically.
The crop is saved as a PNG. White padding keeps it within the video model’s image limits. Review the reference on the next page before generating.

Start with a [character reference sheet](https://seedrouter.ai/tools/ai-character-reference-sheet-generator). Sign in to save the crop, then choose character slot 1 or 2 in [Hotel Lobby AI](https://seedrouter.ai/tools/hotel-lobby-ai) or [Raindance AI](https://seedrouter.ai/tools/raindance-ai). This is a browser workflow, not an additional model API parameter.

## Prompt presets

### Four full-body views

Create one character reference sheet image. Show exactly four full-body views of the same character in one horizontal row: front, three-quarter, profile and back. Keep the head and feet fully visible, with clear space between the figures, matching height, proportions and a shared ground line. Use a relaxed neutral standing pose. If a reference image is attached, preserve its character identity, face, hairstyle, proportions, clothing, colors and accessories. Otherwise create an original illustrated explorer with short curly dark hair, an ochre jacket, navy trousers and brown boots. Keep the same character throughout. Use soft even lighting and a plain off-white background. No labels, logos or decorative text.

### Six facial expressions

Create one facial expression reference sheet image. Arrange six head-and-shoulders portraits of the same character in a two-by-three grid: neutral, happy, sad, angry, surprised and concerned. Keep the camera angle, framing, face shape, hairstyle and outfit consistent; change only the expression. If a reference image is attached, preserve its character identity, face, hairstyle, proportions, clothing, colors and accessories. Otherwise create an original illustrated explorer with short curly dark hair, an ochre jacket, navy trousers and brown boots. Keep the same character throughout. Use soft even lighting and a plain off-white background. No labels, logos or decorative text.

### One profile view — attach a reference

Using the attached character reference, create one full-body profile view of that character. Keep the entire head and feet visible. Preserve the approved face, hairstyle, body proportions, clothes, colors and accessories; change only the camera angle. Do not add another character or combine several views. Use soft even lighting and a plain off-white background. No labels, logos or decorative text.

## Pricing

Choose Standard for per-image billing or Official for token billing. The rates below come from the generator’s live catalogue; a fresh character reference sheet or correction is a new paid request.
Top up once and use your balance as needed. Failed requests are not charged; a finished character reference sheet is a completed generation, even when its creative details need another pass.
Current rates: https://seedrouter.ai/tools/ai-character-reference-sheet-generator#pricing

## Questions

### Is the AI character reference sheet generator free?

Read the prompts, choose a preset and inspect the settings before generating. Creating a character reference sheet uses your SeedRouter balance; check the displayed price before submission. Changing a preset costs nothing, while a new render or correction is another paid request.

### Can I make a character reference sheet from one image?

Yes: add a clear image and explain what to keep. It can guide the visible face and outfit in your character reference sheet, while unseen details remain an interpretation. Add another angle or describe the back of the clothing when those details matter.

### Do four views mean four paid images?

The four-view preset asks for four panels inside one image. Start with an image count of one for a single character reference sheet; a higher count requests more complete outputs and increases the estimate. Inspect the returned views before approving the board.

### What size should a character reference sheet be?

Choose a landscape canvas for body views or a layout suited to your expression grid. The form starts at auto; even a large character reference sheet can contain small faces. Request a separate close-up when facial detail matters more than seeing every angle together.

### Can I download each view separately?

Download the complete image or images returned by the model. Crop a view from your character reference sheet in an image editor, or request it separately with the approved reference. Keep the original board for comparison while preparing your next shot.

### Will the character stay identical in a video?

A checked character reference sheet communicates the face and outfit you want, but identity can change between generated frames or shots. Use the next model’s supported reference format and inspect a short result first. Keep the approved master and repeat its defining traits in later scenes.

## Model integration

This tool uses presets over the models below; the tool name is not an API model ID. The references describe each model’s full contract. Use the scene prompt and inputs above for this workflow; the reference examples illustrate general API usage. Browser-only steps are described separately above.
Use an API key from https://seedrouter.ai/apikeys as Authorization: Bearer $SEEDROUTER_API_KEY. Store the key on your server.

## Current model rates

Rates use the same source and one-minute refresh interval as the model pages. All amounts are in USD. Unavailable rates must not be interpreted as free usage.

### gpt-image-2-5

Model IDs: `gpt-image-2.5-flare`, `gpt-image-2.5-sunburst`, `gpt-image-2.5-flare-official`, `gpt-image-2.5-sunburst-official`. [Model page](https://seedrouter.ai/models/gpt-image-2-5).

Current rates are temporarily unavailable. No price estimate is provided; unavailable rates must not be interpreted as free usage.

## API reference: gpt-image-2-5

- [Markdown](https://seedrouter.ai/docs/gpt-image-2-5.md)
- [OpenAPI request and response schemas](https://seedrouter.ai/docs/gpt-image-2-5.openapi.json)

GPT Image 2.5 accepts a text prompt and optional reference images. Submit once, keep the returned task ID, and check that task for the finished images. It ships as two models that read the same parameters: **Flare** for everyday work and **Sunburst** when edit precision matters most.

## Model IDs

| Model ID                          | Tier                                                         | Channel  |
| --------------------------------- | ------------------------------------------------------------ | -------- |
| `gpt-image-2.5-flare`             | Flare: the default choice for most applications              | Standard |
| `gpt-image-2.5-sunburst`          | Sunburst: most capable, tighter control across edits, slower | Standard |
| `gpt-image-2.5-flare-official`    | Flare                                                        | Official |
| `gpt-image-2.5-sunburst-official` | Sunburst                                                     | Official |

All four IDs accept the same parameters. The channels differ in billing; see the [model page](https://seedrouter.ai/models/gpt-image-2-5#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": "gpt-image-2.5-flare",
    "prompt": "An amber glass bottle on a cream background, studio lighting",
    "size": "1024x1024",
    "quality": "low"
  }'
```

```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": "gpt-image-2.5-flare",
        "prompt": "An amber glass bottle on a cream background, studio lighting",
        "size": "1024x1024",
        "quality": "low",
    },
    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: 'gpt-image-2.5-flare',
    prompt: 'An amber glass bottle on a cream background, studio lighting',
    size: '1024x1024',
    quality: 'low',
  }),
});
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": "gpt-image-2.5-flare",
      "prompt": "An amber glass bottle on a cream background, studio lighting",
      "size": "1024x1024",
      "quality": "low"
    }`)
    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 same endpoint handles generation, reference edits, and masked edits. The response contains a task ID, not the finished image. Keep API keys in server-side code.

## Parameters

| Name                 | Type      | Required | Default        | Notes                                                                                |
| -------------------- | --------- | -------- | -------------- | ------------------------------------------------------------------------------------ |
| `model`              | string    | Yes      | —              | One of the four model IDs above.                                                     |
| `prompt`             | string    | Yes      | —              | Nonblank; up to 32,000 characters.                                                   |
| `images`             | object\[] | No       | —              | 1–16 objects shaped as `{"image_url":"https://..."}`; adding images selects editing. |
| `mask`               | object    | No       | —              | `{"image_url":"https://..."}`; requires `images`.                                    |
| `size`               | string    | No       | `auto`         | `auto` or `WIDTHxHEIGHT`, subject to the rules below.                                |
| `quality`            | enum      | No       | `auto`         | `auto`, `low`, `medium`, `high`, `xhigh`, `max`.                                     |
| `background`         | enum      | No       | `auto`         | `auto`, `opaque`, `transparent`.                                                     |
| `output_format`      | enum      | No       | `png`          | `png`, `jpeg`.                                                                       |
| `output_compression` | integer   | No       | `100` for JPEG | 0–100; send only with `jpeg`. Zero is valid.                                         |
| `n`                  | integer   | No       | `1`            | 1–10 images.                                                                         |
| `moderation`         | enum      | No       | `auto`         | `auto`, `low`.                                                                       |
| `user`               | string    | No       | —              | Optional application end-user identifier. Avoid personal information.                |

### Size rules

Common choices are `1024x1024`, `1536x1024`, and `1024x1536`. Custom dimensions must satisfy every rule:

* Width and height are multiples of 16.
* Neither edge exceeds 3840 pixels.
* The aspect ratio is between 1:3 and 3:1.
* Total area is between 655,360 and 8,294,400 pixels, inclusive.

`auto` leaves the output dimensions to the model. Do not send aspect ratios such as `16:9` as `size`.

The Playground offers Auto, Ratio and Custom controls. Ratio mode combines an aspect ratio with a 1K, 2K or 4K pixel-budget preset, then sends only the resulting `size`. These are UI presets, not separate API parameters: do not send `resolution` or `aspect_ratio`. For example, 16:9 + 4K sends `size: "3840x2160"`; 9:16 + 4K sends `"2160x3840"`; 1:1 + 2K sends `"2048x2048"`. Rounding and the edge limit can reduce the pixel count for a selected tier. The exact dimensions are shown before submission.

OpenAI describes resolutions above 2560×1440 as experimental. They are accepted within the limits above; higher resolution is not a guarantee of better detail.

### Quality tiers

`xhigh` and `max` are new in GPT Image 2.5; GPT Image 2 stops at `high`. Higher tiers take longer to render and, on token-billed IDs, consume more output tokens. Measured at 1024x1024, one render reported 196, 439, 1,756, 3,122 and 7,024 output tokens for `low`, `medium`, `high`, `xhigh` and `max`. These are observed samples, not guarantees: usage also depends on size and content.

Use `low` for drafts and compare results before choosing a higher tier. `auto` lets the model choose; it does not guarantee a particular tier or cost.

### Transparent backgrounds

Transparency is supported for GPT Image 2.5. For a transparent background, set `background: "transparent"` and use PNG. JPEG does not support transparency. Compression applies only to JPEG.

`user` is available for API integrations but is not shown or automatically populated in the Playground.

Optional scalar settings (`n`, `size`, `quality`, `background`, `output_format`, `output_compression`, `moderation`) accept `null` as omission. Unknown fields are rejected. `input_fidelity` is not a GPT Image 2.5 parameter. `style` and `response_format` belong to other image models and are not accepted here.

## Modes

There is no separate mode parameter or editing endpoint to choose.

| Operation      | Parameters                   |
| -------------- | ---------------------------- |
| Text to image  | `prompt`                     |
| Reference edit | `prompt` + `images`          |
| Masked edit    | `prompt` + `images` + `mask` |

### Edit reference images

```bash
curl https://api.seedrouter.ai/v1/images/generations \
  -H "Authorization: Bearer $SEEDROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-image-2.5-flare",
    "prompt": "Make the bottle blue. Preserve the composition and lighting.",
    "images": [{"image_url": "https://example.com/reference.png"}],
    "mask": {"image_url": "https://example.com/mask.png"},
    "output_format": "jpeg",
    "output_compression": 90
  }'
```

Replace both example URLs with your own accessible images. Omit `mask` for a reference edit without a selected region.

## Media inputs

This API accepts URL references only. OpenAI Files IDs, base64 data URLs, and multipart uploads are not accepted. The Playground uploads selected files to storage before submitting their URLs.

Reference images must be public HTTP(S) URLs pointing to PNG, JPEG, or WebP files smaller than 50 MB each. A mask must be a PNG smaller than 4 MB, with the same dimensions as the first reference image; its transparent area marks what to edit. A mask guides the model and does not guarantee pixel-perfect boundaries. For multiple references, the mask applies to the first image. URL media is validated during processing; invalid or inaccessible media can produce a failed task.

The Playground uploads selected files and submits their URLs. API requests use JSON URL objects: do not send file bytes, base64, `data:` URLs, `blob:` URLs, or multipart form data.

## Pricing dimensions

Check the [model pricing section](https://seedrouter.ai/models/gpt-image-2-5#pricing) for current rates. Standard IDs charge one flat price per delivered image, whatever the quality, size, or prompt. On Official IDs, the final cost depends on input and output usage: quality, output dimensions, reference images, prompt length, and image count can all affect it.

The Playground estimate uses a measured sample and current rates; it is not a guaranteed quote. View final charges in your account usage history. Failed tasks are not charged.

## Output schema

Submission returns a task reference:

```json
{
  "id": "task_...",
  "model": "gpt-image-2.5-flare",
  "status": "processing",
  "created_at": 1789970508
}
```

### Poll the task

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

Poll at a modest interval, such as every three 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.

### Complete polling example

Run this after the Python submission example above. It uses the returned `task_id` and waits up to ten minutes. Reaching this local deadline stops polling only; retain the ID and resume querying the same task.

```python
import time

print(f"Task ID: {task_id}")
deadline = time.monotonic() + 600
while time.monotonic() < deadline:
    result = requests.get(
        f"https://api.seedrouter.ai/v1/tasks/{task_id}",
        headers={"Authorization": f"Bearer {os.environ['SEEDROUTER_API_KEY']}"},
        timeout=30,
    )
    result.raise_for_status()
    task = result.json()
    if task["status"] == "completed":
        for image in task["output"]["data"]:
            print(image["url"])
        break
    if task["status"] == "failed":
        raise RuntimeError(task["error"]["message"])
    time.sleep(3)
else:
    raise TimeoutError(f"Still waiting. Resume polling task {task_id}.")
```

### Completed task

A completed task returns hosted image URLs and usage:

```json
{
  "id": "task_...",
  "model": "gpt-image-2.5-flare",
  "status": "completed",
  "created_at": 1789970508,
  "finished_at": 1789970538,
  "output": {
    "created": 1789970532,
    "data": [{"url": "https://static.seedrouter.ai/media/tasks/task_example/0.png"}],
    "usage": {
      "input_tokens": 29,
      "output_tokens": 196,
      "total_tokens": 225
    }
  }
}
```

| Field                       | Meaning                                                                                       |
| --------------------------- | --------------------------------------------------------------------------------------------- |
| `id`                        | Keep this ID for subsequent queries.                                                          |
| `status`                    | `processing`, `completed`, or `failed`.                                                       |
| `created_at`, `finished_at` | Unix timestamps in seconds; completion time is unset or zero while processing.                |
| `output.data[].url`         | Generated image URLs, available on completion.                                                |
| `output.size`               | Actual output dimensions, when reported.                                                      |
| `output.quality`            | Actual quality tier, when reported.                                                           |
| `output.background`         | Actual background, when reported.                                                             |
| `output.output_format`      | Actual image format, when reported.                                                           |
| `output.usage`              | Reported token usage, when available. Detail objects may contain text and image token counts. |
| `error`                     | Structured error on a failed task.                                                            |

This API uses asynchronous task delivery. It is not a synchronous Images SDK replacement; `stream` and `partial_images` are not supported.

## Errors

Requests rejected before a task is created return an HTTP error with an `error` object. 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. All model APIs use the same error envelope.

```json
{
  "id": "task_...",
  "status": "failed",
  "error": {
    "code": 60002,
    "message": "Generation could not be completed. Please try again."
  }
}
```

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

## Tips

* Describe materials, composition, and lighting in the prompt.
* For an edit, specify both the change and what should remain unchanged.
* Use a mask when only a selected area should change.
* Save returned images to your own storage when you need a durable copy.

## Related

* [GPT Image 2.5 Playground and pricing](https://seedrouter.ai/models/gpt-image-2-5)
* [Download OpenAPI](https://seedrouter.ai/docs/gpt-image-2-5.openapi.json)
* [Copyable Markdown](https://seedrouter.ai/docs/gpt-image-2-5.md)

## More resources

- [Task lifecycle](https://seedrouter.ai/docs/api/tasks.md)
- [Error catalog and retry guidance](https://seedrouter.ai/docs/api/errors.md)
- [Account usage](https://seedrouter.ai/usage)
- [All tools and models](https://seedrouter.ai/llms.txt)
- [Documentation index](https://seedrouter.ai/docs/llms.txt)
