API reference
Splits
How a release's or a track's money is shared between collaborators.
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/{releaseId}/split | The release-wide royalty split |
PUT /releases/{releaseId}/split | Set the release-wide royalty split |
GET /tracks/{trackId}/split | A track's own royalty split |
PUT /tracks/{trackId}/split | Set a track's own royalty split |
The release-wide royalty split#
GET /releases/{releaseId}/split · 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}/split" \
-H "Authorization: Bearer $STILLMORE_API_KEY"Response 200#
data holds the object below.
releaseIdstringtrackIdstring or null- Null for the release-wide split.
partiesobject[]parties[].string or nullartistId parties[].stringname parties[].stringrole - One of
ARTIST,FEATURED_ARTIST,PRODUCER,SONGWRITER,COMPOSER,LABEL,MANAGER,OTHER. parties[].stringpercent lockedboolean- A published statement used the split, so it can no longer change.
updatedAtstring or null- ISO 8601 timestamp in UTC.
{
"data": {
"releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
"trackId": "6731c2a1b3c4d5e6f7a8b9c0",
"parties": [
{
"artistId": "6731c2a1b3c4d5e6f7a8b9c0",
"name": "June Hale",
"role": "ARTIST",
"percent": "…"
}
],
"locked": false,
"updatedAt": "2026-11-01T09:30:00.000Z"
}
}Errors#
| Code | What it means |
|---|---|
RELEASE_NOT_FOUND | From the workspace rule behind this endpoint; message says what to change. |
TRACK_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_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.
Set the release-wide royalty split#
PUT /releases/{releaseId}/split · scope releases:write
Applies to every track without a split of its own. An empty parties removes it.
Path parameters#
releaseIdstring- An id.
Body#
partiesobject[]Required- Up to 20 items.
parties[].string or nullartistId - One of your artists, when the party is one.
parties[].stringRequiredname - 1 to 120 characters.
parties[].stringRequiredrole - One of
ARTIST,FEATURED_ARTIST,PRODUCER,SONGWRITER,COMPOSER,LABEL,MANAGER,OTHER. parties[].stringRequiredpercent - A share with up to two decimals, such as "60" or "33.33"; the shares add up to exactly 100.
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 PUT "https://api.stillmoregroup.com/api/v1/releases/{releaseId}/split" \
-H "Authorization: Bearer $STILLMORE_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"parties": [
{
"name": "June Hale",
"role": "ARTIST",
"percent": "60"
},
{
"name": "North Records",
"role": "LABEL",
"percent": "40"
}
]
}'Response 200#
data holds the object below.
releaseIdstringtrackIdstring or null- Null for the release-wide split.
partiesobject[]parties[].string or nullartistId parties[].stringname parties[].stringrole - One of
ARTIST,FEATURED_ARTIST,PRODUCER,SONGWRITER,COMPOSER,LABEL,MANAGER,OTHER. parties[].stringpercent lockedboolean- A published statement used the split, so it can no longer change.
updatedAtstring or null- ISO 8601 timestamp in UTC.
{
"data": {
"releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
"trackId": "6731c2a1b3c4d5e6f7a8b9c0",
"parties": [
{
"artistId": "6731c2a1b3c4d5e6f7a8b9c0",
"name": "June Hale",
"role": "ARTIST",
"percent": "…"
}
],
"locked": false,
"updatedAt": "2026-11-01T09:30:00.000Z"
}
}Errors#
| Code | What it means |
|---|---|
SPLITS_LOCKED | 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.
A track's own royalty split#
GET /tracks/{trackId}/split · scope releases:read
Path parameters#
trackIdstring- 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/tracks/{trackId}/split" \
-H "Authorization: Bearer $STILLMORE_API_KEY"Response 200#
data holds the object below.
releaseIdstringtrackIdstring or null- Null for the release-wide split.
partiesobject[]parties[].string or nullartistId parties[].stringname parties[].stringrole - One of
ARTIST,FEATURED_ARTIST,PRODUCER,SONGWRITER,COMPOSER,LABEL,MANAGER,OTHER. parties[].stringpercent lockedboolean- A published statement used the split, so it can no longer change.
updatedAtstring or null- ISO 8601 timestamp in UTC.
{
"data": {
"releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
"trackId": "6731c2a1b3c4d5e6f7a8b9c0",
"parties": [
{
"artistId": "6731c2a1b3c4d5e6f7a8b9c0",
"name": "June Hale",
"role": "ARTIST",
"percent": "…"
}
],
"locked": false,
"updatedAt": "2026-11-01T09:30:00.000Z"
}
}Errors#
| Code | What it means |
|---|---|
RELEASE_NOT_FOUND | From the workspace rule behind this endpoint; message says what to change. |
TRACK_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_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.
Set a track's own royalty split#
PUT /tracks/{trackId}/split · scope releases:write
Path parameters#
trackIdstring- An id.
Body#
partiesobject[]Required- Up to 20 items.
parties[].string or nullartistId - One of your artists, when the party is one.
parties[].stringRequiredname - 1 to 120 characters.
parties[].stringRequiredrole - One of
ARTIST,FEATURED_ARTIST,PRODUCER,SONGWRITER,COMPOSER,LABEL,MANAGER,OTHER. parties[].stringRequiredpercent - A share with up to two decimals, such as "60" or "33.33"; the shares add up to exactly 100.
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 PUT "https://api.stillmoregroup.com/api/v1/tracks/{trackId}/split" \
-H "Authorization: Bearer $STILLMORE_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"parties": [
{
"name": "June Hale",
"role": "ARTIST",
"percent": "70"
},
{
"name": "Theo Marks",
"role": "PRODUCER",
"percent": "30"
}
]
}'Response 200#
data holds the object below.
releaseIdstringtrackIdstring or null- Null for the release-wide split.
partiesobject[]parties[].string or nullartistId parties[].stringname parties[].stringrole - One of
ARTIST,FEATURED_ARTIST,PRODUCER,SONGWRITER,COMPOSER,LABEL,MANAGER,OTHER. parties[].stringpercent lockedboolean- A published statement used the split, so it can no longer change.
updatedAtstring or null- ISO 8601 timestamp in UTC.
{
"data": {
"releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
"trackId": "6731c2a1b3c4d5e6f7a8b9c0",
"parties": [
{
"artistId": "6731c2a1b3c4d5e6f7a8b9c0",
"name": "June Hale",
"role": "ARTIST",
"percent": "…"
}
],
"locked": false,
"updatedAt": "2026-11-01T09:30:00.000Z"
}
}Errors#
| Code | What it means |
|---|---|
SPLITS_LOCKED | 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.