---
title: "Sound library API"
description: "Upload your own sound effects and ambience into the Studio sound library, manage their metadata, and link them to projects so Create Audio can place them automatically."
canonical_url: https://lyricwinter.com/docs/api/sounds
markdown_url: https://lyricwinter.com/docs/api/sounds.md
last_updated: 2026-09-30
status: beta
---
# LyricWinter API reference: Sound library

> Upload your own sound effects and ambience into the Studio sound library, manage their metadata, and link them to projects so Create Audio can place them automatically.

The LyricWinter API is in beta. Base URL: `https://lyricwinter.com/api/v1`. Authenticate every request with `Authorization: Bearer lw_...`. Successful responses are wrapped as `{ "data": ..., "request_id": "req_..." }`. Machine-readable contract: https://lyricwinter.com/api/v1/openapi.json.

## Endpoints

- [List sounds](https://lyricwinter.com/docs/api/sounds#list-studio-sounds): `GET /studio/sounds`
- [Start a sound upload](https://lyricwinter.com/docs/api/sounds#create-studio-sound-upload): `POST /studio/sounds`
- [Complete a sound upload](https://lyricwinter.com/docs/api/sounds#complete-studio-sound-upload): `POST /studio/sounds/{soundId}/uploads/{uploadId}/complete`
- [Get sound upload status](https://lyricwinter.com/docs/api/sounds#get-studio-sound-upload-status): `GET /studio/sounds/{soundId}/uploads/latest`
- [Get a sound](https://lyricwinter.com/docs/api/sounds#get-studio-sound): `GET /studio/sounds/{soundId}`
- [Update a sound](https://lyricwinter.com/docs/api/sounds#update-studio-sound): `PATCH /studio/sounds/{soundId}`
- [Delete a sound](https://lyricwinter.com/docs/api/sounds#delete-studio-sound): `DELETE /studio/sounds/{soundId}`
- [Create a sound preview URL](https://lyricwinter.com/docs/api/sounds#create-studio-sound-preview-url): `POST /studio/sounds/{soundId}/preview-url`
- [List project sounds](https://lyricwinter.com/docs/api/sounds#list-studio-project-sounds): `GET /studio/projects/{projectId}/sounds`
- [Link a sound to a project](https://lyricwinter.com/docs/api/sounds#add-studio-project-sound): `POST /studio/projects/{projectId}/sounds`
- [Unlink a sound from a project](https://lyricwinter.com/docs/api/sounds#remove-studio-project-sound): `DELETE /studio/projects/{projectId}/sounds/{soundId}`

### List sounds

`GET /studio/sounds`

Scope: `studio:read` · Operation ID: `listStudioSounds`

Lists sounds in your library, sounds shared with you, or public sounds, filtered by `scope` and an optional search query. Results are cursor-paginated.

#### Query parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `scope` | string, default "mine", one of `mine`, `shared`, `public` | No |  |
| `q` | string, max 200 chars | No |  |
| `project_id` | string, uuid | No |  |
| `in_project` | boolean | No |  |
| `limit` | integer, 1–100, default 30 | No |  |
| `cursor` | string, max 500 chars | No |  |

#### Response 200

Cursor-paginated sound library.

Fields inside `data`:

- `schema_version` ("studio-sound-library-1"; required)
- `sounds` (array of object, max 100 items; required)
  - `id` (string, uuid; required)
  - `name` (string, 1–120 chars; required)
  - `description` (string, 1–1000 chars; required)
  - `tags` (array of string, 1–12 items, unique; required)
  - `status` (string, one of `uploading`, `processing`, `ready`, `failed`; required)
  - `is_public` (boolean; required)
  - `owner_display_name` (string | null, 1–200 chars; required)
  - `is_owned_by_user` (boolean; required)
  - `is_shared_with_user` (boolean; required)
  - `incoming_share` (object | null; required)
    - `id` (string, uuid; required)
    - `status` (string, one of `pending`, `accepted`, `declined`; required)
  - `is_in_project` (boolean; required)
  - `can_edit` (boolean; required)
  - `can_delete` (boolean; required)
  - `can_share` (boolean; required)
  - `metadata_version` (integer, ≥ 1; required)
  - `current_revision` (object | null; required)
    - `id` (string, uuid; required)
    - `revision_number` (integer, ≥ 1; required)
    - `duration_ms` (integer, 100–300000; required)
    - `mime_type` (string, 1–200 chars; required)
    - `file_size_bytes` (integer, 1–62914560; required)
    - `created_at` (string, date-time; required)
  - `error` (object | null; required)
    - `code` (string | null, max 200 chars; required)
    - `message` (string, 1–1000 chars; required)
  - `created_at` (string, date-time; required)
  - `updated_at` (string, date-time; required)
- `next_cursor` (string | null, 1–500 chars; required)

Errors: `default` return the standard error envelope.

#### Example request

```bash
curl "https://lyricwinter.com/api/v1/studio/sounds" \
  -H "Authorization: Bearer $LYRICWINTER_API_KEY"
```

### Start a sound upload

`POST /studio/sounds`

Scope: `studio:write` · Retries: reuse the same `client_mutation_id` · Operation ID: `createStudioSoundUpload`

Creates a private sound and returns a signed upload session. Upload the file to the session URL, then call the complete endpoint. Requesting `is_public: true` returns `403` because public listing requires review.

#### Request body (application/json, required)

- `schema_version` ("studio-sound-upload-1"; required)
- `client_mutation_id` (string, uuid; required)
- `name` (string, 1–120 chars; required)
- `description` (string, 1–1000 chars; required)
- `tags` (array of string, 1–12 items, unique; required)
- `is_public` (boolean; required)
- `rights_acknowledgment_version` ("studio-sound-rights-1"; required)
- `file` (object; required)
  - `filename` (string, 1–255 chars; required)
  - `content_type` (string, one of `audio/wav`, `audio/x-wav`, `audio/mpeg`, `audio/ogg`, `audio/opus`, `audio/flac`, `audio/mp4`, `audio/aac`, `audio/webm`; required)
  - `size_bytes` (integer, 1–52428800; required)

#### Response 201

Upload session created.

Fields inside `data`:

- `schema_version` ("studio-sound-upload-1"; required)
- `sound` (object; required)
  - `id` (string, uuid; required)
  - `name` (string, 1–120 chars; required)
  - `description` (string, 1–1000 chars; required)
  - `tags` (array of string, 1–12 items, unique; required)
  - `status` (string, one of `uploading`, `processing`, `ready`, `failed`; required)
  - `is_public` (boolean; required)
  - `owner_display_name` (string | null, 1–200 chars; required)
  - `is_owned_by_user` (boolean; required)
  - `is_shared_with_user` (boolean; required)
  - `incoming_share` (object | null; required)
    - `id` (string, uuid; required)
    - `status` (string, one of `pending`, `accepted`, `declined`; required)
  - `is_in_project` (boolean; required)
  - `can_edit` (boolean; required)
  - `can_delete` (boolean; required)
  - `can_share` (boolean; required)
  - `metadata_version` (integer, ≥ 1; required)
  - `current_revision` (object | null; required)
    - `id` (string, uuid; required)
    - `revision_number` (integer, ≥ 1; required)
    - `duration_ms` (integer, 100–300000; required)
    - `mime_type` (string, 1–200 chars; required)
    - `file_size_bytes` (integer, 1–62914560; required)
    - `created_at` (string, date-time; required)
  - `error` (object | null; required)
    - `code` (string | null, max 200 chars; required)
    - `message` (string, 1–1000 chars; required)
  - `created_at` (string, date-time; required)
  - `updated_at` (string, date-time; required)
- `upload` (object; required)
  - `id` (string, uuid; required)
  - `url` (string, uri; required)
  - `method` ("PUT"; required)
  - `headers` (map of string; required)
  - `expires_at` (string, date-time; required)

Errors: `default` return the standard error envelope.

#### Example request

```bash
curl -X POST "https://lyricwinter.com/api/v1/studio/sounds" \
  -H "Authorization: Bearer $LYRICWINTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "schema_version": "studio-sound-upload-1",
  "client_mutation_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
  "name": "My integration",
  "description": "string",
  "tags": [
    "string"
  ],
  "is_public": true,
  "rights_acknowledgment_version": "studio-sound-rights-1",
  "file": {
    "filename": "string",
    "content_type": "audio/wav",
    "size_bytes": 1
  }
}'
```

### Complete a sound upload

`POST /studio/sounds/{soundId}/uploads/{uploadId}/complete`

Scope: `studio:write` · Operation ID: `completeStudioSoundUpload`

Tells LyricWinter the file has been uploaded so it can process the sound. Poll the latest upload status until the sound is ready.

#### Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `soundId` | string, uuid | Yes |  |
| `uploadId` | string, uuid | Yes |  |

#### Request body (application/json, required)

- `schema_version` ("studio-sound-upload-complete-1"; required)

#### Response 200

Idempotent finalization result.

Fields inside `data`:

- `id` (string, uuid; required)
- `name` (string, 1–120 chars; required)
- `description` (string, 1–1000 chars; required)
- `tags` (array of string, 1–12 items, unique; required)
- `status` (string, one of `uploading`, `processing`, `ready`, `failed`; required)
- `is_public` (boolean; required)
- `owner_display_name` (string | null, 1–200 chars; required)
- `is_owned_by_user` (boolean; required)
- `is_shared_with_user` (boolean; required)
- `incoming_share` (object | null; required)
  - `id` (string, uuid; required)
  - `status` (string, one of `pending`, `accepted`, `declined`; required)
- `is_in_project` (boolean; required)
- `can_edit` (boolean; required)
- `can_delete` (boolean; required)
- `can_share` (boolean; required)
- `metadata_version` (integer, ≥ 1; required)
- `current_revision` (object | null; required)
  - `id` (string, uuid; required)
  - `revision_number` (integer, ≥ 1; required)
  - `duration_ms` (integer, 100–300000; required)
  - `mime_type` (string, 1–200 chars; required)
  - `file_size_bytes` (integer, 1–62914560; required)
  - `created_at` (string, date-time; required)
- `error` (object | null; required)
  - `code` (string | null, max 200 chars; required)
  - `message` (string, 1–1000 chars; required)
- `created_at` (string, date-time; required)
- `updated_at` (string, date-time; required)

#### Response 202

Sanitization accepted.

Fields inside `data`:

- `id` (string, uuid; required)
- `name` (string, 1–120 chars; required)
- `description` (string, 1–1000 chars; required)
- `tags` (array of string, 1–12 items, unique; required)
- `status` (string, one of `uploading`, `processing`, `ready`, `failed`; required)
- `is_public` (boolean; required)
- `owner_display_name` (string | null, 1–200 chars; required)
- `is_owned_by_user` (boolean; required)
- `is_shared_with_user` (boolean; required)
- `incoming_share` (object | null; required)
  - `id` (string, uuid; required)
  - `status` (string, one of `pending`, `accepted`, `declined`; required)
- `is_in_project` (boolean; required)
- `can_edit` (boolean; required)
- `can_delete` (boolean; required)
- `can_share` (boolean; required)
- `metadata_version` (integer, ≥ 1; required)
- `current_revision` (object | null; required)
  - `id` (string, uuid; required)
  - `revision_number` (integer, ≥ 1; required)
  - `duration_ms` (integer, 100–300000; required)
  - `mime_type` (string, 1–200 chars; required)
  - `file_size_bytes` (integer, 1–62914560; required)
  - `created_at` (string, date-time; required)
- `error` (object | null; required)
  - `code` (string | null, max 200 chars; required)
  - `message` (string, 1–1000 chars; required)
- `created_at` (string, date-time; required)
- `updated_at` (string, date-time; required)

Errors: `default` return the standard error envelope.

#### Example request

```bash
curl -X POST "https://lyricwinter.com/api/v1/studio/sounds/$SOUND_ID/uploads/$UPLOAD_ID/complete" \
  -H "Authorization: Bearer $LYRICWINTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "schema_version": "studio-sound-upload-complete-1"
}'
```

### Get sound upload status

`GET /studio/sounds/{soundId}/uploads/latest`

Scope: `studio:read` · Operation ID: `getStudioSoundUploadStatus`

Returns the processing status of the most recent upload for a sound you own.

#### Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `soundId` | string, uuid | Yes |  |

#### Response 200

Latest owner upload, independent of the playable revision; null when none exists.

Fields inside `data`:

- `schema_version` (string, one of `studio-sound-upload-status-1`; required)
- `sound_id` (string, uuid; required)
- `latest` (object | null; required)
  - `id` (string, uuid; required)
  - `revision_number` (integer, ≥ 1; required)
  - `is_replacement` (boolean; required)
  - `status` (string, one of `pending_upload`, `processing`, `ready`, `failed`, `expired`; required)
  - `completed_revision_id` (string | null, uuid; required)
  - `error` (object | null; required)
    - `code` (string | null; required)
    - `message` (string; required)
  - `created_at` (string, date-time; required)
  - `updated_at` (string, date-time; required)
  - `expires_at` (string, date-time; required)

Errors: `default` return the standard error envelope.

#### Example request

```bash
curl "https://lyricwinter.com/api/v1/studio/sounds/$SOUND_ID/uploads/latest" \
  -H "Authorization: Bearer $LYRICWINTER_API_KEY"
```

### Get a sound

`GET /studio/sounds/{soundId}`

Scope: `studio:read` · Operation ID: `getStudioSound`

Returns one sound's metadata and processing state.

#### Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `soundId` | string, uuid | Yes |  |

#### Query parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `project_id` | string, uuid | No |  |

#### Response 200

Accessible sound detail.

Fields inside `data`:

- `id` (string, uuid; required)
- `name` (string, 1–120 chars; required)
- `description` (string, 1–1000 chars; required)
- `tags` (array of string, 1–12 items, unique; required)
- `status` (string, one of `uploading`, `processing`, `ready`, `failed`; required)
- `is_public` (boolean; required)
- `owner_display_name` (string | null, 1–200 chars; required)
- `is_owned_by_user` (boolean; required)
- `is_shared_with_user` (boolean; required)
- `incoming_share` (object | null; required)
  - `id` (string, uuid; required)
  - `status` (string, one of `pending`, `accepted`, `declined`; required)
- `is_in_project` (boolean; required)
- `can_edit` (boolean; required)
- `can_delete` (boolean; required)
- `can_share` (boolean; required)
- `metadata_version` (integer, ≥ 1; required)
- `current_revision` (object | null; required)
  - `id` (string, uuid; required)
  - `revision_number` (integer, ≥ 1; required)
  - `duration_ms` (integer, 100–300000; required)
  - `mime_type` (string, 1–200 chars; required)
  - `file_size_bytes` (integer, 1–62914560; required)
  - `created_at` (string, date-time; required)
- `error` (object | null; required)
  - `code` (string | null, max 200 chars; required)
  - `message` (string, 1–1000 chars; required)
- `created_at` (string, date-time; required)
- `updated_at` (string, date-time; required)

Errors: `default` return the standard error envelope.

#### Example request

```bash
curl "https://lyricwinter.com/api/v1/studio/sounds/$SOUND_ID" \
  -H "Authorization: Bearer $LYRICWINTER_API_KEY"
```

### Update a sound

`PATCH /studio/sounds/{soundId}`

Scope: `studio:write` · Operation ID: `updateStudioSound`

Updates a sound's name, description, or tags. A public sound must be made private before its metadata can change (`409`).

#### Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `soundId` | string, uuid | Yes |  |

#### Request body (application/json, required)

- any

#### Response 200

Updated sound.

Fields inside `data`:

- `id` (string, uuid; required)
- `name` (string, 1–120 chars; required)
- `description` (string, 1–1000 chars; required)
- `tags` (array of string, 1–12 items, unique; required)
- `status` (string, one of `uploading`, `processing`, `ready`, `failed`; required)
- `is_public` (boolean; required)
- `owner_display_name` (string | null, 1–200 chars; required)
- `is_owned_by_user` (boolean; required)
- `is_shared_with_user` (boolean; required)
- `incoming_share` (object | null; required)
  - `id` (string, uuid; required)
  - `status` (string, one of `pending`, `accepted`, `declined`; required)
- `is_in_project` (boolean; required)
- `can_edit` (boolean; required)
- `can_delete` (boolean; required)
- `can_share` (boolean; required)
- `metadata_version` (integer, ≥ 1; required)
- `current_revision` (object | null; required)
  - `id` (string, uuid; required)
  - `revision_number` (integer, ≥ 1; required)
  - `duration_ms` (integer, 100–300000; required)
  - `mime_type` (string, 1–200 chars; required)
  - `file_size_bytes` (integer, 1–62914560; required)
  - `created_at` (string, date-time; required)
- `error` (object | null; required)
  - `code` (string | null, max 200 chars; required)
  - `message` (string, 1–1000 chars; required)
- `created_at` (string, date-time; required)
- `updated_at` (string, date-time; required)

Errors: `default` return the standard error envelope.

#### Example request

```bash
curl -X PATCH "https://lyricwinter.com/api/v1/studio/sounds/$SOUND_ID" \
  -H "Authorization: Bearer $LYRICWINTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d 'null'
```

### Delete a sound

`DELETE /studio/sounds/{soundId}`

Scope: `studio:write` · Retries: reuse the same `client_mutation_id` · Operation ID: `deleteStudioSound`

Deletes a sound you own.

#### Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `soundId` | string, uuid | Yes |  |

#### Request body (application/json, required)

- `schema_version` ("studio-sound-mutation-1"; required)
- `client_mutation_id` (string, uuid; required)
- `expected_metadata_version` (integer, ≥ 1; required)

#### Response 200

Logical sound deleted.

Fields inside `data`:

- `sound_effect_id` (string, uuid; required)
- `deleted` (true; required)

Errors: `default` return the standard error envelope.

#### Example request

```bash
curl -X DELETE "https://lyricwinter.com/api/v1/studio/sounds/$SOUND_ID" \
  -H "Authorization: Bearer $LYRICWINTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "schema_version": "studio-sound-mutation-1",
  "client_mutation_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
  "expected_metadata_version": 1
}'
```

### Create a sound preview URL

`POST /studio/sounds/{soundId}/preview-url`

Scope: `studio:read` · Operation ID: `createStudioSoundPreviewUrl`

Returns a short-lived URL for listening to a sound.

#### Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `soundId` | string, uuid | Yes |  |

#### Response 200

Access-checked short-lived same-origin preview capability URL.

Fields inside `data`:

- `schema_version` ("studio-sound-preview-1"; required)
- `url` (string, uri; required)
- `expires_at` (string, date-time; required)

Errors: `default` return the standard error envelope.

#### Example request

```bash
curl -X POST "https://lyricwinter.com/api/v1/studio/sounds/$SOUND_ID/preview-url" \
  -H "Authorization: Bearer $LYRICWINTER_API_KEY"
```

### List project sounds

`GET /studio/projects/{projectId}/sounds`

Scope: `studio:read` · Operation ID: `listStudioProjectSounds`

Lists the sounds linked to a project. Create Audio can place linked sounds automatically when `place_project_sounds` is on.

#### Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `projectId` | string, uuid | Yes |  |

#### Query parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `q` | string, max 200 chars | No |  |
| `limit` | integer, 1–100, default 50 | No |  |
| `cursor` | string, max 500 chars | No |  |

#### Response 200

Project sound registry page.

Fields inside `data`:

- `schema_version` ("studio-sound-library-1"; required)
- `sounds` (array of object, max 100 items; required)
  - `id` (string, uuid; required)
  - `name` (string, 1–120 chars; required)
  - `description` (string, 1–1000 chars; required)
  - `tags` (array of string, 1–12 items, unique; required)
  - `status` (string, one of `uploading`, `processing`, `ready`, `failed`; required)
  - `is_public` (boolean; required)
  - `owner_display_name` (string | null, 1–200 chars; required)
  - `is_owned_by_user` (boolean; required)
  - `is_shared_with_user` (boolean; required)
  - `incoming_share` (object | null; required)
    - `id` (string, uuid; required)
    - `status` (string, one of `pending`, `accepted`, `declined`; required)
  - `is_in_project` (boolean; required)
  - `can_edit` (boolean; required)
  - `can_delete` (boolean; required)
  - `can_share` (boolean; required)
  - `metadata_version` (integer, ≥ 1; required)
  - `current_revision` (object | null; required)
    - `id` (string, uuid; required)
    - `revision_number` (integer, ≥ 1; required)
    - `duration_ms` (integer, 100–300000; required)
    - `mime_type` (string, 1–200 chars; required)
    - `file_size_bytes` (integer, 1–62914560; required)
    - `created_at` (string, date-time; required)
  - `error` (object | null; required)
    - `code` (string | null, max 200 chars; required)
    - `message` (string, 1–1000 chars; required)
  - `created_at` (string, date-time; required)
  - `updated_at` (string, date-time; required)
- `next_cursor` (string | null, 1–500 chars; required)
- `sound_source_registry_version` (integer, ≥ 1; required)

Errors: `default` return the standard error envelope.

#### Example request

```bash
curl "https://lyricwinter.com/api/v1/studio/projects/$PROJECT_ID/sounds" \
  -H "Authorization: Bearer $LYRICWINTER_API_KEY"
```

### Link a sound to a project

`POST /studio/projects/{projectId}/sounds`

Scope: `studio:write` · Retries: reuse the same `client_mutation_id` · Operation ID: `addStudioProjectSound`

Links a ready sound from your library to a project so Create Audio can place it.

#### Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `projectId` | string, uuid | Yes |  |

#### Request body (application/json, required)

- `schema_version` ("studio-project-sound-source-1"; required)
- `client_mutation_id` (string, uuid; required)
- `sound_effect_id` (string, uuid; required)
- `expected_registry_version` (integer, ≥ 1; required)

#### Response 201

Project sound membership updated.

Fields inside `data`:

- `schema_version` ("studio-project-sound-source-1"; required)
- `project_id` (string, uuid; required)
- `sound_effect_id` (string, uuid; required)
- `linked` (boolean; required)
- `sound_source_registry_version` (integer, ≥ 1; required)

Errors: `default` return the standard error envelope.

#### Example request

```bash
curl -X POST "https://lyricwinter.com/api/v1/studio/projects/$PROJECT_ID/sounds" \
  -H "Authorization: Bearer $LYRICWINTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "schema_version": "studio-project-sound-source-1",
  "client_mutation_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
  "sound_effect_id": "c9f0f895-fb98-4b91-9e3f-1d2a6b7c8d20",
  "expected_registry_version": 1
}'
```

### Unlink a sound from a project

`DELETE /studio/projects/{projectId}/sounds/{soundId}`

Scope: `studio:write` · Retries: reuse the same `client_mutation_id` · Operation ID: `removeStudioProjectSound`

Removes a sound from a project. The sound stays in your library.

#### Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `projectId` | string, uuid | Yes |  |
| `soundId` | string, uuid | Yes |  |

#### Request body (application/json, required)

- `schema_version` ("studio-project-sound-source-1"; required)
- `client_mutation_id` (string, uuid; required)
- `sound_effect_id` (string, uuid; required)
- `expected_registry_version` (integer, ≥ 1; required)

#### Response 200

Project sound membership updated.

Fields inside `data`:

- `schema_version` ("studio-project-sound-source-1"; required)
- `project_id` (string, uuid; required)
- `sound_effect_id` (string, uuid; required)
- `linked` (boolean; required)
- `sound_source_registry_version` (integer, ≥ 1; required)

Errors: `default` return the standard error envelope.

#### Example request

```bash
curl -X DELETE "https://lyricwinter.com/api/v1/studio/projects/$PROJECT_ID/sounds/$SOUND_ID" \
  -H "Authorization: Bearer $LYRICWINTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "schema_version": "studio-project-sound-source-1",
  "client_mutation_id": "8f14e45f-ceea-4e7a-9c2d-3b1a5f2e7c10",
  "sound_effect_id": "c9f0f895-fb98-4b91-9e3f-1d2a6b7c8d20",
  "expected_registry_version": 1
}'
```

