Skip to main content
POST
Map a track's beats and downbeats

Authorizations

Authorization
string
header
required

Your API key as a Bearer token, e.g. Authorization: Bearer vbsk_live_...

Headers

Idempotency-Key
string

A true idempotency key, unlike the match-family endpoints. A repeat with the same key returns the ORIGINAL job_id instead of starting a second job, so a timeout you never saw the response to cannot bill you twice. Honoured for 24 hours. Reusing a key for a different request is a 422.

Re-signing the URL between attempts is fine. The request is identified by the object it points at, not by the signature on it.

Maximum string length: 255

Body

application/json
audio_url
string
required

Signed https:// URL to the audio, from whatever storage you already use: S3 presigned, GCS V4 signed, Azure SAS, R2/B2 presigned, or your own CDN. Nothing has to be public. Must be reachable from the public internet and respond within 120 seconds.

Sign for 12-24 hours when mapping a catalog: jobs queue, and a link signed for one hour can expire while its job is still waiting.

s3:// is accepted only for buckets outside our own account, and only once you have granted our worker read access with a bucket policy.

Maximum string length: 2048
Example:

"https://your-storage/track.mp3"

track_id
string

Your own identifier, echoed back on the job so you can map a catalog without keeping a job_id-to-track table of your own.

Maximum string length: 128
known_bpm
number

Your catalog's tempo for this track, if you have one. Worth +6.73 downbeat CMLt on GTZAN when correct, and it tolerates being a few percent off (+6.65 at 5% error, +4.76 at 10%).

Only the OCTAVE matters: half or double the real tempo measured around -60, so we verify your value against our own unconstrained reading and discard it when the two disagree by an octave. Sending a bad tempo cannot make the result worse than omitting the field.

Required range: 20 <= x <= 400
Example:

128

audio_sha256
string

SHA-256 of the audio bytes, if you already know it. When this account has mapped those exact bytes before, we answer from cache without fetching the file at all, which is what you want when re-running a catalog. Omitting it only costs the fetch, because we hash whatever we download regardless.

Pattern: ^[0-9a-fA-F]{64}$

Response

Accepted. Poll the job. idempotent_replay: true means this key had already started a job and nothing new was created or billed.

An accepted beat-mapping job.

job_id
string
track_id
string | null
status
string
Example:

"processing"

poll
string
Example:

"/v1/beats/9f2c"

next
string
idempotent_replay
boolean

Present and true only when this Idempotency-Key had already started a job. No new job was created and nothing was billed twice.