# Whisper-1 on SeedRouter

> Transcribe recordings with Whisper-1. Get readable text, word timestamps and subtitle files, check live pricing, and try your own audio online on SeedRouter.

Model ID: `whisper-1`. [Playground and pricing](https://seedrouter.ai/models/whisper-1).
Use an API key from https://seedrouter.ai/apikeys as Authorization: Bearer $SEEDROUTER_API_KEY. Store the key on your server.

## Current pricing and worked estimates

Rates use the same source and one-minute refresh interval as the model page. All amounts are in USD.

| Model | USD per minute | USD per million audio metering units |
| --- | --- | --- |
| whisper-1 | $0.036 | $36 |

For each recording: units = round(ceil(duration in seconds) × 1000 / 60). Multiply these audio units by the live unit rate. These are duration units, not transcript tokens. Both transcription and English translation use this rule. Failed requests are not charged.

## API reference

Whisper-1 converts recorded speech into text. Use `/v1/audio/transcriptions` to keep the spoken language or `/v1/audio/translations` to produce English. Both accept `multipart/form-data` with an uploaded file. SeedRouter returns a task ID first; download the selected result after the task completes. This differs from a synchronous OpenAI SDK response.

[Playground and live pricing](https://seedrouter.ai/models/whisper-1) · [First transcription tutorial](https://seedrouter.ai/blog/whisper-1-api) · [OpenAPI](https://seedrouter.ai/docs/whisper-1.openapi.json) · [Markdown](https://seedrouter.ai/docs/whisper-1.md)

## Submit a recording

Keep your API key on the server. Let your HTTP client generate the multipart boundary; do not manually set a bare `Content-Type: multipart/form-data` header.

```bash
curl https://api.seedrouter.ai/v1/audio/transcriptions \
  -H "Authorization: Bearer $SEEDROUTER_API_KEY" \
  -F model=whisper-1 \
  -F file=@recording.mp3 \
  -F language=en \
  -F response_format=verbose_json \
  -F 'timestamp_granularities[]=word' \
  -F 'timestamp_granularities[]=segment'
```

The response acknowledges a task, not a finished transcription:

```json
{
  "id": "task_example",
  "model": "whisper-1",
  "status": "processing",
  "created_at": 1792376116
}
```

Store the actual returned `id`. Submit once. A lost connection does not establish whether the request was accepted; check your task history before creating another request.

## Read the result

```bash
curl "https://api.seedrouter.ai/v1/tasks/$TASK_ID" \
  -H "Authorization: Bearer $SEEDROUTER_API_KEY"
```

Poll while `status` is `processing`. A completed task contains `output.url` and `output.format`; a failed task contains `error.code` and `error.message`. A polling timeout is not a terminal task state. Only the task owner can read it. The examples below illustrate the response shape:

```json
{
  "id": "task_example",
  "model": "whisper-1",
  "status": "completed",
  "output": {
    "format": "verbose_json",
    "url": "https://static.seedrouter.ai/media/tasks/task_example/0.json"
  }
}
```

Download `output.url` with a separate GET request. Read a JSON artifact as JSON and the other formats as text. Public task responses do not include prices or account details.

## Transcription parameters

`file` and `model` are required. The nine fields below comprise the shared request surface, including `file`, `model` and the explicitly ignored `stream`. `chunking_strategy` remains a compatibility gap, as described below.

| Field                       | Type                       | Default                            | Contract                                                                                                                                                                                         |
| --------------------------- | -------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `file`                      | Binary upload              | Required                           | One nonempty audio file, not a URL or filename string. See file limits.                                                                                                                          |
| `model`                     | String                     | Required                           | Exactly `whisper-1`.                                                                                                                                                                             |
| `language`                  | String                     | Automatic detection                | Input language hint, such as `en`. No local language whitelist is imposed. Omit for detection.                                                                                                   |
| `prompt`                    | String                     | Omitted                            | Context, spelling or continuation in the audio's language. No character limit is invented; Whisper considers the last 224 tokens of its own tokenizer. This is not a general instruction prompt. |
| `response_format`           | String                     | `json`                             | `json`, `text`, `srt`, `verbose_json` or `vtt`.                                                                                                                                                  |
| `temperature`               | Number                     | `0`                                | Inclusive range 0–1. Zero allows the model's automatic temperature adjustment; it does not promise deterministic text.                                                                           |
| `timestamp_granularities[]` | Repeated string            | Segment timestamps when applicable | `word`, `segment`, or both. Requires `response_format=verbose_json`. The bare repeated field spelling `timestamp_granularities` is also accepted.                                                |
| `chunking_strategy`         | `auto`, VAD object or null | Omitted                            | Shared audio schema field whose Whisper applicability is unresolved. Leave omitted for the verified path. Explicit `auto` failed live compatibility verification.                                |
| `stream`                    | Boolean or null            | `false`                            | Ignored for Whisper-1. No SSE or partial transcript is produced.                                                                                                                                 |

The VAD object contains required `type: "server_vad"`, optional integer `prefix_padding_ms` (documented default 300), optional integer `silence_duration_ms` (documented default 200), and optional numeric `threshold` from 0 to 1 (documented default 0.5). No undocumented integer range is enforced. An omitted strategy stays omitted; these object defaults do not make `auto` the request default.

For SDK compatibility, the VAD object can be encoded in one JSON multipart part or as `chunking_strategy[type]`, `chunking_strategy[prefix_padding_ms]`, `chunking_strategy[silence_duration_ms]` and `chunking_strategy[threshold]`. Do not mix the two encodings. Acceptance of these field shapes does not establish that VAD works with this model.

Optional text fields use omission, not the literal multipart string `null`. Unknown and model-inapplicable fields are discarded. In particular, `diarized_json`, speaker reference controls, `logprobs` and realtime events are not Whisper-1 features. Duplicate scalar fields are invalid.

## File limits

The documented audio formats are FLAC, MP3, MP4, MPEG, MPGA, M4A, OGG, WAV and WebM. The current upload ceiling is 26,214,400 bytes (25 MiB). The OpenAI Audio API FAQ specifies a 25 MiB maximum request size for legacy Whisper-1 uploads; keep files below the ceiling to leave room for multipart fields. Files must contain readable audio and a positive, measurable duration. An extension alone is not proof of valid audio.

There is no additional local one-hour ceiling, fixed sample-rate requirement or mono-only restriction. File size can still require splitting long recordings. Review boundaries between split recordings to avoid omitting or duplicating speech.

## English translation

```bash
curl https://api.seedrouter.ai/v1/audio/translations \
  -H "Authorization: Bearer $SEEDROUTER_API_KEY" \
  -F model=whisper-1 \
  -F file=@recording.mp3 \
  -F response_format=text \
  -F temperature=0
```

Translation has five fields: `file`, `model`, `prompt`, `response_format` and `temperature`, with the same types and bounds as above. Its optional prompt should be English. There is no selectable target language. `language`, timestamp controls, chunking controls and other transcription-only fields are discarded on this endpoint. A successful English-input translation check does not establish accuracy for every source language.

## Downloaded artifact fields

| Format         | Content                                                                                                                 |
| -------------- | ----------------------------------------------------------------------------------------------------------------------- |
| `json`         | Object with `text`. Transcription may also include `usage: {type: "duration", seconds: number}`.                        |
| `text`         | Plain transcript text.                                                                                                  |
| `srt`          | Numbered subtitle cues with SRT timecodes.                                                                              |
| `vtt`          | WebVTT subtitles.                                                                                                       |
| `verbose_json` | `text`, `language` and `duration` in seconds; optional `segments` and, for transcription, `words` and duration `usage`. |

Each word has `word`, `start` and `end`. Each segment has `id`, `seek`, `start`, `end`, `text`, `tokens`, `temperature`, `avg_logprob`, `compression_ratio` and `no_speech_prob`. `start` and `end` are seconds. Segments do not identify speakers. The transcription-only constant `task: "transcribe"` may be present. Translation artifacts omit transcription-only `words` and `usage`. Audio measurements and transcript text are not rewritten to imitate an expected answer.

## Billing

Both operations use measured input duration. For each recording, audio metering units equal `round(ceil(seconds) × 1000 / 60)`. Multiply those units by the live unit rate; these units do not count transcript text. For example, 15 seconds yields 250 units, while 15.1 seconds yields 267. The page and Playground read the same live rate. Failed requests are not charged.

## Verification status

Checked October 19, 2026. Local end-to-end tests completed all five transcription output formats and a `verbose_json` translation, including owned result downloads and exact account deductions. A transcription requested both word and segment timestamps successfully. FLAC, OGG, M4A, MP4 and subsecond/fractional WAV uploads passed separate live compatibility checks.

Explicit `chunking_strategy=auto` was rejected. Three submitted cases involving WebM, MPEG plus VAD, and MPGA plus `stream=true` did not succeed. These failures do not establish which of their combined settings caused rejection. Those formats and options remain unverified; the service does not silently replace an explicitly requested strategy. The translation test used English input, so cross-language translation quality remains unmeasured. Do not treat the accepted schema as proof that every combination has passed a live test.

## Errors and recovery

Invalid file and parameter combinations are refused before task creation. API errors contain a numeric `code` and a readable `message`; see [error codes](https://seedrouter.ai/docs/errors). After acceptance, check the task's terminal status. For an uncertain submission, find its existing task before submitting again. A failed task is not charged.

## Contract sources

* [OpenAI transcription reference](https://developers.openai.com/api/reference/resources/audio/subresources/transcriptions/methods/create)
* [OpenAI translation reference](https://developers.openai.com/api/reference/resources/audio/subresources/translations/methods/create)
* [OpenAI speech-to-text guide](https://developers.openai.com/api/docs/guides/speech-to-text)
* [OpenAI Whisper prompting guide](https://cookbook.openai.com/examples/whisper_prompting_guide)

OpenAI has announced a February 26, 2027 shutdown date for Whisper on its own API. That announcement does not establish a shutdown date for this service. See the [OpenAI deprecation notice](https://developers.openai.com/api/docs/deprecations).

## More resources

- [OpenAPI request and response schemas](https://seedrouter.ai/docs/whisper-1.openapi.json)
- [API reference as Markdown](https://seedrouter.ai/docs/whisper-1.md)
- [Task lifecycle](https://seedrouter.ai/docs/api/tasks.md)
- [Error catalog and retry guidance](https://seedrouter.ai/docs/api/errors.md)
- [Account usage](https://seedrouter.ai/usage)
- [All model guides](https://seedrouter.ai/llms.txt)
- [Documentation index](https://seedrouter.ai/docs/llms.txt)
