---
title: Credits and what they cost
description: What costs credits in invideo, what is free, how to see the price before you spend, and where to check your balance.
---
Credits pay for AI work in invideo: generation, transcripts and paid stock. Edits and exports are free. Your agent runs a dry run first and tells you the price before it spends anything.

This is the one page on money. For how credits work, start with the <a href="https://invideo.io/help/billing/how-do-credits-work/" target="_blank">credits FAQ</a>. Per-model prices are on the <a href="https://invideo.io/help/billing/video-model-pricing/" target="_blank">video</a>, <a href="https://invideo.io/help/billing/image-pricing/" target="_blank">image</a> and <a href="https://invideo.io/help/billing/audio-pricing/" target="_blank">audio</a> pricing pages, and in `find_models`. Top-ups are on the <a href="https://invideo.io/help/billing/extra-credits/" target="_blank">extra credits page</a>. Plan prices are on the <a href="https://invideo.io/pricing" target="_blank">invideo pricing page</a>. For one specific call, the dry run is the price. Do not infer pricing from anywhere else.

```json
{ "tool": "generate", "arguments": {
  "url": "<page-url>", "model": "<model-id>",
  "inputs": { "prompt": "slow push on the bottle" },
  "dry_run": true } }
```

## What costs credits

These actions spend credits from the workspace you work in.

- **Generation.** `generate` runs a model for video, images, audio or 3D. The price depends on the model and its inputs, such as length and resolution.
- **Transcripts.** `media` with `audio.transcript`. Only the call that starts a transcript costs credits. Later calls on the same file to read the words cost nothing.
- **Model ops in `media`.** `audio.separate`, `audio.clean`, `video.upscale`, `image.upscale`, `video.removeBackground` and `image.removeBackground` run a model and cost credits. Upscales charge by the length of the source.
- **Paid stock.** `add_media` with `stock` places a stock result and charges its cost. For iStock, that is one of the workspace's iStock licenses. For other paid stock, it is a small credit charge.
- **Agent Two in the invideo app.** Agent Two's work and the media it makes use credits. An outside agent edits for free and pays only for generation, transcripts and paid stock. An outside agent's own chat, such as Claude or ChatGPT, runs on that app's plan.

## What is free

These actions cost nothing. Your agent can use them as often as it needs.

- Every timeline edit, by your agent with `edit_timeline` or by you in invideo Editor.
- Every `export`: a video, its sound, a still, or an editable project.
- Reads: `read`, `get_timeline`, `inspect_objects`, `capture`, `check_timeline`, `timeline_catalog`.
- Price and model lookups: `find_models` and `get_model`.
- Stock search with `search_library`, and a closer look at a stock result with `media`.
- Looking at and listening to a file with `media`: `metadata`, `video.frames`, `audio.waveform`, `audio.loudness`, `audio.content`, `audio.onsets`, `audio.markers`, `audio.key`, `audio.sections` and `audio.beats`.
- Bringing your own files in with `add_media` or `start_upload`, and importing from Google Drive.
- Drawing in `/sketch`. Asking Agent Two to work from the drawing uses credits.

`document.pages` and the tool ops in `media` that make a new file without a model, such as `video.trim`, `video.loop`, `image.crop` and `video.stitch`, can show a charge. The dry run shows its price before anything starts.

## See the price first

Every call that can cost credits takes two fields. Use both, every time.

- `dry_run: true` checks the inputs and returns the price. Nothing starts and nothing is spent.
- `max_credits` is the most the call may cost. Nothing starts when the price is higher. `generate` needs it unless it is a dry run. `media` needs it on any op that costs.

Run the dry run before the first paid call. Then tell the person the price, and start the real call with `max_credits` set to that price.

<Steps>
<Step title="Find the model and its price">
Your agent calls `find_models` with a query. Each model comes back with its id and its price per generation, per second or per other unit. It sees a list of models with prices.
</Step>
<Step title="Read the inputs">
Your agent calls `get_model` with the model id. It sees the input names it must fill. This call is free.
</Step>
<Step title="Price the exact call">
Your agent calls `generate` or `media` with `dry_run: true` and the real inputs. It sees the price, and an error if an input is wrong. Nothing is spent.
</Step>
<Step title="Tell the person">
Your agent runs a dry run first. For any call that costs 1 credit or more, it tells you the price and waits for your yes. A call under 1 credit runs without asking, and your agent tells you what it cost.
</Step>
<Step title="Run it with a cap">
Your agent sends the same call without `dry_run` and with `max_credits`. It also passes an `idempotency_key`, so a retry after a timeout finds the first job and does not pay twice. It sees a thread URL at once.
</Step>
</Steps>

