AudioVerify™Overview

AudioVerify™

Identify the music used in a video. Submit a clip and AudioVerify tells you the track that is playing, whether it lives in the Slipstream catalog, and, when an outside service exposes it, the registered label (for example Epidemic Sound).

Behind one simple API, AudioVerify runs a three-tier pipeline: it matches against the Slipstream catalog first with audio fingerprinting, then falls back to external recognition for anything outside the catalog. You do not have to think about the tiers; you submit a video and read one normalized result.

The flow

Recognition runs asynchronously, so it is two steps:

  1. Submit the video. You get back a job_id.
  2. Poll the job until it is completed, then read the recognized track (or null if no music was found).

For the submit step you have two options: send the file directly (simple, good for small clips), or upload it straight to S3 with a presigned URL (good for large clips, the bytes never pass through the API).

Step 1: Submit the video

Option A: upload the file directly (multipart form):

curl https://api.slipstreammusic.com/api/v4/video-recognition/ \
  -X POST \
  -H "Authorization: Bearer $PARTNER_API_KEY" \
  -F "file=@/path/to/clip.mp4"

Accepted formats: .mp4, .mov, .avi, .mpeg. Max 100 MB.

Option B: upload to S3 first, then submit the reference. Ask for a presigned URL, PUT the file to it, then submit the returned storage_key. This keeps large files off the API.

# 1. get a presigned URL
curl https://api.slipstreammusic.com/api/v4/video-recognition/upload-url/ \
  -X POST \
  -H "Authorization: Bearer $PARTNER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"filename": "clip.mp4"}'
# -> { "upload_url": "...", "storage_key": "video-recognition/...", "content_type": "video/mp4", "expires_in": 600 }
 
# 2. PUT the bytes to the signed URL (no auth header; the URL is signed)
curl "$UPLOAD_URL" -X PUT -H "Content-Type: video/mp4" --upload-file /path/to/clip.mp4
 
# 3. submit the storage_key
curl https://api.slipstreammusic.com/api/v4/video-recognition/ \
  -X POST \
  -H "Authorization: Bearer $PARTNER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"storage_key": "video-recognition/...clip.mp4"}'

Response (201 Created) for both options:

{
  "job_id": "7b2c1e8a-0f4d-4a2b-9c11-7f5a2d9e3c10",
  "status": "queued",
  "track": null
}

Hold on to job_id. That is all you need for step 2.

Send the Content-Type on the S3 PUT exactly as returned in content_type. It is pinned when the URL is signed, so a mismatched header is rejected.

Step 2: Poll for the result

Poll the job until status is completed:

curl https://api.slipstreammusic.com/api/v4/video-recognition/7b2c1e8a-0f4d-4a2b-9c11-7f5a2d9e3c10/ \
  -H "Authorization: Bearer $PARTNER_API_KEY"

While it runs you will see status: "queued" then status: "processing", with track: null. Poll every 2 to 5 seconds. Most jobs finish within a few seconds to about a minute.

Reading the result

Once status is completed, branch on the track.

A Slipstream catalog match (internal: true). The id is the catalog track, so you can link straight to it:

{
  "id": "11111111-1111-1111-1111-111111111111",
  "title": "Golden Hour",
  "artist": "The Coast",
  "internal": true,
  "isrc": "USRC12345678",
  "score": 96.5,
  "external_label": null
}

An outside match with a label (internal: false, external_label set). This is how you flag music from competing royalty-free libraries:

{
  "id": null,
  "title": "Some Stock Track",
  "artist": "A Stock Artist",
  "internal": false,
  "isrc": "SE5Q52400123",
  "score": 100.0,
  "external_label": "Epidemic Sound"
}

No music recognized. A null track on a completed job is a normal outcome, not an error:

{ "job_id": "7b2c1e8a-...", "status": "completed", "track": null }

See The RecognitionTrack object for every field.

Error cases worth handling

WhatWhenWhat to do
400 on submitNeither or both of file / storage_key sent, bad extension, or file too largeShow the validation detail to the user
501 on upload-urlThe environment is not configured for S3 temporary storageFall back to the direct file upload (Option A)
404 on pollThe job_id does not exist or has expired from cacheSubmit the video again
track: null on a completed jobNo music was recognizedTreat as a valid “no match” result, not a failure

Tips

  • Poll, do not block. Submit returns immediately. Poll the job_id every few seconds rather than holding a request open.
  • Branch on internal. true means it is in the Slipstream catalog and id links to it. false means an outside match; check external_label to flag libraries such as Epidemic Sound.
  • Use Option B for large files. The presigned upload keeps the bytes off the API and supports the full 100 MB limit comfortably.
  • Results are short-lived. A completed result stays available for about a day, then the job_id expires.

Endpoint reference