Skip to content

API reference

Distribution

Checks, sending releases to review and the stores, takedowns and rights documents.

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}/checksCheck a release before sending it
POST /releases/{releaseId}/submitSend a release to distribution
POST /releases/submitSend many releases to distribution
POST /releases/{releaseId}/takedownAsk for a live release to come down
POST /releases/{releaseId}/documentsStart a document upload
POST /releases/{releaseId}/documents/completeFinish a document upload

Check a release before sending it#

GET /releases/{releaseId}/checks · scope releases:read

Everything submission requires, plus the store rules reviewers check by eye: audio quality, titles (no "feat.", promotional words, emoji or shouting capitals), artist names, codes already used elsewhere, cover licences. ERROR items block a submission (submission rules) or automatic approval (store rules); WARNING items are for a person to judge.

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}/checks" \
  -H "Authorization: Bearer $STILLMORE_API_KEY"

Response 200#

data holds the object below.

submittableboolean
Nothing stops a submission.
cleanboolean
No ERROR at all: nothing would hold back an automatic approval.
checksobject[]
checks[].codestring
checks[].severitystring
One of ERROR, WARNING.
checks[].pathstring
The field, e.g. tracks[1].audio.
checks[].messagestring
Example response
{
  "data": {
    "submittable": false,
    "clean": false,
    "checks": [
      {
        "code": "123456",
        "severity": "ERROR",
        "path": "tracks[0].audio",
        "message": "Sent from our catalogue system"
      }
    ]
  }
}

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.

Send a release to distribution#

POST /releases/{releaseId}/submit · scope releases:submit

The release joins Stillmore Group's review queue exactly as one submitted in the workspace does (paid plans are reviewed first). On an account with automatic approval it is approved without a person once its checks are clean, and goes straight to delivery. Follow it with the release.* webhooks or GET /v1/events.

Path parameters#

releaseIdstring
An id.

Body#

notestring
A note for the reviewers. Up to 2000 characters.

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 POST "https://api.stillmoregroup.com/api/v1/releases/{releaseId}/submit" \
  -H "Authorization: Bearer $STILLMORE_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "note": "Sent from our catalogue system"
  }'

Response 200#

data holds the object below.

