# **Architectural Strategies for High-Efficiency Metadata Aggregation: Optimizing API Utilization in Distributed Client-Side Environments**

## **1\. Executive Summary: The Metadata Aggregation Paradox**

The digital music ecosystem is characterized by a paradox of availability: while metadata is ubiquitous, high-fidelity, standardized, and interoperable data is sequestered behind fragmented API ecosystems, each with distinct access protocols, rate limits, and schema definitions. For MetaMuLate v2.0, a client-side Single Page Application (SPA) tasked with aggregating granular metadata—specifically International Standard Recording Codes (ISRCs), Phonographic Copyright lines (P-Lines), and liner notes—the architectural challenge shifts from mere data retrieval to **efficiency optimization**.

The primary constraint in this domain is the computational and network cost of retrieval. A naive "search-and-scrape" architecture, which iterates sequentially through search results for every track in a batch, introduces an ![][image1] complexity, where ![][image2] is the number of tracks and ![][image3] is the number of service providers. With strict rate limits (e.g., Discogs’ 60 requests per minute 1), such an architecture fails at scale.

This report establishes a **"Lookup-First, Batch-Optimized"** architectural standard. The central thesis is that system efficiency is maximized by increasing **Metadata per Request (MpR)**—the density of useful data points returned in a single HTTP transaction. By transitioning from atomic, single-entity calls to batched, relationship-inclusive queries (using include and views parameters), the system can reduce its API footprint by an estimated 60-80%.

This analysis dissects the specific endpoints, authentication mechanisms (including client-side ES256 JWT generation for Apple Music), and data structures of Apple Music, Discogs, MusicBrainz, Amazon Music, and Genius. It further addresses the critical technical hurdles of browser-based deployments, specifically Cross-Origin Resource Sharing (CORS) policies, and provides a definitive guide to programmatic access.

## **2\. Architectural Theory: Optimizing Metadata per Request (MpR)**

To balance the conflicting requirements of minimizing API calls while maximizing data granularity, the system must adopt a hierarchical query strategy that prioritizes deterministic identifiers over fuzzy search strings.

### **2.1 The Hierarchy of Query Specificity**

Efficiency in metadata aggregation is a function of query specificity. The "Golden Record"—the target output containing reconciled fields like ISRC and P-Line—requires a composite of data from multiple sources. To construct this without exhausting rate limits, MetaMuLate must follow a strict hierarchy of operations:

1. **Level 1: Deterministic Batch Lookup (The "Golden Path")**  
   * **Mechanism:** Querying services using a Unique Identifier (UID) that is universal (ISRC, UPC/EAN) or platform-specific (Apple Catalog ID, MusicBrainz ID).  
   * **Efficiency:** Maximal. Endpoints such as Apple Music’s v1/catalog/{storefront}/songs?ids= allow for retrieving up to 300 entities in a single HTTP transaction.2  
   * **Data Integrity:** Highest. Matches are exact, implicitly satisfying "Uniformity" checks defined in the technical design.3  
2. **Level 2: Relational Browsing (The "Contextual Path")**  
   * **Mechanism:** Retrieving child entities (Recordings) via a parent entity (Release/Album) using payload expansion.  
   * **Efficiency:** High. A single call to a Release endpoint on MusicBrainz can return tracklists, artist credits, and relationships for 50+ tracks simultaneously using the inc parameter.4  
   * **Data Integrity:** High. Context ensures tracks belong to the correct version of a release.  
3. **Level 3: Fuzzy Search (The "Discovery Path")**  
   * **Mechanism:** Querying via text strings (e.g., "Daft Punk Get Lucky").  
   * **Efficiency:** Low. Requires heuristics to filter false positives (covers, remixes). Often necessitates a secondary "detail fetch" call, doubling the request count per entity.  
   * **Recommendation:** This path must be the fallback, utilized only when deterministic identifiers are unavailable.

### **2.2 The "Include" and "Views" Strategy**

The most significant lever for increasing MpR is the utilization of API expansion parameters. Modern RESTful APIs allow clients to shape the response object, embedding related resources that would otherwise require independent requests.

* **Apple Music Strategy:** Utilization of the include parameter. A request for a Song resource can embed the associated Album resource and Artist resource within the same JSON response. This allows the extraction of the P-Line (often stored at the Album level) without a separate API call.6  
* **MusicBrainz Strategy:** Utilization of the inc parameter. MusicBrainz allows for deep subqueries, including artist-credits, isrcs, releases, and url-rels. A single request can effectively dump the entire relational schema for a recording.4

### **2.3 Balancing Rate Limits in Client-Side Architectures**

