MLC Rights Resolver: ISRC to ISWC, Writers, Publisher Shares avatar

MLC Rights Resolver: ISRC to ISWC, Writers, Publisher Shares

Pricing

from $12.00 / catalog exposure report

Go to Apify Store
MLC Rights Resolver: ISRC to ISWC, Writers, Publisher Shares

MLC Rights Resolver: ISRC to ISWC, Writers, Publisher Shares

Resolve a list of ISRCs or MLC song codes into the writers, publishers, and ownership shares The MLC has on file, with an opt-in catalog-exposure report that flags unmatched or no-share tracks.

Pricing

from $12.00 / catalog exposure report

Rating

0.0

(0)

Developer

Paul Mikulskis

Paul Mikulskis

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 days ago

Last modified

Share

MLC Rights Resolver turns a list of ISRCs or MLC song codes into the writers, publishers, and ownership shares The MLC has on file for each underlying composition, and flags the tracks that come back with no match or no share data. It reads the public MLC Public Search API through a licensed seat, returns one flat JSON row per input keyed on the identifier you submitted, and can also produce one summary catalog-exposure report. Every row carries the attribution string Source: The MLC.

Running on the Apify platform gives you API access, scheduling, and integrations (Zapier, Make, Google Sheets), plus a dataset you can export as JSON, CSV, Excel, or HTML.

What does MLC Rights Resolver do?

For each identifier you submit it:

  1. Detects whether the value is an ISRC or an MLC song code.
  2. For an ISRC, searches recordings, collects the distinct MLC song codes those recordings point to, fetches the works, and selects the primary composition (not a remix or alternate). For a song code, it fetches that work directly.
  3. Returns the canonical work title, ISWC, MLC song code, all writers with their roles, and all publishers with their roles and collection shares.

ISWC is an output field, not an input. The MLC public API has no ISWC lookup path, so an ISWC you submit comes back as a free unsupported row. Submit ISRCs or MLC song codes.

Why use it

  • Replace the manual "export a CSV and VLOOKUP against a catalog sheet" loop. The output is a flat join keyed on your input identifier.
  • Find exposure. The not-found and resolved-no-shares rows are the tracks worth a manual review with The MLC or your administrator.
  • Use it from an agent. The metered per-lookup path makes this consumable by rights-research pipelines that cannot sign an enterprise data contract, and the actor is callable through Apify's MCP server.

How to use MLC Rights Resolver

  1. Open the Input tab.
  2. Paste your ISRCs or MLC song codes into Identifiers, or provide a CSV URL.
  3. Optionally turn on Include catalog-exposure report to also receive the summary artifact.
  4. Click Start. Results appear in the dataset; the run summary lands in the key-value store under OUTPUT, and the report (when requested) under REPORT.

Input

FieldTypeNotes
identifiersarrayISRCs or MLC song codes. A string is auto-detected; an object {"isrc": "...", "title": "...", "artist": "..."} bypasses detection and feeds the fuzzy fallback.
csvUrlstringAn https:// CSV. Identifier column is the first header matching isrc / songCode / identifier / id, else column 1. Optional title / artist columns feed the fuzzy fallback.
includeExposureReportbooleanProduce the summary report. Fires the premium event once, only when the full list was processed.
enableFuzzyFallbackbooleanFor not-found ISRCs carrying a title, try a title/artist search (capped at 2 extra calls).
includeRawWorkbooleanAttach the raw MLC work JSON under rawWork.
pacingMsintegerDelay between MLC calls, clamped to 1500-15000 ms. Default 6000 ms.
maxItemsintegerUpper limit on identifiers processed (max 2000). It is a ceiling, not a promise the whole list finishes in one run: a single run also stops at its platform timeout (see Tips). Overflow is reported, never dropped.

Example input:

{
"identifiers": ["USUG12001402", "GBAHS1700227", "USUM71915699"],
"includeExposureReport": false
}

Output

One dataset row per input. A resolved row for USUG12001402 (The Weeknd, "Blinding Lights") looks like this (abridged):

{
"input": "USUG12001402",
"inputType": "isrc",
"status": "resolved-with-shares",
"matchMethod": "direct",
"workTitle": "BLINDING LIGHTS",
"iswc": "T9297449117",
"mlcSongCode": "BA7H8C",
"writers": [
{ "firstName": "AHMAD", "lastName": "BALSHE", "ipi": "00443089947", "role": "ComposerLyricist" },
{ "firstName": "ABEL", "lastName": "TESFAYE", "ipi": "00574514146", "role": "ComposerLyricist" }
],
"publishers": [
{ "name": "UNIVERSAL MUSIC WORKS", "role": "OriginalPublisher", "collectionShare": 1.38, "split": null, "administrators": [] },
{ "name": "UNIVERSAL MUSIC CORP.", "role": "OriginalPublisher", "collectionShare": 2.5, "split": null, "administrators": [] }
],
"totalCollectionShare": 99.99,
"matchedRecordings": [
{ "isrc": "USUG12001402", "title": "BLINDING LIGHTS", "artist": "THE WEEKND", "labels": "REPUBLIC RECORDS" }
],
"alternateWorks": [
{ "workTitle": "BLINDING LIGHTS (MAJOR LAZER REMIX)", "mlcSongCode": "BA7N1S", "iswc": "T9330148260", "writerCount": 8, "publisherCount": 10 }
],
"queryUsed": "isrc=USUG12001402",
"error": null,
"charged": true,
"chargeEvent": "work-resolved",
"attribution": "Source: The MLC"
}

This example also shows why primary-work selection matters: USUG12001402 maps to two works, and the Major Lazer remix is listed first upstream. The resolver returns the canonical "BLINDING LIGHTS" work and files the remix under alternateWorks. You can download the dataset in JSON, CSV, Excel, or HTML.

