curl --request POST \
--url https://cue.vibeset.ai/v1/match \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"video_id": "69e5a58e73370adad5a10dc9",
"top_k": 5
}
'{
"video_id": "69e5a58e73370adad5a10dc9",
"lane": {
"title": "Your shortlist",
"reasoning": "Driving but unhurried — it carries the cuts without fighting the voice.",
"matches": [
{
"track_id": "14792",
"audio_id": "60184",
"soundstripe_song_id": "14792",
"soundstripe_audio_file_id": "60184",
"score": 1,
"bpm": 120,
"instrumental": true,
"duration_seconds": 164.01
},
{
"track_id": "14857",
"audio_id": "60251",
"soundstripe_song_id": "14857",
"soundstripe_audio_file_id": "60251",
"score": 0.89,
"bpm": 116,
"instrumental": false,
"duration_seconds": 235.38
}
]
}
}{
"video_id": "<string>",
"job_id": "<string>",
"status": "processing",
"poll": "/v1/match/jobs/run_9f2c",
"next": "<string>"
}{
"error": {
"type": "invalid_request",
"message": "Provide either 'video_id' or 'video_url'.",
"request_id": "a1b2c3d4e5f6"
}
}{
"error": {
"type": "invalid_request",
"message": "Provide either 'video_id' or 'video_url'.",
"request_id": "a1b2c3d4e5f6"
}
}{
"error": {
"type": "invalid_request",
"message": "Provide either 'video_id' or 'video_url'.",
"request_id": "a1b2c3d4e5f6"
}
}{
"error": {
"type": "invalid_request",
"message": "Provide either 'video_id' or 'video_url'.",
"request_id": "a1b2c3d4e5f6"
}
}{
"error": {
"type": "invalid_request",
"message": "Provide either 'video_id' or 'video_url'.",
"request_id": "a1b2c3d4e5f6"
}
}{
"error": {
"type": "invalid_request",
"message": "Provide either 'video_id' or 'video_url'.",
"request_id": "a1b2c3d4e5f6"
}
}{
"error": {
"type": "invalid_request",
"message": "Provide either 'video_id' or 'video_url'.",
"request_id": "a1b2c3d4e5f6"
}
}{
"error": {
"type": "invalid_request",
"message": "Provide either 'video_id' or 'video_url'.",
"request_id": "a1b2c3d4e5f6"
}
}Match music to a video
Pass a video_id for a shortlist. This answers three ways and they carry different
bodies:
200: the video’s analysis is cached for your account’s engine. The lane is inline.202with ajob_id: the analysis is not cached, so the match runs as a job. PollGET /v1/match/jobs/{job_id}. A video that has just turnedreadynormally takes this branch: ingest flips the row toreadybefore the engine analysis is persisted.202with nojob_id: the video is still ingesting. PollGET /v1/videos/{id}untilready, then call this endpoint again.
Passing a video_url instead of a video_id starts an ingest and returns that third
shape. There is no job_id on that path.
curl --request POST \
--url https://cue.vibeset.ai/v1/match \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"video_id": "69e5a58e73370adad5a10dc9",
"top_k": 5
}
'{
"video_id": "69e5a58e73370adad5a10dc9",
"lane": {
"title": "Your shortlist",
"reasoning": "Driving but unhurried — it carries the cuts without fighting the voice.",
"matches": [
{
"track_id": "14792",
"audio_id": "60184",
"soundstripe_song_id": "14792",
"soundstripe_audio_file_id": "60184",
"score": 1,
"bpm": 120,
"instrumental": true,
"duration_seconds": 164.01
},
{
"track_id": "14857",
"audio_id": "60251",
"soundstripe_song_id": "14857",
"soundstripe_audio_file_id": "60251",
"score": 0.89,
"bpm": 116,
"instrumental": false,
"duration_seconds": 235.38
}
]
}
}{
"video_id": "<string>",
"job_id": "<string>",
"status": "processing",
"poll": "/v1/match/jobs/run_9f2c",
"next": "<string>"
}{
"error": {
"type": "invalid_request",
"message": "Provide either 'video_id' or 'video_url'.",
"request_id": "a1b2c3d4e5f6"
}
}{
"error": {
"type": "invalid_request",
"message": "Provide either 'video_id' or 'video_url'.",
"request_id": "a1b2c3d4e5f6"
}
}{
"error": {
"type": "invalid_request",
"message": "Provide either 'video_id' or 'video_url'.",
"request_id": "a1b2c3d4e5f6"
}
}{
"error": {
"type": "invalid_request",
"message": "Provide either 'video_id' or 'video_url'.",
"request_id": "a1b2c3d4e5f6"
}
}{
"error": {
"type": "invalid_request",
"message": "Provide either 'video_id' or 'video_url'.",
"request_id": "a1b2c3d4e5f6"
}
}{
"error": {
"type": "invalid_request",
"message": "Provide either 'video_id' or 'video_url'.",
"request_id": "a1b2c3d4e5f6"
}
}{
"error": {
"type": "invalid_request",
"message": "Provide either 'video_id' or 'video_url'.",
"request_id": "a1b2c3d4e5f6"
}
}{
"error": {
"type": "invalid_request",
"message": "Provide either 'video_id' or 'video_url'.",
"request_id": "a1b2c3d4e5f6"
}
}Authorizations
Your API key as a Bearer token, e.g. Authorization: Bearer vbsk_live_...
Headers
Suppresses a DUPLICATE BILLING ROW for a retry of this exact request. It does not return the earlier response and does not stop the match re-running. Use a new key per distinct request. A key pinned across different requests silently suppresses billing for all of them.
Query Parameters
Set to full for the full track object plus the lane's candidate pool.
full Body
Provide either video_id or video_url.
An already-ingested video.
128A public https video URL. Ingested first, so the response is a 202 pointing at the video, with no job_id. Share links that redirect (Google Drive, Dropbox, S3, most CDNs) work, and we follow the redirect to the file.
2048MAXIMUM number of matches to return. The lane is planned as a shortlist of up to 10, so a larger value returns everything there is rather than more.
1 <= x <= 100Weight matches toward the video's detected tempo.
A plain-language brief, e.g. "warm, cinematic, no vocals".
500Attach sync_status and sync_points to every match. CACHE-ONLY: it never builds a profile, so an un-indexed track comes back warming with an empty sync_points array. On a freshly ingested video that is most of the shortlist. Cue starts a background index for those tracks, so a later call usually returns them warm. Use /v1/align when you need the index built now.
How many sync points to return per track when they are warm.
1 <= x <= 12