# Sixio models

> Original: https://api.6io.io/en/docs/sixio/ (HTML). All pages: https://api.6io.io/llms.txt

The `sixio` group opens the 6io image and video models: Seedance, Kling, Grok Imagine, WAN, LTX-2, HappyHorse, MiniMax, PixVerse, Nano Banana, GPT Image, Flux, Qwen Image, Seedream and others. These are the same generations as on the 6io site: the same parameter checks and the same price.

A model name is `sixio/<name>`, for example `sixio/flux-3/klein-text-to-image`. Generation runs as tasks: you submit a task, poll the status and collect the result. The addresses start with `https://api.6io.io/native/sixio`, the authorization is the same: `Authorization: Bearer sixio_sk_...`.

Every model has its own page: the `input` fields, the values the model sets itself, files, an example and what the price depends on. These pages are meant for AI agents; the list is at `https://api.6io.io/md/en/sixio-models.md`. The live catalog with prices is `GET /native/sixio/models`.

## A full example

```python
import time
import requests

API = "https://api.6io.io/native/sixio"
H = {"Authorization": "Bearer sixio_sk_..."}

# 1. submit the task
task = requests.post(f"{API}/tasks", headers=H, json={
    "model": "sixio/flux-3/klein-text-to-image",
    "input": {"prompt": "a red circle on a white background", "aspectRatio": "1:1", "resolution": "1K"},
}).json()

# 2. wait for the end
while True:
    state = requests.get(task["status_url"], headers=H).json()
    if state["status"] in ("succeeded", "failed"):
        break
    time.sleep(3)

# 3. collect the files
if state["status"] == "succeeded":
    print(state["result"]["urls"])
else:
    print(state["error"]["message"])
```

