Skip to content

API reference

Smart links

A release's smart link page and how many people it brought.

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}/smart-linkThe release's smart link
PUT /releases/{releaseId}/smart-linkMake or change the smart link
GET /releases/{releaseId}/smart-link/statsClicks and sign-ups

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.

idstring
releaseIdstring
slugstring
urlstring
The public page.
enabledboolean
headlinestring or null
storesobject[]
stores[].storestring
One of SPOTIFY, APPLE_MUSIC, YOUTUBE_MUSIC, AMAZON_MUSIC, DEEZER, TIDAL, SOUNDCLOUD, BANDCAMP, OTHER.
Show 6 more fields
stores[].urlstring
stores[].labelstring or null
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.
createdAtstring
updatedAtstring
Example response
{
  "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#

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

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[].storestringRequired
One of SPOTIFY, APPLE_MUSIC, YOUTUBE_MUSIC, AMAZON_MUSIC, DEEZER, TIDAL, SOUNDCLOUD, BANDCAMP, OTHER.
stores[].urlstringRequired
Up to 500 characters.
stores[].labelstring or null
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.

idstring
releaseIdstring
slugstring
urlstring
The public page.
enabledboolean
headlinestring or null
storesobject[]
stores[].storestring
One of SPOTIFY, APPLE_MUSIC, YOUTUBE_MUSIC, AMAZON_MUSIC, DEEZER, TIDAL, SOUNDCLOUD, BANDCAMP, OTHER.
Show 6 more fields
stores[].urlstring
stores[].labelstring or null
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.
createdAtstring
updatedAtstring
Example response
{
  "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#

CodeWhat it means
RELEASE_NOT_FOUNDFrom the workspace rule behind this endpoint; message says what to change.
SLUG_TAKENFrom 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[].storestring
One of SPOTIFY, APPLE_MUSIC, YOUTUBE_MUSIC, AMAZON_MUSIC, DEEZER, TIDAL, SOUNDCLOUD, BANDCAMP, OTHER.
clicksByStore[].clicksinteger
From -9007199254740991 to 9007199254740991.
clicksByDayobject[]
The last 30 days that had clicks.
clicksByDay[].daystring
clicksByDay[].clicksinteger
From -9007199254740991 to 9007199254740991.
subscribersobject
subscribers.confirmedinteger
From -9007199254740991 to 9007199254740991.
subscribers.pendinginteger
From -9007199254740991 to 9007199254740991.
Example response
{
  "data": {
    "totalClicks": 1200,
    "clicksByStore": [
      {
        "store": "SPOTIFY",
        "clicks": 1200
      }
    ],
    "clicksByDay": [
      {
        "day": "…",
        "clicks": 1200
      }
    ],
    "subscribers": {
      "confirmed": 1,
      "pending": 1
    }
  }
}

Errors#

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