Music distribution has never been more accessible. Platforms like DistroKid, TuneCore, and CD Baby democratized access to DSPs (Digital Service Providers) for independent artists. But for companies operating as distributors - managing multiple labels, complex territory restrictions, and custom royalty splits - the generic UI and rigid workflows of consumer-facing tools quickly become a bottleneck.
The friction points are predictable:
| Pain Point | What Happens |
|---|---|
| Territory restrictions | Many platforms only support album-level territory settings, forcing workarounds when individual tracks have different rights across markets |
| Metadata flexibility | Contributor roles, localized titles, and DSP-specific artist IDs often require manual overrides the UI doesn't expose |
| Reporting | Off-the-shelf dashboards rarely match the operational needs of a multi-label distributor |
| Delivery control | When a platform handles delivery as a black box, debugging ingestion failures becomes a support ticket game |
This is where the build-vs-buy decision becomes real.
Distributors who've outgrown their current setup face a fundamental architectural choice:
This article focuses on Option A: what it looks like in practice, where it excels, and where it hits structural limits.
Revelator positions itself as an "end-to-end operating system" for independent music businesses. Unlike consumer-facing distributors, it's B2B infrastructure - designed for labels, aggregators, and distributors who want to run their own branded operation.
The API is RESTful, JSON-based, and covers five core modules:
POST /content/release/savePOST /distribution/release/{releaseId}/validatePOST /distribution/release/addtoqueuePOST /distribution/release/takedownThe hybrid approach layers your custom platform on top of Revelator's delivery infrastructure:
Loading diagram...
| Layer | Responsibility |
|---|---|
| Artist & label portals | Branded onboarding, release submission, approval workflows |
| Metadata layer | Your own database of releases, tracks, contributors, and rights - synced to Revelator via API |
| Territory & rights engine | Business logic for track-level territory restrictions, split sheets, and embargo rules |
| Reporting dashboards | Custom views pulling from Revelator's analytics API plus your own data |
| Internal tools | Approval queues, QC checklists, bulk operations, CRM integration |
| Layer | Responsibility |
|---|---|
| DDEX generation | Generates ERN (Electronic Release Notification) XML packages from catalog data you push via API |
| DSP delivery | SFTP/API delivery to all connected DSPs, including retry logic and status tracking |
| Royalty ingestion | Parsing DSP statements and normalizing revenue data |
| Payout infrastructure | Payment rail integrations for artist payouts |
Here's a minimal example of how your backend would create and distribute a release through Revelator's API:
import httpx
REVELATOR_API = "https://api.revelator.com"
# 1. Authenticate
auth = httpx.post(f"{REVELATOR_API}/partner/account/login", json={
"email": "your@email.com",
"password": "your-password"
})
token = auth.json()["token"]
headers = {"Authorization": f"Bearer {token}"}
# 2. Create a release
release = httpx.post(f"{REVELATOR_API}/content/release/save", headers=headers, json={
"title": "Delilah - Summer Version",
"releaseType": "Single",
"artists": [
{"name": "MIKOLAS", "role": "MainArtist"},
{"name": "Mark Neve", "role": "MainArtist"}
],
"genre": "Pop",
"releaseDate": "2026-04-01",
"territories": {
"include": "Worldwide",
"exclude": ["JP", "DE", "AT", "CH", "NL", "AU", "NZ"]
}
})
release_id = release.json()["id"]
# 3. Validate before delivery
validation = httpx.post(
f"{REVELATOR_API}/distribution/release/{release_id}/validate",
headers=headers
)
# 4. Queue for delivery to DSPs
if validation.json()["valid"]:
httpx.post(f"{REVELATOR_API}/distribution/release/addtoqueue",
headers=headers,
json={"releaseId": release_id}
)
/media/audio/upload, cover art via /media/image/upload, and handle webhook callbacks for delivery status updates.Under the hood, every delivery to a DSP is a DDEX ERN message - an XML package describing the release, its resources (audio, artwork), and the commercial terms (deals) under which DSPs can exploit the content.
An ERN message has three critical sections:
Defines the audio files, cover art, and their metadata. Each sound recording includes an ISRC, title, artist credits, and territory-specific details:
<SoundRecording>
<SoundRecordingId>
<ISRC>SKXXX2500001</ISRC>
</SoundRecordingId>
<ResourceReference>A1</ResourceReference>
<SoundRecordingDetailsByTerritory>
<TerritoryCode>Worldwide</TerritoryCode>
<Title TitleType="FormalTitle">
<TitleText>Delilah</TitleText>
</Title>
<DisplayArtist>
<PartyName><FullName>MIKOLAS</FullName></PartyName>
<ArtistRole>MainArtist</ArtistRole>
</DisplayArtist>
</SoundRecordingDetailsByTerritory>
</SoundRecording>
Defines the product - the album or single - and links it to its component resources:
<Release>
<ReleaseId><ICPN>0123456789012</ICPN></ReleaseId>
<ReleaseReference>R0</ReleaseReference>
<ReleaseType>Album</ReleaseType>
<ReleaseDetailsByTerritory>
<TerritoryCode>Worldwide</TerritoryCode>
<DisplayArtistName>MIKOLAS</DisplayArtistName>
<Title TitleType="FormalTitle">
<TitleText>ONE</TitleText>
</Title>
</ReleaseDetailsByTerritory>
</Release>
The only section that grants commercial rights. This is where territory restrictions live:
<ReleaseDeal>
<DealReleaseReference>R0</DealReleaseReference>
<Deal>
<DealTerms>
<TerritoryCode>Worldwide</TerritoryCode>
<ExcludedTerritoryCode>JP</ExcludedTerritoryCode>
<CommercialModelType>SubscriptionModel</CommercialModelType>
<Usage>
<UseType>OnDemandStream</UseType>
</Usage>
<ValidityPeriod>
<StartDate>2026-03-15</StartDate>
</ValidityPeriod>
</DealTerms>
</Deal>
</ReleaseDeal>
DetailsByTerritory in ResourceList and ReleaseList describes how content is presented in different markets. The DealList defines where content is available. Confusing these two - applying territory restrictions in metadata instead of deals - is one of the most frequent implementation errors.When a distributor has agreements with partners who hold rights in specific regions, individual tracks must be excluded from those territories. This requires consistent territory entries across three XML sections:
SoundRecordingDetailsByTerritory in ResourceListReleaseDetailsByTerritory in ReleaseListDealTerms in DealListPlatforms like Revelator handle this at the release level through their UI, but track-level territory restrictions within an album are where the friction begins. This is exactly the kind of limitation that pushes distributors toward a custom frontend - you model the territory logic in your own system and push the correct per-track restrictions through the API.
Having worked with distributors who use Revelator as their delivery backbone, here are the practical challenges we've encountered:
There is no PATCH support for releases. Editing a release requires re-submitting the full release object. If you omit files, they are auto-deleted. This means your backend must always maintain the complete release state.
Revelator's API has had several breaking changes in 2025-2026:
| Change | When |
|---|---|
UPC type changed from number to string | Feb 2026 |
API base URL migrated to api.revelator.com | Mar 2026 |
| Production/engineering credits became mandatory | Jun 2025 |
| Zero-sentinel IDs deprecated | Nov 2025 |
Your integration layer needs resilience against schema drift.
Even when Revelator generates valid ERN XML, each DSP interprets certain elements differently. Spotify's ingestion engine, Apple's Content Provider system, and Amazon's pipeline each have proprietary extensions and quirks. When delivery fails, debugging requires understanding both the DDEX standard and the specific DSP's interpretation.
Tracks in certain distribution statuses (-10, -11, -20, -21) become read-only. If you need to modify metadata on a locked track, you may need to initiate a takedown and redeliver, adding complexity to your workflow engine.
The hybrid approach works well when:
It starts breaking down when:
| Signal | Why It Matters |
|---|---|
| Royalty logic becomes the product | If your competitive advantage is in how you calculate, split, and report royalties - with advances, recoupables, and multi-party splits - you'll outgrow Revelator's royalty engine before its delivery |
| You need real-time delivery control | The mandatory approval step and lack of granular delivery status callbacks limit automation at scale |
| DSP-specific customization matters | If you need different DDEX profiles per DSP (ERN 3.8.2 for legacy, ERN 4.3 for Spotify), you'll need your own generation pipeline |
| Vendor risk becomes unacceptable | Revelator is VC-backed. API changes, pricing shifts, or an acquisition could force migration under pressure |
The smartest architecture for Option A anticipates Option B:
For distributors with direct DSP contracts who are hitting the limits of their current platform, the hybrid approach - custom frontend on Revelator's API - is the fastest path to operational control without the multi-year investment of going fully independent.
The key is to build it with migration in mind. Own your metadata, abstract your delivery layer, and invest in DDEX expertise. When the time comes to replace the backend, you'll be swapping a component rather than rebuilding a platform.
At MusicTech Lab, we've helped distributors navigate both paths - from fixing DDEX validation issues and territory restrictions within existing Revelator workflows, to designing the architecture for independent delivery pipelines. If you're at this decision point, get in touch.
Have a similar project in mind? We'd love to hear about it.
Get in touch to discuss how we can help bring your vision to life.
Building a Claude Skill for DDEX Validation: Automate Music Metadata Checks with AI
A step-by-step guide to creating a Claude Code skill that validates DDEX ERN XML files against official schemas - catching metadata errors before they reach distributors.
Building a Suno AI Remix App with Nuxt & Firebase
A step-by-step guide to building a web app that remixes audio using Suno's AI, Nuxt 4, and Firebase Storage.