idstring
labelIdstring
titlestring
versionTitlestring or null
typestring
One of SINGLE, EP, ALBUM.
statusstring
Where the release is, review and delivery together. One of DRAFT, LABEL_REVIEW, IN_REVIEW, CHANGES_REQUESTED, REJECTED, APPROVED, SENT_TO_STORES, LIVE, REFUSED_BY_STORES, TAKEDOWN_REQUESTED, TAKEN_DOWN, ARCHIVED.
primaryArtistIdsstring[]
featuredArtistIdsstring[]
Show 66 more fields
primaryGenrestring or null
secondaryGenrestring or null
languagestring or null
explicitboolean
releaseDatestring (date) or null
originalReleaseDatestring (date) or null
copyrightobject
copyright.cLineobject
copyright.pLineobject
territoriesobject
territories.modestring
One of WORLDWIDE, CUSTOM.
territories.codesstring[]
storesobject
stores.modestring
One of ALL, CUSTOM.
stores.codesstring[]
upcstring or null
artworkobject or null
The cover; null until one is uploaded.
artwork.statusstring
One of PENDING_UPLOAD, UPLOADED, VERIFIED, FAILED, DELETED.
artwork.fileNamestring or null
artwork.mimeTypestring or null
artwork.sizeBytesnumber or null
artwork.uploadedAtstring or null
ISO 8601 timestamp in UTC.
artwork.widthnumber or null
artwork.heightnumber or null
trackCountinteger
From -9007199254740991 to 9007199254740991.
tracksobject[]
Included when one release is read, created or changed.
tracks[].idstring
tracks[].releaseIdstring
tracks[].positioninteger
From -9007199254740991 to 9007199254740991.
tracks[].titlestring
tracks[].versionTitlestring or null
tracks[].primaryArtistIdsstring[]
tracks[].featuredArtistIdsstring[]
tracks[].explicitboolean
tracks[].isCoverboolean
tracks[].languagestring or null
tracks[].isrcstring or null
tracks[].lyricsstring or null
tracks[].creditsobject
tracks[].audioobject or null
The master; null until one is uploaded.
tracks[].externalIdstring or null
Your own id for it, when you set one.
tracks[].metadatamap of string
Your own keys and values, as you sent them.
tracks[].createdAtstring
ISO 8601 timestamp in UTC.
tracks[].updatedAtstring
ISO 8601 timestamp in UTC.
tracks[].revisionstring
Changes whenever the record does; send it back in If-Match to refuse an update when someone else changed it first.
reviewobject
Included when one release is read, created or changed.
review.submittedAtstring or null
ISO 8601 timestamp in UTC.
review.decidedAtstring or null
ISO 8601 timestamp in UTC.
review.automaticboolean
The account's automatic approval passed the release without a person.
review.notestring or null
What review asked for when it sent the release back, or why it rejected it.
review.issuesobject[]
review.documentsRequestedobject or null
deliveryobject
On its way to the stores, codes and store pages; included when one release is read, created or changed.
delivery.statusstring
One of NOT_SENT, SENT_TO_STORES, LIVE, REFUSED_BY_STORES, TAKEDOWN_REQUESTED, TAKEN_DOWN.
delivery.sentAtstring or null
delivery.liveAtstring or null
delivery.refusedReasonstring or null
delivery.storeLinksobject[]
delivery.smartLinkobject or null
submittedAtstring or null
ISO 8601 timestamp in UTC.
approvedAtstring or null
ISO 8601 timestamp in UTC.
externalIdstring or null
Your own id for it, when you set one.
metadatamap of string
Your own keys and values, as you sent them.
createdAtstring
ISO 8601 timestamp in UTC.
updatedAtstring
ISO 8601 timestamp in UTC.
revisionstring
Changes whenever the record does; send it back in If-Match to refuse an update when someone else changed it first.
Example response
{
  "data": {
    "id": "6731c2a1b3c4d5e6f7a8b9c0",
    "labelId": "6731c2a1b3c4d5e6f7a8b9c0",
    "title": "Night Signals",
    "versionTitle": "Radio Edit",
    "type": "SINGLE",
    "status": "DRAFT",
    "primaryArtistIds": [
      "6731c2a1b3c4d5e6f7a8b9c0"
    ],
    "featuredArtistIds": [
      "6731c2a1b3c4d5e6f7a8b9c0"
    ],
    "primaryGenre": "Pop",
    "secondaryGenre": "Pop",
    "language": "en",
    "explicit": false,
    "releaseDate": "2027-01-15",
    "originalReleaseDate": "2026-10-01",
    "copyright": {
      "cLine": {
        "year": 2026,
        "holder": "North Records"
      },
      "pLine": {
        "year": 2026,
        "holder": "North Records"
      }
    },
    "territories": {
      "mode": "WORLDWIDE",
      "codes": [
        "123456"
      ]
    },
    "stores": {
      "mode": "ALL",
      "codes": [
        "123456"
      ]
    },
    "upc": "0612345678905",
    "artwork": {
      "status": "PENDING_UPLOAD",
      "fileName": "cover.jpg",
      "mimeType": "…",
      "sizeBytes": 2483117,
      "uploadedAt": "2026-11-01T09:30:00.000Z",
      "width": 1,
      "height": 1
    },
    "trackCount": 1200,
    "tracks": [
      {
        "id": "6731c2a1b3c4d5e6f7a8b9c0",
        "releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
        "position": 1,
        "title": "Night Signals",
        "versionTitle": "Radio Edit",
        "primaryArtistIds": [
          "6731c2a1b3c4d5e6f7a8b9c0"
        ],
        "featuredArtistIds": [
          "6731c2a1b3c4d5e6f7a8b9c0"
        ],
        "explicit": false,
        "isCover": false,
        "language": "en",
        "isrc": "GBXYZ2600001",
        "lyrics": "…",
        "credits": {
          "songwriters": [],
          "composers": [],
          "producers": [],
          "publishers": [],
          "mixers": [],
          "masteringEngineers": [],
          "remixers": []
        },
        "audio": {
          "status": "PENDING_UPLOAD",
          "fileName": "cover.jpg",
          "mimeType": "…",
          "sizeBytes": 2483117,
          "uploadedAt": "2026-11-01T09:30:00.000Z",
          "durationSeconds": 214,
          "sampleRate": 1,
          "bitDepth": 1,
          "channels": 1
        },
        "externalId": "6731c2a1b3c4d5e6f7a8b9c0",
        "metadata": {
          "catalogueId": "1042"
        },
        "createdAt": "2026-11-01T09:30:00.000Z",
        "updatedAt": "2026-11-01T09:30:00.000Z",
        "revision": "…"
      }
    ],
    "review": {
      "submittedAt": "2026-11-01T09:30:00.000Z",
      "decidedAt": "2026-11-01T09:30:00.000Z",
      "automatic": false,
      "note": "Sent from our catalogue system",
      "issues": [
        {
          "category": "…",
          "message": "Sent from our catalogue system"
        }
      ],
      "documentsRequested": {
        "note": "Sent from our catalogue system",
        "requestedAt": "2026-11-01T09:30:00.000Z",
        "fulfilled": false
      }
    },
    "delivery": {
      "status": "NOT_SENT",
      "sentAt": "2026-11-01T09:30:00.000Z",
      "liveAt": "2026-11-01T09:30:00.000Z",
      "refusedReason": "Sent from our catalogue system",
      "storeLinks": [
        {
          "store": "Spotify",
          "url": "https://example.com/webhooks/stillmore"
        }
      ],
      "smartLink": {
        "url": "https://example.com/webhooks/stillmore",
        "enabled": true
      }
    },
    "submittedAt": "2026-11-01T09:30:00.000Z",
    "approvedAt": "2026-11-01T09:30:00.000Z",
    "externalId": "6731c2a1b3c4d5e6f7a8b9c0",
    "metadata": {
      "catalogueId": "1042"
    },
    "createdAt": "2026-11-01T09:30:00.000Z",
    "updatedAt": "2026-11-01T09:30:00.000Z",
    "revision": "…"
  }
}

