Skip to content

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.

EndpointWhat it does
GET /releases/{releaseId}/splitThe release-wide royalty split
PUT /releases/{releaseId}/splitSet the release-wide royalty split
GET /tracks/{trackId}/splitA track's own royalty split
PUT /tracks/{trackId}/splitSet 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.

releaseIdstring
trackIdstring or null
Null for the release-wide split.
partiesobject[]
parties[].artistIdstring or null
parties[].namestring
parties[].rolestring
One of ARTIST, FEATURED_ARTIST, PRODUCER, SONGWRITER, COMPOSER, LABEL, MANAGER, OTHER.
parties[].percentstring
lockedboolean
A published statement used the split, so it can no longer change.
updatedAtstring or null
ISO 8601 timestamp in UTC.
Example response
{
  "data": {
    "releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
    "trackId": "6731c2a1b3c4d5e6f7a8b9c0",
    "parties": [
      {
        "artistId": "6731c2a1b3c4d5e6f7a8b9c0",
        "name": "June Hale",
        "role": "ARTIST",
        "percent": "…"
      }
    ],
    "locked": false,
    "updatedAt": "2026-11-01T09:30:00.000Z"
  }
}

Errors#

CodeWhat it means
RELEASE_NOT_FOUNDFrom the workspace rule behind this endpoint; message says what to change.
TRACK_NOT_FOUNDFrom the workspace rule behind this endpoint; message says what to change.
ARTIST_NOT_FOUNDFrom the workspace rule behind this endpoint; message says what to change.
LABEL_NOT_FOUNDFrom 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[].artistIdstring or null
One of your artists, when the party is one.
parties[].namestringRequired
1 to 120 characters.
parties[].rolestringRequired
One of ARTIST, FEATURED_ARTIST, PRODUCER, SONGWRITER, COMPOSER, LABEL, MANAGER, OTHER.
parties[].percentstringRequired
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.

releaseIdstring
trackIdstring or null
Null for the release-wide split.
partiesobject[]
parties[].artistIdstring or null
parties[].namestring
parties[].rolestring
One of ARTIST, FEATURED_ARTIST, PRODUCER, SONGWRITER, COMPOSER, LABEL, MANAGER, OTHER.
parties[].percentstring
lockedboolean
A published statement used the split, so it can no longer change.
updatedAtstring or null
ISO 8601 timestamp in UTC.
Example response
{
  "data": {
    "releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
    "trackId": "6731c2a1b3c4d5e6f7a8b9c0",
    "parties": [
      {
        "artistId": "6731c2a1b3c4d5e6f7a8b9c0",
        "name": "June Hale",
        "role": "ARTIST",
        "percent": "…"
      }
    ],
    "locked": false,
    "updatedAt": "2026-11-01T09:30:00.000Z"
  }
}

Errors#

CodeWhat it means
SPLITS_LOCKEDFrom 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.

releaseIdstring
trackIdstring or null
Null for the release-wide split.
partiesobject[]
parties[].artistIdstring or null
parties[].namestring
parties[].rolestring
One of ARTIST, FEATURED_ARTIST, PRODUCER, SONGWRITER, COMPOSER, LABEL, MANAGER, OTHER.
parties[].percentstring
lockedboolean
A published statement used the split, so it can no longer change.
updatedAtstring or null
ISO 8601 timestamp in UTC.
Example response
{
  "data": {
    "releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
    "trackId": "6731c2a1b3c4d5e6f7a8b9c0",
    "parties": [
      {
        "artistId": "6731c2a1b3c4d5e6f7a8b9c0",
        "name": "June Hale",
        "role": "ARTIST",
        "percent": "…"
      }
    ],
    "locked": false,
    "updatedAt": "2026-11-01T09:30:00.000Z"
  }
}

Errors#

CodeWhat it means
RELEASE_NOT_FOUNDFrom the workspace rule behind this endpoint; message says what to change.
TRACK_NOT_FOUNDFrom the workspace rule behind this endpoint; message says what to change.
ARTIST_NOT_FOUNDFrom the workspace rule behind this endpoint; message says what to change.
LABEL_NOT_FOUNDFrom 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[].artistIdstring or null
One of your artists, when the party is one.
parties[].namestringRequired
1 to 120 characters.
parties[].rolestringRequired
One of ARTIST, FEATURED_ARTIST, PRODUCER, SONGWRITER, COMPOSER, LABEL, MANAGER, OTHER.
parties[].percentstringRequired
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.

releaseIdstring
trackIdstring or null
Null for the release-wide split.
partiesobject[]
parties[].artistIdstring or null
parties[].namestring
parties[].rolestring
One of ARTIST, FEATURED_ARTIST, PRODUCER, SONGWRITER, COMPOSER, LABEL, MANAGER, OTHER.
parties[].percentstring
lockedboolean
A published statement used the split, so it can no longer change.
updatedAtstring or null
ISO 8601 timestamp in UTC.
Example response
{
  "data": {
    "releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
    "trackId": "6731c2a1b3c4d5e6f7a8b9c0",
    "parties": [
      {
        "artistId": "6731c2a1b3c4d5e6f7a8b9c0",
        "name": "June Hale",
        "role": "ARTIST",
        "percent": "…"
      }
    ],
    "locked": false,
    "updatedAt": "2026-11-01T09:30:00.000Z"
  }
}

Errors#

CodeWhat it means
SPLITS_LOCKEDFrom 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.