API reference · v1

Build on the music credit graph.

One versioned REST gateway, one API key. MCP and CLI surfaces share the same key. Catalog-scale is a contract, not an overage.

OpenAPI 3.1View specopenapi.yaml ↓llms.txt
v1
API version
OpenAPI 3.1
Machine spec
x-api-key
Auth scheme
300/min+
Rate limit
REST API · v1One key, one meter — api_requests. No bulk export.
OpenAPI 3.1

Quickstart

Every key is live — your welcome credit covers the first calls, so you can build risk-free

Provision a key, send it in the x-api-key header, call the gateway.

request.shshell
# 1 · x-api-key auth on every request — keys come from the console
export MUSO_API_KEY="msk_51Ab…redacted"

# 2 · Call the versioned REST gateway — a profile's verified credits
curl "https://api.platform.muso.ai/v1/profile/e979669b-d99b-46be-91d6-bf1f1e2f44bf/credits" \
  -H "x-api-key: $MUSO_API_KEY"

# → 200 OK, x-request-id, x-ratelimit-remaining on the response

Run it now

Sign in + a card on file — runs on your key & your credits
GET/v1/profile/e979669b-d99b-46be-91d6-bf1f1e2f44bf/credits

Sign in and add a card to run this live. Your first $5 is on us.

GET/v1/profile/e979669b-d99b-46be-91d6-bf1f1e2f44bf

Sign in and add a card to run this live. Your first $5 is on us.

GET/v1/profile/e979669b-d99b-46be-91d6-bf1f1e2f44bf/charts

Sign in and add a card to run this live. Your first $5 is on us.

Guides

Three short, real walkthroughs — pick the one that matches what you're building. Each is copy-paste and ends with something working.

Show an artist's verified credits in your app

Pull a profile's verified credits from the API and render them in your product — the core Muso integration. Server-side with a secret key; about ten minutes end to end.

