Model APIs / Speech-to-text

# Speech-to-text

Transcribe an audio file, sent as multipart form data or as base64 JSON, up to 25 MB.

`POST` `/v1/audio/transcriptions` `inference:invoke`[Browse speech-to-text models →](https://yelno.ai/catalog?type=transcriptions)

## Request

Send `multipart/form-data` with the file, or JSON with the audio base64-encoded. Up to 25 MB either way.

| Field | Required | Notes |
| --- | --- | --- |
| file | required | The audio file (multipart). |
| model | required | A speech-to-text model's id. |
| language | optional | The spoken language, when you know it. |
| response_format | optional | `"json"` · `"verbose_json"` |
| temperature | optional | Sampling temperature, when the model supports it. |

JSON requests may also send `timestamp_granularities`, `diarize` and `keyterms` where the model supports them. Any other field is refused with `400 unsupported_parameter`.

JSON form:

application/json

```
{
  "model": "MODEL",
  "input_audio": { "data": "<base64>", "format": "mp3" },
  "language": "en",
  "response_format": "json"
}
```

Request

```
curl https://yelno.ai/v1/audio/transcriptions \
  -H "Authorization: Bearer $YELNO_API_KEY" \
  -F model="MODEL" \
  -F file=@meeting.mp3 \
  -F response_format=verbose_json
```

## Response

200 · application/json

```
{
  "text": "Thanks everyone for joining…",
  "language": "en",
  "duration": 42.7,
  "segments": [ … ],
  "usage": { … },
  "yelno": { "request_id": "req_…", "provider": "…", "model": "…", "endpoint_id": "ep_…", "attempts": [ … ], "cost": { … } }
}
```

`language`, `duration`, `segments` and `words` are present when the model returns them.

Every JSON response carries the same `yelno` block a chat response does: `request_id`, `provider`, `model`, `endpoint_id`, `attempts` and `cost`. `cost` is `{state: "final", currency, customer_nanos}` when the provider reported the cost with the response, or `{state: "pending", currency, note}` when it reports it later — the charge then settles once. Errors use the standard [error envelope](https://yelno.ai/docs/errors); upstream text never reaches you.

Sending a model to a route it is not served on answers `422` `capability_unsupported` with `code: "operation_unsupported"` and a message naming the route that serves it. Every model in the [catalog](https://yelno.ai/catalog?type=transcriptions) shows its type and route.

Pricing. You pay the model's listed final price — shown on its catalog page — and nothing on top. A model without a fixed unit price is billed per request: its exact charge comes back with every response in `yelno.cost`. A hold is placed before dispatch and released down to the final charge; when the charge is reported after the response, the request settles once — it is never charged a guess.

Source: https://yelno.ai/docs/transcriptions
