SoundCloud for Developers

Discover, connect and build

We use cookies for various purposes including analytics and personalized marketing. By continuing to use the service, you agree to our use of cookies as described in the Cookie Policy.

Backstage Blog RSS

You're browsing posts of the category Announcements

  • May 13th, 2016 Announcements API Playlist search returns only compact representations as of July 15, 2016 By Max Jakob

    We previously introduced new playlist representations. The compact representation returns only the playlist itself without any of the tracks. For most users, this is preferable – the compact representation significantly reduces the size of the JSON payload for large playlists and provides faster API response times.

    Beginning July 15, 2016, all queries using the q parameter will only return this compact representation for playlists. Other playlist representations will no longer be available when using the q parameter.

    To fetch the track listings for one of the returned playlists, you can make an additional request to the /playlists/{id} resource by using the corresponding playlist ID.

    If your application expects track listings from playlist search results, update your application by July 15, 2016.

  • October 1st, 2015 Announcements API JavaScript SDKs Introducing SoundCloud JavaScript SDK 3.0.0 By Jan Monschke

    We are happy to announce version 3.0.0 of our SoundCloud JavaScript SDK.

    The new SDK improves stream security and content uploading functionality, and modernizes the technology stack.

    Version 3 of the SoundCloud JavaScript SDK is a major update and is not backwards compatible. That said, the changes that you need to make your web app work with the new SDK are easy to implement. Please refer to Migrating to JavaScript SDK 3.0.0 to upgrade.

    ECMAScript 2015 and CommonJS

    The original version of the SDK was written in CoffeeScript, which is no longer a core technology at SoundCloud. This update provided us the opportunity to migrate our source code from CoffeeScript to ECMAScript 2015.

    The new SDK is now using the Babel compiler for ES2015 support, and webpack as our bundler. This has the additional benefit of making the SoundCloud JavaScript SDK 3.0.0 compliant with CommonJS.

    Because of this, we can now take advantage of the variety of packages that are available via npm, and users can install the SDK via npm as well. Please refer to the npm page for details.

    JavaScript Promises

    Promises have become a core part of JavaScript with the new ES2015 specification, and they allow for better composability and a easier control flow. Internally, we work with Promises a lot and wanted to give external developers the ability to benefit from an easier API.

    Web Audio API

    The previous SDK neither provided a way to record sounds from Web Audio applications nor a way to upload Web Audio recordings. It shipped with a Flash component that handled recording and uploading of recordings. There was no way to specify an external file for uploading.

    The new SDK ships with a recorder component that uses Web Audio and getUserMedia instead of Flash, and the component allows you to pass in arbitrary AudioNodes that will be recorded. This makes it much easier to integrate the SoundCloud JavaScript SDK 3.0.0 into creator applications that rely on Web Audio. The SDK provides a dedicated method to publish recordings directly from your web app.

    Secure streaming

    The new SDK now includes a new player component. This component improves security for creator content and provides the improved playback stability.


    We also took the time to all of rewrite our documentation and code examples so that you can start with the new SDK immediately.

  • June 16th, 2015 Announcements API Introducing Rate Limits By Dean Hudson

    At SoundCloud, we’re building an ecosystem where creativity thrives. Developers are an important part of that ecosystem. We’re continually inspired by how you use the SoundCloud API to support creators and listeners in innovative ways.

    But as the ecosystem has grown, we’re dealing with an increasing number of applications that abuse creator content by violating our developer Terms of Use. To help control this type of behaviour, we're introducing a daily rate limit on API play requests.

    Beginning July 1, client applications will be limited to 15,000 play requests per 24 hour period. These limits are applied to developer applications using the SoundCloud API, and have no impact on the SoundCloud embedded player.

    Only a small number of developers will be affected by this change, and we’ve contacted them via email to ensure a smooth transition.

    What this means for you:

    1. You should review our developer documentation on rate limiting. Limiting API access is common for API providers. If you’re unfamiliar with rate limits or how they work, we’re here to help.
    2. You should monitor your play requests.
    3. Make sure the email account associated with your app is up-to-date, and keep an eye out for communication from our team.

    This change does not affect the SoundCloud embedded player, and if you have not heard from us, your app is unaffected.

    In the coming months we'll be introducing an application process for developers who'd like additional access.

    This change is an opportunity for us to refocus our efforts and renew our commitment to developers. You’re an integral part of the SoundCloud community, and we look forward to seeing what you build next.

  • June 8th, 2015 Announcements API New playlist representations By Erik Michaels-Ober

    Requests for playlists have always included the full track objects contained within. This representation may be convenient for playlists with ten or twenty tracks but can cause problems for playlists that contain hundreds or thousands of tracks. Requesting such large playlists could result in requests that take a long time to respond and that eventually timeout.

    Today, we introduce two new representations for the /playlists resource: compact and id.

    If you add representation=compact to a playlist request, the request will return only the playlist itself, without any of the tracks it contains. This representation may be useful if you're purely interested in data about the playlist itself and not the tracks contained within.

    Alternatively, if you set the representation=id parameter, it will return the playlist along with IDs of the tracks contained within, without all the associated track meta data (artist, artwork, duration, etc.) If necessary, you can then individually fetch additional information about each track by filling those IDs into the /tracks resource. This allows for greater parallelization and can help make your application more responsive when working with large playlists.

    By default, requests for playlists will continue to include all the contained tracks. There is no need to update your application but we encourage you to take advantage of these new, more efficient representations of playlists.

  • May 18th, 2015 Announcements API Apple's June 1 64-bit deadline By Erik Michaels-Ober

    In October 2014, Apple announced that all submissions to the App Store must include 64-bit support by June 1, 2015. The SoundCloud API for Cocoa contains 32-bit dependencies and will not be updated, because it has been discontinued. Anyone using the SoundCloud API for Cocoa will need to will need to migrate away from it if they wish to update their app after June 1.

    To ease this transition we have built a sample app that demonstrates how to authorize a user via OAuth using only built-in Foundation libraries.

    Once an access_token has been obtained via OAuth, you can make GET requests like so:

    let urlSession = NSURLSession.sharedSession()
    let urlString = ""
    let urlComponents = NSURLComponents(string: urlString)!
    urlComponents.queryItems = [ NSURLQueryItem(name: "oauth_token", value: "insert an OAuth token here")]
    let url = urlComponents.URL!
    let dataTask = urlSession.dataTaskWithRequest(NSURLRequest(URL: url)) { (data, response, error) -> Void in
       if let jsonOutput = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil) as? [String:AnyObject] {
           // do stuff with JSON

    POST requests that contain multipart data (e.g. uploading a track) look like this:

    import UIKit
    class ViewController: UIViewController {
        func uploadTrack(title: String, trackPath: String) {
            let urlSession = NSURLSession.sharedSession()
            let urlRequest = getURLRequest(title, audioPath: trackPath)
            let task = urlSession.dataTaskWithRequest(urlRequest) { (data, response, error) -> Void in
                if let httpResponse = response as? NSHTTPURLResponse {
                    println("returned \(httpResponse.statusCode)")
                if data != nil, let response = NSString(data: data, encoding: NSUTF8StringEncoding) {
                if let err = error {
        func getURLRequest(title: String, audioPath: String) -> NSURLRequest {
            let boundary = NSUUID().UUIDString
            let request = NSMutableURLRequest(URL: NSURL(string: "")!)
            request.HTTPMethod = "POST"
            request.HTTPBody = getPostData("insert an OAuth token here", boundary: boundary, title: title, audioPath: audioPath)
            let contentType = "multipart/form-data; boundary=" + boundary
            request.setValue(contentType, forHTTPHeaderField: "Content-Type")
            return request
        func getPostData(token: String, boundary: String, title: String, audioPath: String) -> NSData {
            let boundaryStart = "--\(boundary)\r\n"
            let boundaryEnd = "\r\n--\(boundary)--\r\n"
            let bodyData : NSMutableData = NSMutableData()
            // add the token
            var tokenSection = boundaryStart
            tokenSection += "Content-Disposition: form-data; name=\"oauth_token\"\r\n\r\n"
            tokenSection += "\(token)\r\n"
            // add the track title
            var titleSection = boundaryStart
            titleSection += "Content-Disposition: form-data; name=\"track[title]\"\r\n\r\n"
            titleSection += "\(title)\r\n"
            // add the audio file
            let trackData = NSData(contentsOfFile: audioPath)!
            var trackSection = boundaryStart
            trackSection += "Content-Disposition: form-data; name=\"track[asset_data]\"; "
            trackSection += "filename=\"\(audioPath.lastPathComponent)\"\r\n"
            trackSection += "Content-Type: application/octet-stream\r\n"
            trackSection += "\r\n"
            return bodyData

    Note: This example assumes access tokens will never expire, however, we encourage you not to make this assumption in your production code. Instead, build your app assuming that tokens will periodically expire and can be refreshed using a refresh token. For details on how to use a refresh token, see Section 1.5 of the OAuth 2.0 specification.