# Get a transcription — Shorty API

> Returns one transcription the authenticated account owns, including the transcript text. A non-existent or foreign id returns 404. When `output_language` was set, each GET advances the translation by one slice of work and can take up to about a minute to answer (use a client timeout of at least 60 seconds): keep polling until `translation_status` is SUCCEEDED, FAILED or SKIPPED (see `translation_progress`).

```http
GET /v1/transcriptions/{transcriptionId}
```

Returns one transcription the authenticated account owns, including the transcript text. A non-existent or foreign id returns 404. When `output_language` was set, each GET advances the translation by one slice of work and can take up to about a minute to answer (use a client timeout of at least 60 seconds): keep polling until `translation_status` is SUCCEEDED, FAILED or SKIPPED (see `translation_progress`).

## Authentication

Requires a Bearer credential — a `shk_live_` API key or an OAuth 2.1 access token with the scope for this resource. See [Authentication](/docs/api).

## Parameters

| Name | In | Required | Description |
| --- | --- | --- | --- |
| `transcriptionId` | path | Yes | — |

## Example request

curl:

```bash
curl -X GET https://aishorty.com/v1/transcriptions/{transcriptionId} \
  -H "Authorization: Bearer shk_live_your_key"
```

TypeScript (@aishorty/sdk):

```typescript
import { Shorty } from '@aishorty/sdk'

const shorty = new Shorty({ apiKey: process.env.SHORTY_API_KEY })

const transcription = await shorty.transcriptions.get(id)
```

## Response · 200

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | `string` | Yes | Stable transcription id. |
| `status` | `string` | Yes | Processing status: PENDING, PROCESSING, SUCCESS, or ERROR. |
| `progress` | `number` | Yes | Completion fraction 0–100. |
| `model_type` | `string` | Yes | Whisper model used (e.g. WHISPER_BASE, WHISPER_LARGE_V3). |
| `language` | `string or null` | Yes | Requested/detected language, or null for auto-detect. |
| `input_file` | `string` | Yes | The source media URL that was transcribed. |
| `error` | `string or null` | Yes | Error message if the job failed, else null. |
| `output_language` | `"en" \| "ar" \| "bn" \| "cs" \| "da" \| "de" \| "el" \| "es" \| "fi" \| "fr" \| "he" \| "hi" \| "hu" \| "id" \| "it" \| "ja" \| "ko" \| "ms" \| "nl" \| "no" \| "pl" \| "pt" \| "ro" \| "ru" \| "sv" \| "th" \| "tr" \| "uk" \| "vi" \| "zh" or null` | Yes | The language the transcript was requested in, or null when none was requested. |
| `translation_status` | `"PENDING" \| "RUNNING" \| "SUCCEEDED" \| "FAILED" \| "SKIPPED" or null` | Yes | State of the translation into `output_language`: PENDING and RUNNING are in flight, SUCCEEDED means `translated_output_text` is ready, SKIPPED means the audio already was in that language, FAILED means it could not be translated (see `translation_error`). Null when no translation was needed (no output language, or English, which the speech model produces directly). |
| `created_at` | `string` | Yes | ISO-8601 UTC timestamp the transcription was created. |
| `output_text` | `string or null` | Yes | The transcript text, or null if not yet produced. |
| `translated_output_text` | `string or null` | Yes | The transcript translated into `output_language`, in the same format as `output_text`, or null until `translation_status` is SUCCEEDED. |
| `translation_progress` | `object or null` | Yes | How far a translation in flight has got, so a client can show "Translating... 40%". Each GET of this endpoint advances it by a few batches (about 20 seconds of work); keep polling until `translation_status` is terminal. Null until the first batch starts and when no translation is owed. |
| `translation_error` | `string or null` | Yes | Why the translation failed when `translation_status` is FAILED, else null. The untranslated `output_text` is unaffected. |

## Errors

On failure this endpoint returns an RFC 9457 problem body. Possible statuses:

- `400`
- `401`
- `403`
- `404`
- `429`
- `500`

Switch on the problem `code`, not the status. See the [error reference](/docs/api/errors) for every code and how to fix it.