MetaMuLate operates as a client-side SPA, meaning API requests originate from the user's IP address. While this distributes the load across the user base, it requires robust client-side throttling to prevent IP banning.

* **Leaky Bucket Implementation:** The application must implement a client-side rate limiter (e.g., a "Leaky Bucket" or "Token Bucket" algorithm). For strictly rate-limited services like Discogs (60 requests/minute), the client must enforce a rigid delay (e.g., 1000ms) between requests.1  
* **Request Queueing:** As users batch-process lists of tracks, requests should not be fired in parallel ( Promise.all with unlimited concurrency). Instead, they must be pushed to a managed queue that respects the specific rate limits of each provider.

## ---

**3\. Service-Specific Implementation Strategy**

The following sections detail the precise mechanisms to extract the "Golden Record" fields from each provider, optimizing for the architectural principles outlined above.

### **3.1 Apple Music API: The Core Identifier Source**

Apple Music serves as the primary source for "Uniform" digital metadata, offering high-reliability ISRCs, standardized artist names, and high-resolution artwork.

#### **3.1.1 Authentication: Client-Side ES256 JWT Generation**

Accessing the Apple Music API requires a signed JSON Web Token (JWT).8

* **Algorithm:** The token must be signed using the **ES256** algorithm (Elliptic Curve Digital Signature Algorithm using P-256 and SHA-256).8  
* **Key Material:** Generation requires a Private Key (.p8 file) and a Key ID (kid) obtained from the Apple Developer Portal.8  
* **Claims:**  
  * iss (Issuer): The 10-character Team ID.  
  * iat (Issued At): Current timestamp (Unix epoch).  
  * exp (Expiration): Timestamp up to 6 months in the future.9

**Client-Side Implementation Strategy:**

Standard security protocols discourage storing private keys in client-side code. However, for a "Zero-Setup" standalone HTML file intended for trusted internal use, generating the token client-side is technically feasible using JavaScript cryptography libraries.

* **Libraries:** The **Web Crypto API** is the native browser standard for cryptographic operations but can be complex to implement for JWT signing directly. Libraries such as jose or jsrsasign provide abstractions for ES256 signing.10  
* **Process:**  
  1. The user provides the Private Key contents (PEM format) into the application settings.  
  2. The application uses importKey (Web Crypto) or the library function to load the EC private key.  
  3. The application constructs the Header and Payload.  
  4. The application signs the data to produce the JWS (JSON Web Signature).

*Code Logic (Conceptual):*

JavaScript

// Conceptual flow using a library like 'jose' or 'jsrsasign'  
const privateKey \= "..."; // Loaded from user input  
const token \= await new SignJWT({ iss: TEAM\_ID, iat: now, exp: now \+ 15777000 })  
 .setProtectedHeader({ alg: 'ES256', kid: KEY\_ID })  
 .sign(privateKey);

#### **3.1.2 Optimization: Batch Lookups**

To populate the track list efficiently, MetaMuLate should utilize Apple Music's batch lookup capabilities.

* **Batch ISRC Lookup:**  
  * **Endpoint:** GET /v1/catalog/{storefront}/songs  
  * **Query:** ?filter\[isrc\]={isrc1},{isrc2}...  
  * **Limit:** The API documents a maximum fetch limit of **25 songs** when filtering by ISRC.13  
  * **Strategy:** The application must slice the user's input list into chunks of 25\. For 100 tracks, this results in 4 API calls instead of 100, a 96% reduction in overhead.  
* **Batch Catalog ID Lookup:**  
  * **Endpoint:** GET /v1/catalog/{storefront}/songs  
  * **Query:** ?ids={id1},{id2}...  
  * **Limit:** The API allows fetching up to **300 songs** by their Apple Music Catalog IDs.2  
  * **Strategy:** If the internal system already possesses Apple IDs (e.g., from a previous search), this endpoint provides the highest MpR efficiency.

#### **3.1.3 Maximizing Metadata via include**

A critical requirement for the Golden Record is the **P-Line** (Phonographic Copyright). In the Apple Music data model, this attribute is typically associated with the **Album** entity, not the individual Song entity. To retrieve this without a secondary call, the include parameter is essential.

* **Query:** GET /v1/catalog/us/songs?ids=...\&include=albums.6  
* **Data Parsing Logic:**  
  1. Parse the data array for Song objects.  
  2. For each Song, access the relationships.albums.data array.  
  3. Extract the first Album object (historically the primary release).  
  4. Read the attributes.copyright field from the Album object to populate the P-Line.15  
