API reference
Smart links
A release's smart link page and how many people it brought.
Base address https://api.stillmoregroup.com/api/v1. Every answer is JSON; errors have one shape.
| Endpoint | What it does |
|---|---|
GET /releases/{releaseId}/smart-link | The release's smart link |
PUT /releases/{releaseId}/smart-link | Make or change the smart link |
GET /releases/{releaseId}/smart-link/stats | Clicks and sign-ups |
The release's smart link#
GET /releases/{releaseId}/smart-link · scope releases:read
The public page fans open to choose a store. null until one is made: by PUT, or when staff record store links at delivery.
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}/smart-link" \
-H "Authorization: Bearer $STILLMORE_API_KEY"Response 200#
data holds the object below.
idstringreleaseIdstringslugstringurlstring- The public page.
enabledbooleanheadlinestring or nullstoresobject[]stores[].stringstore - One of
SPOTIFY,APPLE_MUSIC,YOUTUBE_MUSIC,AMAZON_MUSIC,DEEZER,TIDAL,SOUNDCLOUD,BANDCAMP,OTHER.
Show 6 more fieldsHide 6 fields
stores[].stringurl stores[].string or nulllabel notifyMeEnabledboolean- Fans can leave their email to hear when the release is out.
notifiedAtstring or null- When the "it's out" email went to them.
createdAtstringupdatedAtstring
{
"data": {
"id": "6731c2a1b3c4d5e6f7a8b9c0",
"releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
"slug": "night-signals",
"url": "https://example.com/webhooks/stillmore",
"enabled": true,
"headline": "…",
"stores": [
{
"store": "SPOTIFY",
"url": "https://example.com/webhooks/stillmore",
"label": "…"
}
],
"notifyMeEnabled": true,
"notifiedAt": "2026-11-01T09:30:00.000Z",
"createdAt": "2026-11-01T09:30:00.000Z",
"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. |
Every endpoint can also give the errors every call can give, such as VALIDATION_ERROR, INSUFFICIENT_SCOPE and RATE_LIMITED.
Make or change the smart link#
PUT /releases/{releaseId}/smart-link · scope releases:write
Made on the first call with the release title as its address unless you give a slug; later calls change only what they name.
Path parameters#
releaseIdstring- An id.
Body#
slugstring- The page address; unique across the platform. 3 to 60 characters.
enabledboolean- false hides the page: its address finds nothing until it is set back to true.
headlinestring or null- Up to 140 characters.
storesobject[]- Replaces the page's store buttons, in order; https links only. Up to 12 items.
stores[].stringRequiredstore - One of
SPOTIFY,APPLE_MUSIC,YOUTUBE_MUSIC,AMAZON_MUSIC,DEEZER,TIDAL,SOUNDCLOUD,BANDCAMP,OTHER. stores[].stringRequiredurl - Up to 500 characters.
stores[].string or nulllabel - Up to 40 characters.
notifyMeEnabledboolean- Fans can leave their email to hear when the release is out.
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}/smart-link" \
-H "Authorization: Bearer $STILLMORE_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{}'Response 200#
data holds the object below.
idstringreleaseIdstringslugstringurlstring- The public page.
enabledbooleanheadlinestring or nullstoresobject[]stores[].stringstore - One of
SPOTIFY,APPLE_MUSIC,YOUTUBE_MUSIC,AMAZON_MUSIC,DEEZER,TIDAL,SOUNDCLOUD,BANDCAMP,OTHER.
Show 6 more fieldsHide 6 fields
stores[].stringurl stores[].string or nulllabel notifyMeEnabledboolean- Fans can leave their email to hear when the release is out.
notifiedAtstring or null- When the "it's out" email went to them.
createdAtstringupdatedAtstring
{
"data": {
"id": "6731c2a1b3c4d5e6f7a8b9c0",
"releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
"slug": "night-signals",
"url": "https://example.com/webhooks/stillmore",
"enabled": true,
"headline": "…",
"stores": [
{
"store": "SPOTIFY",
"url": "https://example.com/webhooks/stillmore",
"label": "…"
}
],
"notifyMeEnabled": true,
"notifiedAt": "2026-11-01T09:30:00.000Z",
"createdAt": "2026-11-01T09:30:00.000Z",
"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. |
SLUG_TAKEN | 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.
Clicks and sign-ups#
GET /releases/{releaseId}/smart-link/stats · scope releases:read
Clicks per store and per day for the last 30 days, and fans waiting for the release.
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}/smart-link/stats" \
-H "Authorization: Bearer $STILLMORE_API_KEY"Response 200#
data holds the object below.
totalClicksinteger- From -9007199254740991 to 9007199254740991.
clicksByStoreobject[]clicksByStore[].stringstore - One of
SPOTIFY,APPLE_MUSIC,YOUTUBE_MUSIC,AMAZON_MUSIC,DEEZER,TIDAL,SOUNDCLOUD,BANDCAMP,OTHER. clicksByStore[].integerclicks - From -9007199254740991 to 9007199254740991.
clicksByDayobject[]- The last 30 days that had clicks.
clicksByDay[].stringday clicksByDay[].integerclicks - From -9007199254740991 to 9007199254740991.
subscribersobjectsubscribers.integerconfirmed - From -9007199254740991 to 9007199254740991.
subscribers.integerpending - From -9007199254740991 to 9007199254740991.
{
"data": {
"totalClicks": 1200,
"clicksByStore": [
{
"store": "SPOTIFY",
"clicks": 1200
}
],
"clicksByDay": [
{
"day": "…",
"clicks": 1200
}
],
"subscribers": {
"confirmed": 1,
"pending": 1
}
}
}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.