Errors#

CodeWhat it means
RELEASE_SUBMISSION_INVALIDThe release misses what submission needs; details.issues lists each field (GET …/checks shows the same before submitting).
INVALID_RELEASE_STATUSFrom the workspace rule behind this endpoint; message says what to change.
PLAN_QUOTA_REACHEDFrom the workspace rule behind this endpoint; message says what to change.
SUBMISSION_LIMIT_REACHEDThe organization used today's submissions through the API; the limit resets at midnight UTC.
ORGANIZATION_SUSPENDEDFrom 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.

Send many releases to distribution#

POST /releases/submit · scope releases:submit

Up to 50 releases, each submitted on its own; the answer lists every result. The daily submission limit counts each one.

Body#

releaseIdsstring[]Required
Up to 50 releases, each submitted on its own. 1 to 50 items.
notestring
Up to 2000 characters.

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 POST "https://api.stillmoregroup.com/api/v1/releases/submit" \
  -H "Authorization: Bearer $STILLMORE_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "releaseIds": [
      "6731c2a1b3c4d5e6f7a8b9c0"
    ],
    "note": "Sent from our catalogue system"
  }'

Response 200#

data holds the object below.

resultsobject[]
results[].releaseIdstring
results[].okboolean
results[].statusstring or null
The release's status after the attempt.
results[].errorobject or null
Example response
{
  "data": {
    "results": [
      {
        "releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
        "ok": false,
        "status": "…",
        "error": {
          "code": "123456",
          "message": "Sent from our catalogue system",
          "details": "…"
        }
      }
    ]
  }
}

Errors#

