> For the full page index, fetch https://echonova.ai/llms.txt

# Get sound cleaning job details

Returns one API job of this key's workspace, with its cleaned file URL, whichever key created it. A job of another workspace answers 404. Needs Sound Cleaning access on the key.

## Endpoint

`GET https://api.echonova.ai/v1/sound-cleaning/jobs/{jobId}`

## Authentication

Keys are created in the portal under Developers, sent as `Authorization: Bearer YOUR_API_KEY`. See [Get an API key](/docs/developers/get-an-api-key).

## Request

| Name  | In   | Type   | Required | Limits | Description                                          |
| ----- | ---- | ------ | -------- | ------ | ---------------------------------------------------- |
| jobId | path | string | Yes      |        | The jobId the API returned when the job was created. |

## Responses

| Status | Description           |
| ------ | --------------------- |
| 200    | OK                    |
| 400    | Bad Request           |
| 401    | Unauthorized          |
| 403    | Forbidden             |
| 404    | Not Found             |
| 429    | Too Many Requests     |
| 500    | Internal Server Error |
| 503    | Service Unavailable   |
| 504    | Gateway Timeout       |

## Response

A success answers 200 with the envelope `{ data, success, statusCode, errorMessage }`. The `data` fields:

| Field                  | Type    | Description                                                |
| ---------------------- | ------- | ---------------------------------------------------------- |
| id                     | string  | The job id.                                                |
| status                 | string  | pending, processing, completed or failed.                  |
| fileName               | string  | The name of the uploaded file.                             |
| outputUrl              | string  | Time-limited link to the cleaned WAV.                      |
| durationSeconds        | number  | Length of the audio in seconds.                            |
| creditsConsumed        | integer | Credits charged, a whole number.                           |
| options                | object  | The tuning values the job ran with.                        |
| options.cutoffFreq     | number  | High-pass cutoff in Hz.                                    |
| options.qFactor        | number  | High-pass smoothness.                                      |
| options.targetLufs     | number  | Target loudness in LUFS.                                   |
| options.truePeakDbfs   | number  | Peak ceiling in dBFS.                                      |
| options.compThreshDb   | number  | Compressor threshold in dBFS.                              |
| options.compRatio      | number  | Compressor ratio.                                          |
| options.compAttackMs   | number  | Compressor attack in ms.                                   |
| options.compReleaseMs  | number  | Compressor release in ms.                                  |
| metrics                | object  | Measurements of the cleaned file.                          |
| metrics.sampleRate     | number  | Sample rate of the cleaned file in Hz.                     |
| metrics.integratedLufs | number  | Measured loudness of the cleaned file in LUFS.             |
| metrics.truePeakDbfs   | number  | Measured peak of the cleaned file in dBFS.                 |
| error                  | string  | The reason the job failed. Absent unless status is failed. |
| createdAt              | string  | When the job was created, ISO 8601 in UTC.                 |

```json
{
  "data": {
    "id": "66e3f2a1c9d4b8a1f0e12345",
    "status": "completed",
    "fileName": "noisy.wav",
    "outputUrl": "https://storage.example.com/cleaned/66e3f2a1c9d4b8a1f0e12345.wav?signature=abc",
    "durationSeconds": 12,
    "creditsConsumed": 207,
    "options": {
      "cutoffFreq": 90,
      "qFactor": 0.707,
      "targetLufs": -16,
      "truePeakDbfs": -1,
      "compThreshDb": -3.8,
      "compRatio": 4,
      "compAttackMs": 5,
      "compReleaseMs": 50
    },
    "metrics": {
      "sampleRate": 48000,
      "integratedLufs": -16.1,
      "truePeakDbfs": -1
    },
    "error": "The audio could not be cleaned.",
    "createdAt": "2026-10-11T10:21:04.512Z"
  },
  "success": true,
  "statusCode": 200,
  "errorMessage": null
}
```

## Errors

| Status | errorMessage                                                 | When                                                                                                                                                                                                                                                                                       | Fix                                                                               |
| ------ | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------- |
| 400    | Invalid identifier                                           | jobId is not a well-formed id.                                                                                                                                                                                                                                                             | Copy the id exactly as the API returned it.                                       |
| 401    | Unauthorized                                                 | The Authorization header is missing or is not Bearer ek\_..., no key matches the token, or the key is deleted, disabled or its account is closed.                                                                                                                                          | Send Authorization: Bearer ek\_... with an enabled key.                           |
| 403    | Subscription not found                                       | The workspace that owns the key has no subscription.                                                                                                                                                                                                                                       | Check the workspace's plan in the portal.                                         |
| 403    | Subscription expired or inactive                             | The subscription is in a state other than active or trial.                                                                                                                                                                                                                                 | Renew the subscription.                                                           |
| 403    | This API key does not have access to Sound Cleaning services | The key is restricted and Sound Cleaning is not among its services.                                                                                                                                                                                                                        | Edit the key and turn Sound Cleaning on, or use another key.                      |
| 404    | Clean Job not found                                          | The job id is unknown, or the job belongs to another workspace or was made in the portal.                                                                                                                                                                                                  | Use a jobId from this workspace's API jobs.                                       |
| 429    | ThrottlerException: Too Many Requests                        | The key made more than 100 requests to one endpoint in 60 seconds, or one IP address made more than 100 requests to one endpoint in 60 seconds (the IP limit is counted before the key is checked, so it can answer with no key at all); a Retry-After header carries the seconds to wait. | Wait Retry-After seconds, then retry.                                             |
| 500    | Something went wrong                                         | An error the API did not classify.                                                                                                                                                                                                                                                         | Check the request, then retry after a short wait; contact support if it persists. |
| 503    | Database unavailable                                         | A transient outage inside the API.                                                                                                                                                                                                                                                         | Retry after a short wait.                                                         |
| 504    | Database timed out                                           | A transient timeout inside the API.                                                                                                                                                                                                                                                        | Retry after a short wait.                                                         |

## Code samples

:::tabs

```bash title="cURL"
curl "https://api.echonova.ai/v1/sound-cleaning/jobs/{jobId}" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

```python
import requests

response = requests.get(
    "https://api.echonova.ai/v1/sound-cleaning/jobs/{jobId}",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
)
print(response.json())
```

```javascript
const response = await fetch('https://api.echonova.ai/v1/sound-cleaning/jobs/{jobId}', {
  method: 'GET',
  headers: {
    Authorization: 'Bearer YOUR_API_KEY',
  },
});
console.log(await response.json());
```

:::