In a terminal, the same flags are on the commands that cost.

```bash
invideo gen models <project-url> --query "product video"
invideo gen model <project-url> --model <model-id>
invideo gen run <page-url> --model <model-id> --dry-run \
  -i prompt="slow push on the bottle"
invideo gen run <page-url> --model <model-id> --max-credits <price> \
  --idempotency-key <key> -i prompt="slow push on the bottle"
invideo media audio.transcript <sequence-url> --dry-run
invideo media video.upscale <sequence-url> --dry-run
```

Where each value comes from:

- `<project-url>` comes from `invideo project new`. `<page-url>` is a notebook page, from `invideo notebook new-page <project-url>`, or a page listed by `invideo notebook show <project-url>`.
- `<model-id>` is an id from `invideo gen models`, checked with `invideo gen model`.
- `<price>` is `estimated_credits` in the dry run's answer. Pass the same inputs on both runs.
- `<key>` is any text unique to this run. Reuse it on a retry.
- `<sequence-url>` is the file's URL, `…/notebook/seq-N.M`, from `invideo asset upload`. Paid `media` ops refuse a bin asset (`--asset`), so pass the sequence URL.

When the pricing says the price is an estimate, the final charge can end above it. `max_credits` caps the estimate, not the final charge. Tell the person when a price is an estimate.

## See your balance

Your agent can check the credits left before and after paid work.

- **MCP.** `current_user` returns who is signed in and the credits left in the connection's default workspace.
- **CLI.** `invideo auth status` prints the same, with the credits left.
- **In the app.** Open your profile menu (your picture in the top right corner). It shows the credits left in the workspace, with **Top up credits** next to it. **Usage** shows credits, iStock and storage used this month. In a project, the project menu has **Project Usage** for that project's total.

```bash
invideo auth status
```

## When credits run out or reset

A call that needs more credits than the workspace has is refused before it starts. In the CLI this is exit code 5, "a limit: credits or quota". Your agent stops and tells you. It does not retry.

- **Plan credits.** On an active plan, credits and iStock reset each month on the date and time your plan started, in UTC. Unused plan credits do not roll over.
- **Extra credits.** You can buy extra credits without changing your plan. They expire after a set period, or when your plan ends, whichever comes first.
- **Plan ends.** When a plan ends, its credits do not carry over.

See [Plans](/account/plans) for what changes by plan, and [Refunds and cancellation](/account/refunds) for credits after you cancel.

## Safety holds and confirmations

A paid job can stop before it finishes. It does not charge again while it waits. Your agent follows it with `read` or `status`, and never calls `generate` again to check on it.

| Status or exit code | What it means | What to do |
| --- | --- | --- |
| `held` | A safety review is running. It is not over. | Wait and read again later. |
| Exit code 6 | A safety review holds the CLI job. It is not a refusal. | Wait, then run `invideo status` again. Do not resend. If it ends `failed`, change the input the review flagged. |
| `needs_confirmation` | Only the person can confirm it, in invideo. | Send the person the URL to confirm. |
| Exit code 8 | The CLI job needs the person's confirmation. | Stop and ask the person. |
| `refused` | Nothing took effect. Nothing was spent. | Read `message` and fix the call once. |

## If something goes wrong

Most cost problems come from a missing dry run or a resent call.

| Symptom | Fix |
| --- | --- |
| The call is refused for a price above `max_credits`. | Run the dry run, tell the person the price, then send it with a higher cap. |
| `generate` is refused without `max_credits`. | Add `max_credits`, or set `dry_run: true` to price it. |
| A generation timed out and the agent wants to send it again. | Avoid a new call. Instead, resend with the same `idempotency_key`, or `read` the thread URL. |
| The agent calls `audio.transcript` again to get the words. | This is correct. Only the first call spends credits. |
| Exit code 5 in the CLI. | Stop. Tell the person the workspace is out of credits or quota. |
| The price looks different from the pricing page. | Trust `find_models` and the dry run for that call. |

## Related

- [Know the cost before you spend](/how-to/cost-before-you-spend)
- [Plans](/account/plans)
- [Refunds and cancellation](/account/refunds)
- [Models](/reference/models)
- [MCP tools](/reference/mcp-tools)
- [Exit codes](/reference/exit-codes)