# Genius Scraper — Lyrics, Credits, Samples & Annotations (`haketa/genius-scraper`) Actor

Scrape songs from Genius: full lyrics, credits (producers & writers), samples and interpolations, album, release date, streaming links, tags, stats — plus crowd-sourced annotations. Search songs, sweep an artist's catalog, or target URLs. No token required.

- **URL**: https://apify.com/haketa/genius-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Social media, AI
- **Features:** Limited permissions
- **Stats:** 7 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.75 / 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

<h1 align="center">🎼 Genius Scraper — Lyrics, Credits, Samples & Annotations</h1>

<p align="center">
  <img alt="Platform" src="https://img.shields.io/badge/Made%20for-Apify-97D700?style=for-the-badge">
  <img alt="Target" src="https://img.shields.io/badge/Target-Genius.com-FFFF64?style=for-the-badge&logoColor=black">
  <img alt="No Token" src="https://img.shields.io/badge/No%20API%20Token-Required-4C8BF5?style=for-the-badge">
  <img alt="Scale" src="https://img.shields.io/badge/Scale-1%2C000%2B%20Songs-8A2BE2?style=for-the-badge">
  <img alt="Export" src="https://img.shields.io/badge/Export-JSON%20%7C%20CSV%20%7C%20Excel%20%7C%20API-FF7A00?style=for-the-badge">
</p>

<p align="center"><b>Extract complete song lyrics, producer & writer credits, sample & interpolation graphs, streaming links, pageviews, and community annotations from Genius at scale.</b></p>