* **Record Labels:** The documentation indicates that record-labels is a valid relationship for Albums.16 Therefore, the path to the Record Label name is Song \-\> Album \-\> Record Label. The query should be structured as ?include=albums and potentially nested fields if supported by the specific API version, or parsed from the Album's attributes if record-label relationship fetching is restricted. Note that record-labels is explicitly listed as a relationship for Albums 17, confirming that the Album object is the correct vector for this data.

### **3.2 MusicBrainz: The Relational Engine**

MusicBrainz (MB) excels at linking entities (e.g., connecting a Recording to a Work to find Composers). It is an open-source database with a permissive API but strict rate limiting rules.

#### **3.2.1 Access and User-Agent Throttling**

MusicBrainz does not require an API key for read-only access but enforces a strict **User-Agent policy**.

* **Requirement:** Every request must include a User-Agent header containing the application name, version, and contact information (e.g., MetaMuLate/2.0 ( contact@example.com )).18  
* **Consequence:** Requests with generic or missing User-Agents are throttled to effectively zero. Proper identification allows for approximately **50 requests per second** (burst) or **1 request per second** (sustained) per IP.18 MetaMuLate must enforce a 1-second delay between MB calls to remain good citizens of the API.

#### **3.2.2 Optimization: The Super-Include (inc)**

MusicBrainz supports the most extensive "include" capability of all surveyed services, allowing for massive data retrieval in a single GET request.

* **Endpoint:** GET /ws/2/recording/{mbid}  
* **Parameters:** ?inc=artist-credits+isrcs+releases+url-rels+work-rels+work-level-rels.4  
* **Data Extraction for Golden Record:**  
  * **ISRCs:** Returned in the isrcs list (essential for cross-referencing).19  
  * **Artist Credits:** The artist-credit list provides the canonical artist name and "join phrases" (e.g., " feat. ") required for accurate track titling.5  
  * **Composers:** By including work-rels and work-level-rels, the API returns the abstract "Work" associated with the recording, and the artists related to that Work (e.g., Composers, Lyricists).5 This allows MetaMuLate to populate the "Composer" field without a separate Work lookup.  
  * **Releases:** The releases list provides release dates and countries, aiding in the selection of the "original" release year.5

#### **3.2.3 Batching Limitations and Workarounds**

MusicBrainz does not support a native "multi-get" for arbitrary Recording IDs (e.g., rid:ID1|ID2 is a search syntax, not a lookup).4

* **Search Workaround:** It is possible to use the Search endpoint with a Lucene query to retrieve multiple IDs: query=rid:ID1 OR rid:ID2 OR rid:ID3.20 However, search responses are structured differently than direct lookups and may have inconsistent inc parameter support.  
* **Recommended Strategy:** For high-fidelity metadata, individual lookups with the "Super-Include" string are preferred, throttled to 1/sec. The breadth of data returned per call (MpR) compensates for the inability to batch the primary keys.

### **3.3 Discogs: The Physical Metadata Authority**

Discogs is the definitive source for physical media data, such as Matrix/Runout codes and detailed liner notes. However, its API architecture presents a "Search vs. Detail" dichotomy that threatens efficiency.

#### **3.3.1 Authentication**

Discogs requires a **User-Agent** and, for image access or higher rate limits, a **Personal Access Token**.

* **Header:** Authorization: Discogs token={YOUR\_TOKEN}.1  
* **Rate Limit:** The API strictly enforces **60 requests per minute**.1 Exceeding this results in a 429 error.

#### **3.3.2 The "Search vs. Detail" Structural Inefficiency**

The fundamental challenge with Discogs is that the Search endpoint returns a simplified object that lacks the critical fields required for the Golden Record.

* **Search Response:** Returns title, year, thumb, resource\_url, id. **Missing:** companies (P-Line), identifiers (Barcodes), extraartists (Credits).1  
* **Release Response:** Returns the full schema including companies, identifiers, notes (Liner Notes), and full credits.1

#### **3.3.3 Optimization Strategy: Lazy-Loading**

To balance the 60 req/min limit with the need for deep data:

1. **Search First:** Use the Search endpoint with specific parameters (barcode, catno, or artist+track) to find candidates.22  
2. **Display Summaries:** Render the search results (Zone B of MetaMuLate) using the summary data.  
3. **Fetch on Demand:** **Do not** automatically fetch the details for all search results. Only trigger the expensive GET /releases/{id} call when the user actively selects a candidate or expands a result row. This "Human-in-the-Loop" throttling naturally aligns request volume with user speed.

### **3.4 Amazon Music: The Inaccessible Walled Garden**

Amazon Music's programmatic access is severely restricted. The official Web API is in **Closed Beta** requiring allowlisting 23, and the Device API is deprecated.

