API documentation
Programmatic access to Axilero’s transcription services.
Getting started
API access requires a Pro subscription. Create an API key from your account page, choose which scopes it should have, and copy it once — the full key is shown only at creation time.
Pro accounts can create up to 5 keys and get unlimited transcriptions. The API isn’t available on the free tier.
Base URL: https://axilero.com
Authentication
Send your API key in the Authorization header:
Authorization: Bearer axl_YOUR_KEYbashFor the WebSocket endpoint, pass the key as the token query parameter instead.
Quickstart
End-to-end: upload a file, poll until done, print the transcript.
# 1. Submit
JOB=$(curl -s -X POST https://axilero.com/jobs/upload \
-H "Authorization: Bearer $AXILERO_KEY" \
-F "file=@meeting.mp3" \
-F "language=auto" \
-F "summary_mode=bullets" | jq -r .job_id)
# 2. Poll
while true; do
STATUS=$(curl -s https://axilero.com/jobs/$JOB -H "Authorization: Bearer $AXILERO_KEY" | jq -r .status)
echo "$STATUS"
[ "$STATUS" = "done" ] && break
[ "$STATUS" = "error" ] && exit 1
sleep 5
done
# 3. Read result
curl -s https://axilero.com/jobs/$JOB -H "Authorization: Bearer $AXILERO_KEY" | jq -r .result.textbashSet AXILERO_KEY in your environment first. Replace meeting.mp3 with your audio or video file.
Scopes
Each key is bound to one or more scopes. Requests to endpoints outside the key’s scopes return 403.
transcribe:writeSubmit new transcription jobs (URL or file upload).transcribe:readList your jobs and read transcription results.Endpoints
/jobstranscribe:writeSubmit a transcription job for a public URL. The URL must point directly to a media file you have the right to access (e.g. a self-hosted MP3/WAV/MP4 or a podcast-feed enclosure). Streaming platforms like YouTube, Spotify, TikTok, Instagram, Twitch, Netflix etc. are rejected because their Terms of Service forbid programmatic audio extraction — use /jobs/upload to post the file yourself instead.
curl -X POST https://axilero.com/jobs \
-H "Authorization: Bearer axl_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/recording.mp3",
"tier": "standard",
"language": "da",
"speaker_labels": false,
"word_timestamps": false,
"translate_to": null,
"summary_mode": "bullets"
}'bashtier: standardlanguage: ISO 639-1 source hint (e.g. da, en) — omit or use auto for auto-detectspeaker_labels: boolean — run pyannote speaker diarizationword_timestamps: boolean — per-word timing in segments[].wordstranslate_to: ISO 639-1 target (e.g. da, de, fr) — produces result.translationsummary_mode: brief | bullets | detailed
{ "job_id": "a1b2c3d4", "status": "queued" }json/jobs/uploadtranscribe:writeUpload an audio or video file directly (max 20 GB). The request body is streamed to disk — no in-memory buffering — so multi-hour recordings upload in one POST.
curl -X POST https://axilero.com/jobs/upload \
-H "Authorization: Bearer axl_YOUR_KEY" \
-F "file=@recording.mp3" \
-F "tier=standard" \
-F "language=da"bashAccepted formats: mp3, mp4, m4a, wav, ogg, webm, mkv, flac, aac, opus, wma, mov, avi.
/jobstranscribe:readList your recent jobs (up to 200, newest first).
curl https://axilero.com/jobs \
-H "Authorization: Bearer axl_YOUR_KEY"bash/jobs/{job_id}transcribe:readPoll a specific job. Returns status; once done,result contains text and segments, plus any optional features you requested: speakers (diarization map), summary, translation. Error fields diarization_error / translation_error appear if those steps failed. SRT / VTT are generated client-side from segments.
curl https://axilero.com/jobs/a1b2c3d4 \
-H "Authorization: Bearer axl_YOUR_KEY"bash{
"job_id": "a1b2c3d4",
"status": "done",
"tier": "standard",
"created_at": "2026-04-17T08:30:00+00:00",
"error": null,
"result": {
"language": "en",
"duration": 312.4,
"text": "Full transcript...",
"segments": [
{
"start": 0.0,
"end": 3.2,
"text": "Alright, so...",
"speaker": "SPEAKER_00",
"words": [ { "word": "Alright,", "start": 0.0, "end": 0.6 } ]
}
],
"speakers": { "SPEAKER_00": { "start": 0.0, "end": 3.2 } },
"summary": { "mode": "bullets", "text": "- Key point 1..." },
"translation": {
"language": "da",
"text": "Hele oversættelsen...",
"segments": [ { "start": 0.0, "end": 3.2, "text": "Godt, så..." } ]
},
"diarization_error": null,
"translation_error": null
}
}jsonRate limits
The API is Pro-only, so every key gets the Pro limits — a per-second burst limit, a per-minute window, and a daily cap:
| Tier | Per second | Per minute | Per day |
|---|---|---|---|
| Pro | 4 | 60 | 1,000 |
The daily cap counts every API request, reads and writes alike. Jobs you submit through the web app use your account session, not an API key, so they don’t count against these limits.
When exceeded, requests return 429 Too Many Requests with a Retry-After header indicating how many seconds to wait before retrying.
Error codes
| Status | Meaning |
|---|---|
400 | Invalid parameters. |
401 | Missing or invalid API key. |
403 | Key lacks the required scope, or account is not Pro. |
404 | Job not found (or not owned by this key’s user). |
413 | Uploaded file exceeds 20 GB. |
429 | Rate limit exceeded — see Retry-After. |
Error responses return JSON: {"detail": "..."}.
Questions? support@axilero.com