# Spotify Artist Scraper (`maximedupre/spotify-artists`) Actor

Find public Spotify artist profiles from keywords or Spotify artist links. Get structured identity, audience metrics, releases, top tracks, related artists, and social links when available.

- **URL**: https://apify.com/maximedupre/spotify-artists.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Developer tools, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.80 / 1,000 artist profiles

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

### 🎤 Find Spotify artist profiles from keywords or links

For music researchers, playlist curators, A\&R teams, and developers, this Actor finds public Spotify artist profiles from keywords or Spotify artist links. It saves structured artist rows with identity, audience metrics, releases, top tracks, related artists, and source links when available, so you can review artists in one dataset.

- Look up a public profile from a Spotify artist link with [**Spotify Artist Lookup**](https://apify.com/maximedupre/spotify-artists/examples/spotify-artist-lookup).
- Find public artist profiles from a keyword with [**Spotify Artist Search**](https://apify.com/maximedupre/spotify-artists/examples/spotify-artist-search).
- Collect structured fields for one artist with [**Spotify Artist Data**](https://apify.com/maximedupre/spotify-artists/examples/spotify-artist-data).
- Find profiles for a most-streamed artist query with [**Most Streamed Artist On Spotify**](https://apify.com/maximedupre/spotify-artists/examples/most-streamed-artist-on-spotify).
- Build a list of profiles for a broad ranking query with [**Spotify Top 100 Artists**](https://apify.com/maximedupre/spotify-artists/examples/spotify-top-100-artists).

#### 🎧 Artist profile rows

Each saved row represents the first eligible public profile found for one Spotify artist. It keeps the artist ID, name, Spotify profile link, and available profile details together. Keyword discovery rows also keep the keyword that found the profile. If the same artist appears again from another keyword or submitted link, the later match is ignored.

The source may not provide every optional field. The Actor returns the profile fields that are publicly available, including audience counts, popularity, listener locations, releases, top tracks, related artists, discovery context, and activity links when the source shows them.

#### ▶️ Find public artist profiles

Choose `Keywords` to search for artists from one or more values, or choose `Spotify artist links` to look up supplied public artist pages. Set `Maximum results` to stop after a chosen number of saved profiles. Leave it empty to return all available results until the source is exhausted. Start the run and open the `Artist profiles` link in the output.

#### ⚙️ Input

Choose one method in `findBy`. The Actor uses only the fields for that method. Use one list of keywords or one list of Spotify artist-page links in each run.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `findBy` | string | Chooses `keywords` for keyword discovery or `artistUrls` for direct artist-page lookup. |
| `keywords` | array of strings | Adds one or more artist names, genres, or other search phrases. The Actor searches each value for public Spotify artist profiles. |
| `artistUrls` | array of objects | Adds one or more public Spotify artist-page links for direct profile lookup. |
| `artistUrls[].url` | URL string | Provides one public Spotify artist-page link. |
| `maxItems` | integer | Stops after this many saved profiles. Leave it empty to return all available results until the source is exhausted. |

**Example input**

This example is the public input from a successful current-beta keyword run.

```json
{
  "findBy": "keywords",
  "keywords": [
    "jazz"
  ],
  "maxItems": 10
}
```

#### 🧾 Output

The run output contains one link to the default dataset. The dataset uses one artist-profile row shape for both keyword discovery and direct artist-page lookup. Fields beyond `artistId`, `name`, and `spotifyUrl` are available when the source provides them.

**Run output**

| Field | Type | What it does |
| --- | --- | --- |
| `datasetUrl` | URL string | Opens the default dataset with the saved artist profiles. |

**Artist profile row fields**

| Field | Type | What it does |
| --- | --- | --- |
| `artistId` | string | Stable Spotify artist ID for joining or checking records. |
| `name` | string | Artist name shown on the Spotify profile. |
| `spotifyUrl` | URL string | Public Spotify link for the artist profile. |
| `keyword` | string | Keyword that found the profile when keyword discovery was used. |
| `isVerified` | boolean | Shows whether Spotify marks the profile as verified. |
| `biography` | string | Artist biography shown by the source, when available. |
| `images` | array of objects | Profile images shown by the source, when available. |
| `images[].url` | URL string | Direct URL for one profile image. |
| `images[].width` | integer | Image width in pixels, when available. |
| `images[].height` | integer | Image height in pixels, when available. |
| `followers` | integer | Follower count shown by the source, when available. |
| `monthlyListeners` | integer | Monthly listener count shown by the source, when available. |
| `popularity` | integer | Spotify popularity score from 0 to 100, when available. |
| `listenerLocations` | array of objects | Leading listener locations shown by the source, when available. |
| `listenerLocations[].name` | string | Name of one listener location. |
| `listenerLocations[].listenerCount` | integer | Listener count for that location, when available. |
| `socialLinks` | array of objects | External and social links shown on the profile, when available. |
| `socialLinks[].platform` | string | Platform named by the source. |
| `socialLinks[].url` | URL string | External or social link. |
| `discography` | object | Release information shown by the source, when available. |
| `discography.releaseCount` | integer | Number of releases reported by the source. It may differ from the releases listed here. |
| `discography.releases` | array of objects | Releases shown by the source, when available. |
| `discography.releases[].releaseId` | string | Stable Spotify release ID, when available. |
| `discography.releases[].name` | string | Release name shown by the source. |
| `discography.releases[].releaseType` | string | Release type reported by the source, when available. |
| `discography.releases[].releaseDate` | string | Release date reported by the source. It may contain only a year or month. |
| `discography.releases[].spotifyUrl` | URL string | Public Spotify link for the release. |
| `discography.releases[].totalTracks` | integer | Number of tracks in the release, when available. |
| `topTracks` | array of objects | Popular tracks shown for the artist, when available. |
| `topTracks[].trackId` | string | Stable Spotify track ID, when available. |
| `topTracks[].name` | string | Track name shown by the source. |
| `topTracks[].spotifyUrl` | URL string | Public Spotify link for the track. |
| `topTracks[].durationMs` | integer | Exact track duration in milliseconds, when available. |
| `topTracks[].playCount` | integer | Exact play count reported by the source, when available. |
| `relatedArtists` | array of objects | Related artist profiles shown by the source, when available. |
| `relatedArtists[].artistId` | string | Stable related-artist ID, when available. |
| `relatedArtists[].name` | string | Related artist name shown by the source. |
| `relatedArtists[].spotifyUrl` | URL string | Public Spotify link for the related artist. |
| `discoveryContext` | array of objects | Playlist and other discovery links associated with the artist, when available. |
| `discoveryContext[].contextType` | string | Kind of discovery context reported by the source. |
| `discoveryContext[].name` | string | Name of the discovery item, when available. |
| `discoveryContext[].url` | URL string | Link to the discovery item. |
| `activity` | object | Concert, merchandise, and store links shown by the source, when available. |
| `activity.concerts` | array of objects | Concert links shown by the source, when available. |
| `activity.concerts[].title` | string | Concert title, when available. |
| `activity.concerts[].url` | URL string | Concert link. |
| `activity.concerts[].date` | string | Concert date, when available. |
| `activity.concerts[].venue` | string | Concert venue, when available. |
| `activity.merchandise` | array of objects | Merchandise links shown by the source, when available. |
| `activity.merchandise[].title` | string | Merchandise title, when available. |
| `activity.merchandise[].url` | URL string | Merchandise link. |
| `activity.stores` | array of objects | Store links shown by the source, when available. |
| `activity.stores[].name` | string | Store name, when available. |
| `activity.stores[].url` | URL string | Store link. |

**Genuine current-beta row**

This genuine row is shortened from the successful current-beta keyword run. It keeps useful values from the row and one value from larger collections. Each `"..."` string marks omitted real data.

```json
{
  "artistId": "4uKEP0JYfpFtngWlgViewd",
  "name": "Lil Double 0",
  "spotifyUrl": "https://open.spotify.com/artist/4uKEP0JYfpFtngWlgViewd",
  "keyword": "jazz",
  "isVerified": true,
  "biography": "...",
  "images": [
    {
      "url": "https://i.scdn.co/image/ab6761610000e5ebb4aa3bc64a3ff1eb6a68bd7f",
      "width": 640,
      "height": 640
    },
    "..."
  ],
  "followers": 380571,
  "monthlyListeners": 1247133,
  "popularity": 60,
  "listenerLocations": [
    {
      "name": "Dallas",
      "listenerCount": 64067
    },
    "..."
  ],
  "socialLinks": [
    {
      "platform": "INSTAGRAM",
      "url": "https://instagram.com/lildouble00_/"
    },
    "..."
  ],
  "discography": {
    "releaseCount": 83,
    "releases": [
      {
        "name": "Layin Da Walkdown B Side",
        "spotifyUrl": "https://open.spotify.com/album/6ziu1bpI0H9yjfFPZ4Hjvx",
        "releaseId": "6ziu1bpI0H9yjfFPZ4Hjvx",
        "releaseType": "ALBUM",
        "releaseDate": "2026-06-26",
        "totalTracks": 17
      },
      "..."
    ]
  },
  "topTracks": [
    {
      "name": "Been Solid",
      "spotifyUrl": "https://open.spotify.com/track/4GrO1xFdQjuD9E91E9aCsk",
      "trackId": "4GrO1xFdQjuD9E91E9aCsk",
      "durationMs": 146106,
      "playCount": 42168626
    },
    "..."
  ],
  "relatedArtists": [
    {
      "name": "Big Scarr",
      "spotifyUrl": "https://open.spotify.com/artist/579LsvZcRVKtToYjS0tkKz",
      "artistId": "579LsvZcRVKtToYjS0tkKz"
    },
    "..."
  ],
  "discoveryContext": [
    {
      "contextType": "playlist",
      "url": "https://open.spotify.com/playlist/37i9dQZF1DZ06evO2DfAUE",
      "name": "This Is Lil Double 0"
    },
    "..."
  ],
  "activity": null
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. The primary event covers each structured artist profile saved to the default dataset. Check the Apify pricing panel for the current price and event details.

#### 🔌 Integrations

Open the `datasetUrl` from the run output in Apify, or use the Apify dataset API to read and export the structured artist profiles.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### What happens when the same artist matches more than one keyword or link?

The Actor saves the first eligible match and ignores later matches for the same artist. A keyword-discovered row keeps the keyword from that first saved match.

##### Can I use keywords and artist links in one run?

Choose one method in `findBy` for each run. Use separate runs for separate configurations, and submit one or more values of the same kind for the selected method.

##### What does an empty `Maximum results` value do?

Leaving `maxItems` empty returns all available results until the source is exhausted. Enter a positive number when you want the run to stop earlier.

##### Are all artist fields always filled?

No. `artistId`, `name`, and `spotifyUrl` are required. Other fields appear when Spotify makes that public data available.

##### Do I need a Spotify login or API key?

No buyer Spotify login or API key is needed. The Actor uses publicly available Spotify information.

##### Does this Actor return tracks, albums, or playlists as separate rows?

No. It saves artist-profile rows. Releases, top tracks, and discovery links can appear as nested artist fields when available.

##### Does it return every possible search match?

No. The product does not promise an exhaustive list of every search match. Results depend on what the public source returns for your values.

##### Does it monitor artist changes over time?

No. Each run is a current lookup or discovery pass. Keep datasets from separate runs if you want to compare your own snapshots.

##### How is pricing calculated?

The primary event is tied to each artist profile saved to the default dataset. The Apify pricing panel shows the current event price before you run it.

### 📝 Changelog

**v0.0** (24-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~spotify-artists/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Spotify Songs Scraper](https://apify.com/maximedupre/spotify-songs-scraper) - Search public Spotify tracks after building an artist list.
- [Spotify Artist : Monthly Listeners & Contact Info Scraper](https://apify.com/scrapestorm/spotify-artist-monthly-listeners-contact-info-scraper) - Add monthly-listener and profile details to artist research.
- [Spotify Artist Details Scraper](https://apify.com/nifty.codes/spotify-artistdetails-scraper) - Compare artist biographies, listener counts, rankings, and discography details.
- [Spotify Artist & Fans-Also-Like Recovery](https://apify.com/gabruck97/spotify-coleta-artistas) - Explore related artists and listener locations from an artist profile.
- [Spotify Artists Scraper](https://apify.com/easyapi/spotify-artists-scraper) - Collect artist profiles from keywords for identity research.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `findBy` (type: `string`):

Choose keywords to discover public artist profiles or artist links to look up specific profiles.

## `keywords` (type: `array`):

Enter one or more keywords, such as an artist name or genre. The Actor searches each value for public Spotify artist profiles.

## `artistUrls` (type: `array`):

Add one or more Spotify artist-page links. The Actor looks up each linked artist profile.

## `maxItems` (type: `integer`):

Stop after this many artist profiles. Leave it empty to return all available results until the source is exhausted.

## Actor input object example

```json
{
  "findBy": "keywords",
  "keywords": [
    "jazz"
  ],
  "maxItems": 10
}
```

# Actor output Schema

## `datasetUrl` (type: `string`):

Open the artist profiles found by the Actor.

# 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 = {
    "findBy": "keywords",
    "keywords": [
        "jazz"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/spotify-artists").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 = {
    "findBy": "keywords",
    "keywords": ["jazz"],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/spotify-artists").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 '{
  "findBy": "keywords",
  "keywords": [
    "jazz"
  ],
  "maxItems": 10
}' |
apify call maximedupre/spotify-artists --silent --output-dataset

```

## MCP server setup

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

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/acUWWioMXvUs3Cxpq/builds/0stTUwnMImm9pyRpu/openapi.json