**This Genius scraper extracts the complete picture of any song or artist catalog from [Genius](https://genius.com): full lyrics, producer & writer credits, the samples & interpolations graph, album and release info, streaming links, pageview stats, cover art, and the crowd-sourced annotations behind the words.** Enter a song name, a Genius URL, or an artist and press Start — **no login, no API token, no coding**. It is the most reliable **Genius data extractor** to **scrape Genius** at scale and turn unstructured song pages into clean, structured records ready for **bulk export in JSON, CSV, Excel, or API**.

> 🎧 Built for music-data analysts, music supervisors & sync-licensing teams, NLP/ML engineers, musicology researchers, A\&R teams, playlist curators, and music publishing catalogs who need structured **Genius lyrics**, **song credits**, and **sample clearance intelligence**.

***

### ⚡ At a glance

| Feature | Details |
| :--- | :--- |
| 🎯 **Input modes** | Search by song titles, paste Genius song URLs, pass song IDs, or sweep entire artist catalogs |
| 📝 **Full lyrics** | Clean, in-order song lyrics with section headers (`[Intro]`, `[Verse 1]`, `[Chorus]`) and HTML stripped |
| 🎛️ **Credits & rights** | Producers, songwriters, featured artists, primary artist, album, and release date (`YYYY-MM-DD`) |
| 🔗 **Sample & interpolation graph** | Complete `songRelationships` array (`samples`, `sampled_in`, `interpolates`, `interpolated_by`, `cover_of`, `remixed_by`) |
| 💡 **Crowd-sourced annotations** | Lyric fragment → community explanation, vote score, contributor name, and contributor IQ |
| 📊 **Popularity & media** | Pageviews count, `hot` trending status, high-res cover art URL, Spotify / YouTube / Apple Music / SoundCloud links |
| 🔄 **1,000+ deep pagination** | Automatic multi-page artist catalog traversal (`50 songs/page`) with run-wide deduplication by `songId` |
| 💾 **Export & integration** | Bulk export JSON, CSV, Excel, XML, or stream via Apify API into Python, R, Make, Zapier, n8n, or Google Sheets |

***

### 🔎 Why scrape Genius?

[Genius](https://genius.com) is the largest crowd-sourced music knowledge base and lyrics database on the web — housing millions of tracks with verified lyrics, detailed producer and songwriter credits, track-to-track influence graphs (who sampled, interpolated, covered, or remixed what), and line-by-line annotations explaining cultural references and wordplay. For anyone working in music intelligence, NLP, or catalog valuation, that combination exists nowhere else in one unified place.

The challenge is that all of this rich catalog metadata is scattered across interactive web views built for human browsing. Copy-pasting lyrics, manually logging songwriter splits, and tracing multi-generational sample chains across hundreds of tracks is slow, error-prone, and impossible to maintain across a growing catalog. A **Genius scraper** turns those pages into a structured dataset you can filter, join, and analyze — one normalized record per song, spreadsheet- and warehouse-ready.

**Common reasons teams scrape Genius:**

- 🎤 **Build NLP & AI training corpora** — assemble clean, section-tagged lyrics datasets paired with human-written annotations for LLM fine-tuning, sentiment analysis, and music information retrieval (MIR).
- 🎛️ **Catalog valuation & royalty research** — extract producer and writer credits across hundreds of songs to audit publishing catalogs, verify collaborator networks, and discover uncredited catalog value.
- 🔗 **Sync licensing & sample clearance** — map the complete `songRelationships` influence graph (`samples`, `sampled_in`, `interpolates`, `cover_of`) before clearing a track for film, TV, advertising, or games.
- 📊 **A\&R & artist benchmarking** — track Genius `pageviews`, `annotationCount`, `sampledInCount`, and `hot` status across an artist's discography or an entire genre cohort.
- 💡 **Cultural & musicology research** — analyze lyrical themes, rhyme density, vocabulary evolution, and annotated literary references across decades and genres.
- ▶️ **Cross-platform catalog enrichment** — harvest `spotifyUrl`, `youtubeUrl`, `appleMusicUrl`, `soundcloudUrl`, and high-resolution `songArtImageUrl` to link Genius metadata with DSP streaming catalogs.

***

### ✨ What this Genius scraper does

- ✅ **Flexible multi-mode input** — scrape specific **songs** (by free-text title + artist, direct Genius URL, or numeric song ID) *and/or* sweep **artists'** popular catalogs automatically in a single run.
- ✅ **Full, clean lyrics extraction** — captures complete, properly ordered lyric text with structural markers (`[Verse]`, `[Chorus]`, `[Bridge]`) and zero HTML clutter (toggleable via `includeLyrics`).
- ✅ **Comprehensive song metadata & credits** — extracts `title`, `artist`, `album`, `releaseDate`, `producers`, `writers`, `featuredArtists`, `primaryGenre`, full `tags` list, `language`, and `explicit` flag.
- ✅ **Complete samples & interpolations graph** — populates `songRelationships` with every track a song *samples* or *interpolates*, plus every downstream track that *sampled, interpolated, covered, remixed, performed live, or translated* it.
- ✅ **Structured crowd-sourced annotations** — pairs each annotated lyric `fragment` with its community `explanation`, `votes`, `author`, and `authorIq` (toggleable via `includeAnnotations`).
- ✅ **Cross-platform streaming links** — extracts `spotifyUrl`, `youtubeUrl`, `appleMusicUrl`, and `soundcloudUrl` whenever linked on the song record.
- ✅ **Engagement stats & cover art** — captures `pageviews`, `hot` flag, `annotationCount`, `sampledInCount`, song `description`, and high-resolution `songArtImageUrl`.
- ✅ **Unlocked 1,000+ pagination & deduplication** — paginates deep through artist catalogs (`per_page=50`) with automatic `songId` deduplication so multi-artist or 1,000+ song runs never emit duplicate rows.
- ✅ **No token, no login required** — works out of the box with built-in proxy rotation and automatic retries.

***

### 🎯 Use cases

| Persona | How they use Genius Scraper |
| :--- | :--- |
| 🎬 **Music Supervisors & Sync Teams** | Audit sample and interpolation chains (`songRelationships`) before licensing tracks for commercials, films, or games. |
| 📈 **Music Publishing & Catalog Investors** | Pull songwriter (`writers`) and producer (`producers`) credits across 1,000+ catalog tracks to evaluate acquisition targets. |
| 🤖 **NLP, AI & ML Engineers** | Build multi-thousand-song datasets pairing `lyrics` with human `annotations` to train metaphor detection and lyric generation models. |
| 🎵 **A\&R & Record Label Analysts** | Benchmark emerging artists by Genius `pageviews`, `annotationCount`, `sampledInCount`, and genre tag distributions. |
| ✍️ **Music Journalists & Podcasters** | Research complete verified credits, track descriptions, and top-voted community annotations for artist deep-dives. |
| 🛠️ **Music App & DSP Product Teams** | Enrich internal track databases with cover art (`songArtImageUrl`), release dates, explicit flags, and cross-DSP links (`spotifyUrl`, `youtubeUrl`). |

***

### 📥 Input

Provide **songs**, **artists**, or both. Every field is optional — if you run the Actor with an empty input `{}` it automatically sweeps popular artists to deliver a ~100-song sample dataset.

| Field | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `songs` | array of strings | `[]` | Specific songs to scrape. Enter a **song name** (e.g. `"HUMBLE Kendrick Lamar"`), a **Genius song URL**, or a numeric **song ID**. |
| `artists` | array of strings | `[]` | Artist names (e.g. `"Kendrick Lamar"`, `"Taylor Swift"`) or Genius artist URLs/IDs to sweep their most popular songs. |
| `maxSongsPerArtist` | integer | `0` (auto) | Maximum popular songs to pull per artist. `0` = automatic/unlimited (scales up to `maxItems`). |
| `includeLyrics` | boolean | `true` | Extract the full plain-text lyrics for each song. Turn off for ultra-fast metadata & credit sweeps. |
| `includeAnnotations` | boolean | `true` | Extract crowd-sourced annotations (`fragment`, `explanation`, `votes`, `author`, `authorIq`). |
| `maxItems` | integer | `25` | Total maximum songs to save across the run (`prefill: 25` for fast preview). Set `1000`+ or `0` (unlimited) for full catalog sweeps. |
| `proxyConfiguration` | object | Residential | Proxy settings. Apify Residential proxy is pre-configured by default for reliable access. |

#### Example input — specific songs with lyrics & annotations

```json
{
  "songs": [
    "HUMBLE Kendrick Lamar",
    "https://genius.com/Kendrick-lamar-not-like-us-lyrics",
    "Stan Eminem"
  ],
  "includeLyrics": true,
  "includeAnnotations": true,
  "maxItems": 25
}
```

#### Example input — 1,000+ song multi-artist catalog sweep

```json
{
  "artists": [
    "Kendrick Lamar",
    "Drake",
    "Taylor Swift",
    "Eminem",
    "Kanye West",
    "The Weeknd"
  ],
  "maxSongsPerArtist": 0,
  "includeLyrics": true,
  "includeAnnotations": false,
  "maxItems": 1000
}
```

***

### 📤 Output

Each dataset item represents one unique song. Empty or unavailable fields are omitted to keep records clean and compact. Below is a real record from a verified run:

```json
{
  "songId": 772,
  "title": "Stan",
  "artist": "Eminem",
  "url": "https://genius.com/Eminem-stan-lyrics",
  "releaseDate": "2000-05-23",
  "producers": "Eminem, The 45 King",
  "writers": "Eminem, Dido, Paul Herman, The 45 King",
  "featuredArtists": "Dido",
  "album": "The Marshall Mathers LP",
  "primaryGenre": "Rap",
  "tags": "Trip-Hop, Horrorcore, Hip-Hop, Narrative Music, Conscious Rap, Detroit Rap, Rap",
  "language": "en",
  "explicit": true,
  "songArtImageUrl": "https://images.genius.com/6283a3d3df5aa9dd2d01a47bf7bcc395.953x953x1.png",
  "pageviews": 10083453,
  "spotifyUrl": "https://open.spotify.com/track/3UmaczJpikHgJFyBTAJVoz",
  "youtubeUrl": "https://www.youtube.com/watch?v=aqUpe6QeBTk",
  "soundcloudUrl": "https://soundcloud.com/eminemofficial/stan-album-version-explicit",
  "description": "In this song, Eminem corresponds with a crazed fan who becomes increasingly unhinged…",
  "annotationCount": 54,
  "sampledInCount": 27,
  "songRelationships": [
    {
      "type": "samples",
      "title": "Thank You",
      "artist": "Dido",
      "url": "https://genius.com/Dido-thank-you-lyrics"
    },
    {
      "type": "sampled_in",
      "title": "Fanpost",
      "artist": "Gio (DEU)",
      "url": "https://genius.com/Gio-deu-fanpost-lyrics"
    }
  ],
  "lyrics": "[Intro: Dido]\nMy tea's gone cold, I'm wonderin' why I got out of bed at all…",
  "annotations": [
    {
      "fragment": "I'm doin' ninety on the freeway",
      "explanation": "Stan's speed serves as a physical manifestation of his mania…",
      "votes": 4,
      "author": "readtxt",
      "authorIq": 690
    }
  ]
}
```

#### 📋 Output field reference

##### 🎵 Identity & Core Metadata

| Field | Type | Coverage | Description |
| :--- | :--- | :--- | :--- |
| `songId` | integer | 🟢 High (100%) | Unique Genius numeric song ID (natural primary & deduplication key). |
| `title` | string | 🟢 High (100%) | Official song title on Genius. |
| `artist` | string | 🟢 High (100%) | Primary artist display name. |
| `url` | string | 🟢 High (100%) | Canonical Genius song lyrics page URL. |
| `album` | string | 🟢 High (~95%) | Album or project title when linked on Genius. |
| `releaseDate` | string | 🟢 High (~98%) | Official release date (`YYYY-MM-DD`). |
| `language` | string | 🟢 High (~99%) | ISO language code of the lyrics (e.g. `en`, `es`, `fr`). |
| `explicit` | boolean | 🟢 High (100%) | Whether the track is marked explicit (`true` / `false`). |
| `songArtImageUrl` | string | 🟢 High (100%) | High-resolution cover art image URL. |

##### 🎛️ Credits, Genres & Description

| Field | Type | Coverage | Description |
| :--- | :--- | :--- | :--- |
| `producers` | string | 🟢 High (~97%) | Comma-separated list of credited music producers. |
| `writers` | string | 🟢 High (~98%) | Comma-separated list of credited songwriters and composers. |
| `featuredArtists` | string | 🟡 Conditional (~34%) | Comma-separated featured artists (present when the track has features). |
| `primaryGenre` | string | 🟢 High (100%) | Primary genre tag assigned to the track (e.g. `Rap`, `Pop`, `R&B`). |
| `tags` | string | 🟢 High (100%) | Full comma-separated list of genre, subgenre, and regional tags. |
| `description` | string | 🟢 High (~96%) | Plain-text background summary ("About" blurb) written by the Genius community. |

##### 📊 Engagement, Streaming & Influence Graph

| Field | Type | Coverage | Description |
| :--- | :--- | :--- | :--- |
| `pageviews` | integer | 🟢 High (~99%) | Cumulative Genius pageview count. |
| `hot` | boolean | 🟡 Conditional | Present (`true`) when the song is currently trending on Genius. |
| `annotationCount` | integer | 🟢 High (100%) | Total count of annotations attached to the song. |
| `sampledInCount` | integer | 🟡 Conditional | Number of downstream songs that sampled this track (present when `≥ 1`). |
| `songRelationships` | array of objects | 🟢 High (~98%) | Array of `{type, title, artist, url}` mapping samples, interpolations, covers, remixes, and live versions. |
| `spotifyUrl` | string | 🟡 Conditional (~60%) | Direct Spotify track link when available on Genius. |
| `youtubeUrl` | string | 🟢 High (~99%) | Official YouTube video/audio link when available. |
| `appleMusicUrl` | string | 🟡 Conditional | Apple Music link when available. |
| `soundcloudUrl` | string | 🟢 High (~83%) | SoundCloud stream link when available. |

##### 📝 Lyrics & Crowd-Sourced Annotations

| Field | Type | Coverage | Description |
| :--- | :--- | :--- | :--- |
| `lyrics` | string | 🟢 High (~96%) | Complete plain-text song lyrics with section headers (when `includeLyrics: true`). |
| `annotations` | array of objects | 🟢 High (~94%) | Array of `{fragment, explanation, votes, author, authorIq}` (when `includeAnnotations: true`). |

***

### 🔁 Pagination & 1,000+ scale

For **artist sweeps**, the Genius scraper paginates automatically through each artist's song catalog sorted by popularity (`50 songs per page`), advancing page by page (`page=1, 2, 3…`) until it reaches your `maxSongsPerArtist` / `maxItems` target or the artist's catalog is exhausted.

- **Unlocked 1,000+ results:** Set `maxSongsPerArtist: 0` (automatic) and `maxItems: 1000` (or `0` for unlimited) to collect 1,000+ songs across one or more artists without hitting any page clamp.
- **Empty-run fallback:** Running with `{}` automatically resolves a multi-artist list (`Kendrick Lamar`, `Drake`, `Taylor Swift`, `Eminem`, `The Weeknd`, etc.) and returns ~100 songs out of the box.
- **Zero duplicates:** Every resolved song is deduplicated in memory by its unique Genius `songId` before scraping, guaranteeing **0% duplicate rows** even when featured artists overlap.
- **Parallel worker pool:** Songs are fetched concurrently (`5 parallel workers`) with automatic proxy IP rotation and exponential backoff on transient HTTP `403`/`429` responses.

***

### ⚙️ How to use

1. Open **Genius Scraper** in the **Apify Console**.
2. Enter one or more **Songs** (song names, Genius URLs, or IDs) and/or **Artists**.
3. Set **Max songs** (`maxItems`: `25` for a quick test, `1000+` for deep catalog extraction) and optionally adjust `maxSongsPerArtist`.
4. Choose whether to include full **Lyrics** (`includeLyrics`) and **Annotations** (`includeAnnotations`).
5. Click **Start** and watch songs stream into the dataset in real time.
6. Download your data from the **Storage / Output** tab in **JSON, CSV, Excel, or XML**, or fetch it via the **Apify API**.

#### Run via Apify API (cURL)

```bash
curl -X POST "https://api.apify.com/v2/acts/haketa~genius-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "artists": ["Kendrick Lamar", "Drake"],
    "maxSongsPerArtist": 0,
    "includeLyrics": true,
    "includeAnnotations": true,
    "maxItems": 200
  }'
```

***

### 🐍 Programmatic usage (Python & Node.js)

#### Python (`apify-client`)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run_input = {
    "artists": ["Kendrick Lamar", "Taylor Swift", "Eminem"],
    "maxSongsPerArtist": 0,
    "includeLyrics": True,
    "includeAnnotations": True,
    "maxItems": 300,
}

run = client.actor("haketa/genius-scraper").call(run_input=run_input)

for song in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{song.get('artist')} - {song.get('title')} ({song.get('releaseDate')}) | Pageviews: {song.get('pageviews')}")
```

#### Node.js (`apify-client`)

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('haketa/genius-scraper').call({
    songs: [
        'HUMBLE Kendrick Lamar',
        'https://genius.com/Kendrick-lamar-not-like-us-lyrics',
    ],
    artists: ['Drake'],
    maxSongsPerArtist: 50,
    includeLyrics: true,
    includeAnnotations: true,
    maxItems: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Extracted ${items.length} Genius songs:`, items[0]);