If the input does not fit (`422 invalid_input` with a reason) or there is not enough money (`402 insufficient_funds`), the task is not created: an error comes instead of `status_url`, and nothing is charged. The error codes are in [Errors and limits](https://api.6io.io/md/en/errors-and-limits.md).

## The catalog

```bash
curl "https://api.6io.io/native/sixio/models" -H "Authorization: Bearer sixio_sk_..."
```

For every model the answer has:

- `id`, the name for a request (`sixio/...`), and `kind`, `image` or `video`;
- `example_input`, an example of the `input` field where there is one;
- `price`, the model's price in advance, in credits: `unit` is what the price is set for (`per image`, `per second`, `per video`), `from` and `to` are the lowest and the highest price in that unit, `options` is the price by variant (resolution, length, sound).

`price` is for reference. The price charged is the 6io price for your exact input (length, resolution, sound, number of images) with the group markup. The input fields of each model, their types and an example call are visible in the console: open the model on the Models tab.

## The input fields

`input` holds the generation parameters in the form 6io accepts for this model. Field names are camelCase: `aspectRatio`, `imageUrls`, `referenceImageUrls`, `audio` and so on. Files are passed as public `http(s)` links.

- Some fields are set by the model itself and cannot be overridden. For example, for `sixio/bytedance/seedance-2-fast` the `quality` tier is always `fast`, and for `sixio/nano-banana-pro` the `model` field is that model.
- To edit a picture with Flux 3 Klein or Qwen Image 2.1, send the same model (`sixio/flux-3/klein-text-to-image`, `sixio/qwen2-1/text-to-image`) with the source pictures in `sourceImageUrls`.
- Extending and upscaling a clip (`sixio/grok-imagine/extend`, `sixio/grok-imagine/upscale`, `sixio/pixverse-v6/extend`) take the source in the `originalVideoId` field. It holds the `id` of your earlier finished sixio task, a string like `req_…` (a number will not do). A foreign or wrong ID answers `422 invalid_input`.
- The length of video and audio for the price is measured by the server. Fields where a client could name it itself are not accepted: `inputVideoSeconds` of Seedance and MiniMax H3 and `durationHint` of Kling Avatar give `400 unsupported_parameter`. For Kling Motion the `videoDuration` field is required; give any number from 3 to 30: it is ignored.

Wrong values are refused at once with `422 invalid_input` and a reason. No money is reserved then.

## Files by link

Images, audio and video are passed as public `http(s)` links. Where the file itself sets the price (the length of a video or audio), we do not trust the link: we download the file, check it and work with a copy from then on. These are the fields:

- `referenceVideoUrls` of Seedance 2, Seedance 2.5 and MiniMax H3;
- `videoUrl` of `sixio/happyhorse/video-edit`;
- `imageUrl` and `videoUrl` of `sixio/kling-2.6/motion-control`;
- `imageUrl` and `audioUrl` of `sixio/kling/ai-avatar-standard` and `sixio/kling/ai-avatar-pro`.

An example for Kling Motion:

```json
{
  "model": "sixio/kling-2.6/motion-control",
  "input": {
    "prompt": "The character dances",
    "imageUrl": "https://example.com/character.png",
    "videoUrl": "https://example.com/motion.mp4",
    "orientation": "video",
    "mode": "720p",
    "videoDuration": 5
  }
}
```

The rules:

- The link must lead to a public address and return the file with a 200 answer without a login. Your own server, cloud storage or a link from the result of an earlier sixio task will do. Addresses in private networks are not accepted.
- Size: an image up to 10 MB, a video up to 100 MB, audio up to 50 MB. Video is MP4, MOV or WebM, an image is JPG, PNG or WebP. If the link has no extension, the format is taken from the content or the `Content-Type` header.
- The field takes no more links than the model accepts: up to 3 video references for Seedance 2 and MiniMax H3, up to 10 for Seedance 2.5. For MiniMax H3 their total length is up to 15 seconds, longer is `422 invalid_input`.
- A link to a file that already lies on a 6io server (for example, uploaded on the site) is passed as it is, without a copy. Only a file of your own account is accepted.
- The copy stays with us for 15 minutes at most and is deleted as soon as the task ends (done or failed). You do not get a link to the copy. On a retry send the original link.
- The file is downloaded before the money is reserved. If the link did not open, the file did not fit or is too big, the `422 invalid_input` answer names the field and the reason, and no money is reserved.
- An account can hold a limited number of copies at the same time (12 files and 300 MB by default). Above that the answer is `429 rate_limit_exceeded`: retry when the running tasks end.

## Submitting a task

```bash
curl -X POST "https://api.6io.io/native/sixio/tasks" \
  -H "Authorization: Bearer sixio_sk_..." \
  -H "Content-Type: application/json" \
  -d '{"model": "sixio/flux-3/klein-text-to-image", "input": {"prompt": "a red circle on a white background", "aspectRatio": "1:1", "resolution": "1K"}}'
```

Three fields are allowed in the body: `model`, `input` and an optional `webhook_url`, the address where we report the end of the task so that you need not poll the status ([webhooks](https://api.6io.io/md/en/webhooks.md)). Other fields are not accepted. The answer:

```json
{
  "id": "req_8fK2xQ1mZpVwT9sJdL4nAg",
  "object": "task",
  "model": "sixio/flux-3/klein-text-to-image",
  "status": "queued",
  "status_url": "https://api.6io.io/native/sixio/tasks/req_8fK2xQ1mZpVwT9sJdL4nAg"
}
```

The `id` is ours, the task belongs to your account, and nobody else's can be opened. The `Idempotency-Key` header works as in chat: a retry with the same key does not create a second task (see [Retries and failures](https://api.6io.io/md/en/retries.md)).

## Status and result

`GET status_url` shows the state of the task at the moment of the request. The `status` field:

| `status` | Meaning |
| --- | --- |
| `queued` | the task is accepted and waits to start |
| `running` | the task is in progress |
| `succeeded` | done, `result.urls` holds the links to the files (all of them if there are several images) |
| `failed` | the task was not done, the reason is in `error.message` |
| `unknown` | the state could not be read, the money is being checked: ask again later |

The answer also has `created_at`, `finished_at` and `billing` (the state of the money and the charged amount in credits).

**File links lead to our server** and are valid for a limited time, 14 days by default. Download what you need to keep longer: we do not store results.

## Money

1. The price of a task is the 6io price for your input with the group markup. It is reserved on submit. If the available funds are lower, the answer is `402 insufficient_funds`.
2. A finished task charges exactly the reserve.
3. If the task was not done (`fail`), the reserve is returned in full.
4. If the input is refused (`422 invalid_input`) or the service is temporarily unavailable (`503 service_unavailable`), the task is not created and no money is spent.

The number of tasks at the same time is limited. Images and video have their own limit, separate from the chat limit. Details are in [Errors and limits](https://api.6io.io/md/en/errors-and-limits.md).

## Safety filters

Where the model allows it, the provider's own content filters are off, as on the 6io site. The content of a request and its consequences stay your responsibility (see the [terms of use](https://api.6io.io/md/en/terms.md)).
