> ## 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.

# Changelog

> Changes to the Cue API, newest first.

<Update label="August 2026" description="new product">
  **Beat mapping is now its own endpoint, `POST /v1/beats`.**

  * Send a track, get every beat and every downbeat. The downbeat is the first beat of each bar,
    and it is what decides whether an edit lands musically right. \$0.008 per minute of audio,
    billed once, one-minute minimum, rounded up. A failed job bills nothing.
  * Async by design. Every request returns `202` and a job id you poll at `GET /v1/beats/{job_id}`.
    Beat mapping is real compute on real audio, and we would rather queue a 10-minute track than
    time out on it.
  * It runs our own model, which places and holds the downbeat more accurately than the strongest
    published open model: **0.754 against 0.733** downbeat CMLt on GTZAN, held out of our training.
  * Trained on a substantially expanded body of East Asian popular and rhythm-game music on top of
    the public research corpora, which are overwhelmingly Western. Anime and tie-in tracks, rock,
    pop and fast rhythm-game repertoire are where it shows. See [Beat mapping](/docs/beats).
</Update>

<Update label="August 2026" description="tempo range">
  **Very fast and very slow tracks are no longer forced to the wrong tempo.**

  * The decoder searched 55 to 215 BPM. Outside that the right answer was unreachable, so a 240 BPM
    track came back at 120 and a 40 BPM one at 80. Widening the search is worth **+41 points of
    downbeat CMLt** on the 34 GTZAN tracks that sit above 215 BPM, 3.4% of that benchmark. Drum and
    bass, hardcore and much rhythm-game material live up there.
  * The wider search is conditional. It applies only when your `known_bpm`, or the track's own first
    pass, says the track belongs there. Widening for everything costs between 0.29 and 0.83 points
    on the 95% that never needed it, so ordinary songs keep the old window.
  * `known_bpm` now also handles songs that **change** tempo. A window of plus or minus 20% fits one
    tempo, not a verse at 120 and a drop at 180. Roughly one anime or game track in ten cannot fit
    inside such a window at all, so a correct BPM was still ruling out the tempo the song plays for
    half its length. Nothing to change on your side, send the tempo you have.
</Update>