```

***

### 🔗 Integrations & data pipelines

Because **Genius Scraper** outputs clean, normalized JSON records, you can connect it directly to:

- **Google Sheets & Airtable:** Automatically append newly released artist tracks, producer credits, and streaming links to a shared A\&R or sync-licensing tracker.
- **Make, Zapier & n8n:** Trigger downstream workflows whenever an artist's catalog is scraped — such as enriching Spotify playlists, alerting sync teams on sample clearances, or indexing lyrics in Elasticsearch / Pinecone.
- **Snowflake, BigQuery & PostgreSQL:** Stream multi-thousand-song corpora via the Apify Dataset API for musicology analytics, NLP model training, and catalog valuation models.

***

### 💡 Tips for best results

- 🎯 **Include artist names in song queries:** Pass `"HUMBLE Kendrick Lamar"` rather than just `"HUMBLE"` so search resolution locks onto the exact primary track.
- ⚡ **Speed up bulk credit & sample sweeps:** If you only need songwriters, producers, pageviews, and the `songRelationships` sample graph, set `includeLyrics: false` and `includeAnnotations: false` to cut run time by 60%.
- 🔗 **Filter `songRelationships` by `type`:** In downstream analysis, filter the `songRelationships` array by `samples`, `sampled_in`, `interpolates`, `interpolated_by`, `cover_of`, or `remixed_by` to build directed influence graphs.
- 🌐 **Keep Residential proxies enabled:** Genius applies rate limits to datacenter IPs; the default Apify Residential proxy configuration ensures smooth 1,000+ song collection.

***

### ⚠️ Honest limitations

- **Instrumental & unreleased tracks:** A small percentage (~3–4%) of entries on Genius are instrumentals, tracklist placeholders, or unreleased snippets that do not have published lyrics (`lyrics` will be omitted).
- **Community-contributed coverage:** Streaming URLs (`spotifyUrl`, `appleMusicUrl`) and `featuredArtists` are populated only when present on the Genius record.
- **Annotations per song:** Up to 50 referents/annotations are captured per song from the primary referent feed, covering all major annotated lines on standard tracks.

***

### ❓ FAQ

**Do I need a Genius API token or account?**
No. Genius Scraper works out of the box with zero API keys, zero OAuth tokens, and no login required.

**How many songs can I scrape in a single run?**
As many as you need — set `maxItems: 1000` (or `0` for unlimited) and `maxSongsPerArtist: 0`. The scraper paginates through artist catalogs at 50 songs per page until your target is met.

**Does it extract who sampled or interpolated a song?**
Yes. Every song record includes `songRelationships` — a structured array listing every track the song samples/interpolates and every track that sampled, interpolated, covered, or remixed it, alongside `sampledInCount`.

**Are section headers like `[Chorus]` and `[Verse 1]` preserved in the lyrics?**
Yes. Lyrics are extracted with line breaks and structural section headers intact, while all HTML tags and entities are stripped cleanly.

**Will I get duplicate songs if two artists collaborated on the same hit?**
No. All resolved song IDs are deduplicated by `songId` across the entire run before extraction begins.

**What export formats are supported?**
You can bulk export results to **JSON, CSV, Excel (XLSX), XML, or RSS**, or consume them programmatically via the **Apify API**, Make, Zapier, n8n, and Google Sheets.

***

### 🔗 Related scrapers

- [Discogs Scraper](https://apify.com/haketa/discogs-scraper) — vinyl, CD, artist discographies, labels, and marketplace pricing data.
- [SoundCloud Scraper](https://apify.com/haketa/soundcloud-scraper) — tracks, artists, play counts, and audio metadata from SoundCloud.
- [Podchaser Scraper](https://apify.com/haketa/podchaser-scraper) — podcasts, episodes, ratings, and creator credits.

***

### 📋 Changelog

#### v1.2 (2026-11) — Unlocked 1,000+ Deep Catalog Pagination

- **Unlocked 1K+ artist pagination:** Removed the 5-page (`250-song`) per-artist ceiling in `getArtistTopSongs` and changed `maxSongsPerArtist` default to `0` (auto-scaling with `maxItems`), allowing single or multi-artist sweeps to paginate cleanly past 1,000+ songs.
- **Upgraded empty-run fallback:** Empty input (`{}`) now sweeps a curated 10-artist roster (`Kendrick Lamar`, `Drake`, `Taylor Swift`, `Eminem`, `The Weeknd`, etc.) to return a 100-song sample when no limit is set, while honoring any explicit `maxItems`.
- **Fast prefill execution:** Kept `maxItems` prefill at `25` so Console test runs finish in ~20–40 seconds.

#### v1.1 (2026-10) — Lightweight Lyrics & Sample Graph Enrichment

- Added `sampledInCount` convenience counter alongside the full `songRelationships` array.
- Optimized lyrics extraction via the lightweight embed payload (`~13 KB` vs `~600 KB` full HTML) to reduce residential proxy transfer costs by over 95%.

#### v1.0 (2026-09) — Initial Release

- Initial release with multi-mode song/artist resolution, full lyrics, producer/writer credits, streaming links, and crowd-sourced annotations.

# Changelog

This Actor's version history is a separate document: https://apify.com/haketa/genius-scraper/changelog.md

# Actor input Schema

## `songs` (type: `array`):

The songs to scrape. Enter a song name (e.g. "HUMBLE Kendrick Lamar"), a Genius song URL, or a song ID. Add as many as you like.

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

Optionally, enter artist names (e.g. "Kendrick Lamar", "Taylor Swift") to scrape each artist's most popular songs.

## `maxSongsPerArtist` (type: `integer`):

When using the Artists field, how many of each artist's most popular songs to scrape. Set 0 for automatic / unlimited (governed by Max songs).

## `includeLyrics` (type: `boolean`):

Include the full lyrics text for each song.

## `includeAnnotations` (type: `boolean`):

Include the crowd-sourced annotations (lyric fragment → explanation, votes and author) for each song.

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

Stop after scraping this many songs. Set 0 for no limit.

## `proxyConfiguration` (type: `object`):

Required for reliable collection — residential proxies are recommended for this Actor.

## Actor input object example

```json
{
  "songs": [
    "HUMBLE Kendrick Lamar",
    "https://genius.com/Kendrick-lamar-not-like-us-lyrics"
  ],
  "artists": [
    "Kendrick Lamar",
    "Drake"
  ],
  "maxSongsPerArtist": 0,
  "includeLyrics": true,
  "includeAnnotations": true,
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open to view, filter and export all scraped songs (JSON, CSV, Excel).

# 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 = {
    "songs": [],
    "artists": [],
    "maxItems": 25,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/genius-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 = {
    "songs": [],
    "artists": [],
    "maxItems": 25,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/genius-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 '{
  "songs": [],
  "artists": [],
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call haketa/genius-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,haketa/genius-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/MWl8UUTa96uKUV7yP/builds/6opkW7WRUmcVS06xU/openapi.json
