API reference
Releases
Releases: drafts with their tracks, one at a time or many.
On this page
Base address https://api.stillmoregroup.com/api/v1. Every answer is JSON; errors have one shape.
| Endpoint | What it does |
|---|---|
GET /releases | List releases |
POST /releases | Create a draft release |
GET /releases/{releaseId} | Read a release with its tracks |
PATCH /releases/{releaseId} | Change a draft release |
DELETE /releases/{releaseId} | Archive a draft release |
POST /releases/batch | Create many draft releases |
List releases#
GET /releases · scope releases:read
Newest first. Filter by status, label, artist, UPC or your externalId; updatedSince returns what changed since your last sync.
Query parameters#
limitinteger- From 1 to 100. Default
25. cursorstring- nextCursor from the previous page. Up to 200 characters.
updatedSincestring (date-time)- Only records changed at or after this ISO 8601 time.
externalIdstring- Your own identifier for this record, unique within the organization. 1 to 100 characters.
statusstring- One of
DRAFT,LABEL_REVIEW,IN_REVIEW,CHANGES_REQUESTED,REJECTED,APPROVED,SENT_TO_STORES,LIVE,REFUSED_BY_STORES,TAKEDOWN_REQUESTED,TAKEN_DOWN,ARCHIVED. labelIdstring- An id.
artistIdstring- An id.
upcstring- Up to 20 characters.
Headers#
Stillmore-Organization- A sub-label to act for, when the key may (see Sub-labels).
Example request#
curl "https://api.stillmoregroup.com/api/v1/releases?limit=25" \
-H "Authorization: Bearer $STILLMORE_API_KEY"Response 200#
A page: data holds the items below, hasMore says whether another page follows, and nextCursor is the cursor for it.
idstringlabelIdstringtitlestringversionTitlestring or nulltypestring- One of
SINGLE,EP,ALBUM. statusstring- Where the release is, review and delivery together. One of
DRAFT,LABEL_REVIEW,IN_REVIEW,CHANGES_REQUESTED,REJECTED,APPROVED,SENT_TO_STORES,LIVE,REFUSED_BY_STORES,TAKEDOWN_REQUESTED,TAKEN_DOWN,ARCHIVED. primaryArtistIdsstring[]featuredArtistIdsstring[]
Show 66 more fieldsHide 66 fields
primaryGenrestring or nullsecondaryGenrestring or nulllanguagestring or nullexplicitbooleanreleaseDatestring (date) or nulloriginalReleaseDatestring (date) or nullcopyrightobjectcopyright.objectcLine copyright.objectpLine territoriesobjectterritories.stringmode - One of
WORLDWIDE,CUSTOM. territories.string[]codes storesobjectstores.stringmode - One of
ALL,CUSTOM. stores.string[]codes upcstring or nullartworkobject or null- The cover; null until one is uploaded.
artwork.stringstatus - One of
PENDING_UPLOAD,UPLOADED,VERIFIED,FAILED,DELETED. artwork.string or nullfileName artwork.string or nullmimeType artwork.number or nullsizeBytes artwork.string or nulluploadedAt - ISO 8601 timestamp in UTC.
artwork.number or nullwidth artwork.number or nullheight trackCountinteger- From -9007199254740991 to 9007199254740991.
tracksobject[]- Included when one release is read, created or changed.
tracks[].stringid tracks[].stringreleaseId tracks[].integerposition - From -9007199254740991 to 9007199254740991.
tracks[].stringtitle tracks[].string or nullversionTitle tracks[].string[]primaryArtistIds tracks[].string[]featuredArtistIds tracks[].booleanexplicit tracks[].booleanisCover tracks[].string or nulllanguage tracks[].string or nullisrc tracks[].string or nulllyrics tracks[].objectcredits tracks[].object or nullaudio - The master; null until one is uploaded.
tracks[].string or nullexternalId - Your own id for it, when you set one.
tracks[].map of stringmetadata - Your own keys and values, as you sent them.
tracks[].stringcreatedAt - ISO 8601 timestamp in UTC.
tracks[].stringupdatedAt - ISO 8601 timestamp in UTC.
tracks[].stringrevision - Changes whenever the record does; send it back in If-Match to refuse an update when someone else changed it first.
reviewobject- Included when one release is read, created or changed.
review.string or nullsubmittedAt - ISO 8601 timestamp in UTC.
review.string or nulldecidedAt - ISO 8601 timestamp in UTC.
review.booleanautomatic - The account's automatic approval passed the release without a person.
review.string or nullnote - What review asked for when it sent the release back, or why it rejected it.
review.object[]issues review.object or nulldocumentsRequested deliveryobject- On its way to the stores, codes and store pages; included when one release is read, created or changed.
delivery.stringstatus - One of
NOT_SENT,SENT_TO_STORES,LIVE,REFUSED_BY_STORES,TAKEDOWN_REQUESTED,TAKEN_DOWN. delivery.string or nullsentAt delivery.string or nullliveAt delivery.string or nullrefusedReason delivery.object[]storeLinks delivery.object or nullsmartLink submittedAtstring or null- ISO 8601 timestamp in UTC.
approvedAtstring or null- ISO 8601 timestamp in UTC.
externalIdstring or null- Your own id for it, when you set one.
metadatamap of string- Your own keys and values, as you sent them.
createdAtstring- ISO 8601 timestamp in UTC.
updatedAtstring- ISO 8601 timestamp in UTC.
revisionstring- Changes whenever the record does; send it back in If-Match to refuse an update when someone else changed it first.
{
"data": [
{
"id": "6731c2a1b3c4d5e6f7a8b9c0",
"labelId": "6731c2a1b3c4d5e6f7a8b9c0",
"title": "Night Signals",
"versionTitle": "Radio Edit",
"type": "SINGLE",
"status": "DRAFT",
"primaryArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"featuredArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"primaryGenre": "Pop",
"secondaryGenre": "Pop",
"language": "en",
"explicit": false,
"releaseDate": "2027-01-15",
"originalReleaseDate": "2026-10-01",
"copyright": {
"cLine": {
"year": 2026,
"holder": "North Records"
},
"pLine": {
"year": 2026,
"holder": "North Records"
}
},
"territories": {
"mode": "WORLDWIDE",
"codes": [
"123456"
]
},
"stores": {
"mode": "ALL",
"codes": [
"123456"
]
},
"upc": "0612345678905",
"artwork": {
"status": "PENDING_UPLOAD",
"fileName": "cover.jpg",
"mimeType": "…",
"sizeBytes": 2483117,
"uploadedAt": "2026-11-01T09:30:00.000Z",
"width": 1,
"height": 1
},
"trackCount": 1200,
"tracks": [
{
"id": "6731c2a1b3c4d5e6f7a8b9c0",
"releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
"position": 1,
"title": "Night Signals",
"versionTitle": "Radio Edit",
"primaryArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"featuredArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"explicit": false,
"isCover": false,
"language": "en",
"isrc": "GBXYZ2600001",
"lyrics": "…",
"credits": {
"songwriters": [],
"composers": [],
"producers": [],
"publishers": [],
"mixers": [],
"masteringEngineers": [],
"remixers": []
},
"audio": {
"status": "PENDING_UPLOAD",
"fileName": "cover.jpg",
"mimeType": "…",
"sizeBytes": 2483117,
"uploadedAt": "2026-11-01T09:30:00.000Z",
"durationSeconds": 214,
"sampleRate": 1,
"bitDepth": 1,
"channels": 1
},
"externalId": "6731c2a1b3c4d5e6f7a8b9c0",
"metadata": {
"catalogueId": "1042"
},
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z",
"revision": "…"
}
],
"review": {
"submittedAt": "2026-11-01T09:30:00.000Z",
"decidedAt": "2026-11-01T09:30:00.000Z",
"automatic": false,
"note": "Sent from our catalogue system",
"issues": [
{
"category": "…",
"message": "Sent from our catalogue system"
}
],
"documentsRequested": {
"note": "Sent from our catalogue system",
"requestedAt": "2026-11-01T09:30:00.000Z",
"fulfilled": false
}
},
"delivery": {
"status": "NOT_SENT",
"sentAt": "2026-11-01T09:30:00.000Z",
"liveAt": "2026-11-01T09:30:00.000Z",
"refusedReason": "Sent from our catalogue system",
"storeLinks": [
{
"store": "Spotify",
"url": "https://example.com/webhooks/stillmore"
}
],
"smartLink": {
"url": "https://example.com/webhooks/stillmore",
"enabled": true
}
},
"submittedAt": "2026-11-01T09:30:00.000Z",
"approvedAt": "2026-11-01T09:30:00.000Z",
"externalId": "6731c2a1b3c4d5e6f7a8b9c0",
"metadata": {
"catalogueId": "1042"
},
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z",
"revision": "…"
}
],
"hasMore": false,
"nextCursor": null
}Create a draft release#
POST /releases · scope releases:write
Creates the draft and, when tracks is given, its tracks in order. A SINGLE always has exactly one track, created with the release.
Body#
labelIdstring- The organization's own label when left out. An id.
titlestringRequired- 1 to 180 characters.
versionTitlestring- Up to 120 characters.
typestring- SINGLE by default. One of
SINGLE,EP,ALBUM. primaryArtistIdsstring[]Required- 1 to 20 items.
featuredArtistIdsstring[]- Up to 20 items.
primaryGenrestring- A genre name from GET /v1/reference.
secondaryGenrestring- A genre name from GET /v1/reference.
languagestring- An ISO 639-1 code ("en") or a language name from GET /v1/reference.
explicitboolean- Explicit lyrics or content; new releases and tracks start with false.
releaseDatestring (date)- The day it goes live in the stores; needed before it can be sent, and the checks say how many days ahead it must be.
originalReleaseDatestring (date)- For music that came out before: the day it first did.
copyrightobject- Left out of a new release, the label's release defaults fill in the holders, with this year.
copyright.objectcLine - The © line: the rights in the artwork and text.
copyright.integercLine. year - From 1900 to 2200.
copyright.stringcLine. holder - Who holds the rights, such as the label's name. Up to 180 characters.
copyright.objectpLine - The ℗ line: the rights in the recordings.
copyright.integerpLine. year - From 1900 to 2200.
copyright.stringpLine. holder - Who holds the rights, such as the label's name. Up to 180 characters.
territoriesobject- Where the release may be sold; new releases are WORLDWIDE unless the label's defaults say otherwise.
territories.stringRequiredmode - WORLDWIDE, or CUSTOM to license only the listed countries. One of
WORLDWIDE,CUSTOM. territories.string[]codes - Two-letter country codes, for CUSTOM. Up to 300 items.
storesobject- Which stores get the release; new releases go to ALL.
stores.stringRequiredmode - ALL stores (new ones included), or CUSTOM to deliver only to the listed ones. One of
ALL,CUSTOM. stores.string[]codes - Store codes from GET /v1/reference, for CUSTOM. Each one of
spotify,apple_music,amazon_music,youtube_music,deezer,tidal,pandora,soundcloud,audiomack,napster,qobuz,iheartradio,youtube_content_id,tiktok,meta,snapchat,triller,beatport,traxsource,juno_download,7digital,tencent,netease,jiosaavn,gaana,hungama,joox,kkbox,line_music,awa,melon,genie,flo,bugs,vibe,anghami,boomplay,mdundo,yandex_music,vk_music,zvuk,fizy,claro_musica,peloton,trebel,shazam,gracenote,audible_magic. Up to 200 items. Default[]. upcstring- Your own UPC or EAN, when the release already has one; otherwise one is assigned on delivery (release.codes_assigned).
externalIdstring- Your own identifier for this record, unique within the organization. 1 to 100 characters.
metadatamap of string- Key-value pairs you attach for your own use.
tracksobject[]- Tracks to create with the release, in order. Up to 100 items.
tracks[].stringRequiredtitle - 1 to 180 characters.
tracks[].stringversionTitle - Up to 120 characters.
tracks[].string[]primaryArtistIds - Up to 20 items.
tracks[].string[]featuredArtistIds - Up to 20 items.
tracks[].booleanexplicit - Explicit lyrics or content; new releases and tracks start with false.
tracks[].booleanisCover - Someone else's song: it needs a cover licence before delivery.
tracks[].stringlanguage - An ISO 639-1 code ("en") or a language name from GET /v1/reference.
tracks[].stringisrc - Your own ISRC, when the recording already has one; otherwise one is assigned when the release is submitted or delivered.
tracks[].stringlyrics - Up to 20000 characters.
tracks[].objectcredits - The people behind the track, as lists of names by role.
tracks[].string[]credits. songwriters - Up to 30 items.
tracks[].string[]credits. composers - Up to 30 items.
tracks[].string[]credits. producers - Up to 30 items.
tracks[].string[]credits. publishers - Up to 30 items.
tracks[].string[]credits. mixers - Up to 30 items.
tracks[].string[]credits. masteringEngineers - Up to 30 items.
tracks[].string[]credits. remixers - Up to 30 items.
tracks[].stringexternalId - Your own identifier for this record, unique within the organization. 1 to 100 characters.
tracks[].map of stringmetadata - Key-value pairs you attach for your own use.
Headers#
Idempotency-Key- Any unique value, such as a UUID: a retry with the same key and body gets the first answer again for 24 hours.
Stillmore-Organization- A sub-label to act for, when the key may (see Sub-labels).
Example request#
curl -X POST "https://api.stillmoregroup.com/api/v1/releases" \
-H "Authorization: Bearer $STILLMORE_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"title": "Night Signals",
"type": "SINGLE",
"primaryArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"primaryGenre": "Pop",
"language": "en",
"explicit": false,
"releaseDate": "2027-01-15",
"tracks": [
{
"title": "Night Signals",
"explicit": false,
"language": "en",
"isrc": "GBXYZ2600001"
}
]
}'Response 201#
data holds the object below.
idstringlabelIdstringtitlestringversionTitlestring or nulltypestring- One of
SINGLE,EP,ALBUM. statusstring- Where the release is, review and delivery together. One of
DRAFT,LABEL_REVIEW,IN_REVIEW,CHANGES_REQUESTED,REJECTED,APPROVED,SENT_TO_STORES,LIVE,REFUSED_BY_STORES,TAKEDOWN_REQUESTED,TAKEN_DOWN,ARCHIVED. primaryArtistIdsstring[]featuredArtistIdsstring[]
Show 66 more fieldsHide 66 fields
primaryGenrestring or nullsecondaryGenrestring or nulllanguagestring or nullexplicitbooleanreleaseDatestring (date) or nulloriginalReleaseDatestring (date) or nullcopyrightobjectcopyright.objectcLine copyright.objectpLine territoriesobjectterritories.stringmode - One of
WORLDWIDE,CUSTOM. territories.string[]codes storesobjectstores.stringmode - One of
ALL,CUSTOM. stores.string[]codes upcstring or nullartworkobject or null- The cover; null until one is uploaded.
artwork.stringstatus - One of
PENDING_UPLOAD,UPLOADED,VERIFIED,FAILED,DELETED. artwork.string or nullfileName artwork.string or nullmimeType artwork.number or nullsizeBytes artwork.string or nulluploadedAt - ISO 8601 timestamp in UTC.
artwork.number or nullwidth artwork.number or nullheight trackCountinteger- From -9007199254740991 to 9007199254740991.
tracksobject[]- Included when one release is read, created or changed.
tracks[].stringid tracks[].stringreleaseId tracks[].integerposition - From -9007199254740991 to 9007199254740991.
tracks[].stringtitle tracks[].string or nullversionTitle tracks[].string[]primaryArtistIds tracks[].string[]featuredArtistIds tracks[].booleanexplicit tracks[].booleanisCover tracks[].string or nulllanguage tracks[].string or nullisrc tracks[].string or nulllyrics tracks[].objectcredits tracks[].object or nullaudio - The master; null until one is uploaded.
tracks[].string or nullexternalId - Your own id for it, when you set one.
tracks[].map of stringmetadata - Your own keys and values, as you sent them.
tracks[].stringcreatedAt - ISO 8601 timestamp in UTC.
tracks[].stringupdatedAt - ISO 8601 timestamp in UTC.
tracks[].stringrevision - Changes whenever the record does; send it back in If-Match to refuse an update when someone else changed it first.
reviewobject- Included when one release is read, created or changed.
review.string or nullsubmittedAt - ISO 8601 timestamp in UTC.
review.string or nulldecidedAt - ISO 8601 timestamp in UTC.
review.booleanautomatic - The account's automatic approval passed the release without a person.
review.string or nullnote - What review asked for when it sent the release back, or why it rejected it.
review.object[]issues review.object or nulldocumentsRequested deliveryobject- On its way to the stores, codes and store pages; included when one release is read, created or changed.
delivery.stringstatus - One of
NOT_SENT,SENT_TO_STORES,LIVE,REFUSED_BY_STORES,TAKEDOWN_REQUESTED,TAKEN_DOWN. delivery.string or nullsentAt delivery.string or nullliveAt delivery.string or nullrefusedReason delivery.object[]storeLinks delivery.object or nullsmartLink submittedAtstring or null- ISO 8601 timestamp in UTC.
approvedAtstring or null- ISO 8601 timestamp in UTC.
externalIdstring or null- Your own id for it, when you set one.
metadatamap of string- Your own keys and values, as you sent them.
createdAtstring- ISO 8601 timestamp in UTC.
updatedAtstring- ISO 8601 timestamp in UTC.
revisionstring- Changes whenever the record does; send it back in If-Match to refuse an update when someone else changed it first.
{
"data": {
"id": "6731c2a1b3c4d5e6f7a8b9c0",
"labelId": "6731c2a1b3c4d5e6f7a8b9c0",
"title": "Night Signals",
"versionTitle": "Radio Edit",
"type": "SINGLE",
"status": "DRAFT",
"primaryArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"featuredArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"primaryGenre": "Pop",
"secondaryGenre": "Pop",
"language": "en",
"explicit": false,
"releaseDate": "2027-01-15",
"originalReleaseDate": "2026-10-01",
"copyright": {
"cLine": {
"year": 2026,
"holder": "North Records"
},
"pLine": {
"year": 2026,
"holder": "North Records"
}
},
"territories": {
"mode": "WORLDWIDE",
"codes": [
"123456"
]
},
"stores": {
"mode": "ALL",
"codes": [
"123456"
]
},
"upc": "0612345678905",
"artwork": {
"status": "PENDING_UPLOAD",
"fileName": "cover.jpg",
"mimeType": "…",
"sizeBytes": 2483117,
"uploadedAt": "2026-11-01T09:30:00.000Z",
"width": 1,
"height": 1
},
"trackCount": 1200,
"tracks": [
{
"id": "6731c2a1b3c4d5e6f7a8b9c0",
"releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
"position": 1,
"title": "Night Signals",
"versionTitle": "Radio Edit",
"primaryArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"featuredArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"explicit": false,
"isCover": false,
"language": "en",
"isrc": "GBXYZ2600001",
"lyrics": "…",
"credits": {
"songwriters": [],
"composers": [],
"producers": [],
"publishers": [],
"mixers": [],
"masteringEngineers": [],
"remixers": []
},
"audio": {
"status": "PENDING_UPLOAD",
"fileName": "cover.jpg",
"mimeType": "…",
"sizeBytes": 2483117,
"uploadedAt": "2026-11-01T09:30:00.000Z",
"durationSeconds": 214,
"sampleRate": 1,
"bitDepth": 1,
"channels": 1
},
"externalId": "6731c2a1b3c4d5e6f7a8b9c0",
"metadata": {
"catalogueId": "1042"
},
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z",
"revision": "…"
}
],
"review": {
"submittedAt": "2026-11-01T09:30:00.000Z",
"decidedAt": "2026-11-01T09:30:00.000Z",
"automatic": false,
"note": "Sent from our catalogue system",
"issues": [
{
"category": "…",
"message": "Sent from our catalogue system"
}
],
"documentsRequested": {
"note": "Sent from our catalogue system",
"requestedAt": "2026-11-01T09:30:00.000Z",
"fulfilled": false
}
},
"delivery": {
"status": "NOT_SENT",
"sentAt": "2026-11-01T09:30:00.000Z",
"liveAt": "2026-11-01T09:30:00.000Z",
"refusedReason": "Sent from our catalogue system",
"storeLinks": [
{
"store": "Spotify",
"url": "https://example.com/webhooks/stillmore"
}
],
"smartLink": {
"url": "https://example.com/webhooks/stillmore",
"enabled": true
}
},
"submittedAt": "2026-11-01T09:30:00.000Z",
"approvedAt": "2026-11-01T09:30:00.000Z",
"externalId": "6731c2a1b3c4d5e6f7a8b9c0",
"metadata": {
"catalogueId": "1042"
},
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z",
"revision": "…"
}
}Errors#
| Code | What it means |
|---|---|
EXTERNAL_ID_IN_USE | Another record of the same kind in your organization already has this externalId. |
UPC_IN_USE | Another release already carries this UPC. |
LABEL_NOT_FOUND | From the workspace rule behind this endpoint; message says what to change. |
ARTIST_NOT_FOUND | From the workspace rule behind this endpoint; message says what to change. |
LABEL_TRACK_LIMIT_REACHED | From the workspace rule behind this endpoint; message says what to change. |
Every endpoint can also give the errors every call can give, such as VALIDATION_ERROR, INSUFFICIENT_SCOPE and RATE_LIMITED.
Read a release with its tracks#
GET /releases/{releaseId} · scope releases:read
Path parameters#
releaseIdstring- An id.
Headers#
Stillmore-Organization- A sub-label to act for, when the key may (see Sub-labels).
Example request#
curl "https://api.stillmoregroup.com/api/v1/releases/{releaseId}" \
-H "Authorization: Bearer $STILLMORE_API_KEY"Response 200#
data holds the object below.
idstringlabelIdstringtitlestringversionTitlestring or nulltypestring- One of
SINGLE,EP,ALBUM. statusstring- Where the release is, review and delivery together. One of
DRAFT,LABEL_REVIEW,IN_REVIEW,CHANGES_REQUESTED,REJECTED,APPROVED,SENT_TO_STORES,LIVE,REFUSED_BY_STORES,TAKEDOWN_REQUESTED,TAKEN_DOWN,ARCHIVED. primaryArtistIdsstring[]featuredArtistIdsstring[]
Show 66 more fieldsHide 66 fields
primaryGenrestring or nullsecondaryGenrestring or nulllanguagestring or nullexplicitbooleanreleaseDatestring (date) or nulloriginalReleaseDatestring (date) or nullcopyrightobjectcopyright.objectcLine copyright.objectpLine territoriesobjectterritories.stringmode - One of
WORLDWIDE,CUSTOM. territories.string[]codes storesobjectstores.stringmode - One of
ALL,CUSTOM. stores.string[]codes upcstring or nullartworkobject or null- The cover; null until one is uploaded.
artwork.stringstatus - One of
PENDING_UPLOAD,UPLOADED,VERIFIED,FAILED,DELETED. artwork.string or nullfileName artwork.string or nullmimeType artwork.number or nullsizeBytes artwork.string or nulluploadedAt - ISO 8601 timestamp in UTC.
artwork.number or nullwidth artwork.number or nullheight trackCountinteger- From -9007199254740991 to 9007199254740991.
tracksobject[]- Included when one release is read, created or changed.
tracks[].stringid tracks[].stringreleaseId tracks[].integerposition - From -9007199254740991 to 9007199254740991.
tracks[].stringtitle tracks[].string or nullversionTitle tracks[].string[]primaryArtistIds tracks[].string[]featuredArtistIds tracks[].booleanexplicit tracks[].booleanisCover tracks[].string or nulllanguage tracks[].string or nullisrc tracks[].string or nulllyrics tracks[].objectcredits tracks[].object or nullaudio - The master; null until one is uploaded.
tracks[].string or nullexternalId - Your own id for it, when you set one.
tracks[].map of stringmetadata - Your own keys and values, as you sent them.
tracks[].stringcreatedAt - ISO 8601 timestamp in UTC.
tracks[].stringupdatedAt - ISO 8601 timestamp in UTC.
tracks[].stringrevision - Changes whenever the record does; send it back in If-Match to refuse an update when someone else changed it first.
reviewobject- Included when one release is read, created or changed.
review.string or nullsubmittedAt - ISO 8601 timestamp in UTC.
review.string or nulldecidedAt - ISO 8601 timestamp in UTC.
review.booleanautomatic - The account's automatic approval passed the release without a person.
review.string or nullnote - What review asked for when it sent the release back, or why it rejected it.
review.object[]issues review.object or nulldocumentsRequested deliveryobject- On its way to the stores, codes and store pages; included when one release is read, created or changed.
delivery.stringstatus - One of
NOT_SENT,SENT_TO_STORES,LIVE,REFUSED_BY_STORES,TAKEDOWN_REQUESTED,TAKEN_DOWN. delivery.string or nullsentAt delivery.string or nullliveAt delivery.string or nullrefusedReason delivery.object[]storeLinks delivery.object or nullsmartLink submittedAtstring or null- ISO 8601 timestamp in UTC.
approvedAtstring or null- ISO 8601 timestamp in UTC.
externalIdstring or null- Your own id for it, when you set one.
metadatamap of string- Your own keys and values, as you sent them.
createdAtstring- ISO 8601 timestamp in UTC.
updatedAtstring- ISO 8601 timestamp in UTC.
revisionstring- Changes whenever the record does; send it back in If-Match to refuse an update when someone else changed it first.
{
"data": {
"id": "6731c2a1b3c4d5e6f7a8b9c0",
"labelId": "6731c2a1b3c4d5e6f7a8b9c0",
"title": "Night Signals",
"versionTitle": "Radio Edit",
"type": "SINGLE",
"status": "DRAFT",
"primaryArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"featuredArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"primaryGenre": "Pop",
"secondaryGenre": "Pop",
"language": "en",
"explicit": false,
"releaseDate": "2027-01-15",
"originalReleaseDate": "2026-10-01",
"copyright": {
"cLine": {
"year": 2026,
"holder": "North Records"
},
"pLine": {
"year": 2026,
"holder": "North Records"
}
},
"territories": {
"mode": "WORLDWIDE",
"codes": [
"123456"
]
},
"stores": {
"mode": "ALL",
"codes": [
"123456"
]
},
"upc": "0612345678905",
"artwork": {
"status": "PENDING_UPLOAD",
"fileName": "cover.jpg",
"mimeType": "…",
"sizeBytes": 2483117,
"uploadedAt": "2026-11-01T09:30:00.000Z",
"width": 1,
"height": 1
},
"trackCount": 1200,
"tracks": [
{
"id": "6731c2a1b3c4d5e6f7a8b9c0",
"releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
"position": 1,
"title": "Night Signals",
"versionTitle": "Radio Edit",
"primaryArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"featuredArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"explicit": false,
"isCover": false,
"language": "en",
"isrc": "GBXYZ2600001",
"lyrics": "…",
"credits": {
"songwriters": [],
"composers": [],
"producers": [],
"publishers": [],
"mixers": [],
"masteringEngineers": [],
"remixers": []
},
"audio": {
"status": "PENDING_UPLOAD",
"fileName": "cover.jpg",
"mimeType": "…",
"sizeBytes": 2483117,
"uploadedAt": "2026-11-01T09:30:00.000Z",
"durationSeconds": 214,
"sampleRate": 1,
"bitDepth": 1,
"channels": 1
},
"externalId": "6731c2a1b3c4d5e6f7a8b9c0",
"metadata": {
"catalogueId": "1042"
},
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z",
"revision": "…"
}
],
"review": {
"submittedAt": "2026-11-01T09:30:00.000Z",
"decidedAt": "2026-11-01T09:30:00.000Z",
"automatic": false,
"note": "Sent from our catalogue system",
"issues": [
{
"category": "…",
"message": "Sent from our catalogue system"
}
],
"documentsRequested": {
"note": "Sent from our catalogue system",
"requestedAt": "2026-11-01T09:30:00.000Z",
"fulfilled": false
}
},
"delivery": {
"status": "NOT_SENT",
"sentAt": "2026-11-01T09:30:00.000Z",
"liveAt": "2026-11-01T09:30:00.000Z",
"refusedReason": "Sent from our catalogue system",
"storeLinks": [
{
"store": "Spotify",
"url": "https://example.com/webhooks/stillmore"
}
],
"smartLink": {
"url": "https://example.com/webhooks/stillmore",
"enabled": true
}
},
"submittedAt": "2026-11-01T09:30:00.000Z",
"approvedAt": "2026-11-01T09:30:00.000Z",
"externalId": "6731c2a1b3c4d5e6f7a8b9c0",
"metadata": {
"catalogueId": "1042"
},
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z",
"revision": "…"
}
}Errors#
| Code | What it means |
|---|---|
RELEASE_NOT_FOUND | From the workspace rule behind this endpoint; message says what to change. |
Every endpoint can also give the errors every call can give, such as VALIDATION_ERROR, INSUFFICIENT_SCOPE and RATE_LIMITED.
Change a draft release#
PATCH /releases/{releaseId} · scope releases:write
Only drafts and releases sent back for changes can change. null clears a field that can be empty.
Path parameters#
releaseIdstring- An id.
Body#
labelIdstring- The organization's own label when left out. An id.
titlestring- 1 to 180 characters.
versionTitlestring or null- Up to 120 characters.
typestring- SINGLE by default. One of
SINGLE,EP,ALBUM. primaryArtistIdsstring[]- 1 to 20 items.
featuredArtistIdsstring[]- Up to 20 items.
primaryGenrestring- A genre name from GET /v1/reference.
secondaryGenrestring- A genre name from GET /v1/reference.
languagestring- An ISO 639-1 code ("en") or a language name from GET /v1/reference.
explicitboolean- Explicit lyrics or content; new releases and tracks start with false.
releaseDatestring (date)- The day it goes live in the stores; needed before it can be sent, and the checks say how many days ahead it must be.
originalReleaseDatestring (date) or null- For music that came out before: the day it first did.
copyrightobject- Left out of a new release, the label's release defaults fill in the holders, with this year.
copyright.objectcLine - The © line: the rights in the artwork and text.
copyright.integercLine. year - From 1900 to 2200.
copyright.stringcLine. holder - Who holds the rights, such as the label's name. Up to 180 characters.
copyright.objectpLine - The ℗ line: the rights in the recordings.
copyright.integerpLine. year - From 1900 to 2200.
copyright.stringpLine. holder - Who holds the rights, such as the label's name. Up to 180 characters.
territoriesobject- Where the release may be sold; new releases are WORLDWIDE unless the label's defaults say otherwise.
territories.stringRequiredmode - WORLDWIDE, or CUSTOM to license only the listed countries. One of
WORLDWIDE,CUSTOM. territories.string[]codes - Two-letter country codes, for CUSTOM. Up to 300 items.
storesobject- Which stores get the release; new releases go to ALL.
stores.stringRequiredmode - ALL stores (new ones included), or CUSTOM to deliver only to the listed ones. One of
ALL,CUSTOM. stores.string[]codes - Store codes from GET /v1/reference, for CUSTOM. Each one of
spotify,apple_music,amazon_music,youtube_music,deezer,tidal,pandora,soundcloud,audiomack,napster,qobuz,iheartradio,youtube_content_id,tiktok,meta,snapchat,triller,beatport,traxsource,juno_download,7digital,tencent,netease,jiosaavn,gaana,hungama,joox,kkbox,line_music,awa,melon,genie,flo,bugs,vibe,anghami,boomplay,mdundo,yandex_music,vk_music,zvuk,fizy,claro_musica,peloton,trebel,shazam,gracenote,audible_magic. Up to 200 items. Default[]. upcstring or null- Your own UPC or EAN, when the release already has one; otherwise one is assigned on delivery (release.codes_assigned).
externalIdstring or null- Your own identifier for this record, unique within the organization. 1 to 100 characters.
metadatamap of string- Key-value pairs you attach for your own use.
Headers#
Idempotency-Key- Any unique value, such as a UUID: a retry with the same key and body gets the first answer again for 24 hours.
If-Match- The revision you read; when the object changed since, the answer is 412 REVISION_MISMATCH.
Stillmore-Organization- A sub-label to act for, when the key may (see Sub-labels).
Example request#
curl -X PATCH "https://api.stillmoregroup.com/api/v1/releases/{releaseId}" \
-H "Authorization: Bearer $STILLMORE_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"type": "SINGLE",
"primaryGenre": "Pop",
"language": "en",
"explicit": false,
"releaseDate": "2027-01-15"
}'Response 200#
data holds the object below.
idstringlabelIdstringtitlestringversionTitlestring or nulltypestring- One of
SINGLE,EP,ALBUM. statusstring- Where the release is, review and delivery together. One of
DRAFT,LABEL_REVIEW,IN_REVIEW,CHANGES_REQUESTED,REJECTED,APPROVED,SENT_TO_STORES,LIVE,REFUSED_BY_STORES,TAKEDOWN_REQUESTED,TAKEN_DOWN,ARCHIVED. primaryArtistIdsstring[]featuredArtistIdsstring[]
Show 66 more fieldsHide 66 fields
primaryGenrestring or nullsecondaryGenrestring or nulllanguagestring or nullexplicitbooleanreleaseDatestring (date) or nulloriginalReleaseDatestring (date) or nullcopyrightobjectcopyright.objectcLine copyright.objectpLine territoriesobjectterritories.stringmode - One of
WORLDWIDE,CUSTOM. territories.string[]codes storesobjectstores.stringmode - One of
ALL,CUSTOM. stores.string[]codes upcstring or nullartworkobject or null- The cover; null until one is uploaded.
artwork.stringstatus - One of
PENDING_UPLOAD,UPLOADED,VERIFIED,FAILED,DELETED. artwork.string or nullfileName artwork.string or nullmimeType artwork.number or nullsizeBytes artwork.string or nulluploadedAt - ISO 8601 timestamp in UTC.
artwork.number or nullwidth artwork.number or nullheight trackCountinteger- From -9007199254740991 to 9007199254740991.
tracksobject[]- Included when one release is read, created or changed.
tracks[].stringid tracks[].stringreleaseId tracks[].integerposition - From -9007199254740991 to 9007199254740991.
tracks[].stringtitle tracks[].string or nullversionTitle tracks[].string[]primaryArtistIds tracks[].string[]featuredArtistIds tracks[].booleanexplicit tracks[].booleanisCover tracks[].string or nulllanguage tracks[].string or nullisrc tracks[].string or nulllyrics tracks[].objectcredits tracks[].object or nullaudio - The master; null until one is uploaded.
tracks[].string or nullexternalId - Your own id for it, when you set one.
tracks[].map of stringmetadata - Your own keys and values, as you sent them.
tracks[].stringcreatedAt - ISO 8601 timestamp in UTC.
tracks[].stringupdatedAt - ISO 8601 timestamp in UTC.
tracks[].stringrevision - Changes whenever the record does; send it back in If-Match to refuse an update when someone else changed it first.
reviewobject- Included when one release is read, created or changed.
review.string or nullsubmittedAt - ISO 8601 timestamp in UTC.
review.string or nulldecidedAt - ISO 8601 timestamp in UTC.
review.booleanautomatic - The account's automatic approval passed the release without a person.
review.string or nullnote - What review asked for when it sent the release back, or why it rejected it.
review.object[]issues review.object or nulldocumentsRequested deliveryobject- On its way to the stores, codes and store pages; included when one release is read, created or changed.
delivery.stringstatus - One of
NOT_SENT,SENT_TO_STORES,LIVE,REFUSED_BY_STORES,TAKEDOWN_REQUESTED,TAKEN_DOWN. delivery.string or nullsentAt delivery.string or nullliveAt delivery.string or nullrefusedReason delivery.object[]storeLinks delivery.object or nullsmartLink submittedAtstring or null- ISO 8601 timestamp in UTC.
approvedAtstring or null- ISO 8601 timestamp in UTC.
externalIdstring or null- Your own id for it, when you set one.
metadatamap of string- Your own keys and values, as you sent them.
createdAtstring- ISO 8601 timestamp in UTC.
updatedAtstring- ISO 8601 timestamp in UTC.
revisionstring- Changes whenever the record does; send it back in If-Match to refuse an update when someone else changed it first.
{
"data": {
"id": "6731c2a1b3c4d5e6f7a8b9c0",
"labelId": "6731c2a1b3c4d5e6f7a8b9c0",
"title": "Night Signals",
"versionTitle": "Radio Edit",
"type": "SINGLE",
"status": "DRAFT",
"primaryArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"featuredArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"primaryGenre": "Pop",
"secondaryGenre": "Pop",
"language": "en",
"explicit": false,
"releaseDate": "2027-01-15",
"originalReleaseDate": "2026-10-01",
"copyright": {
"cLine": {
"year": 2026,
"holder": "North Records"
},
"pLine": {
"year": 2026,
"holder": "North Records"
}
},
"territories": {
"mode": "WORLDWIDE",
"codes": [
"123456"
]
},
"stores": {
"mode": "ALL",
"codes": [
"123456"
]
},
"upc": "0612345678905",
"artwork": {
"status": "PENDING_UPLOAD",
"fileName": "cover.jpg",
"mimeType": "…",
"sizeBytes": 2483117,
"uploadedAt": "2026-11-01T09:30:00.000Z",
"width": 1,
"height": 1
},
"trackCount": 1200,
"tracks": [
{
"id": "6731c2a1b3c4d5e6f7a8b9c0",
"releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
"position": 1,
"title": "Night Signals",
"versionTitle": "Radio Edit",
"primaryArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"featuredArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"explicit": false,
"isCover": false,
"language": "en",
"isrc": "GBXYZ2600001",
"lyrics": "…",
"credits": {
"songwriters": [],
"composers": [],
"producers": [],
"publishers": [],
"mixers": [],
"masteringEngineers": [],
"remixers": []
},
"audio": {
"status": "PENDING_UPLOAD",
"fileName": "cover.jpg",
"mimeType": "…",
"sizeBytes": 2483117,
"uploadedAt": "2026-11-01T09:30:00.000Z",
"durationSeconds": 214,
"sampleRate": 1,
"bitDepth": 1,
"channels": 1
},
"externalId": "6731c2a1b3c4d5e6f7a8b9c0",
"metadata": {
"catalogueId": "1042"
},
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z",
"revision": "…"
}
],
"review": {
"submittedAt": "2026-11-01T09:30:00.000Z",
"decidedAt": "2026-11-01T09:30:00.000Z",
"automatic": false,
"note": "Sent from our catalogue system",
"issues": [
{
"category": "…",
"message": "Sent from our catalogue system"
}
],
"documentsRequested": {
"note": "Sent from our catalogue system",
"requestedAt": "2026-11-01T09:30:00.000Z",
"fulfilled": false
}
},
"delivery": {
"status": "NOT_SENT",
"sentAt": "2026-11-01T09:30:00.000Z",
"liveAt": "2026-11-01T09:30:00.000Z",
"refusedReason": "Sent from our catalogue system",
"storeLinks": [
{
"store": "Spotify",
"url": "https://example.com/webhooks/stillmore"
}
],
"smartLink": {
"url": "https://example.com/webhooks/stillmore",
"enabled": true
}
},
"submittedAt": "2026-11-01T09:30:00.000Z",
"approvedAt": "2026-11-01T09:30:00.000Z",
"externalId": "6731c2a1b3c4d5e6f7a8b9c0",
"metadata": {
"catalogueId": "1042"
},
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z",
"revision": "…"
}
}Errors#
| Code | What it means |
|---|---|
RELEASE_NOT_FOUND | From the workspace rule behind this endpoint; message says what to change. |
RELEASE_NOT_EDITABLE | From the workspace rule behind this endpoint; message says what to change. |
REVISION_MISMATCH | The record changed since you read it (If-Match). Read it again and retry. |
UPC_IN_USE | Another release already carries this UPC. |
Every endpoint can also give the errors every call can give, such as VALIDATION_ERROR, INSUFFICIENT_SCOPE and RATE_LIMITED.
Archive a draft release#
DELETE /releases/{releaseId} · scope releases:write
Drafts and releases sent back for changes are archived (status ARCHIVED); nothing that went to review is deleted.
Path parameters#
releaseIdstring- An id.
Headers#
Stillmore-Organization- A sub-label to act for, when the key may (see Sub-labels).
Example request#
curl -X DELETE "https://api.stillmoregroup.com/api/v1/releases/{releaseId}" \
-H "Authorization: Bearer $STILLMORE_API_KEY"Response 200#
data holds the object below.
idstringlabelIdstringtitlestringversionTitlestring or nulltypestring- One of
SINGLE,EP,ALBUM. statusstring- Where the release is, review and delivery together. One of
DRAFT,LABEL_REVIEW,IN_REVIEW,CHANGES_REQUESTED,REJECTED,APPROVED,SENT_TO_STORES,LIVE,REFUSED_BY_STORES,TAKEDOWN_REQUESTED,TAKEN_DOWN,ARCHIVED. primaryArtistIdsstring[]featuredArtistIdsstring[]
Show 66 more fieldsHide 66 fields
primaryGenrestring or nullsecondaryGenrestring or nulllanguagestring or nullexplicitbooleanreleaseDatestring (date) or nulloriginalReleaseDatestring (date) or nullcopyrightobjectcopyright.objectcLine copyright.objectpLine territoriesobjectterritories.stringmode - One of
WORLDWIDE,CUSTOM. territories.string[]codes storesobjectstores.stringmode - One of
ALL,CUSTOM. stores.string[]codes upcstring or nullartworkobject or null- The cover; null until one is uploaded.
artwork.stringstatus - One of
PENDING_UPLOAD,UPLOADED,VERIFIED,FAILED,DELETED. artwork.string or nullfileName artwork.string or nullmimeType artwork.number or nullsizeBytes artwork.string or nulluploadedAt - ISO 8601 timestamp in UTC.
artwork.number or nullwidth artwork.number or nullheight trackCountinteger- From -9007199254740991 to 9007199254740991.
tracksobject[]- Included when one release is read, created or changed.
tracks[].stringid tracks[].stringreleaseId tracks[].integerposition - From -9007199254740991 to 9007199254740991.
tracks[].stringtitle tracks[].string or nullversionTitle tracks[].string[]primaryArtistIds tracks[].string[]featuredArtistIds tracks[].booleanexplicit tracks[].booleanisCover tracks[].string or nulllanguage tracks[].string or nullisrc tracks[].string or nulllyrics tracks[].objectcredits tracks[].object or nullaudio - The master; null until one is uploaded.
tracks[].string or nullexternalId - Your own id for it, when you set one.
tracks[].map of stringmetadata - Your own keys and values, as you sent them.
tracks[].stringcreatedAt - ISO 8601 timestamp in UTC.
tracks[].stringupdatedAt - ISO 8601 timestamp in UTC.
tracks[].stringrevision - Changes whenever the record does; send it back in If-Match to refuse an update when someone else changed it first.
reviewobject- Included when one release is read, created or changed.
review.string or nullsubmittedAt - ISO 8601 timestamp in UTC.
review.string or nulldecidedAt - ISO 8601 timestamp in UTC.
review.booleanautomatic - The account's automatic approval passed the release without a person.
review.string or nullnote - What review asked for when it sent the release back, or why it rejected it.
review.object[]issues review.object or nulldocumentsRequested deliveryobject- On its way to the stores, codes and store pages; included when one release is read, created or changed.
delivery.stringstatus - One of
NOT_SENT,SENT_TO_STORES,LIVE,REFUSED_BY_STORES,TAKEDOWN_REQUESTED,TAKEN_DOWN. delivery.string or nullsentAt delivery.string or nullliveAt delivery.string or nullrefusedReason delivery.object[]storeLinks delivery.object or nullsmartLink submittedAtstring or null- ISO 8601 timestamp in UTC.
approvedAtstring or null- ISO 8601 timestamp in UTC.
externalIdstring or null- Your own id for it, when you set one.
metadatamap of string- Your own keys and values, as you sent them.
createdAtstring- ISO 8601 timestamp in UTC.
updatedAtstring- ISO 8601 timestamp in UTC.
revisionstring- Changes whenever the record does; send it back in If-Match to refuse an update when someone else changed it first.
{
"data": {
"id": "6731c2a1b3c4d5e6f7a8b9c0",
"labelId": "6731c2a1b3c4d5e6f7a8b9c0",
"title": "Night Signals",
"versionTitle": "Radio Edit",
"type": "SINGLE",
"status": "DRAFT",
"primaryArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"featuredArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"primaryGenre": "Pop",
"secondaryGenre": "Pop",
"language": "en",
"explicit": false,
"releaseDate": "2027-01-15",
"originalReleaseDate": "2026-10-01",
"copyright": {
"cLine": {
"year": 2026,
"holder": "North Records"
},
"pLine": {
"year": 2026,
"holder": "North Records"
}
},
"territories": {
"mode": "WORLDWIDE",
"codes": [
"123456"
]
},
"stores": {
"mode": "ALL",
"codes": [
"123456"
]
},
"upc": "0612345678905",
"artwork": {
"status": "PENDING_UPLOAD",
"fileName": "cover.jpg",
"mimeType": "…",
"sizeBytes": 2483117,
"uploadedAt": "2026-11-01T09:30:00.000Z",
"width": 1,
"height": 1
},
"trackCount": 1200,
"tracks": [
{
"id": "6731c2a1b3c4d5e6f7a8b9c0",
"releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
"position": 1,
"title": "Night Signals",
"versionTitle": "Radio Edit",
"primaryArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"featuredArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"explicit": false,
"isCover": false,
"language": "en",
"isrc": "GBXYZ2600001",
"lyrics": "…",
"credits": {
"songwriters": [],
"composers": [],
"producers": [],
"publishers": [],
"mixers": [],
"masteringEngineers": [],
"remixers": []
},
"audio": {
"status": "PENDING_UPLOAD",
"fileName": "cover.jpg",
"mimeType": "…",
"sizeBytes": 2483117,
"uploadedAt": "2026-11-01T09:30:00.000Z",
"durationSeconds": 214,
"sampleRate": 1,
"bitDepth": 1,
"channels": 1
},
"externalId": "6731c2a1b3c4d5e6f7a8b9c0",
"metadata": {
"catalogueId": "1042"
},
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z",
"revision": "…"
}
],
"review": {
"submittedAt": "2026-11-01T09:30:00.000Z",
"decidedAt": "2026-11-01T09:30:00.000Z",
"automatic": false,
"note": "Sent from our catalogue system",
"issues": [
{
"category": "…",
"message": "Sent from our catalogue system"
}
],
"documentsRequested": {
"note": "Sent from our catalogue system",
"requestedAt": "2026-11-01T09:30:00.000Z",
"fulfilled": false
}
},
"delivery": {
"status": "NOT_SENT",
"sentAt": "2026-11-01T09:30:00.000Z",
"liveAt": "2026-11-01T09:30:00.000Z",
"refusedReason": "Sent from our catalogue system",
"storeLinks": [
{
"store": "Spotify",
"url": "https://example.com/webhooks/stillmore"
}
],
"smartLink": {
"url": "https://example.com/webhooks/stillmore",
"enabled": true
}
},
"submittedAt": "2026-11-01T09:30:00.000Z",
"approvedAt": "2026-11-01T09:30:00.000Z",
"externalId": "6731c2a1b3c4d5e6f7a8b9c0",
"metadata": {
"catalogueId": "1042"
},
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z",
"revision": "…"
}
}Errors#
| Code | What it means |
|---|---|
RELEASE_NOT_FOUND | From the workspace rule behind this endpoint; message says what to change. |
RELEASE_NOT_EDITABLE | From the workspace rule behind this endpoint; message says what to change. |
Every endpoint can also give the errors every call can give, such as VALIDATION_ERROR, INSUFFICIENT_SCOPE and RATE_LIMITED.
Create many draft releases#
POST /releases/batch · scope releases:write
Each release is created on its own, as POST /v1/releases would; the answer lists every result in the order sent. One failing doesn't stop the others.
Body#
releasesobject[]Required- Up to 25 drafts, each created on its own. 1 to 25 items.
releases[].stringlabelId - The organization's own label when left out. An id.
releases[].stringRequiredtitle - 1 to 180 characters.
releases[].stringversionTitle - Up to 120 characters.
releases[].stringtype - SINGLE by default. One of
SINGLE,EP,ALBUM. releases[].string[]RequiredprimaryArtistIds - 1 to 20 items.
releases[].string[]featuredArtistIds - Up to 20 items.
releases[].stringprimaryGenre - A genre name from GET /v1/reference.
releases[].stringsecondaryGenre - A genre name from GET /v1/reference.
releases[].stringlanguage - An ISO 639-1 code ("en") or a language name from GET /v1/reference.
releases[].booleanexplicit - Explicit lyrics or content; new releases and tracks start with false.
releases[].string (date)releaseDate - The day it goes live in the stores; needed before it can be sent, and the checks say how many days ahead it must be.
releases[].string (date)originalReleaseDate - For music that came out before: the day it first did.
releases[].objectcopyright - Left out of a new release, the label's release defaults fill in the holders, with this year.
releases[].objectcopyright. cLine - The © line: the rights in the artwork and text.
releases[].objectcopyright. pLine - The ℗ line: the rights in the recordings.
releases[].objectterritories - Where the release may be sold; new releases are WORLDWIDE unless the label's defaults say otherwise.
releases[].stringRequiredterritories. mode - WORLDWIDE, or CUSTOM to license only the listed countries. One of
WORLDWIDE,CUSTOM. releases[].string[]territories. codes - Two-letter country codes, for CUSTOM. Up to 300 items.
releases[].objectstores - Which stores get the release; new releases go to ALL.
releases[].stringRequiredstores. mode - ALL stores (new ones included), or CUSTOM to deliver only to the listed ones. One of
ALL,CUSTOM. releases[].string[]stores. codes - Store codes from GET /v1/reference, for CUSTOM. Each one of
spotify,apple_music,amazon_music,youtube_music,deezer,tidal,pandora,soundcloud,audiomack,napster,qobuz,iheartradio,youtube_content_id,tiktok,meta,snapchat,triller,beatport,traxsource,juno_download,7digital,tencent,netease,jiosaavn,gaana,hungama,joox,kkbox,line_music,awa,melon,genie,flo,bugs,vibe,anghami,boomplay,mdundo,yandex_music,vk_music,zvuk,fizy,claro_musica,peloton,trebel,shazam,gracenote,audible_magic. Up to 200 items. Default[]. releases[].stringupc - Your own UPC or EAN, when the release already has one; otherwise one is assigned on delivery (release.codes_assigned).
releases[].stringexternalId - Your own identifier for this record, unique within the organization. 1 to 100 characters.
releases[].map of stringmetadata - Key-value pairs you attach for your own use.
releases[].object[]tracks - Tracks to create with the release, in order. Up to 100 items.
releases[].stringRequiredtracks[]. title - 1 to 180 characters.
releases[].stringtracks[]. versionTitle - Up to 120 characters.
releases[].string[]tracks[]. primaryArtistIds - Up to 20 items.
releases[].string[]tracks[]. featuredArtistIds - Up to 20 items.
releases[].booleantracks[]. explicit - Explicit lyrics or content; new releases and tracks start with false.
releases[].booleantracks[]. isCover - Someone else's song: it needs a cover licence before delivery.
releases[].stringtracks[]. language - An ISO 639-1 code ("en") or a language name from GET /v1/reference.
releases[].stringtracks[]. isrc - Your own ISRC, when the recording already has one; otherwise one is assigned when the release is submitted or delivered.
releases[].stringtracks[]. lyrics - Up to 20000 characters.
releases[].objecttracks[]. credits - The people behind the track, as lists of names by role.
releases[].stringtracks[]. externalId - Your own identifier for this record, unique within the organization. 1 to 100 characters.
releases[].map of stringtracks[]. metadata - Key-value pairs you attach for your own use.
Headers#
Idempotency-Key- Any unique value, such as a UUID: a retry with the same key and body gets the first answer again for 24 hours.
Stillmore-Organization- A sub-label to act for, when the key may (see Sub-labels).
Example request#
curl -X POST "https://api.stillmoregroup.com/api/v1/releases/batch" \
-H "Authorization: Bearer $STILLMORE_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"releases": [
{
"title": "Night Signals",
"type": "SINGLE",
"primaryArtistIds": [
"6731c2a1b3c4d5e6f7a8b9c0"
],
"primaryGenre": "Pop",
"language": "en",
"explicit": false,
"releaseDate": "2027-01-15",
"tracks": [
{
"title": "Night Signals",
"explicit": false,
"language": "en",
"isrc": "GBXYZ2600001"
}
]
}
]
}'Response 200#
data holds the object below.
resultsobject[]results[].integerindex - From -9007199254740991 to 9007199254740991.
results[].booleanok results[].object or nullrelease results[].object or nullerror
{
"data": {
"results": [
{
"index": 1,
"ok": false,
"release": {
"id": "6731c2a1b3c4d5e6f7a8b9c0",
"labelId": "6731c2a1b3c4d5e6f7a8b9c0",
"title": "Night Signals",
"versionTitle": "Radio Edit",
"type": "SINGLE",
"status": "DRAFT",
"primaryArtistIds": [],
"featuredArtistIds": [],
"primaryGenre": "Pop",
"secondaryGenre": "Pop",
"language": "en",
"explicit": false,
"releaseDate": "2027-01-15",
"originalReleaseDate": "2026-10-01",
"copyright": {},
"territories": {},
"stores": {},
"upc": "0612345678905",
"artwork": {},
"trackCount": 1200,
"tracks": [],
"review": {},
"delivery": {},
"submittedAt": "2026-11-01T09:30:00.000Z",
"approvedAt": "2026-11-01T09:30:00.000Z",
"externalId": "6731c2a1b3c4d5e6f7a8b9c0",
"metadata": {
"catalogueId": "1042"
},
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z",
"revision": "…"
},
"error": {
"code": "123456",
"message": "Sent from our catalogue system",
"details": "…"
}
}
]
}
}