OpenRouter base64 input_audio vs Sume STT 1.0 audio_url
OpenRouter transcription takes base64 audio inside the JSON body. Sume STT 1.0 takes an audio_url instead, so you host the file and send a link.

Sume does not take base64 audio in the request body for STT 1.0. You send audio_url, a link to the file, to POST /v1/stt-1.0/transcribe; OpenRouter's /api/v1/audio/transcriptions instead takes the audio as base64 in input_audio.data with a format field. Moving over means uploading or hosting the file first.
OpenRouter facts are from its speech-to-text guide; Sume facts from the OpenAPI file, read 2026-10-01.
How does OpenRouter take the audio?
The guide says to send a JSON body with base64-encoded audio and get JSON back with the text and usage statistics. input_audio.data is raw base64, not a data URI, and input_audio.format is required. language is an ISO-639-1 code and is auto-detected if omitted. It also accepts OpenAI-style multipart requests.
How does Sume STT 1.0 take it?
The OpenAPI description calls it the primary Sume STT 1.0 route, with the public model id sume/stt-1.0. Its example body is audio_url set to a media.sume.com artifact, an optional language_code such as ko, duration_seconds and mode: "async". A second example omits the language for auto-detection. Completed results include text and words[] word timings in seconds.
curl https://api.sume.com/v1/stt-1.0/transcribe \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-d '{"audio_url":"https://media.sume.com/artifacts/example/clip.m4a","language_code":"ko","mode":"async"}'What changes in my code?
| Item | OpenRouter | Sume STT 1.0 |
|---|---|---|
| Audio | Base64 in input_audio.data | audio_url |
| Format hint | input_audio.format required | Not in the documented example |
| Language | language, ISO-639-1 | language_code, optional |
| Response | JSON text | Job; text and words[] in the result |
What about large files?
A URL keeps the request body small, but Sume must be able to fetch the link. The OpenAPI schema asks for a public HTTPS URL (a Sume media or attachment URL is preferred), and duration_seconds, if you omit it, reserves usage for 1 minute, so pass the real length for longer clips. Then poll status_url as described in Jobs and results. For a full pipeline, see the dubbing pipeline post.
Sources
Related posts
More in Developers
- OpenRouter Batch API vs Sume async jobs: which for video?
OpenRouter's Batch API is for text and embeddings with a 24 hour window. For video files, Sume returns a job id per request: async, sync, or webhook mode.
- OpenRouter batch custom_id vs one Sume Idempotency-Key per job
OpenRouter's Batch API needs a custom_id unique within each batch. Sume has no batch envelope for these submits: give each job its own Idempotency-Key.
- OpenRouter batch 24h window and expired vs Sume queued jobs
OpenRouter batches use a 24-hour completion window and can end as expired. Sume jobs have no queue expiry option today: a queued job waits, or you cancel it.
- OpenRouter batch DELETE 409 vs Sume cancel 409 after start
OpenRouter returns 409 when you DELETE an in-flight batch. Sume returns 409 job_generation_already_started on cancel once generation starts. Handle both.
Written by Sume