Getting started
Errors
The one shape every error has, how to retry, and every error code.
A failed call answers with an HTTP status of 400 or more and one shape, whatever went wrong:
{
"error": {
"type": "invalid_request_error",
"code": "VALIDATION_ERROR",
"message": "tracks[0].title: Required",
"details": [{ "path": "tracks[0].title", "message": "Required", "code": "invalid_type" }],
"requestId": "req_…"
}
}| Field | What it is |
|---|---|
type | The family: invalid_request_error, authentication_error, permission_error, not_found_error, conflict_error, idempotency_error, rate_limit_error, service_unavailable_error, api_error |
code | A stable code to branch on; listed below |
message | A sentence for people; it may change, so never match on it |
details | When there is more: each invalid field for VALIDATION_ERROR, the issues for RELEASE_SUBMISSION_INVALID |
requestId | Also in the X-Request-Id header; send it to support with any question |
Error codes#
These are the codes the API layer returns. An endpoint can also pass on a code from the workspace rule behind it (for example INVALID_RELEASE_STATUS); the reference lists them with each endpoint.
| Status | Code | What it means |
|---|---|---|
| 401 | API_KEY_REQUIRED | No key was sent. Send it as Authorization: Bearer <key>. |
| 401 | INVALID_API_KEY | The key is malformed, unknown or does not match. |
| 401 | API_KEY_REVOKED | The key was revoked. Create a new one in the API tab. |
| 401 | API_KEY_EXPIRED | The key passed its expiry date. |
| 403 | API_KEY_PAUSED | Stillmore Group paused the key. Contact support. |
| 403 | API_KEY_OWNER_INACTIVE | The member the key acts for lost access to the organization. An owner or admin can take the key over. |
| 403 | API_ACCESS_DISABLED | API access is not turned on for this organization. |
| 400 | INVALID_ORGANIZATION_HEADER | The Stillmore-Organization header must be an organization id from GET /v1/organizations. |
| 403 | SUB_LABELS_NOT_ALLOWED | The key may not act for sub-labels. An owner or admin allows it on the key in the API tab. |
| 403 | SUB_LABEL_NOT_ALLOWED | The organization in Stillmore-Organization is not a sub-label below the key's organization, or the member the key acts for can't open it. |
| 403 | SANDBOX_ONLY | Simulations run in the sandbox only; call them with a test key (sm_test_…). |
| 400 | SANDBOX_NO_SUB_LABELS | Test keys work in the organization's sandbox only; leave out the Stillmore-Organization header. |
| 401 | OAUTH_TOKEN_INVALID | The OAuth access token is malformed, unknown or revoked. |
| 401 | OAUTH_TOKEN_EXPIRED | The OAuth access token is over an hour old. Get a new one with the refresh token. |
| 401 | OAUTH_CONNECTION_REVOKED | The organization disconnected the app, or the app was deleted. It has to be connected again. |
| 403 | OAUTH_APP_SUSPENDED | Stillmore Group suspended the app. |
| 403 | OAUTH_MEMBER_INACTIVE | The member who connected the app lost access to the organization. An owner or admin can connect it again. |
| 403 | IP_NOT_ALLOWED | The request came from an address the key does not allow. |
| 403 | INSUFFICIENT_SCOPE | The key lacks the scope this endpoint needs. |
| 403 | OWNER_PERMISSION_MISSING | The member the key acts for no longer holds the permission this endpoint needs. |
| 429 | TOO_MANY_FAILED_ATTEMPTS | Too many requests with a wrong key came from this address. Wait and try again. |
| 429 | RATE_LIMITED | The key or the organization sent too many requests this minute. Retry after Retry-After seconds. |
| 400 | VALIDATION_ERROR | The request did not pass validation; details lists each field. |
| 400 | INVALID_JSON | The body is not valid JSON. |
| 413 | PAYLOAD_TOO_LARGE | The body is larger than 1 MB. Files are uploaded separately. |
| 415 | UNSUPPORTED_MEDIA_TYPE | Send JSON with Content-Type: application/json. |
| 400 | INVALID_ID | An id in the request is not a valid identifier. |
| 404 | ROUTE_NOT_FOUND | No endpoint answers at this method and path. |
| 400 | INVALID_CURSOR | Pass nextCursor from the previous page as it is. |
| 412 | REVISION_MISMATCH | The record changed since you read it (If-Match). Read it again and retry. |
| 409 | EXTERNAL_ID_IN_USE | Another record of the same kind in your organization already has this externalId. |
| 409 | UPC_IN_USE | Another release already carries this UPC. |
| 409 | LABEL_ARCHIVED | Releases can't be added to an archived label. |
| 403 | API_PAYOUTS_OFF | Payout requests through the API are off. An owner or admin turns them on in Workspace › API › Settings. |
| 429 | SUBMISSION_LIMIT_REACHED | The organization used today's submissions through the API; the limit resets at midnight UTC. |
| 422 | RELEASE_SUBMISSION_INVALID | The release misses what submission needs; details.issues lists each field (GET …/checks shows the same before submitting). |
| 409 | UPLOAD_NOT_RECEIVED | Complete was called before the file arrived at the upload address. Finish the PUT first. |
| 422 | ARTWORK_CMYK | The cover is CMYK; stores take RGB covers only. |
| 400 | IMPORT_URL_NOT_ALLOWED | Imports take public http or https links without credentials in them. |
| 422 | IMPORT_FAILED | The link could not be downloaded, or what came back was not usable (shown on the import). |
| 422 | IMPORT_TOO_LARGE | The file at the link is larger than the limit for its kind. |
| 422 | IMPORT_TIMED_OUT | The download took too long; upload large files with the upload endpoints. |
| 410 | STATEMENT_VOID | Stillmore Group withdrew the statement after publishing it; a corrected statement follows. It stays listed with status VOID, without its lines. |
| 400 | IDEMPOTENCY_KEY_INVALID | The Idempotency-Key header must be 1 to 255 visible characters. |
| 422 | IDEMPOTENCY_KEY_REUSED | The Idempotency-Key was already used with a different request. |
| 409 | IDEMPOTENCY_IN_PROGRESS | A request with this Idempotency-Key is still running. Retry shortly. |
| 503 | MAINTENANCE | The platform is being updated. Retry after Retry-After seconds. |
| 503 | MAINTENANCE_READ_ONLY | Reads work, changes are paused while the platform is updated. |
| 503 | DATABASE_UNAVAILABLE | A short outage on our side. Retry after Retry-After seconds. |
| 500 | INTERNAL_ERROR | Something failed on our side. Retry with the same Idempotency-Key, or send the request id to support. |