Meustreams Logo
MEUSTREAMS
Home Docs API Reference

Meustreams API Reference

Automate your music business. The Meustreams API lets you manage releases, track distribution and deliveries, follow royalties and payouts, and register your works with PROs — from your own tools.

REST v1
Browse documentation

Introduction

The Meustreams API is a REST interface for your catalog and your business. It is organised around four areas: Releases, Distribution, Royalties, and Publishing.

Releases

Create releases, tracks and metadata, then submit them.

Distribution

Platforms, DSP deliveries and delivery status.

Royalties

Earnings summaries and payout requests.

Publishing

Works and PRO/society registrations.

Base URL

All endpoints are relative to the following base URL. Requests must be made over HTTPS.

https://api.meustreams.com/v1
EnvironmentBase URLNotes
Productionhttps://api.meustreams.com/v1Live catalog and real payouts.
Sandboxhttps://api.sandbox.meustreams.com/v1Dummy data, safe to experiment.

Authentication

Authenticate every request with a Bearer token. API keys are issued for your space and can be revoked at any time; a revoked or disabled key stops working immediately. Treat keys like passwords and never expose them in client-side code.

Authorization: Bearer ms_live_xxxxxxxxxxxxxxxx

If you hold a credential (username and password) you can exchange it for a short-lived Bearer token instead of keeping a long-lived key around:

curl -X POST https://api.meustreams.com/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{ "username": "mxapi_xxxxxxxx", "password": "xxxxxxxx" }'

The response carries an access_token; send it as Authorization: Bearer <token>. Tokens expire, so request a new one when they do.

Requests without a valid token are rejected with 401 unauthorized. A credential that is valid but not allowed to reach the resource is rejected with 403 forbidden.

Keep credentials and keys server-side only. API keys are long-lived secrets with no built-in expiry, so never embed them in browser code or ship them with a client application. Prefer the short-lived token for anything that runs in a browser, and rotate or revoke a key immediately if it is ever exposed.

Quickstart

Make your first call by listing your releases.

# Store your key once
export MEUSTREAMS_API_KEY="ms_live_xxxxxxxxxxxxxxxx"

