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.
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
| Environment | Base URL | Notes |
|---|---|---|
| Production | https://api.meustreams.com/v1 | Live catalog and real payouts. |
| Sandbox | https://api.sandbox.meustreams.com/v1 | Dummy 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.
| Query | Type | Description |
|---|---|---|
| limit | integer optional | Items per page, 1–100. Defaults to 20. |
| cursor | string optional | Opaque cursor from a previous response. |
| status | string optional | draft, 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.
| Field | Type | Description |
|---|---|---|
| title | string required | Release title. |
| artist | string required | Primary artist name. |
| type | string required | single, ep, or album. |
| release_date | string optional | ISO-8601 date. Defaults to as soon as possible. |
| tracks | array optional | Track 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.
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request body or parameters are malformed. |
| 401 | unauthorized | Missing or invalid API key. |
| 403 | forbidden | The key lacks access to this resource. |
| 404 | not_found | The requested resource does not exist. |
| 409 | conflict | The resource is in a conflicting state. |
| 422 | unprocessable | Validation failed for one or more fields. |
| 429 | rate_limited | Too many requests. Back off and retry. |
| 500 | server_error | Something 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.
| Scope | Limit |
|---|---|
| Read endpoints | 120 requests / minute |
| Write endpoints | 60 requests / minute |
| Payout requests | 10 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