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
202and a job id you poll atGET /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.
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_bpmnow 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.
auto-mix
The duck curve is now in the response, and
auto_mix no longer breaks long videos.mix.duckgainsenvelope_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 onlydepth_db,attack_msandrelease_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_dbarray 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, soauto_mix: truefailed the call.envelope_pointscarries the identical curve in about a tenth the space. - This is API-wide, not MCP-only. One function builds the
mixblock for REST and MCP alike, soPOST /v1/loopandPOST /v1/alignno longer carryenvelope_dbeither. Only Cue’s own export still builds the dense array, because ffmpeg’sasendcmdsteps rather than interpolates. That is our renderer’s constraint, not yours. - See Loop, auto-mix for the render recipe.
pricing
Cold loop is cheaper, 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.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.
audio delivery
No audio attached by default.
- Responses now carry catalog identifiers and timings, not recordings. No
previewobject 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. Resolvesoundstripe_song_idthrough 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
previewon your account and each track carries a short-lived watermarked link again. Plans, sync points and metering are identical either way. See Preview audio. - New guide: Render loops under your own license, how to turn a loop plan into audio, segment by segment, including the seam crossfades and gain laws.
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 thevbsk_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-keybecause the gateway rejectedAuthorization: Bearerwith a401. That was wrong. The gateway checks no header on/mcpat all, it defers the whole path to the app, and the app acceptsAuthorization: Bearerandx-api-keyequally. Bearer is what the MCP authorization spec uses. Either header works and no config needs changing. See MCP server. track_idis the Soundstripe song id. Pass one from your own catalog straight toloop_musicorget_sync_points. You do not have to match first.
underscore
Match music to a script, no video needed.
- New endpoint
POST /v1/underscore, and theunderscoreMCP 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 and Metering & pricing.
- Superseded in part. This shipped with a signed MP3 link on every track. Since the August
audio-delivery change, only accounts granted
previewget one.
auto-mix
Duck music under voiceover, over the API.
POST /v1/loopandPOST /v1/align, and theloop_musicandget_sync_pointsMCP tools, now acceptauto_mix: true. When set, the response includes amixblock. 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.
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.02 per call. Repeat sync and loop stay 0.005 per call.
- Superseded. Cold loop moved again in August, to $0.014. See Metering & pricing for the current rates.
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.
- Superseded. The server now registers eight tools, adding
underscoreandmap_beats, and it accepts eitherAuthorization: Bearerorx-api-key. See MCP tools.
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 atrack_idfrom 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
202and ajob_idto poll atGET /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 returnsapplicable: falseand is not billed. Soundstripe tracks. See Loop.
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/matchis 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 for the rates.
async jobs
No more timeouts on first-time work.
- A
/v1/matchon a video that needs a first-time analysis now returns202with ajob_idinstead of risking a timeout. PollGET /v1/match/jobs/{job_id}until it is complete. Matches on an already-analyzed video stay a single synchronous call. - Likewise, the first
/v1/alignfor a video and track together returns202and ajob_idto poll atGET /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.
sync points
Sync points, where to cut.
- Add
"include_sync": trueto 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/matchare 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 withsync_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.
v1
The Cue API is live.
POST /v1/match, match licensed music to a video byvideo_id. Passing avideo_urlinstead ingests the video and returns avideo_idto poll, not a match. Call match again once it readsready.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/v1responses that reach the rate check.