curl --request POST \
--url https://cue.vibeset.ai/v1/align \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"video_id": "69e5a58e73370adad5a10dc9",
"track_id": "14792",
"top_k": 6
}
'import requests
url = "https://cue.vibeset.ai/v1/align"
payload = {
"video_id": "69e5a58e73370adad5a10dc9",
"track_id": "14792",
"top_k": 6
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({video_id: '69e5a58e73370adad5a10dc9', track_id: '14792', top_k: 6})
};
fetch('https://cue.vibeset.ai/v1/align', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://cue.vibeset.ai/v1/align",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'video_id' => '69e5a58e73370adad5a10dc9',
'track_id' => '14792',
'top_k' => 6
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://cue.vibeset.ai/v1/align"
payload := strings.NewReader("{\n \"video_id\": \"69e5a58e73370adad5a10dc9\",\n \"track_id\": \"14792\",\n \"top_k\": 6\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://cue.vibeset.ai/v1/align")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"video_id\": \"69e5a58e73370adad5a10dc9\",\n \"track_id\": \"14792\",\n \"top_k\": 6\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://cue.vibeset.ai/v1/align")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"video_id\": \"69e5a58e73370adad5a10dc9\",\n \"track_id\": \"14792\",\n \"top_k\": 6\n}"
response = http.request(request)
puts response.read_body{
"video_id": "69e5a58e73370adad5a10dc9",
"track_id": "14792",
"cached": true,
"sync_points": [
{
"offset_seconds": 12.03,
"score": 0.91,
"label": "Drop"
},
{
"offset_seconds": 27.44,
"score": 0.74,
"label": "Downbeat"
}
]
}{
"video_id": "<string>",
"track_id": "<string>",
"job_id": "<string>",
"status": "processing",
"poll": "/v1/align/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"
}
}Get sync points for a track
Sync points for one track against a video you own, no match required. Pass a
track_id (from a match, or one you picked yourself). Returns labeled offsets, best
first: where to start the track under the top of your clip.
The 200 is served from cache only. It needs either stored alignment points for this
exact (video_id, track_id) pair, or both profiles cached: the video’s, built at
ingest, and the track’s, built the first time that track is indexed. Otherwise you get
a 202 with a job_id, so poll GET /v1/align/jobs/{job_id}. cached on the response
tells you which rate you paid.
A video that is still ingesting answers 202 with no job_id.
curl --request POST \
--url https://cue.vibeset.ai/v1/align \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"video_id": "69e5a58e73370adad5a10dc9",
"track_id": "14792",
"top_k": 6
}
'import requests
url = "https://cue.vibeset.ai/v1/align"
payload = {
"video_id": "69e5a58e73370adad5a10dc9",
"track_id": "14792",
"top_k": 6
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({video_id: '69e5a58e73370adad5a10dc9', track_id: '14792', top_k: 6})
};
fetch('https://cue.vibeset.ai/v1/align', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://cue.vibeset.ai/v1/align",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'video_id' => '69e5a58e73370adad5a10dc9',
'track_id' => '14792',
'top_k' => 6
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://cue.vibeset.ai/v1/align"
payload := strings.NewReader("{\n \"video_id\": \"69e5a58e73370adad5a10dc9\",\n \"track_id\": \"14792\",\n \"top_k\": 6\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://cue.vibeset.ai/v1/align")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"video_id\": \"69e5a58e73370adad5a10dc9\",\n \"track_id\": \"14792\",\n \"top_k\": 6\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://cue.vibeset.ai/v1/align")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"video_id\": \"69e5a58e73370adad5a10dc9\",\n \"track_id\": \"14792\",\n \"top_k\": 6\n}"
response = http.request(request)
puts response.read_body{
"video_id": "69e5a58e73370adad5a10dc9",
"track_id": "14792",
"cached": true,
"sync_points": [
{
"offset_seconds": 12.03,
"score": 0.91,
"label": "Drop"
},
{
"offset_seconds": 27.44,
"score": 0.74,
"label": "Downbeat"
}
]
}{
"video_id": "<string>",
"track_id": "<string>",
"job_id": "<string>",
"status": "processing",
"poll": "/v1/align/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"
}
}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 alignment re-running.
Body
A video you own (or a shared/seed clip).
128The track to align, the Soundstripe song id, as returned by /v1/match.
128How many sync points to return.
1 <= x <= 50When true, also return a mix block: if the video has a voiceover, how to duck the music under it (see the Mix schema). Off ⇒ no mix key in the response.
Response
Sync points for the track, best first.
True when this pairing was served warm (billed at the lower rate).
Show child attributes
Show child attributes
Present only when auto_mix was true. Null when the measurement could not be read. Auto-mix never fails the align call.
Show child attributes
Show child attributes
{
"voiceover": true,
"classification": "voice",
"music_gain_db": -4.4,
"video_gain_db": 11.4,
"duck": {
"envelope_points": [[0, 20], [1.2, 20], [1.9, 0], [4.8, 0]],
"envelope_hz": 40,
"speech_ranges": [[1.2, 4.8], [9.5, 14.1]],
"depth_db": 20,
"attack_ms": 375,
"release_ms": 1425
}
}