Soundcloud API /stream endpoint giving 401 error

Since I have the same problem, the answer from @Default motivated me to look for a solution. But I did not understand the workaround with the permalink_url in the steps 2 and 3. The easier solution could be:

  1. Fetch for example user track likes using api-v2 endpoint like this:
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
  1. In the response we can finde the needed URL like mentioned from @Default in his answer:
collection: [
   {
      track: {
         media: {
            transcodings:[
                   ...
                  {
                     url: "https://api-v2.soundcloud.com/media/soundcloud:tracks:713339251/0ab1d60e-e417-4918-b10f-81d572b862dd/stream/progressive"
                  ...
                  }
               ]
            }

         }
...
]
  1. Make request to this URL with client_id as a query param and you get another URL with that you can stream/download the track

Note that the api-v2 is still not public and the request from your client probably will be blocked by CORS.


Okay, I think I have found a generalized solution that will work for most people. I wish it were easier, but it's the simplest thing I've found yet.

  1. Use API to pull tracks from user. You can use linked_partitioning and the next_href property to gather everything because there's a maximum limit of 200 tracks per call.

  2. Using the data pulled down in the JSON, you can use the permalink_url key to get the same thing you would type into the browser.

  3. Make a request to the permalink_url and access the HTML. You'll need to do some parsing, but the url you'll want will be something to the effect of:

    "https://api-v2.soundcloud.com/media/soundcloud:tracks:488625309/c0d9b93d-4a34-4ccf-8e16-7a87cfaa9f79/stream/progressive"

    You could probably use a regex to parse this out simply.

  4. Make a request to this url adding ?client_id=... and it'll give you YET ANOTHER url in its return json.

  5. Using the url returned from the previous step, you can link directly to that in the browser, and it'll take you to your track content. I checked on VLC by inputting the link and it streams correctly.

Hopefully this helps some of you out with your developing.