Submit a video
Start a recognition job. Submit the video in one of two ways: upload the file directly, or reference a file you already uploaded to S3 with a presigned URL. Either way you get back a job_id to poll for the result.
Request
Send exactly one of file (a direct upload) or storage_key (a file already in S3).
File upload (multipart form data)
Best for small videos. The file is proxied through the API.
| Field | Type | Required | Description |
|---|---|---|---|
file | binary | One of two | Video file. Max 100 MB. Allowed extensions: .mp4, .mov, .avi, .mpeg. |
curl https://api.slipstreammusic.com/api/v4/video-recognition/ \
-X POST \
-H "Authorization: Bearer $PARTNER_API_KEY" \
-F "file=@/path/to/clip.mp4"Reference an uploaded file (JSON body)
Best for large videos. First call Get an upload URL, PUT the file to S3, then submit the returned storage_key here. The bytes never pass through the API.
| Field | Type | Required | Description |
|---|---|---|---|
storage_key | string | One of two | The storage_key returned by Get an upload URL. Must start with video-recognition/. |
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/8f3c...2a_clip.mp4"}'Response (201 Created)
{
"job_id": "7b2c1e8a-0f4d-4a2b-9c11-7f5a2d9e3c10",
"status": "queued",
"track": null
}The track is always null here, and there are no segments yet. Poll GET /api/v4/video-recognition/{job_id}/ until status is completed to get the result.
Recognition runs in the background. A clip with one song usually completes in well under a minute; one carrying several songs takes a couple of minutes, since each stretch is identified on its own. Poll the job rather than holding the request open.
Errors
| HTTP | Body | When |
|---|---|---|
| 400 | { "detail": "Provide exactly one of \file` or `storage_key`.” }` | Neither or both fields were sent. |
| 400 | { "file": ["File extension is not allowed..."] } | The file is not one of .mp4, .mov, .avi, .mpeg. |
| 400 | { "file": ["File size cannot exceed 100 MB."] } | The upload is larger than the configured limit. |
| 400 | { "storage_key": ["Must start with \video-recognition/`.”] }` | The storage_key is not in the recognition namespace. |
| 401 | { "detail": "Authentication credentials were not provided." } | Missing or invalid partner key. |
| 403 | { "detail": "..." } | The token is valid but does not have the AudioVerify (compliance_check) scope. Contact Slipstream to enable it. |
| 429 | See Rate limits. | You have hit your daily AudioVerify quota. |
Rate limits
Only this submit endpoint is metered. Polling a job and requesting an upload URL are free. Each submit counts against the daily AudioVerify quota configured for your partnership.
When you exceed it, the submit returns 429 before any recognition runs, with the cap, your current usage, and when the window resets:
{
"detail": "You have reached your daily AudioVerify limit.",
"scope_code": "compliance_check",
"window": "daily",
"cap": 5000,
"used": 5000,
"resets_in": "7 hours",
"resets_at": "2026-07-09T00:00:00+00:00"
}Back off until resets_at, then retry.