Poll a beat-mapping job
curl --request GET \
--url https://cue.vibeset.ai/v1/beats/{job_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://cue.vibeset.ai/v1/beats/{job_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://cue.vibeset.ai/v1/beats/{job_id}', 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/beats/{job_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://cue.vibeset.ai/v1/beats/{job_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://cue.vibeset.ai/v1/beats/{job_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://cue.vibeset.ai/v1/beats/{job_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"job_id": "<string>",
"track_id": "<string>",
"status": "complete",
"duration_seconds": 184.2,
"tempo_bpm": 128.02,
"beats": [
0.412,
0.881,
1.35,
1.819
],
"downbeats": [
0.412,
2.288,
4.164
],
"billed_minutes": 4,
"cached": true
}{
"job_id": "<string>",
"track_id": "<string>",
"status": "processing",
"stage": "queued",
"poll": "<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"
}
}Beats
Poll a beat-mapping job
202 while the job is running. 200 with the grid once complete. 422 if the job
failed, if it started and will not finish, or if it sat in the queue past its
retention. None of the three is billed.
GET
/
v1
/
beats
/
{job_id}
Poll a beat-mapping job
curl --request GET \
--url https://cue.vibeset.ai/v1/beats/{job_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://cue.vibeset.ai/v1/beats/{job_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://cue.vibeset.ai/v1/beats/{job_id}', 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/beats/{job_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://cue.vibeset.ai/v1/beats/{job_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://cue.vibeset.ai/v1/beats/{job_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://cue.vibeset.ai/v1/beats/{job_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"job_id": "<string>",
"track_id": "<string>",
"status": "complete",
"duration_seconds": 184.2,
"tempo_bpm": 128.02,
"beats": [
0.412,
0.881,
1.35,
1.819
],
"downbeats": [
0.412,
2.288,
4.164
],
"billed_minutes": 4,
"cached": true
}{
"job_id": "<string>",
"track_id": "<string>",
"status": "processing",
"stage": "queued",
"poll": "<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"
}
}Authorizations
bearerAuthapiKeyAuth
Your API key as a Bearer token, e.g. Authorization: Bearer vbsk_live_...
Path Parameters
Response
The finished beat grid.
A track's beat grid. Times are seconds from the start of the audio.
Whatever you sent on submit.
Available options:
complete Example:
184.2
Example:
128.02
Every beat, in seconds.
Example:
[0.412, 0.881, 1.35, 1.819]
The subset of beats that opens a bar, so one response drives both a beat grid
and a bar grid.
Example:
[0.412, 2.288, 4.164]
Minutes of audio billed, rounded up with a one-minute minimum.
Example:
4
True when this account had already mapped these exact bytes, so the grid came from cache and the analysis did not re-run. Does not change what the call costs.