Get an upload URL

Request a one-time presigned URL to upload a video directly to S3, so large files never proxy through the API. After uploading, call Submit a video with the returned storage_key.

POST/api/v4/video-recognition/upload-url/

Request (JSON body)

FieldTypeRequiredDescription
filenamestringYesOriginal filename, including extension. The extension must be one of .mp4, .mov, .avi, .mpeg. It is used to validate the type and pin the Content-Type on the upload.
content_lengthintegerNoExact size of the video in bytes. Send it whenever you can measure the file.
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", "content_length": 18446572}'

Sending content_length is strictly better: an oversize video is refused here, before a URL is ever issued, instead of after you have uploaded it. Omit it and the size is checked when you submit the job.

⚠️

content_length is pinned into the signature, so the PUT must carry exactly that many bytes — measure the file, never estimate. S3 rejects a body of any other size.

Response (201 Created)

{
  "upload_url": "https://bucket.s3.amazonaws.com/temp/video-recognition/8f3c...2a_clip.mp4?X-Amz-...",
  "storage_key": "video-recognition/8f3c...2a_clip.mp4",
  "expires_in": 600,
  "content_type": "video/mp4"
}
FieldDescription
upload_urlPresigned S3 PUT URL. Upload the file here within expires_in seconds.
storage_keyReference to the uploaded file. Pass this to Submit a video.
expires_inSeconds until upload_url expires (default 600).
content_typeThe exact Content-Type header you must send on the PUT.

Upload the file

PUT the raw bytes to upload_url, using the exact content_type returned. Do not add an Authorization header to this request, the URL is already signed.

curl "$UPLOAD_URL" \
  -X PUT \
  -H "Content-Type: video/mp4" \
  --upload-file /path/to/clip.mp4

Then start recognition with 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/8f3c...2a_clip.mp4"}'
⚠️

Send the Content-Type on the PUT exactly as returned in content_type. It is pinned at signing time, so a mismatched header is rejected by S3.

Errors

HTTPBodyWhen
400{ "filename": ["File extension must be one of: mov, mpeg, mp4, avi."] }Unsupported file extension.
400{ "content_length": ["File size cannot exceed 100 MB."] }The declared size is over the limit. No URL is issued.
401 / 403{ "detail": "Authentication credentials were not provided." }Missing or invalid partner key.
501{ "detail": "Presigned uploads require S3 temporary storage." }The environment is not configured for S3 temporary storage. Use the direct file upload instead.