# List your releases
curl https://api.meustreams.com/v1/releases \
  -H "Authorization: Bearer $MEUSTREAMS_API_KEY"
{
  "data": [
    {
      "id": "rel_4k92mx",
      "title": "Midnight Horizon",
      "artist": "Your Name",
      "type": "single",
      "status": "live",
      "release_date": "2026-02-20",
      "upc": "196589201234"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Releases

Create, edit and submit your catalog.

GET /v1/releases

Returns a paginated list of releases, newest first.

QueryTypeDescription
limitinteger optionalItems per page, 1–100. Defaults to 20.
cursorstring optionalOpaque cursor from a previous response.
statusstring optionaldraft, processing, live, or rejected.
curl "https://api.meustreams.com/v1/releases?limit=20&status=live" \
  -H "Authorization: Bearer $MEUSTREAMS_API_KEY"
POST /v1/releases

Create a new release with its tracks and metadata.

FieldTypeDescription
titlestring requiredRelease title.
artiststring requiredPrimary artist name.
typestring requiredsingle, ep, or album.
release_datestring optionalISO-8601 date. Defaults to as soon as possible.
tracksarray optionalTrack objects with title, isrc, and audio_url.
curl -X POST https://api.meustreams.com/v1/releases \
  -H "Authorization: Bearer $MEUSTREAMS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Midnight Horizon",
    "artist": "Your Name",
    "type": "single",
    "release_date": "2026-02-20",
    "tracks": [
      { "title": "Midnight Horizon", "isrc": "US-MSX-26-00891", "audio_url": "https://cdn.example.com/track.wav" }
    ]
  }'
GET /v1/releases/{id}

Retrieve a single release with its tracks, artwork and delivery links.

{
  "id": "rel_4k92mx",
  "title": "Midnight Horizon",
  "artist": "Your Name",
  "type": "single",
  "status": "live",
  "upc": "196589201234",
  "artwork_url": "https://cdn.example.com/art.jpg",
  "tracks": [ { "id": "trk_1a2b3c", "title": "Midnight Horizon", "isrc": "US-MSX-26-00891" } ]
}
PATCH /v1/releases/{id}

Update editable metadata on a release that has not gone live yet.

curl -X PATCH https://api.meustreams.com/v1/releases/rel_4k92mx \
  -H "Authorization: Bearer $MEUSTREAMS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "release_date": "2026-03-01" }'
DELETE /v1/releases/{id}

Delete a draft release. Live releases must be taken down through distribution first.

curl -X DELETE https://api.meustreams.com/v1/releases/rel_4k92mx \
  -H "Authorization: Bearer $MEUSTREAMS_API_KEY"
POST /v1/releases/{id}/submit

Submit a draft release for distribution. Meustreams validates the metadata and queues the deliveries.

{
  "id": "rel_4k92mx",
  "status": "processing",
  "submitted_at": "2026-02-01T10:14:00Z",
  "deliveries_queued": 118
}

Distribution

Where your music goes and how it landed.

GET /v1/distribution/platforms

List the DSPs and recording pools available for distribution.

{
  "data": [
    { "id": "spotify", "name": "Spotify", "type": "dsp", "enabled": true },
    { "id": "apple_music", "name": "Apple Music", "type": "dsp", "enabled": true },
    { "id": "beatport", "name": "Beatport", "type": "pool", "enabled": true },
    { "id": "mixcloud", "name": "Mixcloud", "type": "dsp", "enabled": false }
  ]
}
GET /v1/distribution/deliveries

List deliveries for a release, with the per-platform status.

{
  "data": [
    { "id": "dlv_9f8e7d", "platform": "spotify", "status": "delivered", "delivered_at": "2026-02-03T08:20:11Z" },
    { "id": "dlv_6c5b4a", "platform": "apple_music", "status": "delivered", "delivered_at": "2026-02-03T08:41:52Z" },
    { "id": "dlv_3a2b1c", "platform": "tiktok", "status": "pending", "delivered_at": null }
  ],
  "has_more": false,
  "next_cursor": null
}
GET /v1/distribution/deliveries/{id}

Retrieve a single delivery, including any errors reported by the platform.

{
  "id": "dlv_9f8e7d",
  "platform": "spotify",
  "status": "delivered",
  "external_id": "sp_5f3a91",
  "errors": []
}

Royalties

Track what you earned and get paid.

GET /v1/royalties/summary

A summary of earnings by period, with the split between recorded and publishing royalties.

{
  "currency": "USD",
  "period": "2026-02",
  "recorded_cents": 318420,
  "publishing_cents": 74210,
  "total_cents": 392630,
  "available_for_payout_cents": 210900
}
GET /v1/royalties/payouts

List past and pending payouts.

{
  "data": [
    { "id": "po_11aa22", "amount_cents": 150000, "currency": "USD", "status": "paid", "paid_at": "2026-01-15T12:00:00Z" },
    { "id": "po_33bb44", "amount_cents": 210900, "currency": "USD", "status": "processing", "paid_at": null }
  ]
}
POST /v1/royalties/payouts

Request a payout of your available balance to your registered bank account.

curl -X POST https://api.meustreams.com/v1/royalties/payouts \
  -H "Authorization: Bearer $MEUSTREAMS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "amount_cents": 210900 }'

Publishing

Register your works around the world.

GET /v1/publishing/works

List the musical works in your publishing catalog.

{
  "data": [
    {
      "id": "wrk_7d6c5b",
      "title": "Midnight Horizon",
      "iswc": "T-123456789-0",
      "writers": [ { "name": "Your Name", "share": 100 } ],
      "registered_societies": ["ASCAP", "SGAE"]
    }
  ]
}
POST /v1/publishing/registrations

Register a work with one or more Performance Rights Organizations and collection societies.

curl -X POST https://api.meustreams.com/v1/publishing/registrations \
  -H "Authorization: Bearer $MEUSTREAMS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "work_id": "wrk_7d6c5b",
    "societies": ["ASCAP", "SGAE"],
    "writers": [ { "name": "Your Name", "share": 100 } ]
  }'

Analytics

Understand where your music is being heard.

GET /v1/analytics/streams

Stream counts and listening time, grouped by platform or by release.

{
  "group_by": "platform",
  "period": "2026-02",
  "data": [
    { "key": "spotify", "streams": 842310, "listening_minutes": 2104555 },
    { "key": "apple_music", "streams": 318900, "listening_minutes": 902112 },
    { "key": "youtube", "streams": 87690, "listening_minutes": 304981 }
  ]
}

Webhooks

React to events as they happen.

POST /v1/webhooks

Subscribe an HTTPS endpoint to events such as release.live, delivery.updated, and payout.paid.

curl -X POST https://api.meustreams.com/v1/webhooks \
  -H "Authorization: Bearer $MEUSTREAMS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://your-site.com/hooks/meustreams",
    "events": ["release.live", "payout.paid"]
  }'

Every webhook is signed so you can verify it came from us.

Meustreams-Signature: t=1772540400,v1=8f1c2d3e4b5a6978
DELETE /v1/webhooks/{id}

Remove a webhook subscription.

curl -X DELETE https://api.meustreams.com/v1/webhooks/wh_5a6b7c \
  -H "Authorization: Bearer $MEUSTREAMS_API_KEY"

Reference

Status codes, limits and lists.

Errors

Errors use conventional HTTP status codes and return a JSON body with a machine-readable code.

StatusCodeMeaning
400invalid_requestThe request body or parameters are malformed.
401unauthorizedMissing or invalid API key.
403forbiddenThe key lacks access to this resource.
404not_foundThe requested resource does not exist.
409conflictThe resource is in a conflicting state.
422unprocessableValidation failed for one or more fields.
429rate_limitedToo many requests. Back off and retry.
500server_errorSomething went wrong on our side.
{
  "error": {
    "code": "unprocessable",
    "message": "The field 'title' is required.",
    "field": "title"
  }
}

Rate limits

Limits apply per API key. Responses include headers so you can adapt before you are throttled.

ScopeLimit
Read endpoints120 requests / minute
Write endpoints60 requests / minute
Payout requests10 requests / hour
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1772540400

Pagination

List endpoints are cursor-based. Pass the cursor from next_cursor to fetch the next page.

curl "https://api.meustreams.com/v1/releases?limit=20&cursor=Y3Vyc29yX3JlbF80azkybXg" \
  -H "Authorization: Bearer $MEUSTREAMS_API_KEY"

Cursors are opaque. Do not parse or construct them yourself.

Ready to automate your music business?

Get an API key from your Meusx dashboard and start building.

Join Meusx to Get Started