# Credits and billing

What bills, what never bills, and the receipts your integration can rely on.

The API spends the same credits as the Cliphi app. No seats, no separate API
plan.

## What bills

| Action | Billing |
| --- | --- |
| Submit a job | Processing bills **per video minute**. Credits are reserved at admission and charged when the job completes, exactly once. |
| Render a clip | Billed **per second of finished clip**. The render response states `estimated_credits` before the clip exists. |

## What never bills

- Moment previews (`preview_page_url`): free, unlimited.
- Polling job status.
- The keyless `/api/v1/demo`.
- A render request answered with `status: "already_rendered"`: the existing
  clip comes back free.

## Duplicate protection

`already_running: true` on submit means this video already has a job in
flight and nothing new was charged. Resubmitting a video whose job already
FINISHED starts and bills a new job; confirm with your user first.
`force_new: true` overrides in-flight dedup and always charges; require
explicit user approval.

## Receipts and failure honesty

- Every HTTP error body carries `billed`; it is `false` on all request errors.
- A rendered clip carries `billed_credits`: the receipt.
- A render that fails mid-pipeline makes **no billing claim**: billing runs
  mid-pipeline, so a post-billing failure is possible. Never tell a user
  "nothing was charged" on a failed render; point them at `studio_url` or
  support.
