Endpoint for creating a stream link from an audio file. Files are stored permanently.
Endpoint: POST https://streamables.butterlabs.app/upload
Account attribution: API uploads are anonymous. Authenticated attribution is available only through the Streamables website; direct API requests carrying Firebase credentials are rejected.
Content Types: multipart/form-data or raw body bytes
Limit: 25 MB
Rate Limit: 10 uploads per hour per client IP
Protection: protected=true (default) disables direct download, raw access, and embedding. Set protected=false to allow.
Visibility: unlisted=true keeps the stream playable through its direct link while excluding it from Discover. It is false by default.
Custom name: Use the preferred name field for multipart uploads, the x-stream-name header for raw uploads, or ?name=.... The older customId, customName, x-custom-id, and x-custom-name forms remain supported.
Success Response:
{
"success": true,
"id": "my-song",
"name": "my-song",
"url": "https://streamables.butterlabs.app/stream/my-song",
"streamUrl": "https://streamables.butterlabs.app/stream/my-song",
"path": "/stream/my-song",
"protected": false,
"unlisted": false,
"embedUrl": "https://streamables.butterlabs.app/embed/my-song",
"embedCode": "",
"accountId": "firebase-user-id",
"uploaderName": "Display name"
}
curl -X POST -F "file=@song.mp3" -F "name=my-song" -F "protected=false" -F "unlisted=true" https://streamables.butterlabs.app/upload
curl -X POST --data-binary @song.mp3 -H "Content-Type: audio/mpeg" -H "x-stream-name: my-song" -H "x-protected: false" -H "x-unlisted: true" https://streamables.butterlabs.app/upload
https://streamables.butterlabs.app/stream/uuid?download
https://streamables.butterlabs.app/stream/uuid?raw
<iframe src="https://streamables.butterlabs.app/embed/my-song" title="my-song — Streamables" width="100%" height="100%" loading="lazy" allow="autoplay" style="border:0;width:100%;height:100%;min-height:112px" referrerpolicy="no-referrer"></iframe>