API ReferenceAudioVerify™Overview

AudioVerify™

AudioVerify identifies the music used in a video. Upload a clip and AudioVerify returns every stretch of music it found, in timeline order — what each one is, whether the account’s subscription covers it, and, when an outside service exposes it, the registered label (for example Epidemic Sound).

Behind one simple submit-and-poll API, AudioVerify runs a three-tier pipeline: it matches against the Slipstream catalog first (audio fingerprinting), then falls back to external recognition for anything outside the catalog.

How it works

Recognition runs asynchronously. You submit a video and immediately get a job_id, then poll until the job is completed.

  1. Submit a video, either as a direct file upload or by reference to a file you uploaded to S3 with a presigned URL. You get back a job_id.
  2. Poll the job until status is completed. The response then carries segments, one entry per stretch of music in the video.

A video can use several songs back to back. segments is the full list; track holds the longest-running identified segment so a single-track integration keeps working unchanged.

Endpoints

MethodPathPurpose
POST/api/v4/video-recognition/Submit a video (file upload or storage_key). Returns a job_id.
POST/api/v4/video-recognition/upload-url/Get a presigned S3 URL to upload large videos directly.
GET/api/v4/video-recognition/{job_id}/Poll a job for its status and result.

The RecognitionJob object

{
  "job_id": "7b2c1e8a-0f4d-4a2b-9c11-7f5a2d9e3c10",
  "status": "completed",
  "progress": null,
  "track": {
    "id": "11111111-1111-1111-1111-111111111111",
    "title": "Nothing To See",
    "artist": "Auracle",
    "cleared": true,
    "internal": true,
    "isrc": "CAQOQ1521348",
    "score": 99.24,
    "external_label": null,
    "cover": { "...": "..." }
  },
  "segments": [
    {
      "identified": true,
      "start_ms": 0,
      "end_ms": 24985,
      "id": "22222222-2222-2222-2222-222222222222",
      "title": "B2 100",
      "artist": "T-Pain",
      "cleared": true,
      "internal": true,
      "isrc": null,
      "score": 93.91,
      "external_label": null,
      "cover": { "...": "..." }
    },
    {
      "identified": false,
      "start_ms": 24985,
      "end_ms": 50062,
      "id": null,
      "title": null,
      "artist": null,
      "cleared": null,
      "internal": null,
      "isrc": null,
      "score": null,
      "external_label": null,
      "cover": null
    }
  ]
}
FieldDescription
job_idUUID of the recognition job. Use it to poll for the result.
statusOne of queued, processing, or completed.
progressWhile status is processing, the stage the run has reached: queued, extracting, matching or finishing. null once the job is terminal.
trackThe longest-running identified segment, or null when nothing was identified. Same shape as a segment minus the timeline fields.
segmentsEvery stretch of music in the video, in timeline order. Populated once status is completed.

The RecognitionSegment object

A segment is a RecognitionTrack plus its position in the video.

FieldTypeDescription
identifiedbooleanfalse for a stretch carrying music that could not be placed. Every track field is null there; the time range still applies.
start_msintegerStart of the stretch, in milliseconds from the beginning of the video.
end_msintegerEnd of the stretch, in milliseconds.

An identified: false segment is not silence and not an error. It means music plays there that no tier could name, so it cannot be reported as cleared. Surface it by its time range alongside the rest.

The RecognitionTrack object

FieldTypeDescription
idstring or nullSlipstream track UUID. Set whenever the match resolved to a catalog row — including one the account’s plan does not reach. null for a match only an outside service could name.
titlestring or nullTrack title. null on an unidentified segment.
artiststring or nullArtist name. null on an unidentified segment.
clearedboolean or nulltrue when this account’s subscription covers the track. null on an unidentified segment.
internalboolean or nullDeprecated alias of cleared, same value. Prefer cleared.
isrcstring or nullInternational Standard Recording Code, when known.
scorenumber or nullFingerprint similarity from 0 to 100. null when an external service made the identification — none of them expose a confidence of their own.
external_labelstring or nullRegistered label exposed by external recognition, for example "Epidemic Sound". Use it to flag music from competing royalty-free libraries.
coverobject or nullArtwork of the matched catalog row, carrying all_image_sizes with small, medium and large URLs. null for an outside match — there is no catalog row to take a cover from.
suggestionsarrayCatalog tracks that sound like this one, offered only when cleared is false. Up to 3. See below.

cleared and id answer different questions. id says whether the catalog has the track at all; cleared says whether this account may use it. A catalog track outside the account’s plan comes back with an id and cleared: false — do not present it as covered.

Suggestions

When a track is not cleared, suggestions offers up to 3 catalog alternatives that sound like it, already filtered to what the account can actually access.

"suggestions": [
  {
    "id": "870112aa-49e6-446d-9eaf-ee12e36d2163",
    "name": "Mystery Water",
    "artist": { "name": "Thomaz Ayê", "path": "/artists/thomaz-aye" },
    "album": { "name": "Earth Rebirth", "url": "/albums/earth-rebirth" },
    "length": 143,
    "tempo": 90,
    "short_id": "3NIYB3NHQUSSQB"
  }
]
⚠️

Suggestions carry the catalog’s own track shape, not the recognition shape: the title is name and artist is an object, not a string. They are the same objects Retrieve a track returns.

Input limits

  • Accepted formats: .mp4, .mov, .avi, .mpeg
  • Maximum file size: 100 MB (use Get an upload URL for large files so the bytes never proxy through the API)

Authentication and rate limits

Every AudioVerify call uses your partner key, and the token must carry the AudioVerify (compliance_check) scope — without it, calls return 403.

Authorization: Bearer <PARTNER_API_KEY>

Only Submit a video is metered, against the daily AudioVerify quota configured for your partnership. Polling and requesting upload URLs are free. Over quota, submit returns 429 with the cap, your usage, and when the window resets.