One request: audio in, text and the cost out. You need an API key and an audio file.
1. Get a key
Create an account, then create a key under Keys in the dashboard. Keys start with hohe_ and belong to your organization rather than to you.
A new account starts with a credit balance and the monthly free allowance, so the first call below works without paying for anything.
2. Send audio
The body is multipart. The audio goes in a field named file. The model field is optional and defaults to hohe-asr.
curl -X POST https://api.hohelabs.com/v1/transcribe \
-H "Authorization: Bearer $HOHE_API_KEY" \
-H "Idempotency-Key: meeting-2026-10-15-01" \
-F "model=hohe-asr" \
-F "[email protected]"Audio as a base64 string in a JSON body is not accepted: it adds a third to the bytes on the wire, which matters on the connections many of our customers have.
3. Read the response
{
"id": "ue_0Nq8c1xWv3kR",
"object": "transcription",
"model": "hohe-asr",
"text": "ጤና ይስጥልኝ፣ ስለ ኢትዮጵያ ቋንቋዎች እንነጋገር።",
"duration_seconds": 4.32,
"usage": {
"unit": "audio_second",
"units": 5,
"free_units_applied": 5,
"credits_charged": 0,
"balance_remaining": 100000,
"quantities": {
"audio_seconds": 4.32,
"characters": 32,
"words": 6
}
}
}text is the transcript. duration_seconds is what the decoder measured, units is that rounded up to a whole second, and usage.credits_charged is what the call cost. The same number is in the x-credits-charged response header, so you can read the cost without parsing the body.
usage.quantities is everything the call counted, whether or not it was priced. usage.unit names the one quantity the charge came from, so you can always reconcile a bill without our price list: here the unit is audio_second, and units is quantities.audio_seconds rounded up. characters counts Unicode code points of the transcript, which for Amharic is one per Ge’ez syllable, and words splits on spaces and on the Ethiopic wordspace. Neither is billed for transcription.
4. Make retries safe
Metering happens after the transcript is produced, so a request that times out on your side may still have been delivered and billed. Send an Idempotency-Key with every call. A retry with the same key will not bill twice.
5. Handle the errors you will actually hit
A 402 means the account is out of credits, a 429 means the key's rate limit was hit, and a 409 means the idempotency key has been used. Every error body has a stable code to branch on and a request_id to quote to support.
{
"error": {
"code": "insufficient_credits",
"message": "This organization has no credits left.",
"request_id": "req_0Nq8c1xWv3kR"
}
}Next: how keys work in Authentication, and what a call costs in Credits and metering.