Skip to content

Getting started

Quickstart

From a new sandbox key to a release on its way to the stores, in five steps.

On this page

Everything here runs in the sandbox, where nothing is real: nothing reaches review, the stores or anyone's inbox.

1. Make a sandbox key#

In Workspace › API, open Keys and make a key with the Sandbox switch on. Give it the scopes releases:write and releases:submit. The key starts with sm_test_ and is shown once: keep it in your server's secrets.

2. Check the key#

GET /me says which organization and key a call acts for.

curl https://api.stillmoregroup.com/api/v1/me \
  -H "Authorization: Bearer $STILLMORE_API_KEY"

3. Create an artist and a release#

A release needs at least one primary artist. Create the artist, then the release with its tracks in one call. Send an Idempotency-Key on every write: a retry with the same key never does the work twice.

curl https://api.stillmoregroup.com/api/v1/artists \
  -H "Authorization: Bearer $STILLMORE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"name":"June Hale"}'

curl https://api.stillmoregroup.com/api/v1/releases \
  -H "Authorization: Bearer $STILLMORE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"title":"Night Signals","type":"SINGLE","primaryArtistIds":["<artist id>"],"primaryGenre":"Pop","language":"en","tracks":[{"title":"Night Signals"}]}'

4. Upload the cover and the master#

Each file goes in three moves: ask for an upload address, PUT the bytes there, then say it is done. Covers are square JPEG or PNG, exactly 3000 × 3000 pixels, in RGB; masters are WAV or FLAC. Files you already host can be fetched from a link instead (…/artwork/import, …/audio/import).

# 1. An upload address for the cover
curl https://api.stillmoregroup.com/api/v1/releases/<release id>/artwork \
  -H "Authorization: Bearer $STILLMORE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"fileName":"cover.jpg","contentType":"image/jpeg","sizeBytes":2483117}'

# 2. PUT the file to uploadUrl, with the headers the answer lists
curl -X PUT "<uploadUrl>" -H "Content-Type: image/jpeg" --data-binary @cover.jpg

# 3. Done
curl https://api.stillmoregroup.com/api/v1/releases/<release id>/artwork/complete \
  -H "Authorization: Bearer $STILLMORE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"uploadId":"<uploadId>"}'

5. Check and submit#

GET /releases/{id}/checks lists what review would flag before you submit: submittable says nothing stops a submission, clean that nothing would hold back an automatic approval. Then submit: the release joins the review queue exactly as one submitted in the workspace does.

curl https://api.stillmoregroup.com/api/v1/releases/<release id>/checks -H "Authorization: Bearer $STILLMORE_API_KEY"

curl https://api.stillmoregroup.com/api/v1/releases/<release id>/submit \
  -H "Authorization: Bearer $STILLMORE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{}'

In the sandbox, play review and the stores yourself: POST /sandbox/releases/{id}/review with { "decision": "APPROVE" }, then POST /sandbox/releases/{id}/deliver. Each step raises the same webhooks the real ones do. When it all works, make a live key with only the scopes your system needs, and switch.