REST API · v1 · OAS 3.0

Operate like a distributor.
Without building one.

Push releases, manage artists and labels, monitor delivery and pull royalties from a single REST API. Your users live in your database — Move only sees you as one technical partner account.

distribute-release.post
POST /v1/releases
{
"title": "Neon Horizon",
"artist": "Synthetix",
"upc": "8823490123",
"platforms": ["spotify", "apple", "beatport"],
"territories": "WORLDWIDE",
"schedule": {
"release_date": "2026-06-01"
}
}
201 Created
142ms
All stores
Direct DDEX delivery
DDEX ERN 4.x
Compliant out of the box
Sandbox
Mocked DSP responses
Webhooks
Ingestion & takedown events
Authentication

JWT + API key

Every request is signed with a short-lived JWT and an x-api-key header. Tokens are obtained via /auth/obtain-token/ and refreshed with /auth/refresh-token/.

# Required headers on every request
Authorization: Bearer <access_token>
x-api-key: <your_api_key>
Referer: <as instructed by Move staff>
# Token lifecycle
POST /auth/obtain-token/
POST /auth/refresh-token/
POST /auth/verify-token/
Sample · From the docs

A taste of the API.

A few representative endpoints — full schemas, query params and examples live in the OAS 3.0 reference.

Obtain an access token

POST /auth/obtain-token/
curl -X POST https://privapi.movemusic.io/auth/obtain-token/ \
  -H "x-api-key: <your_api_key>" \
  -H "Content-Type: application/json" \
  -d '{
    "username": "partner@yourbrand.com",
    "password": "••••••••"
  }'

# 200 OK
{
  "access":  "eyJ0eXAiOiJKV1QiLC...",
  "refresh": "eyJ0eXAiOiJKV1QiLC..."
}

Create a release

POST /releases/
POST /releases/
Authorization: Bearer <access_token>
x-api-key: <your_api_key>

{
  "title": "Aurora EP",
  "primary_artist": 1842,
  "label": 17,
  "release_date": "2026-06-01",
  "upc": null,            // auto-generated if omitted
  "genre": 12,
  "tracks": [9421, 9422, 9423],
  "ddex_stores": [1, 4, 7, 9, 12]   // or "all"
}

List delivery confirmations

GET /ddex-delivery-confirmations/
GET /ddex-delivery-confirmations/?release=8821

# 200 OK
{
  "count": 42,
  "results": [
    { "store": "spotify", "status": "DELIVERED", "delivered_at": "2026-05-28T09:14:02Z" },
    { "store": "apple",   "status": "DELIVERED", "delivered_at": "2026-05-28T09:18:55Z" },
    { "store": "beatport","status": "REJECTED",  "reason": "ARTWORK_RESOLUTION" }
  ]
}

Pull a royalty statement

GET /statements/
GET /statements/?period=2026-04&format=json

# 200 OK
{
  "period": "2026-04",
  "currency": "EUR",
  "totals": { "gross": 12840.55, "net": 10921.46 },
  "by_dsp":   [ /* per-store breakdown */ ],
  "by_track": [ /* per-track drilldown */ ]
}

Core resources

Every catalog object exposed as a clean REST resource.

Artists

GET · POST · PUT · PATCH
/artists/

Create and manage artist profiles, aliases and platform IDs.

Releases

GET · POST · PUT · PATCH
/releases/

Create releases, attach tracks and trigger delivery. Update status via /releases/update-status/.

Tracks

GET · POST · PUT · PATCH
/tracks/

Audio assets, ISRCs, contributors, publishers and per-track metadata.

Labels

GET · POST · PUT · PATCH
/labels/

Manage your labels and validate label-name uniqueness.

Contributors

GET · POST · PUT · PATCH
/contributors/

Writers, producers, mixers, performers — role assignments via /contributor-roles/.

Publishers

GET · POST · PUT · PATCH
/publishers/

Publisher entities for accurate split sheets and mechanical reporting.

DDEX Stores

GET
/ddex-store/

List of every connected DSP target your account can deliver to.

Delivery confirmations

GET
/ddex-delivery-confirmations/

Per-store delivery status, errors and acknowledgements from each DSP.

Statements

GET
/statements/

Royalty statements aggregated by period, ready for accounting export.

Invoices

GET · POST
/invoices/

Generate invoices to Move and inspect prior issued invoices.

Trends

GET
/trends/

Normalized chart, playlist and stream trend data across every DSP.

Store URLs

GET
/store-urls/

Live links to each release on every DSP that accepted it.

Genres / Subgenres

GET
/genres/ · /subgenres/

Canonical genre & subgenre IDs accepted across all delivery targets.

Uploads

GET
/obtain-signed-url-for-upload/

Request a signed S3 URL for direct audio & artwork upload.

Feature Requests

GET · POST · PUT · PATCH
/feature-request/

Submit and track feature requests from your team or sub-users.

DDEX-compliant

Generates ERN 4.x messages and delivers via the right delivery protocol per partner.

Your users, your DB

Customers live in your database and auth system. Move only sees you as one technical partner.

Complimentary admin

Every API customer gets an internal admin dashboard to inspect releases, statuses and DSP feedback.

REST API FAQ

Who is the REST API for?+

Distributors, sub-distributors and SaaS platforms that want to embed music distribution into their own product. You manage users and auth in your backend; Move powers the distribution engine behind it.

What authentication does the API use?+

Every request must include both an Authorization header (Bearer access token) and an x-api-key header issued by Move. A referer header per Move staff instructions is also required.

Do my users see Move Music?+

No. Your users live in your database and never leave your platform. Move is invisible to them — to us you are one technical partner account.

Can I see delivery confirmations?+

Yes. /ddex-delivery-confirmations/ returns per-store status, errors and acknowledgements. You can also subscribe to webhook callbacks on ingestion and takedown events.

Is there a sandbox?+

Yes — every account includes a sandbox with mocked DSP responses for end-to-end testing. Sandbox traffic is unmetered.

Who pays my customers?+

We pay you. You pay your customers. Move splits between your master account and Move; you handle downstream payouts to your sub-users.