Download audio
Request a download for a single audio asset — a track, a sound effect, or one of a track’s stems. The endpoint returns a short-lived presigned URL; your client fetches the file from that URL directly.
Path parameters
| Parameter | Description |
|---|---|
id | UUID of the asset. The shape of this ID matches the type field in the body — a track UUID for type: "track", a sound-effect UUID for type: "soundfx", a stem UUID for type: "stem". |
Headers
| Header | Required | Description |
|---|---|---|
Authorization | Yes | Bearer <PARTNER_API_KEY> |
Content-Type | Yes | application/json |
Request body
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
type | string | Yes | — | track, soundfx, or stem. Must match the asset the path id points to. |
format | string[] | No | ["mp3"] | One or more of mp3, wav. Asking for both triggers the async ZIP flow. |
include_stems | boolean | No | false | Bundle the track’s stems into the download. Only valid when type is track. Triggers the async ZIP flow. |
confirm_personal_use | boolean | No | false | Acknowledges the download is for personal/licensed use. |
Example — simple download
Single format, no stems. Returns the URL immediately.
curl https://api.slipstreammusic.com/api/v4/download/audio/3f1a4b2c-9e7f-4a6b-b3c2-1f8d4e5a7c6b/ \
-X POST \
-H "Authorization: Bearer $PARTNER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "track",
"format": ["mp3"]
}'{
"url": "https://cdn.slipstreammusic.com/.../signed?Expires=..."
}Fetch the URL within a few minutes — it’s signed and expires.
Example — ZIP with stems
Multiple formats or stems. Returns 202 while the ZIP builds.
curl https://api.slipstreammusic.com/api/v4/download/audio/3f1a4b2c-9e7f-4a6b-b3c2-1f8d4e5a7c6b/ \
-X POST \
-H "Authorization: Bearer $PARTNER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "track",
"format": ["mp3", "wav"],
"include_stems": true
}'{
"detail": "Download is being prepared. Please try again in a few moments."
}Poll the same endpoint with the same body. When the ZIP is ready you’ll get a 200 with the URL.
Async ZIP flow
When you ask for multiple formats or set include_stems: true, the server builds a ZIP in the background. The first call kicks off the build and returns 202. Subsequent calls with the same body return 202 until the build finishes, then 200 with the presigned URL.
| Iteration | Status | Body |
|---|---|---|
| First request | 202 | { "detail": "Download is being prepared..." } |
| Polling (still building) | 202 | Same as above |
| Build finished | 200 | { "url": "https://cdn.slipstreammusic.com/..." } |
A reasonable polling cadence is once every 5–10 seconds. The result is cached, so polling stays cheap.
Browser redirect (GET)
A GET variant of the same endpoint exists for browser-navigable links. It runs the exact same auth, permission, and build logic — but instead of returning JSON, it 302-redirects straight to the presigned URL. Useful for “download” buttons that you want to open in a new tab.
Query parameters
| Parameter | Required | Default | Description |
|---|---|---|---|
type | Yes | — | track, soundfx, or stem. |
fmt | No | mp3 | mp3 or wav. Repeat the param to ask for both: ?fmt=mp3&fmt=wav. |
include_stems | No | false | Only valid when type=track. Triggers the async ZIP flow. |
Use fmt, not format. The framework reserves ?format= for content-type negotiation, and unknown values trigger a 404 before the endpoint runs.
Example
GET /api/v4/download/audio/3f1a4b2c-9e7f-4a6b-b3c2-1f8d4e5a7c6b/?type=track&fmt=mp3
→ 302 Location: https://cdn.slipstreammusic.com/.../signed?Expires=...If the download falls into the async flow (multiple formats, stems), the GET returns 202 with a JSON { "detail": ... } body instead of redirecting. Retry until it returns 302.
Responses
200 OK — ready
{
"url": "https://cdn.slipstreammusic.com/.../signed?Expires=..."
}| Field | Description |
|---|---|
url | Short-lived presigned URL. Fetch within a few minutes. |
202 Accepted — still building
{
"detail": "Download is being prepared. Please try again in a few moments."
}Poll the same endpoint with the same body.
Errors
| HTTP | When |
|---|---|
| 400 | Validation error in the body — invalid type, unknown format, include_stems set with a non-track asset. |
| 401 | Caller is not authenticated. |
| 403 | Caller is authenticated but their plan can’t download this asset (free accounts; subscriber/commercial caller hitting an enterprise-only track; enterprise without can_download). |
| 404 | Asset doesn’t exist, has expired, or isn’t downloadable. |
Notes
- Presigned URLs are short-lived. Don’t cache them — store the asset ID and re-request when needed.
- Sound effects (
type: "soundfx") and stems (type: "stem") follow the same flow, butinclude_stemsis rejected for them.