Statuses

StatusMeaningCharge event
resolved-with-sharesPrimary work matched, at least one publisher carries a collection sharework-resolved
resolved-no-sharesWork matched, but The MLC has no share data on file (a "check this" flag)work-resolved-no-shares
not-foundSearches ran, nothing matched (the normalized query is returned)lookup-unresolved
unsupportedISWC input, which has no MLC lookup pathfree
invalid-inputUnrecognized identifier format, nothing was queriedfree
errorUpstream failure after retries, or a schema changefree

Data fields

FieldDescription
inputThe identifier you submitted, verbatim (the join key).
inputTypeisrc, songCode, iswc, or unknown.
statusOne of the statuses above.
matchMethoddirect, fuzzy-title, or null.
workTitle, iswc, mlcSongCodeThe matched composition's identity.
writersWriter first/last name, IPI, and role.
publishersPublisher name, role, collection share, and any administrator chain.
totalCollectionShareSum of top-level publisher collection shares, or null.
matchedRecordingsRecordings that matched the ISRC (up to 5).
alternateWorksOther works the identifier mapped to, as identity summaries.
queryUsedThe normalized upstream query, so you can see what was searched.
charged, chargeEventWhether the row billed, and which event.
attributionSource: The MLC on every row.

The OUTPUT key-value record summarizes the run (counts by status, charged total, pacing, and anything not processed and why). When includeExposureReport is on and the full list is processed, REPORT holds the summary: totals by status, the exposure rate, and the flagged identifiers to investigate. The report flags rows to investigate; it does not compute a dollar recovery figure.

Demo dataset and catalog-exposure report

The full multi-input demo is free to inspect, no run required. It was generated locally against the live MLC API (non-billing, Source: The MLC on every row) from 3 identifiers: 2 real ISRCs and 1 that is not on file with The MLC.

  • Dataset (3 rows): https://api.apify.com/v2/datasets/QGvFHuMa6po0W2ISf/items?format=jsonUSUG12001402 (The Weeknd, "Blinding Lights") and GBAHS1700227 (Ed Sheeran, "Shape of You") both resolve with full writer and publisher share data; USUM71999999 comes back not-found.
  • Catalog-exposure report: https://api.apify.com/v2/key-value-stores/RoeZnYgYyEEynoZIW/records/REPORT — the same summary artifact a buyer gets from includeExposureReport: true. Over these 3 identifiers: 2 resolved with shares, 0 resolved without shares, 1 not-found, a 33% exposure rate, and the flagged identifier listed by input. Generating your own report over your own list is the paid catalog-exposure-report event ($15, see Pricing); reading this sample one is free.

The dataset and report above are real output from the shipped resolver, not mocked. A single-lookup example from an earlier live platform run (USUG12001402 only, no report) is still up at https://api.apify.com/v2/datasets/phZI56MlbflKeXSJn/items?format=json if you want the smallest possible worked example.

  • Spotify Catalog Resolver resolves ISRCs, UPCs, ISWCs, or free-text queries to Spotify catalog metadata (artist, album, cover art, popularity). Use it for catalog/metadata lookups; this actor is the rights layer, not a metadata mirror.

Pricing

This Actor uses pay-per-event pricing. You pay per outcome, not per compute unit:

EventPriceFires
catalog-exposure-report$15.00Once per run, opt-in, only when the full list was processed
work-resolved$0.03Per row resolved with shares
work-resolved-no-shares$0.01Per row resolved without share data
lookup-unresolved$0.005Per row that came back not-found

Free rows (unsupported, invalid-input, error) never charge. Discounted tiers are available (SILVER: $13.50 / $0.027 / $0.009 / $0.0045; GOLD: $12.00 / $0.024 / $0.008 / $0.004). A 100-ISRC list resolving mostly with shares costs about $3 in per-lookup events, or add $15 for the exposure report.

Tips and limitations

  • Pacing and runtime. Calls are paced to respect a shared paid seat. At the default 6000 ms, 100 ISRCs takes about 21 minutes, so a single run at the default 1-hour timeout resolves roughly 200-280 ISRCs. maxItems is a ceiling, not a completion promise: for larger lists, raise the run timeout (Run options, Timeout) or split the work across runs. When a run would otherwise hit the timeout, it stops without charging for an unfinished lookup, leaves that identifier and the rest unprocessed and uncharged, withholds the report, and records what happened in OUTPUT.note. If two runs are active at once, each paces at half speed and resolves fewer per hour; the OUTPUT record reports runsSharingSeat.
  • Coverage. Results reflect what The MLC has on file. A not-found means no MLC match, not that no composition exists.
  • Fuzzy fallback is best-effort. It only runs for not-found ISRCs that carry a title, is capped at two extra calls, and is flagged with matchMethod: "fuzzy-title".
  • No ISWC input path. Submit ISRCs or MLC song codes.
  • Agents and MCP. Every field is documented and stable, so an agent can consume rows directly, and the actor is callable through Apify's MCP server. The per-lookup events make single-track lookups cheap.

FAQ and support

Is this legal? The data is public under the Music Modernization Act (17 U.S.C. 115). This Actor reads the MLC Public Search API through a licensed seat and attributes every row to Source: The MLC.

Why did a track come back not-found? Either The MLC has nothing on that ISRC, or the recording is registered under a different identifier. Try the fuzzy fallback with a title, or submit the MLC song code directly.

Why resolved-no-shares? The work exists but The MLC has no or partial share data on file. These rows are the ones worth a manual follow-up.

For issues or a custom variant, use the Issues tab.