Music Credits API
Free REST API for songwriter credits, publisher chains, recording metadata, and music identifier lookups. No signup required.
Quick start
# Look up songwriter credits for any ISRC (snake_case JSON) curl https://api.credits.fm/v1/isrc/GBAYE0601498 # Search across all identifier types curl "https://api.credits.fm/v1/search?q=bohemian+rhapsody" # Batch lookup — up to 100 identifiers at once curl -X POST https://api.credits.fm/v1/batch -H "Content-Type: application/json" -d '{"isrcs":["GBAYE0601498","USUM71922944"]}' # Resolve a Spotify URL to identifiers curl "https://api.credits.fm/v1/lookup?url=https://open.spotify.com/track/5eIDxmWYxRA0HJBYM9bIIS"
Base URL: https://api.credits.fm — All endpoints return JSON with CORS enabled.
Authentication
Pass your API key via the x-api-key header:
curl -H "x-api-key: cfm_your_key_here" \ https://api.credits.fm/v1/isrc/GBAYE0601498
No key? The API still works — just with lower rate limits.
Rate limits
| Tier | Lookup | Search | MCP | Contribute |
|---|---|---|---|---|
| No key (per IP) | 30/min | 10/min | 20/min | Not available |
| Free API key | 300/min | 60/min | 60/min | 10/min |
Rate limit info is returned in X-RateLimit-Remaining and X-RateLimit-Limit response headers.
Get an API key
Generate a free API key instantly. No credit card or approval needed.
Error responses
All errors return JSON with an error field:
| Status | Meaning | Example |
|---|---|---|
| 400 | Missing or invalid parameter | {"error": "ISRC is required"} |
| 401 | API key required | {"error": "API key required for contributions"} |
| 404 | Identifier not found | {"error": "ISRC not found"} |
| 429 | Rate limit exceeded | {"error": "Rate limit exceeded", "retryAfter": 42} |
| 503 | Service unavailable | {"error": "Service unavailable"} |
All endpoints
Complete public /v1/* inventory from the live OpenAPI spec. Parameter schemas and Try-it live in the interactive reference (api.credits.fm/docs). Showing 80 operations.
API keys
- POST
/v1/keysCreate API keyOpen in docs
Account & Claims
- POST
/v1/account/magic-linkRequest a sign-in linkOpen in docs - GET
/v1/account/meYour accountOpen in docs - POST
/v1/account/verifyVerify a sign-in linkOpen in docs - GET
/v1/me/claimsList your claimsOpen in docs - POST
/v1/me/claimsClaim an identifierOpen in docs - DELETE
/v1/me/claims/{code}Remove a claimOpen in docs - GET
/v1/me/graphYour personal Credits GraphOpen in docs
Audit
- POST
/v1/audit/catalogPublisher-catalog audit (two-file classification)Open in docs - POST
/v1/audit/classifyClassify one ISRC (audit)Open in docs - POST
/v1/audit/sharesShare audit (batch) — not currently available (returns 403 while MLC ownership shares are withheld pending licensing)Open in docs - POST
/v1/audit/unmatchedUnmatched audit (batch)Open in docs
Batch
- POST
/v1/batchBatch lookupOpen in docs
Billing
- POST
/v1/billing/checkoutStart Credits Graph checkoutOpen in docs - POST
/v1/billing/portalOpen billing portalOpen in docs
Catalog
- POST
/v1/catalog/analyzeAnalyze an ISRC catalog (publisher → writer-IPI → ISWC graph)Open in docs - POST
/v1/catalog/enrichEnrich a catalog of ISRCs (queue graph-link + fetch MLC songwriters)Open in docs - POST
/v1/publishersFind publishers for a writer across recordingsOpen in docs - POST
/v1/songwritersAggregate songwriters across recordingsOpen in docs
Compositions
- GET
/v1/iswc/{iswc}/related-worksGet related-works group for ISWCOpen in docs - GET
/v1/mlc/{code}/related-worksGet related-works group for MLC Song CodeOpen in docs - GET
/v1/related-works/{id}Get related-works group by IDOpen in docs
Contributions
- GET
/v1/meYour Credits Compute statusOpen in docs
Cover art
- POST
/v1/cover-artCover art by ISRCsOpen in docs
Credits Compute
- POST
/v1/compute/resultSubmit a Credits Compute work-unit resultOpen in docs - GET
/v1/compute/unitGet a Credits Compute work unitOpen in docs
Crowd verification
- GET
/v1/crowd/taskGet a crowd verification taskOpen in docs - POST
/v1/crowd/voteVote on a crowd verification taskOpen in docs
Data contributions
- POST
/v1/contributeSubmit contributionsOpen in docs
Discovery
- GET
/v1/samplesSample identifiersOpen in docs
Enrich
- POST
/v1/enrichBatch enrich ISWC/ISRC metadataOpen in docs
Health
- GET
/v1/coverageIndex coverageOpen in docs - GET
/v1/healthHealth check (full)Open in docs
Lookup
- GET
/v1/lookupResolve URL (Spotify / Apple Music)Open in docs
Lookups
- GET
/v1/contributorsPublic contributors leaderboardOpen in docs - GET
/v1/ipi-group/summaryCatalog verify summary for a group of IPIsOpen in docs - POST
/v1/ipi-group/summaryCatalog verify summary for an IPI group (body variant)Open in docs - GET
/v1/ipi/{ipi}Get IPIOpen in docs - GET
/v1/ipi/{ipi}/publisher-linksPublisher links for a songwriter IPIOpen in docs - GET
/v1/ipi/{ipi}/publishersGet publishers for songwriter IPIOpen in docs - GET
/v1/ipi/{ipi}/registration-eligibilityRegistration eligibility for a songwriter IPIOpen in docs - GET
/v1/ipi/{ipi}/summaryCatalog verify summary for an IPIOpen in docs - GET
/v1/ipi/{ipi}/worksRanked works (ISWCs) for an IPIOpen in docs - GET
/v1/isni/{isni}Get ISNIOpen in docs - GET
/v1/isni/{isni}/recordingsGet recordings for an ISNIOpen in docs - GET
/v1/isrc/{isrc}Get ISRCOpen in docs - GET
/v1/isrc/{isrc}/mlc-liveLive MLC Public Work Search by ISRCOpen in docs - GET
/v1/iswc/{iswc}Get ISWCOpen in docs - GET
/v1/musician/{mbid}/publisher-linksPublisher links for a musician (MBID)Open in docs - GET
/v1/musician/{mbid}/registration-eligibilityRegistration eligibility for a musician (MBID)Open in docs - GET
/v1/publishers/{ipi}/catalogGet publisher catalog with optional audit flagsOpen in docs - GET
/v1/publishers/{ipi}/musiciansMusicians administered by a publisherOpen in docs - GET
/v1/publishers/searchSearch publishers by nameOpen in docs - GET
/v1/upc/{upc}Get UPCOpen in docs
Music Identity
- GET
/v1Discovery root (legacy)Open in docs - GET
/v1/artist/{id}Get artist discography by Spotify IDOpen in docs - GET
/v1/graph/{type}/{id}Credits Graph networkOpen in docs - GET
/v1/graph/activityCredits Graph activity feedOpen in docs - GET
/v1/graph/searchGraph search (bucketed)Open in docs - GET
/v1/identityIdentifier graph discoveryOpen in docs - GET
/v1/musician/{mbid}Get musician by MBIDOpen in docs
Ownership
- POST
/v1/ownership/analyzeSongwriter analysis across ISRCsOpen in docs - POST
/v1/ownership/analyze-dataSongwriter analysis on caller-supplied matched_songs (no fetch)Open in docs - POST
/v1/ownership/ip-chainsBroken IP-chain detection for a writer across ISRCsOpen in docs - POST
/v1/ownership/ip-chains-dataBroken IP-chain detection on caller-supplied matched_songs (no fetch)Open in docs - POST
/v1/ownership/representationSongwriter representation check across ISRCsOpen in docs - POST
/v1/ownership/representation-dataRepresentation verdict on caller-supplied matched_songs (no fetch)Open in docs - POST
/v1/ownership/searchSongwriter name search with representation analysisOpen in docs - POST
/v1/ownership/search-dataSongwriter name search on caller-supplied matched_songs (no fetch)Open in docs
Relationships
- GET
/v1/isrc/{isrc}/relationshipsGet typed relationships for an ISRCOpen in docs - GET
/v1/iswc/{iswc}/relationshipsGet typed relationships for an ISWCOpen in docs
Resolve
- POST
/v1/resolve/batchBatch resolve tracks to ISRCsOpen in docs - POST
/v1/resolve/songwriterResolve songwriter name to IPIOpen in docs - POST
/v1/resolve/trackResolve single track to ISRC and creditsOpen in docs
Search
- GET
/v1/searchUnified identifier searchOpen in docs - GET
/v1/suggestAutocomplete suggestionsOpen in docs - GET
/v1/typeaheadCross-collection typeahead (Typesense-backed)Open in docs
Validate
- POST
/v1/validate/batchBatch ISRC validationOpen in docs
Verify
- GET
/v1/verify/{type}/{code}Multi-source identifier verificationOpen in docs - POST
/v1/verify/batchBatch multi-source verificationOpen in docs
Credits ID
Every entity in Credits.fm has a deterministic Credits ID — a UUIDv5 derived from its external identifier. The same input always produces the same UUID, so you can use it as a stable reference across systems.
| Entity | Input | Example ID |
|---|---|---|
| Recording | isrc:GBAYE0601498 | 9b033599-8a5e-565a-b6b6-2dafbb91939c |
| Work | iswc:T-070237966-1 | 359586ff-b848-502f-98aa-8d33b7dba9fd |
| Songwriter | ipi:00508530861 | 5f8f3def-adf3-5f8e-b81f-db45093bf8c6 |
| Contributor | isni:0000000000012571 | c4d5e6f7-a8b9-5012-3456-789abcdef012 |
| Album | upc:602445790098 | e5f6a7b8-c9d0-5123-4567-89abcdef0123 |
| Musician | musician:0383dadf-... | a1b2c3d4-e5f6-5789-abcd-ef0123456789 |
| Artist | artist:1dfeR4HaWD... | b2c3d4e5-f6a7-5890-bcde-f01234567890 |
Responses include credits_id. Response-only — you cannot yet query by Credits ID.
Credits Graph
Curated examples — full parameter matrix: api.credits.fm/docs
/v1/graph/{type}/{id}Credits Graph network — identifier nodes (isrc, iswc, ipi, isni, upc) plus musician (people) nodes, and connections around one code, with per-connection source provenance and verification status (verified = 2+ independent sources, single = one). Node no_match lists directions checked with no counterpart (verified absence); typed ISRC↔ISRC relationships (cover, sample, remix, …) appear as kind: relation connections, people credits as kind: credit. Every node carries a credits_id. Explore third-order by re-querying any node at depth=1 and merging.
| Parameter | Type | Description |
|---|---|---|
| typerequired | string | isrc | iswc | ipi | isni | upc | musician (path; musician takes a MusicBrainz MBID — responses use Credits IDs as musician identity) |
| idrequired | string | Identifier code (path) |
| depth | number | 1–2 hops (default 2) |
| per_hop | number | Connection cap per node + neighbor type (default 12, max 25) |
| max_nodes | number | Total node budget (default 200, max 300) |
| people | string | 0 to skip musician (people) nodes (default on) |
/v1/graph/activityCredits Graph status feed — recent changes of every type across the index, newest first: link_found, link_verified (connection crossed 2+ independent sources), relation_found (cover/sample/remix), no_match_recorded (verified absence). Poll with since set to the previous response as_of for deltas (clamped to 24h).
| Parameter | Type | Description |
|---|---|---|
| limit | number | Max events (default 60, max 150) |
| since | string | ISO timestamp — only newer events |
Search & Discovery
Curated examples — full parameter matrix: api.credits.fm/docs
/v1/identityMusic Identity discovery JSON (path templates, links). Same payload as GET /v1/. Full interactive reference: api.credits.fm/docs.
/v1/graph/search?q={query}Bucketed Music Identity search (all, artist, song, recording, release, musician, publisher). Default limit 20 per bucket (max 500; -1 capped). Optional exclude_lyrics, nocache.
| Parameter | Type | Description |
|---|---|---|
| qrequired | string | Search query |
| type | string | all | artist | song | recording | release | musician | publisher |
| limit | number | Per bucket (default 20, max 500) |
| offset | number | Paging within each bucket |
| exclude_lyrics | string | boolean | Reduce lyrics-index ISRC noise |
| nocache | string | Skip CDN cache |
/v1/search?q={query}Unified search across identifiers. Each bucket is { items, pagination } with snake_case pagination (has_more, total, limit, offset, count). Supports match=recording_title, exclude_lyrics, CDN bypass (nocache, no_cache, fresh). For bucketed Music Identity search with a different type vocabulary, use GET /v1/graph/search.
| Parameter | Type | Description |
|---|---|---|
| qrequired | string | Search text or identifier (canonicalized server-side) |
| type | string | auto (default), isrc, iswc, ipi, isni, upc, musician, all |
| match | string | default or recording_title (title-focused ISRC bucket) |
| exclude_lyrics | string | boolean | When true, skip lyrics-heavy ISRC matches |
| limit | number | Per bucket; default 8 (match=default) or 100 (match=recording_title); max 100; window offset+limit ≤ 1000 |
| offset | number | Skip within each bucket |
| nocache | string | Truthy → Cache-Control: no-store (aliases: no_cache, fresh) |
/v1/suggest?q={query}Fast autocomplete across identifier types. q optional; min 2 characters when provided. limit/offset window ≤ 1000.
| Parameter | Type | Description |
|---|---|---|
| q | string | Prefix (min 2 characters when provided) |
| limit | number | Max suggestions (default 10; 0 = bounded window) |
| offset | number | Skip suggestions |
| nocache | string | Skip CDN cache |
/v1/typeahead?q={query}Cross-collection typeahead (Typesense-backed). Prefix + typo-tolerant autocomplete across recordings, songs, releases, publishers/writers, and artists. Response shape matches /v1/suggest so clients can share a parser. Falls back to PG /v1/suggest when Typesense is not configured.
| Parameter | Type | Description |
|---|---|---|
| q | string | Search string (min 2 chars after trim) |
| limit | number | Max suggestions after interleaving (default 10) |
| nocache | string | Skip CDN cache (aliases: no_cache, fresh) |
/v1/samplesUp to ten example identifiers per type from the live index (ISRC, ISWC, IPI, ISNI, UPC, MBID). Use to build working detail URLs against your deployment.
/v1/healthService health: database reachability and critical table row thresholds. 503 when unavailable or below threshold. Same checks as GET /healthz on api.credits.fm.
Identifier Lookups
Curated examples — full parameter matrix: api.credits.fm/docs
/v1/isrc/{isrc}Recording by ISRC (snake_case). Flat document by default; graph query keys return Music Identity graph (human-readable /v1/recordings/{isrc} 308s here). See api.credits.fm/docs for the full parameter matrix.
| Parameter | Type | Description |
|---|---|---|
| isrcrequired | string | 12-character ISRC (dashes/spaces stripped) |
| contribute | string | boolean | Flat JSON only: pass false to omit missing_fields and contribute_url. Ignored for graph responses. |
| graph | string | Truthy (1 / true / yes): default Music Identity graph when no other graph keys are present. |
| identity_graph | string | Alias for graph (same semantics). |
| include | string | Comma-separated relationship keys; merged with relationships / relationship. Use all to expand every connection. |
| relationships | string | Luminate-style alias for include (values merged). |
| relationship | string | Singular alias; merged with include. |
| depth | number | Graph expansion depth 1–5 (default 1). |
| limit | number | Per-relationship page size (default 50, max 10000; -1 = all). On ISNI flat (no graph keys), paginates isrcs / iswcs with total_isrcs / total_iswcs. |
| offset | number | Skip N items for each expanded list (or ISNI flat isrcs/iswcs slices). |
/v1/isrc/{isrc}/mlc-liveAuthoritative live MLC Public Work Search by ISRC — work(s) with writer chains, ISWCs, publishers, and alternative titles. Cached 14 days server-side; pass ?refresh=true to force a fresh MLC fetch. source is cache | live | stale | unavailable. Empty works means no MLC registration (or temporary unavailability when source is unavailable).
| Parameter | Type | Description |
|---|---|---|
| isrcrequired | string | 12-character ISRC (path) |
| refresh | boolean | Bypass the 14-day cache and force a fresh MLC API call |
/v1/iswc/{iswc}Musical work by ISWC. Flat work row or Music Identity graph (/v1/songs/{iswc} 308s here). For large recording lists use graph + include / pagination — not the old credits.fm-only complete query.
| Parameter | Type | Description |
|---|---|---|
| iswcrequired | string | ISWC (T-#########-# or compact) |
| contribute | string | boolean | Flat JSON only: pass false to omit missing_fields and contribute_url. Ignored for graph responses. |
| graph | string | Truthy (1 / true / yes): default Music Identity graph when no other graph keys are present. |
| identity_graph | string | Alias for graph (same semantics). |
| include | string | Comma-separated relationship keys; merged with relationships / relationship. Use all to expand every connection. |
| relationships | string | Luminate-style alias for include (values merged). |
| relationship | string | Singular alias; merged with include. |
| depth | number | Graph expansion depth 1–5 (default 1). |
| limit | number | Per-relationship page size (default 50, max 10000; -1 = all). On ISNI flat (no graph keys), paginates isrcs / iswcs with total_isrcs / total_iswcs. |
| offset | number | Skip N items for each expanded list (or ISNI flat isrcs/iswcs slices). |
/v1/ipi/{ipi}Songwriter or publisher by IPI. represent=musician|publisher drives graph shape; older /v1/musicians/… / /v1/publishers/… paths 308 here.
| Parameter | Type | Description |
|---|---|---|
| ipirequired | string | 9–11 digit IPI |
| graph | string | Truthy (1 / true / yes): default Music Identity graph when no other graph keys are present. |
| identity_graph | string | Alias for graph (same semantics). |
| represent | string | Graph mode: musician | publisher (forces graph; inferred from entity_type when omitted) |
| contribute | string | boolean | Flat JSON only: pass false to omit missing_fields and contribute_url. Ignored for graph responses. |
| include | string | Comma-separated relationship keys; merged with relationships / relationship. Use all to expand every connection. |
| relationships | string | Luminate-style alias for include (values merged). |
| relationship | string | Singular alias; merged with include. |
| depth | number | Graph expansion depth 1–5 (default 1). |
| limit | number | Per-relationship page size (default 50, max 10000; -1 = all). On ISNI flat (no graph keys), paginates isrcs / iswcs with total_isrcs / total_iswcs. |
| offset | number | Skip N items for each expanded list (or ISNI flat isrcs/iswcs slices). |
/v1/ipi/{ipi}/publishersAll publishers that co-occur with this songwriter IPI. Optional include=isrcs for shared ISRC lists per publisher.
| Parameter | Type | Description |
|---|---|---|
| ipirequired | string | Songwriter IPI |
| include | string | isrcs — attach shared ISRC arrays per publisher |
/v1/isni/{isni}Creative contributor by ISNI. Flat document, optional isrcs/iswcs pagination, or graph mode. Includes recordings_url → GET /v1/isni/{isni}/recordings.
| Parameter | Type | Description |
|---|---|---|
| isnirequired | string | 16-character ISNI |
| contribute | string | boolean | Flat JSON only: pass false to omit missing_fields and contribute_url. Ignored for graph responses. |
| graph | string | Truthy (1 / true / yes): default Music Identity graph when no other graph keys are present. |
| identity_graph | string | Alias for graph (same semantics). |
| include | string | Comma-separated relationship keys; merged with relationships / relationship. Use all to expand every connection. |
| relationships | string | Luminate-style alias for include (values merged). |
| relationship | string | Singular alias; merged with include. |
| depth | number | Graph expansion depth 1–5 (default 1). |
| limit | number | Per-relationship page size (default 50, max 10000; -1 = all). On ISNI flat (no graph keys), paginates isrcs / iswcs with total_isrcs / total_iswcs. |
| offset | number | Skip N items for each expanded list (or ISNI flat isrcs/iswcs slices). |
/v1/upc/{upc}Release by UPC/EAN (snake_case flat row or graph). Older /v1/releases/{upc} paths 308 here. No contribution hints on flat rows.
| Parameter | Type | Description |
|---|---|---|
| upcrequired | string | 12–14 digit UPC |
| graph | string | Truthy (1 / true / yes): default Music Identity graph when no other graph keys are present. |
| identity_graph | string | Alias for graph (same semantics). |
| include | string | Comma-separated relationship keys; merged with relationships / relationship. Use all to expand every connection. |
| relationships | string | Luminate-style alias for include (values merged). |
| relationship | string | Singular alias; merged with include. |
| depth | number | Graph expansion depth 1–5 (default 1). |
| limit | number | Per-relationship page size (default 50, max 10000; -1 = all). On ISNI flat (no graph keys), paginates isrcs / iswcs with total_isrcs / total_iswcs. |
| offset | number | Skip N items for each expanded list (or ISNI flat isrcs/iswcs slices). |
People
Curated examples — full parameter matrix: api.credits.fm/docs
/v1/musician/{mbid}Musician profile (MusicBrainz MBID) — songwriter + performer credits, groups, identifiers. Fields are snake_case where emitted.
| Parameter | Type | Description |
|---|---|---|
| mbidrequired | string | MusicBrainz artist UUID |
/v1/artist/{id}DSP release-artist discography (snake_case).
| Parameter | Type | Description |
|---|---|---|
| idrequired | string | Spotify-style artist id (22 chars) |
Resolution
Curated examples — full parameter matrix: api.credits.fm/docs
/v1/lookup?url={url}Resolve Spotify or Apple Music URLs to identifiers and metadata (snake_case).
| Parameter | Type | Description |
|---|---|---|
| urlrequired | string | Spotify or Apple Music URL |
/v1/resolve/trackResolve a track to ISRC + credits (name/artist and/or platform URLs). Optional contribute in JSON body.
| Parameter | Type | Description |
|---|---|---|
| name | string | Track title |
| artist | string | Artist name |
| spotify_url | string | Spotify track URL |
| apple_music_url | string | Apple Music track URL |
| contribute | boolean | Contribution hints on success (default true) |
/v1/resolve/songwriterResolve songwriter name to IPI using ISRC/ISWC context (snake_case response fields).
| Parameter | Type | Description |
|---|---|---|
| namerequired | string | Songwriter name |
| isrcs | string[] | Context ISRCs |
| iswcs | string[] | Context ISWCs |
/v1/resolve/batchBatch-resolve tracks (up to 50 {name, artist} pairs) to ISRCs.
| Parameter | Type | Description |
|---|---|---|
| tracksrequired | array | {name, artist} pairs (max 50) |
Data
Curated examples — full parameter matrix: api.credits.fm/docs
/v1/batchBatch lookup — up to 100 identifiers per type per request (snake_case maps). MusicBrainz fallback where configured. Public: does not validate x-api-key (header ignored). A 200 here does not prove an API key is valid — use POST /v1/contribute to test credentials.
| Parameter | Type | Description |
|---|---|---|
| isrcs | string[] | Up to 100 ISRCs |
| iswcs | string[] | Up to 100 ISWCs |
| ipis | string[] | Up to 100 IPIs |
| isnis | string[] | Up to 100 ISNIs |
| upcs | string[] | Up to 100 UPCs |
| contribute | boolean | Top-level contribute_url nudges (default on) |
/v1/catalog/analyzeAnalyze an ISRC catalog into a publisher → writer-IPI → ISWC graph. Pass a flat isrcs list for ad-hoc lookups, or a pre-grouped songs array to reproduce a publisher catalog structure. Powers catalog tooling and POST /v1/catalog/analyze clients.
| Parameter | Type | Description |
|---|---|---|
| isrcs | string[] | Flat ISRC list (each becomes a 1-row song) |
| songs | array | Pre-grouped song structure (writers + ISRC variants per song) |
/v1/contributeSubmit index improvements. Requires cfm_… key registered in api_keys (same Supabase project as lookups). Request/response use snake_case (e.g. target_id in results). If batch works with the same header but this returns 401, the key is invalid or not cfm_-prefixed — not a separate database.
| Parameter | Type | Description |
|---|---|---|
| contributionsrequired | array | Contribution objects (max 25) |
| .targetrequired | string | isrc | iswc | ipi | isni | upc |
| .idrequired | string | Identifier value |
| .fieldrequired | string | Field key (snake_case) |
| .valuerequired | string | New value |
| .type | string | fill_null | correction | append |
| .citation | string | Provenance string |
/v1/coverageIndex row counts / coverage metrics (snake_case nested keys).
Validation & Audit
Curated examples — full parameter matrix: api.credits.fm/docs
/v1/verify/{type}/{code}Multi-source verification for one identifier (type: isrc | iswc | ipi | isni | upc). Per-field agreement across Notes Credits, MusicBrainz, DSPs, CISAC, ISNI.org as applicable. Optional ?raw=1 for adapter debug payloads.
| Parameter | Type | Description |
|---|---|---|
| typerequired | string | isrc | iswc | ipi | isni | upc |
| coderequired | string | Identifier value (normalized server-side) |
| raw | string | Pass 1 to include raw per-adapter results |
/v1/verify/batchBatch verify up to 100 { type, code } items. Invalid rows return inline { error, input }; order preserved.
| Parameter | Type | Description |
|---|---|---|
| itemsrequired | array | Objects with type + code (max 100) |
/v1/validate/batchValidate ISRCs against MLC (+ optional DSP cross-check). ?format=csv supported. Results use snake_case.
| Parameter | Type | Description |
|---|---|---|
| isrcsrequired | string[] | Up to 100 ISRCs |
| include_dsp_check | boolean | Spotify + Apple cross-check |
/v1/audit/unmatchedMLC match status audit. ?format=csv supported.
| Parameter | Type | Description |
|---|---|---|
| isrcsrequired | string[] | Up to 100 ISRCs |
API keys & operator hooks
Curated examples — full parameter matrix: api.credits.fm/docs
/v1/keysCreate a free cfm_… API key (name + email). Returns the secret once. Max 3 active keys per email. Same flow as the key form at credits.fm/api.
| Parameter | Type | Description |
|---|---|---|
| namerequired | string | 2–100 characters |
| emailrequired | string | Valid email |
| contributor_name | string | Display name for contributions |
| contributor_url | string | Contributor URL |
/v1/enrichBatch ISWC titles + ISRC metadata (title, artists) for lazy UI loads. Public; capped per array server-side.
| Parameter | Type | Description |
|---|---|---|
| iswcs | string[] | ISWC codes |
| isrcs | string[] | ISRC codes |
/v1/cover-artCover art URLs for up to 10 ISRCs (cache + Spotify when configured).
| Parameter | Type | Description |
|---|---|---|
| isrcsrequired | string[] | Max 10 ISRCs |
Crowd verification (anonymous)
Curated examples — full parameter matrix: api.credits.fm/docs
/v1/crowd/task?target={type}&id={code}&session_id={uuid}One one-tap verification microtask for a record — a real source disagreement (kind: conflict) or a known-answer control item (kind: credit). No API key. Pass a client-generated session_id (UUID) so voted tasks are not re-served. Returns { task: null } when there is nothing to verify.
| Parameter | Type | Description |
|---|---|---|
| targetrequired | string | isrc | iswc | ipi | isni | upc |
| idrequired | string | The identifier code |
| session_id | string | Client-generated UUID (first-party cookie) |
/v1/crowd/voteRecord an anonymous vote on a microtask. No API key. value must be one of the task options’ values, or { "not_sure": true }. Credit tasks score the session’s trust weight; conflict tasks evaluate weighted consensus. A field flips to verified only when enough trusted, independent sessions confirm the live value — anonymous votes never overwrite a canonical value.
| Parameter | Type | Description |
|---|---|---|
| task_idrequired | string | From GET /v1/crowd/task |
| session_idrequired | string | Same UUID used to fetch the task |
| valuerequired | any | Chosen option value, or { not_sure: true } |
Credits Compute
Curated examples — full parameter matrix: api.credits.fm/docs
/v1/compute/unitRequest a Credits Compute work unit — rank the candidate compositions by similarity to the anchor and submit the best to earn access credits. No API key; identify with a session_id. Returns { unit: { unit_token, anchor, candidates[] } }, or { unit: null } when none is available. Results are verified server-side.
| Parameter | Type | Description |
|---|---|---|
| session_idrequired | string | Client-generated UUID (reuse it across requests) |
/v1/compute/resultSubmit a work-unit result. No API key. The server re-verifies the ranking before it counts; verified contributions are staged additively (never overwriting canonical data) and accrue an access-credit balance that raises your tier (base → contributor → partner).
| Parameter | Type | Description |
|---|---|---|
| session_idrequired | string | Same UUID used to fetch the unit |
| unit_tokenrequired | string | From GET /v1/compute/unit |
| winner_idrequired | string | Chosen candidate's identifier |
| scorerequired | number | Your computed similarity (0–1) |
/v1/meYour earned Credits Compute status. Identify with an API key (x-api-key) and/or a compute session_id. Returns your effective tier, contribution totals, your claimed identifiers (claims), and whether the optional email account layer is available on this deployment (account_sign_in).
| Parameter | Type | Description |
|---|---|---|
| session_id | string | Compute session UUID (optional if using an API key) |
Your Credits Graph (claims & accounts)
Curated examples — full parameter matrix: api.credits.fm/docs
/v1/me/claimsClaim an identifier for your personal Credits Graph. No API key — identify with your compute session_id (body, query, or x-compute-session header). The code must exist in the Credits index; up to 24 claims per session (the personal graph’s one-traversal budget). Idempotent — re-claiming answers 200. Claiming is open and never gates anything; verification (unverified | compute_verified | owner_verified) is a separate trust signal derived from your earned Credits Compute tier.
| Parameter | Type | Description |
|---|---|---|
| session_idrequired | string | Client-generated UUID (the compute session) |
| typerequired | string | isrc | iswc | ipi | isni | upc | musician (MBID) |
| coderequired | string | The identifier code to claim |
/v1/me/claims?session_id={uuid}List your claimed identifiers, each with its verification trust signal.
| Parameter | Type | Description |
|---|---|---|
| session_idrequired | string | Compute session UUID |
/v1/me/claims/{code}?type={type}&session_id={uuid}Remove a claim. Idempotent — removing a code you never claimed answers 200 with removed: 0.
| Parameter | Type | Description |
|---|---|---|
| coderequired | string | The claimed code (path) |
| type | string | Disambiguate the claim type (recommended) |
| session_idrequired | string | Compute session UUID |
/v1/me/graph?session_id={uuid}&depth=1Your personal Credits Graph: one seeded traversal across every claimed code, a synthetic you root node (hop 0) with kind: claim connections to your codes, and a per-claim gaps summary — verified, single_source, verifiable (fixable right now via Credits Compute), and no_match (verified absences). Zero claims still answers 200 with the you node and a hint. depth 1–2 (default 1). Musician claims expand to their IPI/ISNI/ISRC codes.
| Parameter | Type | Description |
|---|---|---|
| session_idrequired | string | Compute session UUID |
| depth | number | Hops beyond your claimed codes (1–2, default 1) |
/v1/account/magic-linkOptional passwordless account: email yourself a single-use sign-in link (15 min). Accounts exist to persist your claims across devices by ADOPTING your session — claims always live on sessions and never move. Dormant until configured: answers 503 on deployments without email sign-in (check account_sign_in on GET /v1/me). Rate-limited per IP and per email; the response never reveals whether an account already existed.
| Parameter | Type | Description |
|---|---|---|
| emailrequired | string | Where to send the link |
| session_id | string | Session to adopt on verify (defaults to the requester’s) |
/v1/account/verifyExchange the emailed token for a 90-day bearer account_token (send it as Authorization: Bearer …). Verifying adopts your session onto the account; a session already on a different account reports session_conflict: true and login still succeeds. Links are single-use — used, expired, or superseded links answer 401.
| Parameter | Type | Description |
|---|---|---|
| tokenrequired | string | The token from the emailed link |
| session_id | string | Session to adopt (falls back to the one that requested the link) |
/v1/account/meThe signed-in account: adopted sessions, the best earned Credits Compute tier across them, and the deduped union of their claims. Authorization: Bearer <account_token> — header-only transport, no cookies.
Verify and improve data
These endpoints solve different jobs. Choose by what your integration already knows:
Verify
GET /v1/verify/{type}/{code}Inspect what independent sources say about an identifier. No API key.
Contribute
POST /v1/contributeSubmit sourced metadata or links your integration already has. API key required.
Crowd
GET /v1/crowd/task → POST /v1/crowd/voteAsk a person or agent one field-choice question. Anonymous session UUID.
Compute
GET /v1/compute/unit → POST /v1/compute/resultLet software rank a server-issued candidate set. Anonymous session UUID.
Verify inspects evidence; Contribute submits evidence. Crowd and Compute never blindly overwrite canonical data.
Contribute data
Submit sourced data your integration already has. Every item is validated and may be applied, verified against existing evidence, queued for review, recorded as negative evidence, or rejected. Requires a free API key.
What you can contribute
| Target | Fields | Types |
|---|---|---|
| isrc | recording_title, song_title, artist_names, iswc, songwriters, cover_art_url, mlc_song_code | fill_null, correction |
| iswc | song_title, alternative_titles, songwriter_names, artist_names | fill_null, append, correction |
| ipi | full_name, alternative_names, roles, entity_type | fill_null, append |
| isni | full_name, roles, linked_ipis | fill_null, append |
| upc | album_title, artist_names | fill_null, correction |
curl -X POST https://api.credits.fm/v1/contribute \
-H "Content-Type: application/json" \
-H "x-api-key: cfm_your_key_here" \
-d '{
"contributions": [{
"target": "isrc",
"id": "GBAYE0601498",
"field": "iswc",
"value": "T-070237966-1",
"citation": "CISAC registry"
}]
}'How contributions are verified
- Inspect every
results[].status; HTTP 201 means the batch was processed, not that every item was applied - fill_null only applies if the field is currently empty — it won't overwrite existing data
- append adds to array fields (e.g., alternative names, roles) and skips duplicates
- correction overwrites existing data — requires a high trust score (50+)
- Unknown identifiers can receive sparse fill/append records; corrections still require an existing record
- Accepted ISRC↔ISWC links update both ISRC→ISWC and ISWC→ISRC reads before the response returns
- Field-level risk assessment: low-risk fields (titles, URLs) auto-accept at trust 1+, medium-risk (artist names, ISWCs) at 10+, high-risk (songwriters) at 50+
- New API keys start with manual review; accepted contributions increase your trust score for auto-acceptance
Auto-contribute on lookup
On v1, lookups that support contribution hints (/v1/isrc, /v1/iswc, /v1/ipi, /v1/isni, /v1/batch, /v1/resolve/track, …) may include missing_fields and contribute_url unless you pass ?contribute=false (GET) or "contribute": false (POST body) where applicable.
What you get
Songwriter credits
Names, roles (lyricist, composer, arranger), and publisher relationships from MLC data
Publisher chains
Full publisher hierarchy — original publishers, sub-publishers, and administrator relationships
Recording metadata
Titles, artist names, ISWC connections, match status, and platform links (Spotify, Apple Music)
Musician profiles
The real person behind the music — songwriter + performer credits, group memberships, IPI/ISNI identifiers
Artist discographies
Full DSP catalog for any release artist — albums, tracks with ISRCs, UPCs, and streaming links
Cross-references
ISRC to ISWC, IPI to ISNI, recording to work — every identifier linked to every other
URL resolution
Paste a Spotify or Apple Music link, get back ISRCs, UPCs, and full track listings
Data sources
Every response aggregates data from multiple authoritative sources in parallel:
Apple Music and Spotify are link sources: we link out so listeners can open a recording, and use their factual metadata (recording/album titles, artist names) to fill records the open sources don’t cover. Those platform-origin fields are attributed to the platform and are not claimed under Credits.fm’s CC-BY 4.0 license; their cover art is governed by their own developer terms and is not redistributed. Cover art returned by the API (e.g. /v1/cover-art) is limited to open-licensed artwork from the MusicBrainz Cover Art Archive.
Identifier types
| Code | Full name | Identifies | Format |
|---|---|---|---|
| ISRC | International Standard Recording Code | Sound recordings & music videos | GBAYE0601498 |
| ISWC | International Standard Musical Work Code | Musical compositions | T-070237966-1 |
| IPI | Interested Parties Information | Songwriters & publishers | 00508530861 |
| ISNI | International Standard Name Identifier | Creative contributors | 0000000000012571 |
| UPC | Universal Product Code | Album releases | 602445790098 |
Use with AI
Credits.fm is designed to work with AI assistants. Use the MCP server for native tool access, the OpenAPI spec for one-click setup, or copy a system prompt for any AI tool.
Claude Code, Cursor, Windsurf (MCP)
Connect directly via the Credits.fm MCP server — 8 tools, no auth required.
See credits.fm/mcp/docs for setup configs.
ChatGPT Custom GPTs
- Go to ChatGPT → Explore GPTs → Create
- Under “Actions”, click “Create new action”
- Click “Import from URL”
- Paste:
https://api.credits.fm/_openapi.json(orhttps://api.credits.fm/openapi.json— redirects to the same spec) - Done — your GPT can now call all Credits.fm endpoints
Optional: under Authentication, select “API Key”, header name x-api-key, and paste your key for higher rate limits.
Cursor
- Add an MCP server in Cursor Settings → MCP
- Or add a
.cursor/mcp.jsonto your project with a fetch-based tool pointing tohttps://api.credits.fm/v1/ - Alternatively, paste the system prompt below into your project's
.cursorrulesfile so the agent knows how to call the API viacurl
System prompt for ChatGPT, Claude, Cursor, or any AI assistant
Paste this into your Custom GPT instructions, Claude Project instructions, Cursor rules, or any system prompt:
You are a music credits research assistant powered by the Credits.fm API (https://credits.fm). You help users find songwriter credits, music identifiers, and music metadata.
Primary base URL: https://api.credits.fm/v1 — **snake_case** JSON. Full parameter matrix: https://api.credits.fm/docs (Scalar OpenAPI).
Core endpoints:
- GET /v1/identity — Music Identity discovery (same as GET /v1/)
- GET /v1/graph/search?q={query} — Bucketed Music Identity search
- GET /v1/search?q={query} — Unified search (nested buckets, snake_case pagination)
- GET /v1/suggest?q={query} — Autocomplete
- GET /v1/isrc/{isrc}, /v1/iswc/{iswc}, /v1/ipi/{ipi}, /v1/isni/{isni}, /v1/upc/{upc} — Identifier lookups (+ graph query keys: graph, identity_graph, include, depth, limit, offset, …)
- GET /v1/ipi/{ipi}/publishers — Publishers for a songwriter IPI
- GET /v1/musician/{mbid}, GET /v1/artist/{id} — Musician (MBID) vs DSP artist discography
- GET /v1/lookup?url={url} — Spotify / Apple Music URL resolution
- POST /v1/resolve/track, /v1/resolve/songwriter, /v1/resolve/batch — Resolution helpers
- POST /v1/batch — Batch lookup (up to 100 per type)
- GET /v1/verify/{type}/{code}, POST /v1/verify/batch — INSPECT independent source agreement; does not accept caller-supplied values
- POST /v1/contribute — SUBMIT sourced values you already have (requires x-api-key; inspect every per-item status)
- GET /v1/crowd/task, POST /v1/crowd/vote — Human/agent field-choice loop (anonymous session UUID)
- GET /v1/compute/unit?session_id={uuid}, POST /v1/compute/result, GET /v1/me?session_id={uuid} — Software candidate-matching loop. Always follow the returned task_type; identity, crosslink_verify, writer_ipi, and composition_similarity are supported. No API key.
- GET /v1/coverage — Index coverage metrics
- POST /v1/validate/batch, /v1/audit/shares, /v1/audit/unmatched — Validation & audit (CSV via ?format=csv where supported)
Workflow:
1. Start with GET /v1/search?q={query} or /v1/graph/search as appropriate
2. Use returned identifiers for GET /v1/isrc/{isrc}, /v1/iswc/{iswc}, /v1/ipi/{ipi}, etc.
3. Inspect evidence with GET /v1/verify/{type}/{code}
4. Submit sourced missing data with POST /v1/contribute
5. Use Crowd for one field choice or Compute for software candidate matching
6. Coverage gaps: GET /v1/coverage
Key concepts:
- **credits_id** = deterministic UUIDv5 for every entity.
- ISRC = recording; ISWC = composition; IPI = songwriter/publisher; ISNI = contributor; UPC = album.
- Artist = DSP release artist (/v1/artist/{id}); Musician = person profile (/v1/musician/{mbid}).
Always present songwriter credits with roles and publisher relationships when available. Link to credits.fm pages for exploration.Crowd verification
Put one source disagreement in front of a person or agent. No API key is required; generate one UUID and reuse it as the session ID.
How it works
- Call
GET /v1/crowd/taskwith target, ID, and session UUID - Render the returned field and options without guessing whether it is a hidden control
- Submit one exact option value, or
{ "not_sure": true }, toPOST /v1/crowd/vote
A session has zero voting weight until it answers at least three hidden controls correctly. Consensus requires three distinct voters, trusted weight ≥2, and a winning margin ≥1. Anonymous votes can confirm the live value or flag a competing value for review; they never replace a canonical scalar.
Credits Compute
Let software rank a small, server-issued candidate set. No API key is required; reuse one session UUID so trust and access credits accumulate.
Two-step protocol
- Call
GET /v1/compute/unit?session_id=… - Branch on the returned
task_typeand choose one candidate - Submit the opaque token and winner to
POST /v1/compute/result
composition_similaritySame musical work; real units require a local score
identitySame person or organization: IPI ↔ ISNI
crosslink_verifyRecording belongs to work: ISRC ↔ ISWC
writer_ipiWriter name belongs to IPI
Always use the returned task type: hidden composition controls can be interleaved even when identity work was requested. staged means server-checked and awaiting consensus; it does not mean the link is already public.
Verified compute raises access Base → Contributor → Partner. See Credits API pricing for tier details.
Powered by Notes.fm