CodeWhat it means
SUBMISSION_LIMIT_REACHEDThe organization used today's submissions through the API; the limit resets at midnight UTC.

Every endpoint can also give the errors every call can give, such as VALIDATION_ERROR, INSUFFICIENT_SCOPE and RATE_LIMITED.

Ask for a live release to come down#

POST /releases/{releaseId}/takedown · scope releases:submit

Stillmore Group's team takes it down from the stores; the release.taken_down webhook tells you when it's done.

Path parameters#

releaseIdstring
An id.

Body#

reasonstringRequired
Why the release should come down, for Stillmore Group's team. 10 to 2000 characters.

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 POST "https://api.stillmoregroup.com/api/v1/releases/{releaseId}/takedown" \
  -H "Authorization: Bearer $STILLMORE_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "reason": "Sent from our catalogue system"
  }'

Response 201#

data holds the object below.

idstring
releaseIdstring
statusstring
reasonstring
createdAtstring
Example response
{
  "data": {
    "id": "6731c2a1b3c4d5e6f7a8b9c0",
    "releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
    "status": "…",
    "reason": "Sent from our catalogue system",
    "createdAt": "2026-11-01T09:30:00.000Z"
  }
}

Errors#

CodeWhat it means
TAKEDOWN_NOT_ALLOWEDFrom the workspace rule behind this endpoint; message says what to change.
TAKEDOWN_ALREADY_REQUESTEDFrom 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.

Start a document upload#

POST /releases/{releaseId}/documents · scope releases:write

When review asks for documents (proof of rights, licences, agreements: review.documentsRequested), upload them here: PDF, Word, JPEG or PNG up to 20 MB.

Path parameters#

releaseIdstring
An id.

Body#

fileNamestringRequired
The file's name, with its extension. 1 to 255 characters.
contentTypestringRequired
image/jpeg or image/png for covers; audio/wav or audio/flac for masters. 3 to 120 characters.
sizeBytesintegerRequired
Exact size in bytes; the PUT must send the same Content-Length.

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 POST "https://api.stillmoregroup.com/api/v1/releases/{releaseId}/documents" \
  -H "Authorization: Bearer $STILLMORE_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "fileName": "cover.jpg",
    "contentType": "image/jpeg",
    "sizeBytes": 2483117
  }'

Response 201#

data holds the object below.

uploadIdstring
uploadUrlstring
PUT the file's bytes here.
method"PUT"
headersmap of string
Send these headers with the PUT, and Content-Length equal to sizeBytes.
expiresAtstring
Upload and complete before this time.
Example response
{
  "data": {
    "uploadId": "6731c2a1b3c4d5e6f7a8b9c0",
    "uploadUrl": "https://storage.example.com/upload/cover.jpg?signature=…",
    "method": "PUT",
    "headers": {
      "key": "…"
    },
    "expiresAt": "2026-11-01T09:30:00.000Z"
  }
}

Finish a document upload#

POST /releases/{releaseId}/documents/complete · scope releases:write

Path parameters#

releaseIdstring
An id.

Body#

uploadIdstringRequired
An id.
durationSecondsnumber
From 0 to 21600.

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 POST "https://api.stillmoregroup.com/api/v1/releases/{releaseId}/documents/complete" \
  -H "Authorization: Bearer $STILLMORE_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "uploadId": "6731c2a1b3c4d5e6f7a8b9c0"
  }'

Response 200#

data holds the object below.

