Avalon API documentation
Batch speech-to-text tuned for technical language, with official OpenAI Python and JavaScript SDK support for the contract documented here.
Base URL
https://api.aquavoice.com/v1
Model
avalon-v1.5
Price
$0.39 per audio hour
Quickstart
Create a key in the dashboard, then call Avalon through the OpenAI SDK or multipart HTTP. Idempotency is optional.
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.aquavoice.com/v1",
)
with open("audio.mp3", "rb") as audio:
transcript = client.audio.transcriptions.create(
model="avalon-v1.5",
file=audio,
)
print(transcript.text)curl https://api.aquavoice.com/v1/audio/transcriptions \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@audio.mp3" \
-F "model=avalon-v1.5"Create transcription
/v1/audio/transcriptionsmultipart/form-dataSend Authorization: Bearer YOUR_API_KEY. The file and model fields are required.
This compatibility endpoint waits for the queued job for up to 210 seconds. If it returns a timeout, processing continues; use the response's x-request-id as the job ID to check its status. For bursty or long-running work, use the async job endpoint below.
fileAudio in flac, mp3, mp4, mpeg, mpga, m4a, ogg, wav, or webm format. Maximum upload size is 25 MiB; decoded audio must be shorter than one hour.
modelMust be "avalon-v1.5".
promptContext or vocabulary hints for the transcription.
languageISO 639-1 language code. Omit it or use "auto" to detect the language.
response_formatOne of "json" (default), "text", "srt", "vtt", or "verbose_json".
temperatureOnly 0 is accepted, as a compatibility no-op. Nonzero values are unsupported.
streamOnly false is accepted. The Avalon API is batch-only.
timestamp_granularities[]Only "segment" is supported, with response_format="verbose_json".
Optional header: Idempotency-Key. Reuse one 1–255 character value for every retry of the same logical request. Matching completed requests replay for 24 hours without another inference or charge.
Optional header: X-Client-Request-Id for your own correlation. It does not provide idempotency.
Responses
The default json response contains the transcript and duration usage.
{
"text": "Transcribed text",
"usage": {
"type": "duration",
"seconds": 12.34
}
}Text and subtitles
text returns plain text. srt and vtt use Avalon's segment timing.
Verbose JSON
Guarantees task, detected language, duration, text, usage, and segment id/start/end/text.
Every response includes x-request-id. Errors use the OpenAI-style envelope below.
{
"error": {
"message": "Safe customer-facing message",
"type": "invalid_request_error",
"param": "file",
"code": "invalid_audio"
}
}Async jobs
API inference runs at low priority behind Aqua Voice dictation. Submit bursty workloads as durable jobs so your client does not need to hold a connection open while work waits for capacity.
Each account's concurrency limit controls how many of its jobs may run at once. Additional jobs remain queued instead of being rejected.
/v1/audio/transcription-jobssame multipart fields as create transcriptioncurl https://api.aquavoice.com/v1/audio/transcription-jobs \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@audio.mp3" \
-F "model=avalon-v1.5"A successful submission returns 202 with a durable job record.
{
"id": "req_...",
"object": "transcription.job",
"status": "queued",
"created_at": "2026-08-04T14:43:47Z",
"completed_at": null,
"audio_duration_seconds": 12.34,
"error_code": null,
"result_url": null
}Get status with GET /v1/audio/transcription-jobs/{job_id}. While work is pending, status is queued. A completed job includes its terminal status and a result_url.
Fetch the transcription from GET /v1/audio/transcription-jobs/{job_id}/result. Before completion it returns a retryable 409; after completion it uses the requested response format. All job endpoints require the same API key and only expose that account's jobs.
OpenAI compatibility
Avalon implements a compatible subset of OpenAI's batch transcription contract. It is not a drop-in replacement for every OpenAI audio feature.
Supported
- Official OpenAI Python and JavaScript SDKs
- JSON, text, SRT, VTT, and partial verbose JSON
- Segment timestamps
temperature=0andstream=false
Not supported
- Streaming or word timestamps
- Diarization or known speakers
- Nonzero temperature or token logprobs
- Full verbose diagnostics
- Keyword arrays, multiple-language hints, or custom VAD
- Translations, realtime, or other model IDs
Unsupported parameters return a structured 400 error naming the parameter; they are not silently ignored.
Retries and idempotency
Errors include x-should-retry. Retryable throttling and in-progress idempotent requests also include Retry-After.
Without Idempotency-Key, every attempt is an independent inference and billable request. With a key, matching successful and deterministic client-error responses replay for 24 hours. Reusing a key for different request content returns 409.
Billing is $0.39 per audio hour, measured per second with a 10-second minimum per request. Account request and concurrency limits are returned in x-ratelimit-* headers.
Migration from the legacy Avalon API
- Use the canonical
/v1/audio/transcriptionspath. The old/api/v1/audio/transcriptionspath remains an alias to the new contract. - Send
model=avalon-v1.5; the model is required and Avalon v1 is retired. - Read request correlation from the
x-request-idresponse header. - Expect unknown or unsupported parameters to return structured errors instead of being ignored.