#### **3.4.1 Access Strategy: Scraping Structured Data (JSON-LD)**

Since API access is not guaranteed, MetaMuLate must rely on parsing the structured data embedded in the public web pages of music.amazon.com.

* **Target:** https://music.amazon.com/search/{query} or https://music.amazon.com/albums/{asin}.  
* **JSON-LD Extraction:** Amazon injects Schema.org compliant JSON-LD into \<script type="application/ld+json"\> tags. This data typically contains the MusicAlbum or MusicRecording schema, which includes copyrightYear, copyrightHolder (P-Line), and duration.24  
* **Hydration Data:** Inspecting the DOM for window.amznMusic or \_\_NEXT\_DATA\_\_ (if the stack is Next.js based) often reveals the full application state object, containing unmasked metadata.23

#### **3.4.2 Technical Limitations**

Scraping is fragile and does not support batching. It must be treated as a fallback mechanism for specific fields (like Amazon-specific ASINs or Lyrics Snippets) that are unavailable elsewhere.

### **3.5 Genius: Lyrics and Annotations**

Genius is primarily useful for lyrics and crowdsourced annotations.

#### **3.5.1 Access and API**

* **Authentication:** OAuth2 Access Token passed in the header: Authorization: Bearer {TOKEN}.28  
* **Endpoint:** GET /songs/{id}.  
* **Limitation:** The API does not natively support searching by ISRC.29 Lookup must be performed via text search (GET /search?q={artist} {track}) followed by selecting the best match.  
* **Metadata:** The song object contains description (annotations) and metadata, but the full lyrics text is often not returned in the API JSON to avoid licensing issues, requiring scraping of the returned url.30

## ---

**4\. Technical Hurdles: CORS and Browser Security**

As a client-side application ("Zero-Setup" HTML), MetaMuLate operates within the browser's security sandbox. This presents a critical obstacle: **Cross-Origin Resource Sharing (CORS)**.

### **4.1 The CORS Problem**

Browsers enforce the Same-Origin Policy. If MetaMuLate is running from file:/// or http://localhost, and attempts to fetch('https://api.discogs.com/...'), the browser sends a preflight OPTIONS request.

* **Failure Mode:** If the server (Discogs, Genius) does not respond with Access-Control-Allow-Origin: \* or the specific origin of the client, the browser blocks the response. Discogs and Genius generally **do not** allow wildcard access for authenticated requests with credentials.28

### **4.2 Architectural Solutions**

#### **4.2.1 Solution A: The Local Proxy (Development/Advanced)**

The most robust solution is to route requests through a local proxy server that injects the necessary CORS headers.

* **Tool:** cors-anywhere (Node.js).  
* **Workflow:**  
  1. Start local proxy on port 8080\.  
  2. MetaMuLate requests: http://localhost:8080/https://api.discogs.com/releases/123.  
  3. Proxy fetches data, adds Access-Control-Allow-Origin: \*, and returns to client.

#### **4.2.2 Solution B: Browser Extensions (Zero-Setup)**

For a purely client-side distribution without Node.js dependencies, the user must install a browser extension like **"Allow CORS: Access-Control-Allow-Origin"**.33 This extension intercepts the preflight check and injects the allow headers, effectively bypassing the restriction. This requirement must be documented as a prerequisite for MetaMuLate v2.0 users.

## ---

**5\. Synthesis: The "Golden Record" Mapping Strategy**

The following table synthesizes the optimized source path for each field in the Golden Record, prioritizing MpR and API reliability.

| Golden Field | Primary Source | Endpoint / Logic | Optimization Strategy | Fallback Source |
| :---- | :---- | :---- | :---- | :---- |
| **Track Name** | Apple Music | v1/catalog/songs \-\> attributes.name | Batch Lookup (25/call) | MusicBrainz |
| **ISRC** | Apple Music | v1/catalog/songs \-\> attributes.isrc | Batch Lookup | MusicBrainz (isrcs inc) |
| **Release Name** | Apple Music | include=albums \-\> attributes.name | Embedded Relationship | Discogs |
| **P-Line** | Apple Music | include=albums \-\> attributes.copyright | Embedded Relationship | Discogs (companies) |
| **Record Label** | Apple Music | include=albums \-\> relationships.record-labels | Embedded Relationship | Discogs (labels) |
| **Year** | Apple Music | attributes.releaseDate (Parse YYYY) | Direct Attribute | Discogs (year) |
| **Composer** | MusicBrainz | inc=work-rels \-\> artist-credits (type: composer) | Deep Subquery | Apple Music (composerName) |
| **Liner Notes** | Discogs | GET /releases/{id} \-\> notes | Lazy Load (On-Click) | Apple Music (editorialNotes) |
| **Producer** | Discogs | GET /releases/{id} \-\> extraartists (role: Producer) | Lazy Load | MusicBrainz (artist-rels) |
| **Lyrics** | Genius | Scrape via URL from API search | Text Match | Amazon Music (Scrape) |
| **Cover Art** | Apple Music | attributes.artwork.url | Template Resolution | Cover Art Archive |

