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

# Pricing and retention

> Understand V1 render charges and result availability.

## Credits

1 credit = \*\*$0.01**. New accounts start with **100 free credits** ($1.00).

Check your balance with [`GET /v1/credits`](/v1/api-reference/credits) or manage billing in the [Viggle Dashboard](https://portal.viggle.ai/dashboard). If an operation can't start because the account has insufficient credit, the API returns `402` with `error.code: "INSUFFICIENT_CREDITS"` — see [Errors and recovery](/v1/production/errors).

## Pricing summary

| Capability | Endpoint | Price |
| - | - | - |
| [Video Remix](#video-remix) | `POST /v1/renders` | **\$0.01 per character per output second** |
| [Character](#character) | `POST /v1/characters` — `type=render` | **\$0.01** each |
| [Character 3D](#character-3d) | `POST /v1/characters` — `type=vsplat` | **$0.30** each (**$0.25** with `enhance=false`) |
| [Motion](#motion) | `POST /v1/motions` (video) — `type=render` | No separate charge |
| [Motion 3D](#motion-3d) | `POST /v1/motions` (video) — `type=glb` | **\$0.05 per source-video second**, rounded up |
| [Text-to-Motion](#text-to-motion) | `POST /v1/motions` (JSON `text`) | **\$0.10** flat |
| [H3 Video](#h3-video) | `POST /v1/videos` | \*\*$0.01 per generated second** ($0.05/sec at `resolution=4k`) |
| [Character Animation](#character-animation) | `POST /v1/videos` (character-animation mode) | **$0.01 per driving-video second**, rounded up (5–16 credits); **$0.11** flat without a driving video |
| [Viggle Image](#viggle-image) | `POST /v1/images` | **$0.01 per image** at `1K`, **$0.02 per image** at `2K` |
| [Import Motion](#import-motion) | `POST /v1/motions/import` | **$0.01 per second** of the template's duration, minimum **$0.01** |

Every other operation — `GET`/`DELETE`/list/export on any resource, and `POST /v1/renders/prepare` — is free.

## Video Remix

[Video Remix](/v1/guides/quickstart-mix) (`POST /v1/renders`) is billed at **\$0.01 per character in the render, per second of finished output**:

```
cost = $0.01 × characters in the render × finished duration in seconds
```

A render today always has exactly one character (`image`, `image_url`, or `character_id` — the API accepts only one character source per render; see [Render Video](/v1/api-reference/renders/create)), so in practice this is **$0.01 per finished second**. For example, a 10-second finished video costs **$0.10 (10 credits)**. The per-character term is stated explicitly so the price is unambiguous if a render ever includes more than one character — it isn't something you can request today.

Billing uses the video's exact finished duration in seconds — fractional seconds are billed fractionally, there is no per-render minimum charge. The amount reserved when the render starts is an estimate based on the requested inputs; it's finalized against the actual completed duration once the render reaches `ready`.

## Character

Creating a reusable [Character](/v1/api-reference/characters/create) with `type=render` (the default) costs **\$0.01 (1 credit)** each, flat — independent of image size or `name`.

## Character 3D

Creating a Character with `type=vsplat` extracts a 3D Gaussian splat instead of (or in addition to) the 2D render:

| `type` | `enhance` | Price |
| - | - | - |
| `vsplat` | `true` (default) | **\$0.30** flat |
| `vsplat` | `false` | **\$0.25** flat |
| `all` (render + vsplat) | `true` (default) | **\$0.31** flat |
| `all` (render + vsplat) | `false` | **\$0.26** flat |

`enhance` only affects the vsplat extraction — it **replaces** the $0.25 price with $0.30 rather than adding a surcharge on top, and is on by default. `type=all` is billed for both outputs it produces (the \$0.01 render plus the vsplat price above). `model_precision`, `joint_set`, and `render_thumbnail` don't change the price. Once ready, download the extraction from [Export 3D Character](/v1/api-reference/characters/export).

## Motion

Creating a reusable [Motion](/v1/api-reference/motions/create) from a directly uploaded or URL-supplied video with `type=render` (the default) has **no separate preprocessing charge** — you're only billed later, when that Motion is used in a Video Remix.

## Motion 3D

Creating a Motion with `type=glb` extracts a 3D skeletal animation instead of (or in addition to) the 2D render, billed by the **source video's duration**:

```
cost = $0.05 × ceil(source video duration in seconds)
```

Any fractional remainder rounds up to the next whole second before the rate is applied — a 0.3-second clip is billed as 1 second ($0.05), and a 10.1-second clip is billed as 11 seconds ($0.55). `type=all` is billed for both the glb extraction above and the (free) 2D render. `enable_smoothing` and `target_fps` don't change the price. Once ready, download both the `mixamo` and `metahuman` skeletons from [Export 3D Motion](/v1/api-reference/motions/export).

## Text-to-Motion

[Create Motion (from Text)](/v1/api-reference/motions/create-from-text) — `POST /v1/motions` with a JSON `text` body — is a **flat \$0.10 (10 credits)** per request, regardless of `duration_seconds`, `guidance_scale`, or `smooth`. This is a distinct price from the per-second [Motion 3D](#motion-3d) `glb` extraction above; a text-generated Motion is always `type: glb` under the hood, but it is not billed by duration.

## H3 Video

[Generate Video](/v1/api-reference/videos/create-from-text) (`POST /v1/videos`) covers all four MiniMax H3 modes — text-to-video, [first-frame](/v1/api-reference/videos/create-from-first-frame), [first-and-last-frame](/v1/api-reference/videos/create-from-first-last-frame), and [reference-video/image](/v1/api-reference/videos/create-from-reference-video) — on one price, driven by `duration_s` and `resolution`:

```
cost = ceil(duration_s) × ($0.05 if resolution == "4k" else $0.01)
```

`duration_s` (5–15, default `5`) is rounded up to the next whole second before the rate is applied. `resolution` (`480p`, `768p`, `1080p`, `2k`, or `4k`, default `768p`) sets the per-second rate — **$0.01/second (1 credit)** at every tier except `4k`, which is **$0.05/second (5 credits)**. `quality` (`low` for faster generation, `high` for higher fidelity) and `aspect_ratio` do **not** change the price — both quality tiers are billed at the same rate for a given resolution. `enhance` (an optional AI prompt-rewrite pass — see [Generate Video (from Text)](/v1/api-reference/videos/create-from-text)) also doesn't affect price. Every generated video includes native audio at no extra cost. Supplying a first frame, last frame, and/or reference video/images costs the same as text-only generation for the same `quality`, `resolution`, and `duration_s`.

## Character Animation

[Using Viggle-Animate](/v1/api-reference/videos/create-from-character-animation) (`POST /v1/videos`, selected by `character_image`/`character_image_url`/`character_image_urls` and an optional `driving_video`/`driving_video_url`) dispatches to a separate backend, billed at 1 credit/second:

```
reserved = ceil(driving video duration in seconds) × $0.01   # with a driving video
reserved = $0.11                                             # images only, no driving video
charged  = min(ceil(finished video duration) × $0.01, reserved)
```

* **With a driving video**, the service measures the driving video at submission and reserves **5–16 credits ($0.05–$0.16)**. The 5–15 second duration check truncates to whole seconds first, so a 15.9-second clip is accepted and reserves 16 credits.
* **Without a driving video** (images only), there's nothing to measure, so every request reserves a fixed **11 credits (\$0.11)**.

On `ready`, the charge is settled against the finished video's duration at the same rate, capped at the reservation — settlement only ever refunds, never charges above what was reserved. There's no caller-controlled `duration_s`/`quality`/`resolution`/`aspect_ratio` for this mode. `watermark` does not affect price.

## Viggle Image

[Generate Image](/v1/api-reference/images/create) (`POST /v1/images`) is billed per image, by `resolution`:

```
cost = n × ($0.02 if resolution == "2K" else $0.01)
```

**$0.01 (1 credit) per image** at `1K`, **$0.02 (2 credits) per image** at `2K`, for `n` images (1–6) — for example, `2K` with `n=3` is **\$0.06 (6 credits)**. `aspect_ratio`, `seed`, and reference images don't change the price, even though `2K` with reference images produces a smaller size than text-only `2K`. The whole amount is reserved when the job is created — `402 INSUFFICIENT_CREDITS` if the balance can't cover it, and no generation starts. A job either produces all `n` images and is charged, or fails and is refunded in full, even if some images had already been generated before it failed.

## Import Motion

[Import Motion](/v1/api-reference/motions/import) — `POST /v1/motions/import` — copies a Viggle motion template into your account as your own reusable Motion. It's billed at **$0.01 per second** of the source template's duration, with a minimum of **$0.01 (1 credit)**. This is unrelated to the Video Remix, Motion, and Motion 3D prices above — it doesn't process any media of yours, it only clones an existing template.

## Credit reservation and settlement

Every billable operation reserves credits **when the asynchronous task is created**, using an estimate (for Video Remix, the requested/expected duration; for Character Animation, the driving video's measured duration or the flat images-only amount; for everything else, the price is already fixed at request time). That reservation is then settled once the task reaches a terminal state:

* **`ready`** — the reservation is settled to the final price (for Video Remix, refined against the actual completed duration; for Character Animation, refined against the finished video's duration but never above the reservation; for everything else, unchanged from the initial reservation). This is the only outcome that results in a net charge.
* **`failed`** or **`cancelled`** — the reservation is released and **no credits are charged**. `cancelled` only applies to Renders and is not client-triggerable (see [Async jobs and result availability](/v1/production/async-jobs)), but it's treated the same as `failed` for billing.
* **Retrying** after a `failed`/`cancelled` outcome means submitting a new request. That new request opens its own, independent reservation — you are not double-charged for the earlier unsuccessful attempt, since it never settled.

<Note>
  This reservation/settlement behavior mirrors what the Legacy extraction endpoints documented explicitly ("reserved on create, settled on success, refunded on failure"). If your integration observes different behavior for a specific V1 resource, check `error.code` and `request_id` and contact support.
</Note>

## Result retention

Signed output URLs — `video_url`, `alpha_url`, `vsplat_url`, `thumbnail_url`, a Motion export's `mixamo_url`/`metahuman_url`/`metahuman_body_url`, and a generated image's `images[].url` — are valid for **1 hour** from the moment they're issued, and are **re-signed with a fresh 1-hour window** every time you read the endpoint that returns them (for example, re-fetching [Get Video](/v1/api-reference/videos/get), or calling [Export 3D Character](/v1/api-reference/characters/export) / [Export 3D Motion](/v1/api-reference/motions/export) again, or re-fetching [Get Image](/v1/api-reference/images/get)).

Generated images are deleted **24 hours after the job finishes**. After that, [Get Image](/v1/api-reference/images/get) still returns the job, but every `images[].url` is `null` — download images within that window.

Don't cache a URL past the hour — a request against an expired one fails with `RESULT_EXPIRED` (`400`). Download completed output promptly and store it in your own system for anything beyond quick testing; if you need a link again later, re-request the same export/download/get endpoint for a freshly signed one rather than reusing the old URL. See [Errors and recovery](/v1/production/errors).

## Failed jobs

If a job fails, inspect its `error` object — `code`, `retryable`, and `remediation` in particular. Do not assume a failed request created a usable output. See [Errors and recovery](/v1/production/errors).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.