<Update label="August 2026" description="auto-mix">
  **The duck curve is now in the response, and `auto_mix` no longer breaks long videos.**

  * `mix.duck` gains **`envelope_points`**, `[[t_seconds, gain_db], …]`, the actual automation Cue's
    own renderer replays. Interpolate linearly between points and your duck matches the app's
    exactly. Until now the response carried only `depth_db`, `attack_ms` and `release_ms`, and since
    ramp lengths went per-gap those three stopped describing any real move. Anyone rendering from
    them got an audibly cruder mix than Cue's, with pumping on short pauses. They remain, marked
    nominal, for callers already approximating from them.
  * **Breaking:** the dense 40 Hz `envelope_db` array is no longer sent. It was 96% repeated values,
    61.5 KB on a 257 s clip to describe about 390 real instants, and past roughly two minutes it
    pushed an MCP response over the tool-output limit, so `auto_mix: true` *failed the call*.
    `envelope_points` carries the identical curve in about a tenth the space.
  * This is API-wide, not MCP-only. One function builds the `mix` block for REST and MCP alike, so
    `POST /v1/loop` and `POST /v1/align` no longer carry `envelope_db` either. Only Cue's own export
    still builds the dense array, because ffmpeg's `asendcmd` steps rather than interpolates. That
    is our renderer's constraint, not yours.
  * See [Loop, auto-mix](/docs/loop#duck-under-voiceover-auto-mix) for the render recipe.
</Update>

<Update label="August 2026" description="pricing">
  **Cold loop is cheaper, $0.02 down to $0.014.**

  * Building a track's loop for a video the first time now costs **\$0.014**. Pricing it at twice a
    cold sync overstated the gap. A loop build runs the same alignment a sync does, then makes one
    more pass over that analysis to find a downbeat-aligned, integer-bar body and score its seam.
    Extra work, but not a second analysis.
  * Everything else is unchanged. Warm loop and warm sync stay $0.001, cold sync stays $0.01, and a
    not-applicable loop still bills nothing.
  * A reminder that has caught people out: for loop, warm and cold are decided per `(video_id,
    track_id)` pair, not per track. Looping a track you have built before over a new video is a cold
    call again. See [Metering & pricing](/docs/metering-and-pricing).
</Update>

<Update label="August 2026" description="audio delivery">
  **No audio attached by default.**

  * Responses now carry catalog identifiers and timings, not recordings. No `preview` object on a
    match or underscore result, no audio URL on a loop plan. The only audio Cue can serve is
    watermarked, and watermarked audio cannot go into a finished video, so it was never a
    deliverable. Resolve `soundstripe_song_id` through your own catalog access instead.
  * This supersedes the July underscore note below, which promised a signed MP3 link on every
    underscore result. That link is now sent only to accounts granted `preview`.
  * Evaluating, and do not license a catalog yet? Ask us to enable **`preview`** on your account and
    each track carries a short-lived watermarked link again. Plans, sync points and metering are
    identical either way. See [Preview audio](/docs/own-license#preview-audio).
  * New guide: [Render loops under your own license](/docs/own-license), how to turn a loop plan into
    audio, segment by segment, including the seam crossfades and gain laws.
</Update>

<Update label="August 2026" description="keys & MCP">
  **Key and MCP corrections.**

  * Customer keys are always **`vbsk_live_`**. Test keys are an internal tool, not a free tier. A
    test key bills nothing and skips the spend cap, so it is no longer issuable to a customer
    account. This supersedes the `vbsk_test_` line in the July v1 note below.
  * **Correction to an earlier version of this entry**, which said the MCP server should use
    `x-api-key` because the gateway rejected `Authorization: Bearer` with a `401`. That was wrong.
    The gateway checks no header on `/mcp` at all, it defers the whole path to the app, and the app
    accepts `Authorization: Bearer` and `x-api-key` equally. Bearer is what the MCP authorization
    spec uses. Either header works and no config needs changing. See [MCP server](/docs/mcp-server).
  * `track_id` **is** the Soundstripe song id. Pass one from your own catalog straight to
    `loop_music` or `get_sync_points`. You do not have to match first.
</Update>

<Update label="July 2026" description="underscore">
  **Match music to a script, no video needed.**

  * New endpoint **`POST /v1/underscore`**, and the **`underscore`** MCP tool. Paste a short-form
    script and get back a ranked shortlist of licensed tracks, each with its title, artist, and a
    why-it-fits map showing which words pulled which sound. Synchronous, no ingest, no per-minute
    analysis.
  * Billed **flat at \$0.05 per call**. The shortlist is a fixed size, and a call that returns
    nothing is not billed. See [Underscore](/docs/underscore) and
    [Metering & pricing](/docs/metering-and-pricing).
  * *Superseded in part.* This shipped with a signed MP3 link on every track. Since the August
    audio-delivery change, only accounts granted `preview` get one.
</Update>

<Update label="July 2026" description="auto-mix">
  **Duck music under voiceover, over the API.**

  * `POST /v1/loop` and `POST /v1/align`, and the `loop_music` and `get_sync_points` MCP tools, now
    accept **`auto_mix: true`**. When set, the response includes a `mix` block. If the video has a
    voiceover, that block says exactly how to duck the music under it: depth, speech ranges, and
    suggested gains, the same numbers the Cue app's preview and export use.
  * No voiceover gives you `{ voiceover: false, duck: null }`. It reads the measurement warmed at
    ingest, so it adds no charge. See [Loop, auto-mix](/docs/loop#duck-under-voiceover-auto-mix).
</Update>

<Update label="July 2026" description="pricing">
  **One engine, simpler pricing.**

  * Analysis is now a **single engine** at **\$0.06 per minute**. The separate Premium tier is
    retired. One rate, no tier to choose.
  * First-time **sync** and **loop** indexing were repriced to **$0.01** and **$0.02** per call.
    Repeat sync and loop stay $0.001, and match stays $0.005 per call.
  * *Superseded.* Cold loop moved again in August, to \$0.014. See
    [Metering & pricing](/docs/metering-and-pricing) for the current rates.
</Update>

<Update label="July 2026" description="MCP">
  **Drive Cue from an AI agent.**

  * New **MCP server** at `https://cue.vibeset.ai/mcp`, a Model Context Protocol server that works
    with any MCP-capable coding agent or client. Tools at launch: `match_music`, `loop_music`,
    `get_sync_points`, `ingest_video`, `check_video_status`, `check_job`.
  * Calls are metered exactly like the REST endpoints they mirror. See [MCP server](/docs/mcp-server).
  * *Superseded.* The server now registers eight tools, adding `underscore` and `map_beats`, and it
    accepts either `Authorization: Bearer` or `x-api-key`. See [MCP tools](/docs/mcp-tools).
</Update>

<Update label="July 2026" description="loop">
  **Loop a short track across a long video.**

  * New **`POST /v1/loop`**, a downbeat-aligned, integer-bar self-loop with musical seams and fades
    that covers a whole long clip. Pass a `track_id` from a match and get back the loop plan: loop
    body, repeat count, seams, fades.
  * The first loop build for a video and track together returns `202` and a `job_id` to poll at
    `GET /v1/loop/jobs/{job_id}`. Already-built pairs return instantly. Billed once, on completion.
    A video that is not long enough to loop a track returns `applicable: false` and is not billed.
    Soundstripe tracks. See [Loop](/docs/loop).
</Update>

<Update label="July 2026" description="pricing">
  **Simpler, two-part pricing.**

  * Analysis is now billed **per minute of video, once**, when you add it. Cue analyzes the whole
    clip at ingest, rounded up, one-minute minimum.
  * Every `POST /v1/match` is a flat per-call charge after that. No more "first match costs more".
    The analysis you paid for at upload covers every later match on that video.
  * See [Metering & pricing](/docs/metering-and-pricing) for the rates.
</Update>

<Update label="July 2026" description="async jobs">
  **No more timeouts on first-time work.**

  * A `/v1/match` on a video that needs a first-time analysis now returns `202` with a `job_id`
    instead of risking a timeout. Poll `GET /v1/match/jobs/{job_id}` until it is complete. Matches
    on an already-analyzed video stay a single synchronous call.
  * Likewise, the first `/v1/align` for a video and track together returns `202` and a `job_id` to
    poll at `GET /v1/align/jobs/{job_id}`. Pairs already in the cache return instantly.
  * Jobs are billed once, on completion, whether or not you poll. Polling itself is free.
</Update>

<Update label="July 2026" description="sync points">
  **Sync points, where to cut.**

  * Add `"include_sync": true` to a match and every track comes back with sync points: the moments
    where the music lands with your video, as timestamps into the song, best first.
  * `sync_points_per_track` (default 4) sets how many you get per track.
  * Off by default, so the plain match call stays lean. Sync points on `/v1/match` are included in
    the match price, with no separate charge. They are a cache-only read, so a track that is not
    warm yet comes back with `sync_status: "warming"` and an empty list rather than a billable
    alignment.
  * New **`POST /v1/align`**, sync points for any one track against a video, no match required.
</Update>

<Update label="July 2026" description="v1">
  **The Cue API is live.**

  * `POST /v1/match`, match licensed music to a video by `video_id`. Passing a `video_url` instead
    ingests the video and returns a `video_id` to poll, not a match. Call match again once it reads
    `ready`.
  * `POST /v1/videos`, `POST /v1/videos/{id}/ingest`, `GET /v1/videos/{id}`, ingest videos and poll
    their status.
  * Test keys (`vbsk_test_`) that match for real and never bill. *Superseded.* Test keys became
    internal-only in August.
  * Pay as you go and invoiced billing, with a monthly spend cap.
  * Rate-limit headers (`X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`,
    `Retry-After`) on `/v1` responses that reach the rate check.
</Update>