## ---

**6\. Conclusion**

The optimization of MetaMuLate v2.0 relies on a strategic inversion of the typical data gathering workflow. Rather than searching and iterating, the system must **Identify, Batch, and Expand**.

1. **Identify:** Use **Apple Music** as the high-throughput entry point to resolve ISRCs and basic metadata in batches of 25-300 items.  
2. **Expand:** Use **MusicBrainz** to enrich these identifiers with relational data (Composers, Works) using the inc parameter to fetch deep trees in single requests.  
3. **Target:** Use **Discogs** surgically. By restricting Discogs calls to user-selected candidates via Lazy Loading, the system respects the strict 60/min rate limit while accessing the deep physical metadata (Liner Notes, P-Lines) that only Discogs possesses.  
4. **Scrape:** Reserve **Amazon Music** and **Genius** scraping for data points unavailable elsewhere (Lyrics, specific ASINs), mitigating the fragility of HTML parsing.

This architecture reduces the API call volume by an order of magnitude compared to linear iteration, ensuring MetaMuLate v2.0 is both responsive and resilient.

## ---

**Appendix: Access and Authentication Guide to Music Repositories**

This appendix provides the specific procedural steps required to gain programmatic access to the APIs referenced in this report.

### **A.1 Apple Music API**

* **Access Tier:** Commercial / Developer.  
* **Cost:** Requires Apple Developer Program membership ($99/year).  
* **Prerequisites:** An Apple ID with Two-Factor Authentication enabled.  
* **Step-by-Step Access:**  
  1. **Enroll:** Sign up for the([https://developer.apple.com/programs/](https://developer.apple.com/programs/)).  
  2. **Register App ID:** Navigate to **Certificates, Identifiers & Profiles** \> **Identifiers**. Create a new App ID and ensure the **MusicKit** service is enabled in the capabilities list.  
  3. **Create Private Key:** Go to **Certificates, Identifiers & Profiles** \> **Keys**. Create a new Key, check the box for **Media Services** (MusicKit), and download the .p8 Private Key file.  
     * *Warning:* This file can only be downloaded **once**. Store it securely.  
  4. **Gather Identifiers:** Record your **Team ID** (found in the top right of the portal) and the **Key ID** (from the Keys section).  
  5. **Token Generation:** You must generate a JWT (JSON Web Token) signed with your private key using the ES256 algorithm.  
     * **Header:** { "alg": "ES256", "kid": "YOUR\_KEY\_ID" }  
     * **Payload:** { "iss": "YOUR\_TEAM\_ID", "iat": 1600000000, "exp": 1615552000 } (Expiration can be up to 6 months).

### **A.2 Discogs API**

* **Access Tier:** Public / Community.  
* **Cost:** Free.  
* **Prerequisites:** A free Discogs user account.  
* **Step-by-Step Access:**  
  1. **Log In:** Sign in to([https://www.discogs.com](https://www.discogs.com)).  
  2. **Developer Settings:** Navigate to **Settings** \> **Developers** (usually at the bottom footer or in the user menu).  
  3. **Create Application:** Click **"Create New Application"**. Enter an Application Name (e.g., "MetaMuLate") and Description.  
  4. **Generate Token:** Once the application is created, you will see "Consumer Key" and "Consumer Secret" (used for OAuth). For simple read-only access (sufficient for MetaMuLate), look for the **"Generate New Token"** button.  
  5. **Usage:** This token acts as a permanent personal access token. Use it in the HTTP Header: Authorization: Discogs token={YOUR\_TOKEN}.

### **A.3 MusicBrainz API**

* **Access Tier:** Open Source / Public.  
* **Cost:** Free (Non-commercial).  
* **Prerequisites:** None for read access. Account required for writing data.  
* **Step-by-Step Access:**  
  1. **No Key Required:** The API does not use API keys for standard read operations.  
  2. **User-Agent Configuration:** You **must** configure your application to send a unique User-Agent header.  
     * *Format:* ApplicationName/Version ( ContactInformation )  
     * *Example:* MetaMuLate/2.0 ( admin@metamulate.app ).  
  3. **Rate Limiting:** Ensure your client logic strictly adheres to **1 request per second**. Violating this (or failing to provide a User-Agent) will result in your IP being throttled or banned.

### **A.4 Amazon Music (Web API)**

* **Access Tier:** Closed Beta / Restricted.  
* **Cost:** Varies (Partner agreements).  
* **Prerequisites:** Amazon Developer Account.  
* **Step-by-Step Access:**  
  1. **Register:** Create an account at the([https://developer.amazon.com/](https://developer.amazon.com/)).  
  2. **Security Profile:** Create a **Login with Amazon (LWA)** Security Profile. This generates a Client ID and Client Secret.  
  3. **Request Access:** Access to the Music API scopes (music::catalog, music::playback) is **not public**. You cannot self-service enable these scopes.  
  4. **Contact:** You must contact Amazon Music Business Development directly to have your Security Profile "allowlisted" for the Music API. Without this manual approval, LWA tokens will not grant access to the API endpoints.  
  5. **Fallback:** If approval is not granted, utilize the scraping method (Parsing music.amazon.com HTML) which requires no authentication, only a standard browser User-Agent string.

### **A.5 Genius API**

* **Access Tier:** Public.  
* **Cost:** Free.  
* **Prerequisites:** Genius user account.  
* **Step-by-Step Access:**  
  1. **Log In:** Sign in to [Genius.com](https://genius.com).  
  2. **API Management:** Visit the [API Client Management Page](https://genius.com/api-clients).  
  3. **Create Client:** Click **"New API Client"**. Enter an App Name and App Website URL (this can be a placeholder like http://example.com if strictly for local use).  
  4. **Get Token:** After saving, click **"Generate Access Token"**. This provides a bearer token.  
  5. **Usage:** Pass this token in the header: Authorization: Bearer {YOUR\_TOKEN}.

### **A.6 Cover Art Archive (CAA)**

* **Access Tier:** Public (hosted by Internet Archive).  
* **Cost:** Free.  
* **Prerequisites:** None.  
* **Step-by-Step Access:**  
  1. **URL Construction:** No authentication is required. Access is purely URL-based.  
  2. **Format:** http://coverartarchive.org/release/{MBID}/front.  
  3. **Handling:** The API returns a 307 Temporary Redirect to the actual image location on archive.org servers. Your HTTP client must be configured to follow redirects automatically.

#### **Works cited**

1. Home \- Discogs API Documentation, accessed January 22, 2026, [https://www.discogs.com/developers](https://www.discogs.com/developers)  
2. Get Multiple Catalog Songs by ID | Apple Developer Documentation, accessed January 22, 2026, [https://developer.apple.com/documentation/applemusicapi/get-multiple-catalog-songs-by-id](https://developer.apple.com/documentation/applemusicapi/get-multiple-catalog-songs-by-id)  
3. MetaMuLate Technical Design \- V3  
4. MusicBrainz API, accessed January 22, 2026, [https://musicbrainz.org/doc/MusicBrainz\_API](https://musicbrainz.org/doc/MusicBrainz_API)  
5. MusicBrainz API / Examples, accessed January 22, 2026, [https://musicbrainz.org/doc/MusicBrainz\_API/Examples](https://musicbrainz.org/doc/MusicBrainz_API/Examples)  
6. Apple Music API | Apple Developer Documentation, accessed January 22, 2026, [https://developer.apple.com/documentation/applemusicapi/](https://developer.apple.com/documentation/applemusicapi/)  
7. Handling Resource Representation and Relationships | Apple Developer Documentation, accessed January 22, 2026, [https://developer.apple.com/documentation/applemusicapi/handling-resource-representation-and-relationships](https://developer.apple.com/documentation/applemusicapi/handling-resource-representation-and-relationships)  
8. Generating Developer Tokens | Apple Developer Documentation, accessed January 22, 2026, [https://developer.apple.com/documentation/applemusicapi/generating-developer-tokens](https://developer.apple.com/documentation/applemusicapi/generating-developer-tokens)  
9. Generating developer tokens | Apple Developer Documentation, accessed January 22, 2026, [https://developer.apple.com/documentation/devicemanagement/generating-developer-tokens](https://developer.apple.com/documentation/devicemanagement/generating-developer-tokens)  
10. Validate JWT using RS256 in JavaScript | JWT Validation in Multiple Programming Languages \- SSOJet, accessed January 22, 2026, [https://ssojet.com/jwt-validation/validate-jwt-using-rs256-in-javascript](https://ssojet.com/jwt-validation/validate-jwt-using-rs256-in-javascript)  
11. JSON Web Token Libraries \- jwt.io, accessed January 22, 2026, [https://jwt.io/libraries](https://jwt.io/libraries)  
12. jose \- UNPKG, accessed January 22, 2026, [https://app.unpkg.com/jose@3.9.0/files/README.md](https://app.unpkg.com/jose@3.9.0/files/README.md)  
13. accessed January 22, 2026, [https://developer.apple.com/documentation/applemusicapi/get-multiple-catalog-songs-by-isrc\#:\~:text=Note%20that%20one%20ISRC%20value,maximum%20fetch%20limit%20is%2025.](https://developer.apple.com/documentation/applemusicapi/get-multiple-catalog-songs-by-isrc#:~:text=Note%20that%20one%20ISRC%20value,maximum%20fetch%20limit%20is%2025.)  
14. Get Multiple Catalog Songs by ISRC | Apple Developer Documentation, accessed January 22, 2026, [https://developer.apple.com/documentation/applemusicapi/get-multiple-catalog-songs-by-isrc](https://developer.apple.com/documentation/applemusicapi/get-multiple-catalog-songs-by-isrc)  
15. Album | Apple Developer Documentation, accessed January 22, 2026, [https://developer.apple.com/documentation/applemusicfeed/album](https://developer.apple.com/documentation/applemusicfeed/album)  
16. Albums.Relationships | Apple Developer Documentation, accessed January 22, 2026, [https://developer.apple.com/documentation/applemusicapi/albums/relationships-data.dictionary](https://developer.apple.com/documentation/applemusicapi/albums/relationships-data.dictionary)  
17. Record Labels | Apple Developer Documentation, accessed January 22, 2026, [https://developer.apple.com/documentation/applemusicapi/record-labels-api](https://developer.apple.com/documentation/applemusicapi/record-labels-api)  
18. MusicBrainz API / Rate Limiting, accessed January 22, 2026, [https://musicbrainz.org/doc/MusicBrainz\_API/Rate\_Limiting](https://musicbrainz.org/doc/MusicBrainz_API/Rate_Limiting)  
19. MusicBrainz API / Search / RecordingSearch, accessed January 22, 2026, [https://musicbrainz.org/doc/MusicBrainz\_API/Search/RecordingSearch](https://musicbrainz.org/doc/MusicBrainz_API/Search/RecordingSearch)  
20. MusicBrainz API / Search, accessed January 22, 2026, [https://musicbrainz.org/doc/MusicBrainz\_API/Search](https://musicbrainz.org/doc/MusicBrainz_API/Search)  
21. No-Code Discogs API Data Scraper | Legally Download to CSV, accessed January 22, 2026, [https://stevesie.com/apps/discogs-api](https://stevesie.com/apps/discogs-api)  
22. lizmat/Discogs-API: Provide basic API to Discogs \- GitHub, accessed January 22, 2026, [https://github.com/lizmat/Discogs-API](https://github.com/lizmat/Discogs-API)  
23. Web API Overview V1.0 | Amazon Music Web API \- Amazon Developers, accessed January 22, 2026, [https://developer.amazon.com/docs/music/API\_web\_overview.html](https://developer.amazon.com/docs/music/API_web_overview.html)  
24. Harmony: Music Metadata Aggregator and MusicBrainz Importer \- Page 15 \- MetaBrainz Community Discourse, accessed January 22, 2026, [https://community.metabrainz.org/t/harmony-music-metadata-aggregator-and-musicbrainz-importer/698641?page=15](https://community.metabrainz.org/t/harmony-music-metadata-aggregator-and-musicbrainz-importer/698641?page=15)  
25. Creating schema JSON files for Amazon Personalize schemas, accessed January 22, 2026, [https://docs.aws.amazon.com/personalize/latest/dg/how-it-works-dataset-schema.html](https://docs.aws.amazon.com/personalize/latest/dg/how-it-works-dataset-schema.html)  
26. Why Next.js render "  
27. JSON Object Types | Amazon Music Device API, accessed January 22, 2026, [https://developer.amazon.com/docs/music/API\_browse\_json-object-types.html](https://developer.amazon.com/docs/music/API_browse_json-object-types.html)  
28. Genius API, accessed January 22, 2026, [https://docs.genius.com/](https://docs.genius.com/)  
29. is it possible to find the meta data of a song using its ISRC \- Stack Overflow, accessed January 22, 2026, [https://stackoverflow.com/questions/31003565/is-it-possible-to-find-the-meta-data-of-a-song-using-its-isrc](https://stackoverflow.com/questions/31003565/is-it-possible-to-find-the-meta-data-of-a-song-using-its-isrc)  
30. Scraping song lyrics from Genius.com \- John W. Miller, accessed January 22, 2026, [https://www.johnwmillr.com/scraping-genius-lyrics/](https://www.johnwmillr.com/scraping-genius-lyrics/)  
31. Discogs api issue \- APIs \- Bubble Forum, accessed January 22, 2026, [https://forum.bubble.io/t/discogs-api-issue/109287](https://forum.bubble.io/t/discogs-api-issue/109287)  
32. Cross-Origin Request to API for JSON data \- "You may need an appropriate loader to handle this file type.", accessed January 22, 2026, [https://stackoverflow.com/questions/46740539/cross-origin-request-to-api-for-json-data-you-may-need-an-appropriate-loader](https://stackoverflow.com/questions/46740539/cross-origin-request-to-api-for-json-data-you-may-need-an-appropriate-loader)  
33. Allow CORS: Access-Control-Allow-Origin \- Chrome Web Store \- Google, accessed January 22, 2026, [https://chromewebstore.google.com/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf?hl=en](https://chromewebstore.google.com/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf?hl=en)

[image1]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFMAAAAYCAYAAACGLcGvAAACrUlEQVR4Xu2Xy+tNURTHl7ckSnkkE0XKVGFiphQpI5QBAwN5lzLwHxgZKYZKTDAw8BhhLEpRBsorQsij5M36/vZe3XW/Z+1z7/11f79+v9P51Oqe81l7ncc++5y9r0hLS0vLwPxj0TBGdX/vJRVeyYHtL10tqnxm0VB+syixUFLHnSI/K/uL5I1rGl9ZNpQPGg9ZMhskddhKTjiQP8lSRjn8JzG19ztPUoMLnCDQhg+0QOM5uabzSGMbSyPqpIioHfbXkBsW8yUdfzonHC9ZjAOrpNoPI8yQuJMiona8b0zV+CadvJ3H3KLse7FMyuco+YijGr8k1UzR2JW3/T3ZNWKyxe+m7CPCc/+QlNjKiQDuTJuYIsxbzVrKlepKoP1Mt//ObffD/fwbnRv7fzSOk+N2HuQwYCqyrsg4JqndC+dKw32udNohf8nlzEV1dSyXTs2gtcAmVtQ+9Yns3gSu7jzI4f4rsq7IiNptDpxnncR5uF6TXQRGAmpnc6JP7DX24JWH4+8yXN1yD/ntkeQTMGcltTlEfkX2JW5INW8dghXEIFjd4vw7Gk5ItfZw4ADcTpYO5DFYuriXE/j+lUC+9A8ouhAjelBY9H7K268kjZZeYPTgX5kHx+2n1oOay4Hjazzv3GlJbyAT9pk98TucyGCCspuP4AvxIPc2cDbZ/fWJAvYaMksk9nWg/erA8XGwjw617YiSH1kCIPlA0lIEJ7yd3cZOs5DXGjtYZlCP43l+auzWeEY+Yr10T3gRxZsi9krcFm4/OfTDGY3r5I0tkgZZLTc1vms80ThCuRJ7NO6yzJS+OQclzfjjyTSNfSyVAywy6OClLDO3JPheDgs83TksG0q0IhgqHzUes2womLB5Mhw6V2Xw2XWygbXoOZZjxZgO/wlAP6uPlpYJxH8EZ8SR0ljgkwAAAABJRU5ErkJggg==>

[image2]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAXCAYAAAA/ZK6/AAAAkElEQVR4XmNgGAWDDVwF4lQkfjcQXwJiPiQxOPgHxPJA/B+IuaA0JxDbQdkyCKUMDOVAnAPELFDJhciSULE9yAInoXQJA0QSHYDEKtEFQQAkga7BGYsYHIAkPmARmw9layNLgABIshCJD/I0SIwZyn+KJMegw4BptRuS2GpkCRAAmSKBLsgACbkAdMFRQAgAAE1yHQVYFGMtAAAAAElFTkSuQmCC>

[image3]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAYCAYAAAAcYhYyAAAAtUlEQVR4XmNgGAWjgM6gAoh/AfF/KL8YiH9D+TAxESj7G5QWgoqDgSIQH4GyQZIgzcgAJPYXiJ3QxGCGg8FlIJYDYj+oBAuyJFTsABYxFENgAOZ8ZCCDRQwEQGKL0AVBAJvps7CIMULFeNDEwQAkMQOLGLohL4H4M5T9GlkCBECKxbGIgWINXSwYykaRy2XAtLELKmaBJv4DiGOB+AGaOAMrEAtjEUtEE4OBHCDmQhccBYMRAADT4TF45CJdygAAAABJRU5ErkJggg==>