# SoundCloud Scraper - Tracks, Plays, Likes & Artists (`scrapers_lat/soundcloud-scraper`) Actor

Scrape SoundCloud tracks by keyword, artist or URL. Get plays, likes, reposts, comments, genre, tags, artwork and artist stats as JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers_lat/soundcloud-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Social media, Other
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 4.00 out of 5 stars

## Pricing

from $6.80 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

[![SoundCloud Scraper - Tracks, Plays, Likes & Artists](https://scrapers.lat/banners/soundcloud-scraper.png)](https://console.apify.com/actors/WSdvaffIxuqeuofie/input)

## SoundCloud Scraper - Tracks, Plays, Likes & Artists

Here is one real result, with every field the actor returns (the long `description` is trimmed here with `...`; live records return it in full):

```json
{
  "imageUrl": "https://i1.sndcdn.com/artworks-0ljHO6lNVPp3dJPy-CTOtGw-large.jpg",
  "title": "Chuyện Đôi Ta  - Emcee L Ft Muộii (lofi ver.)",
  "url": "https://soundcloud.com/minh-ph-789763242/chuyen-doi-ta-emcee-l-ft-muoii-lofi-ver",
  "id": 1172136256,
  "artistName": "aga1n",
  "artistUrl": "https://soundcloud.com/minh-ph-789763242",
  "artistId": 948916771,
  "playCount": 5114079,
  "likeCount": 27018,
  "repostCount": 506,
  "commentCount": 316,
  "durationMs": 210776,
  "fullDurationMs": 210756,
  "genre": null,
  "tags": [],
  "description": "Chorus:\nNhững cơn sóng xô lâu đài vỡ trong bóng đêm...",
  "uploadDate": "2021-12-05T02:55:01Z",
  "releaseDate": null,
  "lastModified": "2022-01-18T14:56:51Z",
  "downloadable": false,
  "downloadCount": 0,
  "license": "all-rights-reserved",
  "labelName": null,
  "permalink": "chuyen-doi-ta-emcee-l-ft-muoii-lofi-ver",
  "waveformUrl": "https://wave.sndcdn.com/ftk0Nbu7QQpd_m.json",
  "artistFollowers": 472,
  "artistTrackCount": 5,
  "artistPlaylistCount": 0,
  "artistVerified": false,
  "artistCity": "Hai Phong",
  "artistCountry": "VN",
  "source": "search:lofi",
  "observedAt": "2026-08-10T14:33:15.175Z",
  "error": null
}
```

The most complete SoundCloud scraper available. It returns every field a SoundCloud track exposes, plus full engagement counts (plays, likes, reposts, comments) and a rich artist profile block (followers, track count, verification, city and country), from keyword searches, artist profiles or direct track and playlist URLs.

**📥 [Input](https://apify.com/scrapers_lat/soundcloud-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/soundcloud-scraper/output-schema) · 💰 [Pricing](https://apify.com/scrapers_lat/soundcloud-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/soundcloud-scraper/examples)**

![Apify](https://img.shields.io/badge/Platform-Apify-1CE1CE?logo=apify\&logoColor=white)
![Coverage](https://img.shields.io/badge/Coverage-Global-blue)
![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)
![Billing](https://img.shields.io/badge/Billing-Pay%20per%20result-brightgreen)

### Table of contents

- [What it does](#what-it-does)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [Example output record](#example-output-record)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)

### What it does

The actor collects SoundCloud tracks and writes one normalized record per track to the run's dataset. It accepts three kinds of input: keyword searches, artist or user profiles (newest uploads), and direct track or playlist URLs (playlists are expanded into their tracks). Results from all inputs are merged and capped by `maxTracks`.

Each record carries the track title, URL, artwork, engagement counts (plays, likes, reposts, comments), duration, licensing and upload dates, plus an artist profile block (followers, track and playlist counts, verification status, city and country) so you can rank tracks and profile artists without a second lookup.

### Quickstart

Open the actor, paste this into the input, and press Run. It searches SoundCloud for "lofi" and returns up to 10 tracks.

```json
{
  "searchQueries": ["lofi"],
  "maxTracks": 10
}
```

Provide any combination of `searchQueries`, `artists` and `trackUrls`. Results from all sources are merged and capped by `maxTracks`.

### Input reference

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `searchQueries` | string\[] | no | `["lofi"]` | Keywords to search on SoundCloud (for example `lofi`, `deep house`). Each keyword runs its own search. |
| `artists` | string\[] | no | (empty) | Artist or user profile URLs (`https://soundcloud.com/username`) or plain usernames. Collects the newest tracks each artist uploaded. |
| `trackUrls` | string\[] | no | (empty) | Direct track URLs or playlist (set) URLs. Playlists are expanded into their tracks. |
| `maxTracks` | integer | no | `10` | Maximum number of tracks to collect across the whole run. Free Apify plans are capped at 25 per run. |

### Output reference

One dataset item per track. Types: `string`, `integer`, `boolean`, `string[]`, or `null` when the source value is absent.

| Field | Type | Description |
|---|---|---|
| `title` | string | Track title. |
| `url` | string | Public track URL. |
| `id` | integer | SoundCloud track id. |
| `permalink` | string | Track permalink slug. |
| `imageUrl` | string | Track artwork URL, or `null`. |
| `artistName` | string | Artist / uploader display name. |
| `artistUrl` | string | Artist profile URL. |
| `artistId` | integer | SoundCloud artist id. |
| `playCount` | integer | Number of plays. |
| `likeCount` | integer | Number of likes. |
| `repostCount` | integer | Number of reposts. |
| `commentCount` | integer | Number of comments. |
| `durationMs` | integer | Playable duration in milliseconds. |
| `fullDurationMs` | integer | Full track duration in milliseconds. |
| `genre` | string | Genre, or `null`. |
| `tags` | string\[] | Track tags. Empty array when none. |
| `description` | string | Track description text, or `null`. |
| `uploadDate` | string | ISO 8601 upload timestamp. |
| `releaseDate` | string | ISO 8601 release date, or `null`. |
| `lastModified` | string | ISO 8601 last-modified timestamp. |
| `downloadable` | boolean | Whether the track is marked downloadable. |
| `downloadCount` | integer | Number of downloads. |
| `license` | string | License string, for example `all-rights-reserved`. |
| `labelName` | string | Record label name, or `null`. |
| `waveformUrl` | string | URL of the track waveform JSON. |
| `artistFollowers` | integer | Follower count of the artist. |
| `artistTrackCount` | integer | Number of tracks the artist has uploaded. |
| `artistPlaylistCount` | integer | Number of playlists the artist has. |
| `artistVerified` | boolean | Whether the artist profile is verified. |
| `artistCity` | string | Artist city, or `null`. |
| `artistCountry` | string | Artist country code, or `null`. |
| `source` | string | Which input produced this record, for example `search:lofi`. |
| `observedAt` | string | ISO 8601 timestamp of when the record was collected. |
| `error` | string | `null` on success. On a failed run, a single item with a populated `error` field is written instead. |

### Example output record

Real record from a live run (input `{"searchQueries": ["lofi"], "maxTracks": 10}`). The long `description` is trimmed here with `...`:

```json
{
  "title": "Chuyện Đôi Ta  - Emcee L Ft Muộii (lofi ver.)",
  "url": "https://soundcloud.com/minh-ph-789763242/chuyen-doi-ta-emcee-l-ft-muoii-lofi-ver",
  "id": 1172136256,
  "artistName": "aga1n",
  "artistUrl": "https://soundcloud.com/minh-ph-789763242",
  "artistId": 948916771,
  "playCount": 5114079,
  "likeCount": 27018,
  "repostCount": 506,
  "commentCount": 316,
  "durationMs": 210776,
  "genre": null,
  "tags": [],
  "uploadDate": "2021-12-05T02:55:01Z",
  "license": "all-rights-reserved",
  "artistFollowers": 472,
  "artistTrackCount": 5,
  "artistVerified": false,
  "artistCity": "Hai Phong",
  "artistCountry": "VN",
  "source": "search:lofi",
  "observedAt": "2026-08-10T14:33:15.175Z",
  "error": null
}
```

### Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace `<TOKEN>` with your Apify API token.

Run synchronously and get dataset items in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~soundcloud-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries":["lofi"],"maxTracks":25}'
```

Start a run asynchronously:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~soundcloud-scraper/runs?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"artists":["https://soundcloud.com/octobersveryown"],"maxTracks":100}'
```

Apify CLI:

```bash
apify call scrapers_lat/soundcloud-scraper \
  --input '{"trackUrls":["https://soundcloud.com/user/track-name"]}'
```

### Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"

## Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
```

`<DATASET_ID>` is returned as `defaultDatasetId` in the run object. Use `offset` and `limit` to page through large result sets. `clean=true` drops empty and internal fields.

### Billing and limits

- **Pay per result.** You are charged per track returned (`result` event). See the [pricing tab](https://apify.com/scrapers_lat/soundcloud-scraper/pricing) for the current per-result price.
- **No charge on failure.** If a run errors, the actor writes a single item with a populated `error` field and does not charge for it. Empty runs cost nothing.
- **Spend cap respected.** Set `maxTotalChargeUsd` on the run; once reached, the actor stops emitting and charging further billable results.
- **Free Apify plans** are capped at 25 tracks per run. Upgrade for higher `maxTracks`.

### FAQ and troubleshooting

**Can I scrape one artist's uploads?**
Yes. Put the profile URL or username in `artists`. The actor collects the newest tracks that artist uploaded.

**Does it expand playlists?**
Yes. Put a playlist (set) URL in `trackUrls` and it is expanded into its tracks.

**Why is `genre` or `artistCity` null?**
The uploader did not set it. Missing source values are returned as `null`, never invented.

**How are the sources combined?**
Results from `searchQueries`, `artists` and `trackUrls` are merged and capped by `maxTracks`. The `source` field tells you which input produced each record.

**Is this an official SoundCloud tool?**
No. This actor is independent and has no affiliation with SoundCloud. It reads only publicly available track and profile data. Use the results in accordance with the source's terms.

### Related scrapers

- [Discogs Scraper](https://apify.com/scrapers_lat/discogs-scraper): Music releases, artists and labels from Discogs.
- [DeviantArt Scraper](https://apify.com/scrapers_lat/deviantart-scraper): Artwork and creator data from DeviantArt.
- [Behance Scraper](https://apify.com/scrapers_lat/behance-scraper): Creative projects and creators from Behance.
- [Dribbble Scraper](https://apify.com/scrapers_lat/dribbble-scraper): Design shots and designers from Dribbble.
- [Douyin Scraper](https://apify.com/scrapers_lat/douyin-scraper): Videos and creators from Douyin.

### More scrapers at scrapers.lat

Built and maintained by [scrapers.lat](https://scrapers.lat), where we publish scrapers for public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at [scrapers.lat](https://scrapers.lat).

***

> Independent tool, not affiliated with SoundCloud. Accesses only publicly available track and profile data. Use the results in accordance with the source's terms.
>
> </content>

# Actor input Schema

## `maxTracks` (type: `integer`):

Maximum number of tracks to collect across the whole run. Optional.

## `searchQueries` (type: `array`):

Keywords to search on SoundCloud (for example "lofi", "deep house"). Each keyword runs its own search.

## `artists` (type: `array`):

Artist or user profile URLs (https://soundcloud.com/username) or plain usernames. Collects the newest tracks each artist uploaded.

## `trackUrls` (type: `array`):

Direct track URLs or playlist (set) URLs. Playlists are expanded into their tracks.

## Actor input object example

```json
{
  "maxTracks": 10,
  "searchQueries": [
    "lofi"
  ]
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxTracks": 10,
    "searchQueries": [
        "lofi"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/soundcloud-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "maxTracks": 10,
    "searchQueries": ["lofi"],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/soundcloud-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxTracks": 10,
  "searchQueries": [
    "lofi"
  ]
}' |
apify call scrapers_lat/soundcloud-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapers_lat/soundcloud-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/WSdvaffIxuqeuofie/builds/K8UyqrPADnM63C0dp/openapi.json
