Free API and REST API
Free API
No key and no account. Send a file to POST https://audo.ai/api/try/<tool> and get the result back. Each tool processes the first part of the file for free, a few times a day.
curl -F file=@interview.wav https://audo.ai/api/try/remove-noise -D response.headers -o response.bodyThe file-expiry periods below apply to Audo's copies. AI processing providers may retain data under their own terms; see the privacy policy. Audo expiry does not establish deletion timing at a downstream provider.
Inputs
file, orurlfor a public HTTPS link, for tools that take one file. Send the body asmultipart/form-data, or as JSON when every input is aurl.- Join takes
file(orurl) 2 to 20 times, in order. - Swap audio takes
videoandaudio(orvideo_urlandaudio_url). - Align a script takes
file, plus atextfield or ascriptfile (TXT, SRT, or VTT, up to 2 MB). - Options are the tool's inputs, with the same names and defaults as the MCP tools. Send numbers and booleans as text, and arrays, such as cut's
ranges, as JSON. IDs andidempotency_keyaren't accepted, andfreeandmax_creditsneed an API key. - Transcription returns
json,srt,vtt, ortxt. Alignment returnsjson,srt, orvtt(no TXT output). - A single request takes up to 100 MB of files, with or without a key (or upload up to 10 GB in parts with
POST /api/try/uploadsand sendfile_token); without one, what its links fetch counts too. Links are fetched one at a time. Please send a User-Agent that names your agent.
Responses
The curl examples save response.headers and response.body, which are not yet media. Read the HTTP status and Content-Type before naming the result. A 200 JSON response can be a transcript, media report, or a job manifest with multiple output links. A 202 response is unfinished work. A 4xx or 5xx response is an error, even when a file was written.
For a complete single-file recipe, download and inspect the Python client. It uses Python 3 and ffprobe, handles synchronous media and text/JSON, polls only the returned HTTPS Audo job link, detects terminal failure, validates every downloaded output, and saves to a new directory. It refuses redirects and unrelated origins, and never executes returned commands or prints capability links. The in-memory example handles files below 100 MB; join, mix, replacement and script uploads need their documented multi-input layouts.
python3 free-api.py remove-noise interview.wav noise-results
# Keep only seconds 1 through 4 (mode=remove would delete them):
python3 free-api.py cut interview.wav cut-results '{"mode":"keep","ranges":[[1,4]]}'Anonymous filler previews are review-only: to make automatic cuts, send the same original to remove-fillers with dry_run=false, without transcript_file_id or cut_ids. This transcribes again and uses another free use. To select preview cuts or reuse a transcript, sign in, upload the original on that account, and create a new preview through REST /api/v1/jobs or MCP remove_fillers. Anonymous IDs cannot be reused in that account workflow.
- The request waits up to about 30 seconds and returns the result itself: the audio or video file, the transcript, or the media info JSON.
- Send
Prefer: respond-asyncto get202as soon as the upload is checked. - A job that's still running returns
202with a link to check on it:/api/try/jobs/<job_id>?t=<token>. The link works for 1 hour. RateLimit-PolicyandRateLimitsay how many free uses are left.Audo-Processed-Secondssays how much of the file was processed, andAudo-Full-Price-Creditsgives the price of the whole file.- When the free uses run out, the API returns
429with JSON that says which limit and when it resets, and still takes the file: it waits for payment, anddetailshasfinishUrl(the person pays there, from $5, no sign-up, and the whole file runs),finishPriceCredits,jobId, andstatusUrl, whosefinishedBynames the whole-file job once paid. One address can have 3 waiting at once in an hour. - A result cut short has a finish link. JSON results carry
finishUrlandfinishPriceCreditswith anextStep, and a file returned directly carriesAudo-Finish-UrlandAudo-Finish-Price-Credits. Give the link to the person: they pay there (from $5, no sign-up), and the whole file runs. Keep checking the job's status link: once paid,finishedBynames the whole-file job with its own status link, which gives the whole result. The link works while the free run's files are kept (an hour).
Whole files with an API key
Send an API key from the API page, and the same request runs on your account: omitting free processes the whole file with credits when the available balance covers it, otherwise the free portion if a free use is available. Credits are charged only if the job succeeds. Add an Idempotency-Key header (a new UUID for each request) to retry safely: the same key returns the same job. Single-request uploads are up to 100 MB; send a larger file (up to 10 GB) in parts with POST /api/try/uploads or the REST API.
curl -H "Authorization: Bearer $AUDO_API_KEY" -F file=@interview.wav -F free=false -F max_credits="$APPROVED_MAX_CREDITS" https://audo.ai/api/try/remove-noise -D response.headers -o response.bodySet APPROVED_MAX_CREDITS to a positive integer explicitly approved by the person before using this paid example.
| Keyed request | Balance covers whole file | Insufficient balance |
|---|---|---|
| free omitted | Paid whole file, even if free quota is exhausted | Free portion if quota available; otherwise 402 |
| free=true | Free portion; 429 if quota exhausted | Free portion; 429 if quota exhausted |
| free=false | Paid whole file | 402; no fallback |
A disabled free tier is also unavailable. A positive max_credits caps paid cost (402 if exceeded); it does not prohibit spending. Use free=true to prohibit spending. Media info always runs free and counts against its daily quota. Report processedSeconds and free from the job, or Audo-Processed-Seconds for synchronous results, so the person knows if only a portion was processed.
Free limits
| Tool | Free API | Free covers | Free uses a day |
|---|---|---|---|
| Remove noise | remove-noise | First minute | 3 |
| Enhance voice | enhance-voice | First minute | 3 |
| Split stems | split-stems | First 45 seconds | 3 |
| Transcribe | transcribe | First 2 minutes | 3 |
| Align a script | align-script | First 2 minutes | 3 |
| Cut | cut | First hour | 10 |
| Remove silence | remove-silence | First 3 minutes | 10 |
| Set loudness | loudness | First 3 minutes | 10 |
| Convert | convert | First hour | 10 |
| Join files | join | First hour | 10 |
| Swap a video's audio | swap-audio | First hour | 10 |
| Media info | media-info | Whole file | 20 |
| Remove filler words | remove-fillers | First 2 minutes | 3 |
| Translate audio | audio-translator | First 2 minutes | 3 |
| Translate subtitles | translate-subtitles | Up to 1,000 chars (3 langs) | 3 |
| Find highlights | find-highlights | First 10 minutes | 3 |
| Shorten transcript | shorten-transcript | First 10 minutes | 3 |
| Level speakers | level-speakers | First 3 minutes | 3 |
| Mix tracks | mix | First 3 minutes | 3 |
| Change speed & pitch | speed-pitch | First 10 minutes | 10 |
| Find key & BPM | key-bpm | Whole file | 20 |
| Reverse audio | reverse | First 10 minutes | 10 |
| Mute a video | mute-video | First hour | 10 |
| Convert video | mov-to-mp4 | First 10 minutes | 10 |
| Compress video | video-compressor | First 10 minutes | 10 |
| Crop video | crop-video | First 10 minutes | 10 |
| Resize video | resize-video | First 10 minutes | 10 |
| Reverse video | reverse-video | First 10 minutes | 10 |
| Loop video | loop-video | First 10 minutes | 10 |
| Grab a frame | get-frame | 1 job | 10 |
| Video to GIF | video-to-gif | First 5 minutes | 10 |
| Add captions | add-captions | First 2 minutes | 3 |
| Audio to video | audio-to-video | First 2 minutes | 3 |
| Add text and logo | add-overlay | First 10 minutes | 10 |
| Plan a reframe | reframe-plan | First 2 minutes | 3 |
| Reframe video | reframe-video | First 2 minutes | 3 |
| Text to speech | text-to-speech | Up to 300 chars | 3 |
Uses are counted per tool, per UTC day. The website and the API share one count for each visitor.
Without a key, one address can send 2 uploads at once (an account, 4). Another upload while those are still arriving gets 429 with Retry-After; send it again once one finishes.
Every tool
Remove noise
curl -F file=@interview.wav https://audo.ai/api/try/remove-noise -D response.headers -o response.bodyEnhance voice
curl -F file=@voice-note.m4a https://audo.ai/api/try/enhance-voice -D response.headers -o response.bodySplit stems
curl -F file=@song.mp3 -F stems=vocals https://audo.ai/api/try/split-stems -D response.headers -o response.bodyTranscribe
curl -F file=@interview.mp3 -F format=srt https://audo.ai/api/try/transcribe -D response.headers -o response.bodyAlign a script
curl -F file=@talk.mp3 -F script=@script.txt -F format=srt https://audo.ai/api/try/align-script -D response.headers -o response.bodyCut
curl -F file=@episode.mp3 -F mode=remove -F 'ranges=[[0,12.5]]' https://audo.ai/api/try/cut -D response.headers -o response.bodyRemove silence
curl -F file=@episode.wav https://audo.ai/api/try/remove-silence -D response.headers -o response.bodySet loudness
curl -F file=@episode.wav -F target=podcast https://audo.ai/api/try/loudness -D response.headers -o response.bodyConvert
curl -F file=@episode.wav -F format=mp3 https://audo.ai/api/try/convert -D response.headers -o response.bodyJoin files
curl -F file=@intro.mp3 -F file=@episode.mp3 -F file=@outro.mp3 https://audo.ai/api/try/join -D response.headers -o response.bodySwap a video's audio
curl -F video=@talk.mp4 -F audio=@talk-clean.wav https://audo.ai/api/try/swap-audio -D response.headers -o response.bodyMedia info
curl -F file=@interview.wav https://audo.ai/api/try/media-info -D response.headers -o response.bodyRemove filler words
curl -F file=@interview.mp3 https://audo.ai/api/try/remove-fillers -D response.headers -o response.bodyTranslate audio
curl -F file=@interview.mp3 -F target_language=en -F format=srt https://audo.ai/api/try/audio-translator -D response.headers -o response.bodyTranslate subtitles
curl -F file=@subtitles.srt -F 'target_languages=["es","de"]' https://audo.ai/api/try/translate-subtitles -D response.headers -o response.bodyFind highlights
curl -F file=@talk.mp3 -F count=5 https://audo.ai/api/try/find-highlights -D response.headers -o response.bodyShorten transcript
curl -F file=@meeting.mp3 -F strength=medium https://audo.ai/api/try/shorten-transcript -D response.headers -o response.bodyLevel speakers
curl -F file=@podcast.wav https://audo.ai/api/try/level-speakers -D response.headers -o response.bodyMix tracks
curl -F file=@voice.wav -F file=@music.mp3 -F 'tracks=[{"role":"voice"},{"role":"music","volume_db":-6}]' -F duck=true https://audo.ai/api/try/mix -D response.headers -o response.bodyChange speed & pitch
curl -F file=@song.mp3 -F pitch_semitones=2 https://audo.ai/api/try/speed-pitch -D response.headers -o response.bodyFind key & BPM
curl -F file=@track.wav https://audo.ai/api/try/key-bpm -D response.headers -o response.bodyReverse audio
curl -F file=@cymbal.wav https://audo.ai/api/try/reverse -D response.headers -o response.bodyMute a video
curl -F file=@clip.mp4 https://audo.ai/api/try/mute-video -D response.headers -o response.bodyConvert video
curl -F file=@clip.mp4 https://audo.ai/api/try/mov-to-mp4 -D response.headers -o response.bodyCompress video
curl -F file=@clip.mp4 https://audo.ai/api/try/video-compressor -D response.headers -o response.bodyCrop video
curl -F file=@clip.mp4 https://audo.ai/api/try/crop-video -D response.headers -o response.bodyResize video
curl -F file=@clip.mp4 https://audo.ai/api/try/resize-video -D response.headers -o response.bodyReverse video
curl -F file=@clip.mp4 https://audo.ai/api/try/reverse-video -D response.headers -o response.bodyLoop video
curl -F file=@clip.mp4 https://audo.ai/api/try/loop-video -D response.headers -o response.bodyGrab a frame
curl -F file=@clip.mp4 -F time_seconds=1 https://audo.ai/api/try/get-frame -D response.headers -o response.bodyVideo to GIF
curl -F file=@clip.mp4 -F start_seconds=1 -F end_seconds=3 https://audo.ai/api/try/video-to-gif -D response.headers -o response.bodyAdd captions
curl -F file=@video.mp4 https://audo.ai/api/try/add-captions -D response.headers -o response.bodyAudio to video
curl -F file=@podcast.mp3 -F preset=podcast_square https://audo.ai/api/try/audio-to-video -D response.headers -o response.bodyAdd text and logo
curl -F file=@clip.mp4 -F logo=@logo.png -F 'overlay={"version":1,"items":[{"type":"logo","position":{"anchor":"bottom_right"},"scale":0.15,"opacity":1,"margin":0.04,"start_ms":0,"end_ms":3000}]}' https://audo.ai/api/try/add-overlay -D response.headers -o response.bodyPlan a reframe
curl -F file=@clip.mp4 -F ratio=9:16 https://audo.ai/api/try/reframe-plan -D response.headers -o response.bodyReframe video
curl -F file=@clip.mp4 -F ratio=9:16 https://audo.ai/api/try/reframe-video -D response.headers -o response.bodyText to speech
curl -F 'text=Welcome back to the show.' -F model=eleven_v4 https://audo.ai/api/try/text-to-speech -D response.headers -o response.bodyREST API
The REST API uses the same paid/free choice matrix above: omitted free prefers paid whole files, then falls back to an available free portion. Explicit free=false requires credits for the whole file; use an approved positive max_credits. Its base address is https://audo.ai/api/v1. Send an API key from the API page as a bearer token:
curl https://audo.ai/api/v1/account -H "Authorization: Bearer $AUDO_API_KEY"Run a tool
POST /api/v1/fileswith{"filename": "interview.wav", "sizeBytes": 48213000}returns the file and how to upload it: one link inupload(up to 100 MB), or, for files over 16 MB,multipartwith the part size, a part link, and a complete link, all under one token.- Upload the bytes with
PUTtoupload.url. For parts,PUTpart n (counting from 1) tomultipart.partUrlwith{n}replaced by n, thenPOSTtomultipart.completeUrl, which joins them or lists the parts to send again. GET /api/v1/files/<file_id>?wait=30until its status isready. Itspricesgives each tool's price for the file, in credits.POST /api/v1/jobswith the tool and its inputs, in snake_case:{"tool": "remove_noise", "file_id": "file_8Kc2QmP4", "idempotency_key": "<a new UUID>", "free": true}. Addmax_creditsto cap the price, or"free": truefor the free part.GET /api/v1/jobs/<job_id>until its status issucceeded,failed, orcancelled. A job is charged only if it succeeds.GET /api/v1/files/<output_file_id>/downloadreturns a link that works for 15 minutes.
Endpoints
| Method and path | What it does |
|---|---|
GET /api/v1/account | Balance (in credits and in US cents: balanceCents, availableCents), free uses left today, prices, and limits |
GET /api/v1/ledger | Credit history |
GET /api/v1/auto-refill | Auto-refill, read-only: on or off, and its threshold, amount, and monthly limit in US cents (thresholdCents, amountCents, monthlyCapCents), and the card. Only the person changes it, at https://audo.ai/keys#auto-refill |
POST /api/v1/files | Create a file and get an upload link |
GET /api/v1/files | List recent files |
GET /api/v1/files/<id> | A file's status, length, and prices |
GET /api/v1/files/<id>/download | A download link |
DELETE /api/v1/files/<id> | Delete a file now |
POST /api/v1/quote | The price of a tool for some files, and the free uses left |
POST /api/v1/jobs | Start a tool |
GET /api/v1/jobs | List jobs, or one tool's with ?tool= |
GET /api/v1/jobs/<id> | A job's status, progress, stage, rough time left (estimatedSecondsLeft), and outputs |
GET /api/v1/jobs/<id>/transcript | Read a time window of a completed transcription job's speaker-labeled sentences |
POST /api/v1/jobs/<id>/cancel | Cancel a job that hasn't finished |
GET /api/v1/workflows | List built-in workflows (podcast_ready, fix_video_sound, clips, meeting_shortener) and your saved recipes |
POST /api/v1/workflows | Save a reusable multi-step WorkflowRecipe (up to 100 per account) |
PATCH /api/v1/workflows/<id> | Update a saved workflow recipe |
DELETE /api/v1/workflows/<id> | Delete a saved workflow recipe |
POST /api/v1/workflow-runs | Run or dry-run quote (dry_run: true) a catalog workflow, inline WorkflowRecipe, or editor_export |
GET /api/v1/workflow-runs/<id> | Workflow run status, per-step child jobs, progress, estimatedSecondsLeft, outputs, and ZIP archive (?wait=0..40) |
GET /api/v1/workflow-runs/<id>/archive | Stream all published outputs of a completed workflow run as a ZIP |
POST /api/v1/workflow-runs/<id>/cancel | Cancel unfinished steps in a workflow run |
POST /api/v1/workflow-runs/<id>/finish | Re-run a truncated free workflow run on the whole file with credits |
POST /api/try/workflows/<recipe> | Run a built-in workflow on the free tier with no API key (podcast_ready, fix_video_sound, clips, meeting_shortener) |
Errors
Errors are JSON: {"error": {"code": "...", "message": "...", "retryable": false, "nextAction": "..."}}. The message says what went wrong, and nextAction says what to do. Codes: bad_request, unauthorized, forbidden, not_found, conflict, idempotency_key_reused, insufficient_balance, over_spending_cap, target_too_small, free_result_too_long, free_limit_reached, free_budget_exhausted, free_disabled, file_not_ready, file_invalid, file_expired, file_too_large, file_too_long, unsupported_format, wrong_file_type, text_too_long, no_audio, ranges_outside, fetch_failed, limit_exceeded, upload_limit_reached, rate_limited, job_not_cancellable, tool_unavailable, build_mismatch, internal_error.
OpenAPI
The full description of the free API and the REST API is at https://audo.ai/api/openapi.json.
Workflow guides
- Noise Removal & Audio Cleanup API: one-call noise reduction (
remove-noise) and studio voice enhancement (enhance-voice), video pass-through, batch folder processing, and comparison withafftdnandarnndnfilters. - Free LUFS Loudness & Media Info API: measure integrated loudness (LUFS), true peak (dBTP), loudness range, noise floor, silences, and clipping for free (
0¢, 20 files/day), then normalize to-16 LUFSor-14 LUFS. - Audio Cleanup & Transcription in n8n: configure an n8n HTTP Request node for audio/video clean-up and speaker-labeled transcription, with binary uploads, URL inputs, and
202async polling.