idstring
labelIdstring
titlestring
versionTitlestring or null
typestring
One of SINGLE, EP, ALBUM.
statusstring
Where the release is, review and delivery together. One of DRAFT, LABEL_REVIEW, IN_REVIEW, CHANGES_REQUESTED, REJECTED, APPROVED, SENT_TO_STORES, LIVE, REFUSED_BY_STORES, TAKEDOWN_REQUESTED, TAKEN_DOWN, ARCHIVED.
primaryArtistIdsstring[]
featuredArtistIdsstring[]
Show 66 more fields
primaryGenrestring or null
secondaryGenrestring or null
languagestring or null
explicitboolean
releaseDatestring (date) or null
originalReleaseDatestring (date) or null
copyrightobject
copyright.cLineobject
copyright.pLineobject
territoriesobject
territories.modestring
One of WORLDWIDE, CUSTOM.
territories.codesstring[]
storesobject
stores.modestring
One of ALL, CUSTOM.
stores.codesstring[]
upcstring or null
artworkobject or null
The cover; null until one is uploaded.
artwork.statusstring
One of PENDING_UPLOAD, UPLOADED, VERIFIED, FAILED, DELETED.
artwork.fileNamestring or null
artwork.mimeTypestring or null
artwork.sizeBytesnumber or null
artwork.uploadedAtstring or null
ISO 8601 timestamp in UTC.
artwork.widthnumber or null
artwork.heightnumber or null
trackCountinteger
From -9007199254740991 to 9007199254740991.
tracksobject[]
Included when one release is read, created or changed.
tracks[].idstring
tracks[].releaseIdstring
tracks[].positioninteger
From -9007199254740991 to 9007199254740991.
tracks[].titlestring
tracks[].versionTitlestring or null
tracks[].primaryArtistIdsstring[]
tracks[].featuredArtistIdsstring[]
tracks[].explicitboolean
tracks[].isCoverboolean
tracks[].languagestring or null
tracks[].isrcstring or null
tracks[].lyricsstring or null
tracks[].creditsobject
tracks[].audioobject or null
The master; null until one is uploaded.
tracks[].externalIdstring or null
Your own id for it, when you set one.
tracks[].metadatamap of string
Your own keys and values, as you sent them.
tracks[].createdAtstring
ISO 8601 timestamp in UTC.
tracks[].updatedAtstring
ISO 8601 timestamp in UTC.
tracks[].revisionstring
Changes whenever the record does; send it back in If-Match to refuse an update when someone else changed it first.
reviewobject
Included when one release is read, created or changed.
review.submittedAtstring or null
ISO 8601 timestamp in UTC.
review.decidedAtstring or null
ISO 8601 timestamp in UTC.
review.automaticboolean
The account's automatic approval passed the release without a person.
review.notestring or null
What review asked for when it sent the release back, or why it rejected it.
review.issuesobject[]
review.documentsRequestedobject or null
deliveryobject
On its way to the stores, codes and store pages; included when one release is read, created or changed.
delivery.statusstring
One of NOT_SENT, SENT_TO_STORES, LIVE, REFUSED_BY_STORES, TAKEDOWN_REQUESTED, TAKEN_DOWN.
delivery.sentAtstring or null
delivery.liveAtstring or null
delivery.refusedReasonstring or null
delivery.storeLinksobject[]
delivery.smartLinkobject or null
submittedAtstring or null
ISO 8601 timestamp in UTC.
approvedAtstring or null
ISO 8601 timestamp in UTC.
externalIdstring or null
Your own id for it, when you set one.
metadatamap of string
Your own keys and values, as you sent them.
createdAtstring
ISO 8601 timestamp in UTC.
updatedAtstring
ISO 8601 timestamp in UTC.
revisionstring
Changes whenever the record does; send it back in If-Match to refuse an update when someone else changed it first.
Example response
{
  "data": {
    "id": "6731c2a1b3c4d5e6f7a8b9c0",
    "labelId": "6731c2a1b3c4d5e6f7a8b9c0",
    "title": "Night Signals",
    "versionTitle": "Radio Edit",
    "type": "SINGLE",
    "status": "DRAFT",
    "primaryArtistIds": [
      "6731c2a1b3c4d5e6f7a8b9c0"
    ],
    "featuredArtistIds": [
      "6731c2a1b3c4d5e6f7a8b9c0"
    ],
    "primaryGenre": "Pop",
    "secondaryGenre": "Pop",
    "language": "en",
    "explicit": false,
    "releaseDate": "2027-01-15",
    "originalReleaseDate": "2026-10-01",
    "copyright": {
      "cLine": {
        "year": 2026,
        "holder": "North Records"
      },
      "pLine": {
        "year": 2026,
        "holder": "North Records"
      }
    },
    "territories": {
      "mode": "WORLDWIDE",
      "codes": [
        "123456"
      ]
    },
    "stores": {
      "mode": "ALL",
      "codes": [
        "123456"
      ]
    },
    "upc": "0612345678905",
    "artwork": {
      "status": "PENDING_UPLOAD",
      "fileName": "cover.jpg",
      "mimeType": "…",
      "sizeBytes": 2483117,
      "uploadedAt": "2026-11-01T09:30:00.000Z",
      "width": 1,
      "height": 1
    },
    "trackCount": 1200,
    "tracks": [
      {
        "id": "6731c2a1b3c4d5e6f7a8b9c0",
        "releaseId": "6731c2a1b3c4d5e6f7a8b9c0",
        "position": 1,
        "title": "Night Signals",
        "versionTitle": "Radio Edit",
        "primaryArtistIds": [
          "6731c2a1b3c4d5e6f7a8b9c0"
        ],
        "featuredArtistIds": [
          "6731c2a1b3c4d5e6f7a8b9c0"
        ],
        "explicit": false,
        "isCover": false,
        "language": "en",
        "isrc": "GBXYZ2600001",
        "lyrics": "…",
        "credits": {
          "songwriters": [],
          "composers": [],
          "producers": [],
          "publishers": [],
          "mixers": [],
          "masteringEngineers": [],
          "remixers": []
        },
        "audio": {
          "status": "PENDING_UPLOAD",
          "fileName": "cover.jpg",
          "mimeType": "…",
          "sizeBytes": 2483117,
          "uploadedAt": "2026-11-01T09:30:00.000Z",
          "durationSeconds": 214,
          "sampleRate": 1,
          "bitDepth": 1,
          "channels": 1
        },
        "externalId": "6731c2a1b3c4d5e6f7a8b9c0",
        "metadata": {
          "catalogueId": "1042"
        },
        "createdAt": "2026-11-01T09:30:00.000Z",
        "updatedAt": "2026-11-01T09:30:00.000Z",
        "revision": "…"
      }
    ],
    "review": {
      "submittedAt": "2026-11-01T09:30:00.000Z",
      "decidedAt": "2026-11-01T09:30:00.000Z",
      "automatic": false,
      "note": "Sent from our catalogue system",
      "issues": [
        {
          "category": "…",
          "message": "Sent from our catalogue system"
        }
      ],
      "documentsRequested": {
        "note": "Sent from our catalogue system",
        "requestedAt": "2026-11-01T09:30:00.000Z",
        "fulfilled": false
      }
    },
    "delivery": {
      "status": "NOT_SENT",
      "sentAt": "2026-11-01T09:30:00.000Z",
      "liveAt": "2026-11-01T09:30:00.000Z",
      "refusedReason": "Sent from our catalogue system",
      "storeLinks": [
        {
          "store": "Spotify",
          "url": "https://example.com/webhooks/stillmore"
        }
      ],
      "smartLink": {
        "url": "https://example.com/webhooks/stillmore",
        "enabled": true
      }
    },
    "submittedAt": "2026-11-01T09:30:00.000Z",
    "approvedAt": "2026-11-01T09:30:00.000Z",
    "externalId": "6731c2a1b3c4d5e6f7a8b9c0",
    "metadata": {
      "catalogueId": "1042"
    },
    "createdAt": "2026-11-01T09:30:00.000Z",
    "updatedAt": "2026-11-01T09:30:00.000Z",
    "revision": "…"
  }
}

Errors#

CodeWhat it means
UPLOAD_NOT_RECEIVEDComplete was called before the file arrived at the upload address. Finish the PUT first.

Every endpoint can also give the errors every call can give, such as VALIDATION_ERROR, INSUFFICIENT_SCOPE and RATE_LIMITED.