MLC Rights Resolver: ISRC to ISWC, Writers, Publisher Shares
Pricing
from $12.00 / catalog exposure report
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
15 days ago
Last modified
Categories
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:
- Detects whether the value is an ISRC or an MLC song code.
- 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.
- 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-foundandresolved-no-sharesrows 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
- Open the Input tab.
- Paste your ISRCs or MLC song codes into Identifiers, or provide a CSV URL.
- Optionally turn on Include catalog-exposure report to also receive the summary artifact.
- Click Start. Results appear in the dataset; the run summary lands in the key-value store under
OUTPUT, and the report (when requested) underREPORT.
Input
| Field | Type | Notes |
|---|---|---|
identifiers | array | ISRCs or MLC song codes. A string is auto-detected; an object {"isrc": "...", "title": "...", "artist": "..."} bypasses detection and feeds the fuzzy fallback. |
csvUrl | string | An https:// CSV. Identifier column is the first header matching isrc / songCode / identifier / id, else column 1. Optional title / artist columns feed the fuzzy fallback. |
includeExposureReport | boolean | Produce the summary report. Fires the premium event once, only when the full list was processed. |
enableFuzzyFallback | boolean | For not-found ISRCs carrying a title, try a title/artist search (capped at 2 extra calls). |
includeRawWork | boolean | Attach the raw MLC work JSON under rawWork. |
pacingMs | integer | Delay between MLC calls, clamped to 1500-15000 ms. Default 6000 ms. |
maxItems | integer | Upper 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
| Status | Meaning | Charge event |
|---|---|---|
resolved-with-shares | Primary work matched, at least one publisher carries a collection share | work-resolved |
resolved-no-shares | Work matched, but The MLC has no share data on file (a "check this" flag) | work-resolved-no-shares |
not-found | Searches ran, nothing matched (the normalized query is returned) | lookup-unresolved |
unsupported | ISWC input, which has no MLC lookup path | free |
invalid-input | Unrecognized identifier format, nothing was queried | free |
error | Upstream failure after retries, or a schema change | free |
Data fields
| Field | Description |
|---|---|
input | The identifier you submitted, verbatim (the join key). |
inputType | isrc, songCode, iswc, or unknown. |
status | One of the statuses above. |
matchMethod | direct, fuzzy-title, or null. |
workTitle, iswc, mlcSongCode | The matched composition's identity. |
writers | Writer first/last name, IPI, and role. |
publishers | Publisher name, role, collection share, and any administrator chain. |
totalCollectionShare | Sum of top-level publisher collection shares, or null. |
matchedRecordings | Recordings that matched the ISRC (up to 5). |
alternateWorks | Other works the identifier mapped to, as identity summaries. |
queryUsed | The normalized upstream query, so you can see what was searched. |
charged, chargeEvent | Whether the row billed, and which event. |
attribution | Source: 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=json —
USUG12001402(The Weeknd, "Blinding Lights") andGBAHS1700227(Ed Sheeran, "Shape of You") both resolve with full writer and publisher share data;USUM71999999comes backnot-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 paidcatalog-exposure-reportevent ($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.
Related actors
- 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:
| Event | Price | Fires |
|---|---|---|
catalog-exposure-report | $15.00 | Once per run, opt-in, only when the full list was processed |
work-resolved | $0.03 | Per row resolved with shares |
work-resolved-no-shares | $0.01 | Per row resolved without share data |
lookup-unresolved | $0.005 | Per 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.
maxItemsis 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 inOUTPUT.note. If two runs are active at once, each paces at half speed and resolves fewer per hour; the OUTPUT record reportsrunsSharingSeat. - Coverage. Results reflect what The MLC has on file. A
not-foundmeans 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.