10 min
  1. 1
    Create a secret key

    Sign in at platform.muso.ai → Keys → create a secret key (msk_…). Add a card and your first $5 of usage is on us. Secret keys live on your server only — never in browser code (that's what publishable keys are for).

  2. 2
    Find the profile

    Resolve the artist you want by search, then keep their profile id.

    search.shshell
    curl "https://api.platform.muso.ai/v1/search/autocomplete?q=drake" -H "x-api-key: $MUSO_API_KEY"
    # → items[0].id = "e979669b-d99b-46be-91d6-bf1f1e2f44bf"
  3. 3
    Fetch the credits

    Credits are paginated — walk them with limit/offset. Each item carries the track, album, release date, and the credited roles.

    credits.tstypescript
    const r = await fetch(
      "https://api.platform.muso.ai/v1/profile/e979669b-d99b-46be-91d6-bf1f1e2f44bf/credits?limit=10",
      { headers: { "x-api-key": process.env.MUSO_API_KEY! } },
    );
    const { data, totalCount } = await r.json();
  4. 4
    Render — and respect the live-use terms

    Render the response directly to your users. Muso data is a live license: serve it at call time, don't store it. If your architecture needs caching, that's an enterprise agreement (see Data-use terms).

Add Login with Muso

Let your users sign in with their Muso account and consent to sharing their own credits (and analytics on Pro) with your app. Standard OpenID Connect — if you've integrated Google sign-in you already know the shape.

20 min
  1. 1
    Register your app

    Register your app at platform.muso.ai — the $99/mo per-app SSO fee is the publishing gate — and we provision your OIDC client id + secret and register your redirect URI.

  2. 2
    Point at the discovery document

    Everything your OIDC library needs is published at the well-known endpoint — endpoints, JWKS, scopes.

    discovery.shshell
    curl https://login.muso.ai/.well-known/openid-configuration
  3. 3
    Run the code flow (PKCE)

    Send the user to the authorize endpoint; exchange the code server-side; verify the id_token against the JWKS. The token's claims include the user's Muso identity (sub, email, name and the stable https://muso.ai/user_uuid).

  4. 4
    Read their entitled data

    With the user's consent your app sees, live, what their membership allows — verified credits on Lite, credits + their own analytics on Pro. Scoped to the signed-in user; never the wider catalog. Flat $99/mo per registered app, never metered.

Embed a profile card on any site

Put a live, verified Muso profile card on any web page with two lines of HTML — like a YouTube embed for music credits. Uses a publishable key that's safe in public code.

5 min
  1. 1
    Create a publishable key

    Console → Keys → Publishable → create. Register the domains that may use it. mpk_ keys are read-only and safe to ship in page source.

  2. 2
    Paste the embed

    One div, one script. The widget renders in an isolated Shadow DOM — it inherits the Muso look and never touches your page's styles. If anything fails it renders nothing rather than break your site.

    index.htmlhtml
    <div data-muso-profile="e979669b-d99b-46be-91d6-bf1f1e2f44bf" data-muso-key="mpk_your_key"></div>
    <script src="https://platform.muso.ai/embed/v1.js" async></script>
  3. 3
    Or use the React component

    Building in React? The <MusoProfileCard/> component is built but not on public npm yet — the hosted script renders the same card in a React app today.

Looking for a package, the CLI, or the OpenAPI spec? Downloads & resources has every asset and where to get it.

Authentication

Authorization header
x-api-key: msk_51Ab…redacted
Secret keys
msk_…

Live production data. Metered to api_requests, auto-disabled when the subscription ends.

One mode: live
no test mode

Every key is live — same API, same shapes, your plan's limits. There is no separate sandbox host and no test/live split; the key you mint is ready to use.

Scopes
fullAll-catalog graph. This is what a platform x-api-key (msk_…) gets. Metered pay-as-you-go, rate-limited per key.
workspaceYour roster only, free. Not a platform key — the free roster-scoped Workspace key is issued by the Muso app. See Workspace API key →

Keys minted in this platform console are full-scope developer keys for the paid catalog. For free, own-roster reads use the separate Workspace API key from the Muso app.

OpenAPI 3.1 reference

11 operations across 3 tags in one machine-readable document. Generate clients, mocks, and types from the spec.

MethodPath
GET/v1/profile/{id}Profiles
GET/v1/profile/{id}/credits
GET/v1/profile/{id}/charts
GET/v1/profile/{id}/collaborators
GET/v1/track/{idKey}/{idValue}Recordings & releases
GET/v1/track/{idKey}/{idValue}/albums
GET/v1/album/{idKey}/{idValue}
GET/v1/album/{idKey}/{idValue}/credits
POST/v1/searchSearch
GET/v1/search/autocomplete
GET/v1/roles

The spec is the source of truth — SDKs, MCP tools, llms.txt, and this page generate from it.

Versioning

/v1
Additive by default
New fields and endpoints arrive without breaking clients.
Pinned major
Breaking changes ship as /v2; the prior major keeps serving.
Deprecation window
Deprecated routes return a Sunset header, live 6 months minimum.
response headers
x-muso-version: 2026-06-01
sunset: Wed, 01 Apr 2026 00:00:00 GMT   # only on deprecated routes
deprecation: true

Rate-limit headers

per key · per minute

Throughput is capped so the graph can't be cloned. Every response carries pacing headers; a 429 always includes Retry-After.

Pay as you go300/minEnterprisecustom
HeaderExampleMeaning
RateLimit-Limit30Requests permitted per minute on the active key.
RateLimit-Remaining29Requests left in the current window.
RateLimit-Reset35SECONDS until the window refills — not a timestamp.
X-RateLimit-Limit-Minute30Per-minute view of the same budget (sent alongside the above).
X-Kong-Request-Id6925703b19f0c6484300e429c8d91d59Identifies this exact request. Echo it in any support report.
200 OK
HTTP/2 200
content-type: application/json
RateLimit-Limit: 30
RateLimit-Remaining: 29
RateLimit-Reset: 35
X-RateLimit-Limit-Minute: 30
X-RateLimit-Remaining-Minute: 29
X-Kong-Request-Id: 6925703b19f0c6484300e429c8d91d59
429 Too Many Requests
HTTP/2 429
Retry-After: 35
RateLimit-Remaining: 0
RateLimit-Reset: 35
X-Kong-Request-Id: 6925703b19f0c6484300e429c8d91d59

# 429 comes from the gateway, so it carries the gateway error shape
# (a message, no result/code envelope). Wait RateLimit-Reset seconds.

Log X-Request-Id — fastest path to a resolution. Pair it in the support email.

Cursor pagination

List endpoints page with limit and offset, and report the full size as totalCount. Read rows from data.items.

limit / offset paginationhttp
# First page — limit/offset. MAX limit is 50; asking for more is a 400.
GET https://api.platform.muso.ai/v1/profile/e979669b-d99b-46be-91d6-bf1f1e2f44bf/credits?limit=50&offset=0

{
  "result": "ok",
  "code": 200,
  "data": {
    "limit": 50,
    "offset": 0,
    "totalCount": 11701,
    "items": [ /* up to 50 records */ ]
  }
}

# Next page — advance offset by limit. Stop when offset >= totalCount
# (a page past the end returns items: [], not an error).
GET https://api.platform.muso.ai/v1/profile/e979669b-d99b-46be-91d6-bf1f1e2f44bf/credits?limit=50&offset=50
Maximum page size is 50
400

Requesting a larger page is rejected outright rather than silently truncated, so a paging loop can never think it read more than it did.

page too bighttp
# Asking for a bigger page than the API allows
GET https://api.platform.muso.ai/v1/profile/e979669b-d99b-46be-91d6-bf1f1e2f44bf/credits?limit=100

HTTP/2 400
{ "result": "error", "code": 400, "message": "Too big page, max page size is 50" }

Error envelope

Two shapes, and which one you get tells you how far the request travelled. The API answers with the same envelope it uses for success — result: "error", code, message. The gateway rejects auth and quota problems before the API runs, so those carry message and a request_id instead.

error responseshttp
# API errors — same {result, code} envelope as a success, result: "error"
HTTP/2 400
{ "result": "error", "code": 400, "message": "Too big page, max page size is 50" }

# Gateway errors — your request never reached the API, so there is no
# result/code envelope. Log request_id; it is what support will ask for.
HTTP/2 401
{ "message": "No API key found in request", "request_id": "6925703b19f0c6484300e429c8d91d59" }
StatusRaised byWhen
400APIBad request — e.g. limit above 50 ("Too big page, max page size is 50") or an id that resolves to nothing ("Profile not found").
401GatewayNo key sent ("No API key found in request") or the key is unknown/revoked ("Unauthorized").
403GatewayThe key is valid but not entitled to this route — e.g. a publishable mpk_ key against the paid /v1 API ("You cannot consume this service").
429GatewayPer-minute rate limit for your key exceeded. Back off and retry.

A 401 or 403 means the gateway stopped you, so retrying the same request will not help — fix the key. A 400 came from the API and its message says exactly what to change.

Embeddable widgets

Drop-in

Put a live, verified Muso profile card or roster on any website — like a YouTube embed for music credits. Two lines of HTML, or a React component. Both use a publishable key that's safe in public code.

Script embed — any site, no build

Paste a div and one script. It renders in an isolated Shadow DOM — inherits the Muso look, never touches your page's styles, and fails silently rather than break your site.

any-page.htmlhtml
<div data-muso-profile="e979669b-d99b-46be-91d6-bf1f1e2f44bf" data-muso-key="mpk_your_key"></div>
<script src="https://platform.muso.ai/embed/v1.js" async></script>
roster.htmlhtml
<div data-muso-roster="e979669b-d99b-46be-91d6-bf1f1e2f44bf,another-profile-id"
     data-muso-key="mpk_your_key"></div>
<script src="https://platform.muso.ai/embed/v1.js" async></script>
React component

Building in React? The @muso-ai/embeds component is built, but not on public npm yet — the hosted script above works on any site today, React included.

Page.tsxtypescript
// The @muso-ai/embeds package is not on public npm yet — the hosted
// /embed/v1.js script below renders the same component with no install.
import "@muso-ai/octave-ui/globals.css";
import { MusoProfileCard, MusoRoster } from "@muso-ai/embeds";

export default function Page() {
  return <MusoProfileCard entityId="e979669b-d99b-46be-91d6-bf1f1e2f44bf" apiKey="mpk_your_key" />;
  // <MusoRoster profiles={[id1, id2]} apiKey="mpk_your_key" /> renders a grid
}
Live preview
mpk_ · read-only · real data

This card is the real widget, rendered against the live API with the demo publishable key.

Renders the live widget from https://platform.muso.ai/embed/v1.js

Publishable keys

A second key type for browser code. Publishable keys (mpk_) are read-only, locked to your domains, and safe to ship in page source — the credential the widgets use.

Secret key · msk_Publishable · mpk_
Server-side onlySafe in browser / page source
Full catalog + writesRead-only: profile + credits + charts
Any originLocked to your registered domains
Base https://api.platform.muso.ai/v1Base https://api.platform.muso.ai/embed/v1
What a publishable key can read

GET only, CORS-open, 120 requests/min, metered like any read. The same key on the paid /v1 surface returns 403 by design. Create one in the console: Keys → Publishable.

embed-read.shshell
# Publishable keys hit the read-only embed surface (CORS-open, 120/min)
curl "https://api.platform.muso.ai/embed/v1/profile/e979669b-d99b-46be-91d6-bf1f1e2f44bf" \
  -H "x-api-key: mpk_dfa3dcbb707a13d8db910f5cfe5eb904"
# Also: /profile/{id}/credits · /charts · /collaborators — GET only.
# The same key on the paid /v1 surface returns 403 by design.

MCP server

Agent-native

Give Claude, ChatGPT, or any agent tool-based access to the credit graph — ask 'who produced this track?' in plain language and get real answers. Twelve live tools, on the same key and meter as the REST API.

Install
install.shshell
# WORKS TODAY — zero install. Point any MCP client at the hosted endpoint:
#   https://mcp.muso.ai/mcp
# Transport: Streamable HTTP. Auth: your msk_ key in the x-api-key header.

# A local `muso-mcp` package is built but NOT yet on PyPI, so
# A local package exists but is not on PyPI, so there is nothing to
# install today. Use the hosted endpoint above.

Or point any MCP client at the hosted endpoint — https://mcp.muso.ai/mcp — no local install.

Configure Claude Desktop
claude_desktop_config.jsonjson
{
  "mcpServers": {
    "muso": {
      "command": "muso-mcp",
      "env": {
        "MUSO_API_KEY": "msk_your_key_here",
        "MUSO_API_BASE_URL": "https://api.platform.muso.ai/v1"
      }
    }
  }
}
ToolWhat it doesRequired argumentsEndpoint
searchKeyword search across profiles, tracks, albumskeywordPOST /search
search_autocompleteFast typeaheadqGET /search/autocomplete
search_profilesResolve profiles for a known tracknames + track_ids or spotify_track_idsGET /profiles/search
get_profileProfile identity, stats, linksid_valueGET /profile/{id}
get_profile_creditsVerified credits (paginated)id_valueGET /profile/{id}/credits
get_profile_collaboratorsWho they've worked withid_valueGET /profile/{id}/collaborators
get_profile_chartsChart / analytics positionsid_valueGET /profile/{id}/charts
get_trackRecording by ISRC or idid_key, id_valueGET /track/{idKey}/{idValue}
get_track_albumsAlbums a recording appears onid_key, id_valueGET /track/{k}/{v}/albums
get_albumAlbum by UPC or idid_key, id_valueGET /album/{idKey}/{idValue}
get_album_creditsAn album's full credit listid_key, id_valueGET /album/{k}/{v}/credits
get_rolesThe credit-role taxonomy(none)GET /roles

Works on any paid metered key — no separate MCP fee. Each tool call is one metered read.

CLI

Look up verified credits, profiles, and search from your terminal — then copy the same calls into your app. One binary, your secret key, the live API.

Install & authenticate
install.shshell
# The CLI is built and working, but Muso-AI/muso-cli is still a PRIVATE
# repo, so `go install` cannot resolve it from outside the org yet and
# there are no public release archives. Nothing to install today.
#
# Everything the CLI does, the REST API does now — see the Quickstart.
# This section documents the commands so the interface is stable when it ships.
login.shshell
muso login                 # paste your msk_ key — stored 0600 at ~/.muso/config.json
# or, for CI:  export MUSO_API_KEY=msk_…

$ muso whoami
Authenticated ✓
  key      msk_…2684
  base_url https://api.platform.muso.ai/v1
Real output
examples.shshell
$ muso profile e979669b-d99b-46be-91d6-bf1f1e2f44bf
Drake
  country        Canada
  credits        11689
  collaborators  15754
  popularity     97

$ muso credits e979669b-d99b-46be-91d6-bf1f1e2f44bf --limit 3
11689 total credits (showing 3)
TRACK            ALBUM                RELEASED
Janice STFU      ICEMAN               2026-05-15
NOKIA            $ome $exy $ongs 4 U  2025-02-14
Whisper My Name  ICEMAN               2026-05-15

$ muso search drake --json | jq '.items[0].name'
"Drake"
CommandWhat it does
muso login / logoutStore / clear your key
muso whoamiVerify the active key
muso profile <id>Profile identity + headline stats
muso credits <id>Verified credits (paged, --limit/--offset)
muso search <query>Type-ahead across the catalog
muso track <isrc>A recording by ISRC
muso usageCurrent rate-limit headroom

Release archives are rolling out — for now, go install …/cmd/muso-api@latest. All calls use your account's standard metered API; no separate CLI fee.

Streaming analytics

Rolling out

Push live analytics deltas to your app over a WebSocket instead of polling — chart moves and consumption signals as they happen. Part of the streaming-analytics tier; the delivery endpoint is rolling out.

Connection lifecycle

Connect → authenticate with your issued token → subscribe to a channel → receive delta frames. When the tier ships, your wss:// endpoint and token will be provisioned with the subscription (planned at $10,000/mo) — it is not purchasable yet.

connect.tstypescript
// Streaming analytics — connection lifecycle.
// Your dedicated wss:// endpoint + token are issued with the
// streaming subscription (Console → Limits → Streaming analytics).
const ws = new WebSocket(STREAM_ENDPOINT); // wss://… (issued per account)

ws.onopen = () => {
  // 1 · authenticate, then 2 · subscribe to a channel
  ws.send(JSON.stringify({ connect: { token: STREAM_TOKEN } }));
  ws.send(JSON.stringify({ subscribe: { channel: "profile:e979669b-d99b-46be-91d6-bf1f1e2f44bf" } }));
};

ws.onmessage = (e) => {
  const frame = JSON.parse(e.data);
  // frames: { channel, data: { metric, value, at } } — deltas, not snapshots
  if (frame.data) render(frame.channel, frame.data);
};
reconnect.tstypescript
// Reconnect with exponential backoff + jitter. Resubscribe on open —
// the server replays nothing; treat the stream as live-only and
// backfill gaps from the REST charts endpoint.
let attempt = 0;
function reconnect() {
  const wait = Math.min(30_000, 1_000 * 2 ** attempt) * (0.5 + Math.random());
  setTimeout(() => { attempt += 1; connect(); }, wait);
}
ws.onclose = reconnect;   // attempt = 0 again after a healthy minute

Treat the stream as live-only — it replays nothing on reconnect; backfill any gap from the REST /profile/{id}/charts endpoint. Interested before general availability? Reach us from the console.

SDKs & surfaces

One key, four surfaces. SDKs handle auth, retries with backoff, and limit/offset paging.

TypeScript
fetch / generated client

Plain fetch works out of the box — or generate a fully-typed client from the OpenAPI spec (below).

See quickstart →
Python
requests / generated client

Plain requests works out of the box — or generate a typed client from the same spec.

See quickstart →
MCP server
agent-native tools

The credit graph as tools for Claude, ChatGPT, or any agent — 12 live tools on the same key & meter.

Read the docs →
CLI
muso — terminal

Look up credits, profiles, and search from your terminal — one command, same key.

Read the docs →
Generate an SDK
openapi.yaml ↓

Prefer your own client? Any OpenAPI 3.1 generator works against the spec — today, for every language.

TypeScript · @hey-api/openapi-tsshell
# TypeScript — typed client + models from the live spec.
# Pin typescript@5: the generator reads your project's TypeScript and
# crashes on TS 7 (verified). Use "type": "module" in package.json.
npm i -D typescript@5 @hey-api/openapi-ts
npx @hey-api/openapi-ts -i https://platform.muso.ai/openapi.yaml -o src/muso
Python · openapi-generatorshell
# Python — openapi-generator against the same document
npx @openapitools/openapi-generator-cli generate \
  -i https://platform.muso.ai/openapi.yaml -g python -o muso_client

An official typed SDK (@muso-ai/sdk) with credits, roster & analytics modules, React hooks, and a recipes gallery is rolling out for registered developers.

Login with Muso (SSO)

OpenID Connect

Let your users sign in with their Muso account and see, live, the data their membership allows — their own credits, and analytics on Pro. Standard OpenID Connect; user-consented; scoped to the signed-in user's own data. Flat fee per registered app, never metered.

Step 1
Register your app

Register your app — the $99/mo per-app SSO fee is the publishing gate. We provision your OIDC client credentials and register your redirect URIs.

Step 2
Add the OIDC flow

Authorization-code + PKCE against login.muso.ai — the same flow you already use for Google or Apple. Any standard OIDC library works.

Step 3
Receive the user

Your app gets a verified id_token for the signed-in Muso user — including a stable Muso user id — and the user sees their own entitled data, live.

OIDC discoveryshell
# Discovery — endpoints, keys, everything your OIDC library needs
curl https://login.muso.ai/.well-known/openid-configuration

# authorization_endpoint  https://login.muso.ai/api/auth/oauth2/authorize
# token_endpoint          https://login.muso.ai/api/auth/oauth2/token
# userinfo_endpoint       https://login.muso.ai/api/auth/oauth2/userinfo
# jwks_uri                https://login.muso.ai/api/auth/jwks
# grants                  authorization_code (+ PKCE), refresh_token
# scopes                  openid profile email offline_access
What your app receives
  • A signed id_token (verify against jwks_uri) with standard claims — sub, email, email_verified, name, picture — plus https://muso.ai/user_uuid, the stable Muso user id that keys the user across Muso surfaces.
  • userinfo_endpointaccess with the user's token for the same profile claims.
  • Entitlement-scoped data for the signed-in user — their own credits on Lite, credits + their own analytics on Pro — enabled for your registered app during app registration. The user consents on first sign-in; your app never sees beyond their own data.

Login with Muso is $99/mo per registered app and never metered — the free on-ramp for your users, distinct from the paid catalog API. Catalog-wide reads always go through your metered API key. Overview →

Workspace API key — free roster access

Included · free

Already pay for Muso Pro or Business? Your own roster's credits & stats are free through the Workspace API key — a read-only key scoped to the profiles on your roster. It's issued and managed inside the Muso app, not here.

Two different keys — don't confuse them

The Workspace API key is the free, roster-scoped, read-only key for reading your own artists. It is created and rotated in the Muso app (app.muso.ai → Settings → API Key), and it calls the Muso backend directly — a different header and host from the platform developer key below.

The key you get here in the platform console (msk_) is a developer API key for the paid catalog (pay-as-you-go) — it reaches the whole catalog, not just your roster. Use the Workspace key for your own roster for free; use the platform key when you need catalog-wide access.

What the Workspace key reads

The verified credits and stats for the profiles on your own Muso roster — the artists your Pro/Business subscription already covers. Read-only, your own data only, and auto-disabled the moment the subscription lapses.

Who gets it

Every Muso Pro and Businesssubscriber, free — no separate charge. A workspace owner creates it in the Muso app; it's revealed once, so store it safely.

Use it

The Workspace key calls the Muso backend with the workspace-api-key header (not the platform's x-api-key). Create the key at app.muso.ai → Settings → API Key, then read your roster:

workspace-roster.shshell
# Create/rotate the Workspace key in the Muso app:
#   app.muso.ai → Settings → API Key  (owner + active Pro/Business sub)
export MUSO_WORKSPACE_KEY="<your workspace key>"

# List the profiles on your roster (own data, free)
curl "https://api.muso.ai/api/c/v4a/workspace/roster" \
  -H "workspace-api-key: $MUSO_WORKSPACE_KEY"
Getting more — add profiles to your roster

The Workspace key sees exactly the profiles on your roster, so to read more artists you add them to your Muso subscription — you do not upgrade any API plan. Manage your roster in the Muso app under Settings → Profiles (the “Add Profile” button; subject to your plan's roster seat limit). Newly added profiles are readable through the same key immediately. If you need the wholecatalog rather than your own roster, that's the metered pay-as-you-go API using your platform key.

Tiers, billing & workspace

Self-service

How capacity, billing, and account features work — everything is self-service.

Usage tiers & plans

You reach a higher tier two ways: automatically as your billing history grows, or instantly by buying the tier's monthly plan. Plans sell the $0.020 per-call rate from your first call; plan money counts toward usage — you only pay the difference.

TierReq/secReq/minSpend capPlan to unlock
Start5300$500/mo
Build251.5K$3,000/mo$500/mo min
Scale1006K$100,000/mo$3,000/mo min
Customrequest higher

The ladder telescopes: each tier's spend cap equals the next tier's plan, so upgrading is never a leap. Your current tier, limits, and instant upgrades live in the console under Limits.

Billing — prepaid credits

Self-serve billing is a prepaid balance: start with $5in credits on the house, then top up (from $10) — every API call draws down your balance, so there's never a surprise bill. Turn on auto-recharge to stay topped up. Plans present as included calls (the $500/mo Build plan → 25,000 calls at $0.020 + Build throughput); plan money counts toward usage — you only pay the difference. Enterprise contracts are invoiced. Your balance and usage are always live in the console.

Workspace API key (Muso Pro/Business)

Paying Muso subscribers read their own roster at no charge through the free, roster-scoped Workspace key — created and managed in the Muso app, separate from the platform developer key on this page. Auto-disabled if the subscription lapses. Full guide →

Teams & key management

Invite teammates from Settings → Team. Owners and admins see and manage the workspace key (revealed once — copy it then); members never see key material. Rotate or revoke anytime — rotation is immediate at the gateway, and removing a member auto-rotates the key.

Platform Analytics & streaming

Per-entity analytics (an artist's charts) are part of the metered API today. Platform Analytics — system-wide, cross-catalog queries — is metered with a $3,000/mo minimum that counts toward usage. The minimum includes the Scale plan — one payment covers both. Streaming analytics ($10,000/mo) is coming soon.

Data-use terms

In-app use only

Your subscription licenses Muso credits & stats for use INSIDE your own application, for your own users. It does not grant the right to resell, redistribute, or feed Muso data into another product or service — and it is a LIVE license: data is fetched from the API at the moment of use, never stored on your side.

Licensed for in-app consumption only
No resale

You may not sell, sublicense, or otherwise make Muso data available to third parties as data.

No redistribution

Data may not be re-exposed via your own bulk API, export, or feed in a way that reconstitutes the Muso graph.

No model/DB cloning

You may not use the API to systematically replicate the catalog or train a competing credits/stats database.

No caching or storage

Muso data must be requested live from the API at the time of use. API responses may not be cached, stored, retained, or written to any database, file, index, or datastore beyond the transient in-memory handling of the current request.

Storage is an Enterprise arrangement

Need to cache or store Muso data locally? Enterprise agreements include a term-limited storage license: you may cache and store licensed data locally for the duration of your agreement, under its security controls, with certified deletion when the agreement ends. Standard plans remain live-use only — talk to sales.

Express written consent

Any use beyond in-app consumption requires written consent from Muso. When in doubt, ask.

Rate limits, quotas, the spend ceiling, and per-record watermarks exist specifically to keep the database from being cloned. Money buys past your included quota — never a licence to take the catalog. Catalog-scale extraction is Enterprise-only under the data licence: a card on file does not buy it.

Storage or retention needs? Talk to sales about an Enterprise data agreement →

Downloads & resources

Everything we ship, in one place — with exactly where to get it. Hosted resources work right now with no install. Client libraries are publishing to public registries (scoped GitHub Packages today); the hosted embed script and API need no package at all.

Use it now — hosted, nothing to install
Embed script
A verified profile card or roster on any page — two lines, a publishable mpk_ key, no backend.
html
<div data-muso-profile="e979…44bf" data-muso-key="mpk_…"></div>
<script src="https://platform.muso.ai/embed/v1.js" async></script>

Versioned — /embed/v1.js never breaks under you. See Embeddable widgets.

OpenAPI spec
The full machine-readable contract. Import it into Postman or Insomnia to get a ready-made collection.
bash
curl https://platform.muso.ai/openapi.yaml -o muso-openapi.yaml
# Postman / Insomnia → Import → paste the URL

Also at /api/openapi. Browse it in OpenAPI reference.

MCP server (hosted)
The same data as typed tools for AI agents — Claude Desktop, Cursor, Windsurf — on your key and quota.
json
{ "mcpServers": { "muso": {
  "url": "https://mcp.muso.ai/mcp",
  "headers": { "x-api-key": "msk_…" }
} } }

Full setup in MCP server.

Machine docs & brand
For LLMs and agents: point them at the full docs. Plus the Muso wordmark for attribution.
Client librariesPublishing to public registries
TypeScript SDK
Typed client with credits, profiles, roster & analytics modules — plus React hooks in @muso-ai/sdk-react.
bash
# scoped registry (GitHub Packages) — public npm rolling out
echo "@muso-ai:registry=https://npm.pkg.github.com" >> .npmrc
# Not on public npm yet — generate a typed client from the spec instead (above).

See SDKs for the domain modules & recipes.

Embeds (React)
<MusoProfileCard/> and <MusoRoster/> as typed React components — same data, same look.
bash
# Not on public npm yet — @muso-ai/embeds resolves only
# inside the Muso GitHub Packages scope.

Use the hosted /embed/v1.js above — it needs no package and works on any site today.

CLI
Sign in once, then script the catalog from anywhere — JSON out, pipe-friendly.
bash
go install github.com/Muso-AI/muso-cli/cmd/muso-api@latest
# Prebuilt release archives are rolling out.

Commands & auth in CLI.

Login with Muso (SSO)
Standard OpenID Connect — let your users sign in and bring their OWN entitled data into your app.
bash
curl https://login.muso.ai/.well-known/openid-configuration

Full flow in Login with Muso (SSO).