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

# List Speech to Text jobs

Lists the API jobs in this key's workspace, paged with offset and limit. Needs Speech to Text access on the key.

## Endpoint

`GET https://api.echonova.ai/v1/speech-to-text/jobs`

## 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              |
| ------ | ----- | ------- | -------- | -------------------- | ------------------------ |
| offset | query | integer | No       | min 0, default 0     | How many jobs to skip.   |
| limit  | query | integer | No       | 1 to 100, default 20 | How many jobs to return. |

## Responses

| Status | Description           |
| ------ | --------------------- |
| 200    | OK                    |
| 400    | Bad Request           |
| 401    | Unauthorized          |
| 403    | Forbidden             |
| 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                                                                                                    |
| ----------------------- | ---------------- | -------------------------------------------------------------------------------------------------------------- |
| items                   | array of objects | The items on this page.                                                                                        |
| items.id                | string           | The job id.                                                                                                    |
| items.status            | string           | pending, processing, completed or failed.                                                                      |
| items.transcription     | string           | The transcript text. Absent until the job completes.                                                           |
| items.durationSeconds   | number           | Length of the audio in seconds. An estimate while processing, the measured length once completed.              |
| items.language          | string           | Language the transcription was requested with.                                                                 |
| items.numbersAsDigits   | boolean          | Whether spoken numbers were written as digits. Jobs from before the option read true.                          |
| items.identifySpeakers  | boolean          | Whether speaker identification was requested with identify_speakers. Jobs from before the option read false.   |
| items.segments          | array of objects | The transcript in timed pieces, each with its speaker, sorted by start. Empty unless speakers were identified. |
| items.segments.start    | number           | Where the piece starts, in seconds from the start of the audio.                                                |
| items.segments.end      | number           | Where the piece ends, in seconds from the start of the audio.                                                  |
| items.segments.text     | string           | What was said in this piece.                                                                                   |
| items.segments.speaker  | string           | The id of the speaker (spk0, spk1, ...), numbered by first appearance; null when the speaker is unknown.       |
| items.speakers          | array of objects | The speakers heard, in order of first appearance. Empty unless speakers were identified.                       |
| items.speakers.id       | string           | The speaker id the segments use.                                                                               |
| items.speakers.talkTime | number           | How long this speaker talks, in seconds.                                                                       |
| items.creditsConsumed   | integer          | Credits charged, a whole number.                                                                               |
| items.error             | string           | The reason the job failed. Absent unless status is failed.                                                     |
| items.createdAt         | string           | When the job was created, ISO 8601 in UTC.                                                                     |
| total                   | number           | The total number of items.                                                                                     |

```json
{
  "data": {
    "items": [
      {
        "id": "66e3f2a1c9d4b8a1f0e12346",
        "status": "completed",
        "transcription": "مرحبا بكم في إيكونوڤا",
        "durationSeconds": 312.4,
        "language": "ar",
        "numbersAsDigits": true,
        "identifySpeakers": true,
        "segments": [
          {
            "start": 0.38,
            "end": 4.12,
            "text": "السلام عليكم، كيف حالك؟",
            "speaker": "spk0"
          }
        ],
        "speakers": [
          {
            "id": "spk0",
            "talkTime": 88.1
          }
        ],
        "creditsConsumed": 521,
        "error": null,
        "createdAt": "2026-09-15T10:21:04.512Z"
      }
    ],
    "total": 1
  },
  "success": true,
  "statusCode": 200,
  "errorMessage": null
}
```

## Errors

| Status | errorMessage                                                                                       | When                                                                                                                                                                                                                                                                                       | Fix                                                                               |
| ------ | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------- |
| 400    | offset must not be less than 0                                                                     | offset on a jobs list is negative.                                                                                                                                                                                                                                                         | Send 0 or more.                                                                   |
| 400    | offset must be an integer number                                                                   | offset is not a whole number.                                                                                                                                                                                                                                                              | Send an integer.                                                                  |
| 400    | limit must not be less than 1                                                                      | limit on a jobs list is below 1.                                                                                                                                                                                                                                                           | Send 1 to 100.                                                                    |
| 400    | limit must not be greater than 100                                                                 | limit on a jobs list is above 100.                                                                                                                                                                                                                                                         | Send 1 to 100.                                                                    |
| 400    | limit must not be greater than 100, limit must not be less than 1, limit must be an integer number | limit is not a number at all.                                                                                                                                                                                                                                                              | Send an integer from 1 to 100.                                                    |
| 400    | property <name> should not exist                                                                   | The body or query carries a field the endpoint does not define.                                                                                                                                                                                                                            | Remove the field.                                                                 |
| 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 from this environment.     |
| 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 Speech-to-Text services                                       | The key is restricted and Speech to Text is not among its services.                                                                                                                                                                                                                        | Edit the key and grant Speech to Text, or use another key.                        |
| 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/speech-to-text/jobs?offset=0&limit=20" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

```python
import requests

response = requests.get(
    "https://api.echonova.ai/v1/speech-to-text/jobs?offset=0&limit=20",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
)
print(response.json())
```

```javascript
const response = await fetch('https://api.echonova.ai/v1/speech-to-text/jobs?offset=0&limit=20', {
  method: 'GET',
  headers: {
    Authorization: 'Bearer YOUR_API_KEY',
  },
});
console.log(await response.json());
```

:::
