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

# Metering & pricing

> What a call costs, what's never billed, and where the cheap rate actually applies.

<Note>
  This page covers the **API** (pay as you go). Using the **Cue app**? That is sold as monthly
  credit plans, Creator, Pro and Studio, plus custom Enterprise. See
  [pricing](https://cue.vibeset.ai/pricing).
</Note>

You pay for analyzing a video once, when you add it, and for the calls you make against it. No
monthly minimum.

| Call                                                               | Price                       |
| ------------------------------------------------------------------ | --------------------------- |
| Analysis, per minute of video, charged when you add it             | \$0.06 per minute           |
| Match, a shortlist for an analyzed video (`POST /v1/match`)        | \$0.005 per call            |
| Underscore, music for a script (`POST /v1/underscore`)             | \$0.05 per call             |
| Beat mapping, a beat and downbeat grid (`POST /v1/beats`)          | \$0.008 per minute of audio |
| Sync, first call for a video and track together (`POST /v1/align`) | \$0.01 per call             |
| Sync, any later call for that same pair                            | \$0.001 per call            |
| Loop, first call for a video and track together (`POST /v1/loop`)  | \$0.014 per call            |
| Loop, any later call for that same pair                            | \$0.001 per call            |

Video and audio minutes both round up, with a one-minute floor.

## The cheap rate is not "once per track"

Loop is strictly per pair. The plan cache is keyed on `(video_id, track_source, track_key)` and
there is no track-level fallback, so preparing a track for one video buys you nothing on the next.
Fanning one track across ten videos is ten calls at the higher rate, and fanning ten tracks across
one video is also ten calls at the higher rate.

Sync has one escape hatch. `POST /v1/align` is cheap when Cue already holds sync points for that
exact pair, and also when it holds both profiles it would need to score them in memory: the video's
sync profile and the track's audio profile. The audio profile is built the first time you align
that track against anything, and the video's profile is warmed in the background after ingest.

That background warm is best-effort and swallows its own failures. When the video's profile is
missing, the call is cold and bills \$0.01, however many times you have aligned that track before.

Sizing a batch, multiply the higher rate by the number of distinct pairings rather than by the
number of tracks.

## A cold call comes back as a job

A cold `/v1/align` or `/v1/loop` cannot finish inside the gateway's 29-second budget, so it
returns `202` with a `job_id` and a poll URL rather than a result:

```json theme={null}
{ "video_id": "…", "track_id": "14792", "status": "processing", "job_id": "…", "poll": "/v1/loop/jobs/…" }
```

The job bills once, when it completes, whether or not you ever poll it. A warm call returns `200`
with the plan or the sync points directly, and `cached: true` on an align response tells you which
one you got.

Expect a job on your first call for a new pairing. Retrying that request with the same
`Idempotency-Key` returns the original job rather than starting a second one, so a timeout on your
side cannot bill the cold rate twice. Polling the URL you already have is still faster.

## Analysis and match

Analysis is billed once, when a video is ingested. Cue analyzes the whole clip and prices it per
minute of its length. One engine, one rate. Every match against that video afterwards is the flat
match price, however many times you run it.

Sync points embedded in a match (`include_sync: true`) are included in the match price. They are a
cache-only read, so a track whose points are not yet cached comes back with an empty `sync_points`
array and `sync_status: "warming"` rather than a billable alignment. Expect that on a first match
against a new video. Cue kicks a background warm, and a later match on the same video returns
`sync_status: "warm"` with the points filled in.

## Underscore

[Underscore](/docs/underscore) matches music to a script. There is no video to ingest, so there is no
analysis charge, just one flat rate per call. The shortlist is a fixed size, so there is no
quantity to move the price. A call that returns no tracks bills nothing.

Nothing about a script is stored or analyzed ahead of time, so a second call for the same script
costs the same as the first.

## What is never billed

<Check>Failed calls. If a match errors out, you pay nothing.</Check>
<Check>A loop that comes back `applicable: false`, because no loop was delivered.</Check>
<Check>Polling. `GET /v1/videos/{id}` and the job endpoints are free.</Check>

## Where the spend lands

Usage is written to a ledger the moment a call succeeds, and shown in the
[developer portal](https://cue.vibeset.ai/developer) as this month's spend and a per-day
breakdown.

Card-billed accounts are provisioned with a \*\*$100 monthly spend cap** (invoiced accounts are set
up without one). Live calls stop with a `402` naming the cap once the calendar month's ledger total
reaches it. Raise it under Billing in the console before a large batch, or lower it if $100 is more
exposure than you want.

## Paying

Add a card for pay as you go, billed monthly. High volume? We can invoice you instead,
[talk to us](mailto:sales@vibeset.ai).
