The SilentCut API at https://api.silentcut.ai is what SilentCut Studio's web
editor and the plugins run on. Every tool works the same way: upload the
recording's audio once, start a job for the tool, and poll the job until its
result comes back.
Authentication
A plugin, a script or an MCP client calls with an API key as a bearer token:
Authorization: Bearer sc_…. Make keys on your account page;
a key is shown once, when it is made. The Free and Editor plans hold three
active keys at a time, the Agency plan as many as it needs, and every key draws
on the account's one pool of AI hours.
Every call also names its client in X-SilentCut-Client:
<surface>/<build> sdk/<version> contract/<contract>, where <contract> is
the contract version the API sends back in its X-SilentCut-Contract header.
A plugin connects its key to the install it runs as and names that install in
X-SilentCut-Install on every call; a connected key answers that install only.
A script that never connects names no install.
A recording's audio
The API never takes video. Extract the audio first, one channel at 48 000 Hz, 16-bit, in FLAC (or WAV where FLAC is not available):
ffmpeg -i <video> -vn -map 0:a:0 -map_metadata -1 -fflags +bitexact -flags:a +bitexact -ac 1 -ar 48000 -c:a flac <audio>.flacThe same sound makes the same bytes, so a recording uploaded twice is found by its hash and every finished job on it comes back without running again.
Endpoints
POST /v1/uploads
Asks for an upload slot: an uploadId, the putUrl to send the audio to, and
when the slot expires. Send the audio's bytes to the putUrl as they are,
with PUT and no Authorization or X-SilentCut-Client header.
POST /v1/uploads/{uploadId}/complete
Declares the upload done. The API probes the audio against the format above
and answers the registered audio with its audioId.
POST /v1/jobs/silence
Runs the Silence Remover on an audio: { "audioId": "…", "knobs": { … } },
knobs being the tool's settings (any left out take their defaults). The
Silence Remover uses no AI hours.
POST /v1/jobs/cleanup
Runs Speech Cleanup on an audio, with the same body. It uses AI hours: a recording counts once a month, whichever AI tools run on it.
POST /v1/jobs/takes
Runs the Best-Take Selector on an audio, with the same body and the same AI hours.
A job request answers 202 with the queued job, or 200 with the finished one
when the same audio already ran with the same settings.
GET /v1/jobs/{jobId}
The job, as it runs and once it ends: its status, its stage and share done
while it runs, and its result inline once it is done. While it runs, the
Retry-After header says how long to wait before asking again.
POST /v1/jobs/{jobId}/cancel
Cancels a job that has not finished. A cancelled job uses no AI hours.
GET /v1/audio/{audioId}/transcript
The recording's transcript, once a job has made one.
GET /v1/me
The account behind the key: its plan, the subscription that gives it, and the month's AI hours (included, used, held by running jobs, left, and when they reset).
POST /v1/connect
A plugin's Connect: connects the key to the install named in
X-SilentCut-Install, unless another install holds it.
DELETE /v1/connect
A plugin's Disconnect: the key is connected nowhere, ready for another install.
Errors
Every error has one shape, { "error": { "code": "…", "message": "…" } },
sometimes with details. Switch on code; message is for a log. Treat a
code you do not know as internal.
| Code | When |
| --- | --- |
| invalid_request | the request breaks the contract; details.field names what |
| unauthorized | the key is unknown or revoked, or its account is gone |
| forbidden | the call takes another credential (managing keys takes a session) |
| not_found | no such upload, audio or job on this account |
| upload_incomplete | nothing was sent to the upload slot |
| not_audio | the upload is not audio in the format above |
| too_long | the recording is longer than the tool accepts |
| plan_required | an AI tool on the free plan |
| quota_exceeded | the recording needs more AI hours than are left this month |
| free_job_running | the free plan runs one job at a time |
| client_outdated | the client is older than the API accepts |
| job_failed | the job ran and did not finish |
| transcriber_unavailable | transcription is down; try again later |
| segmenter_unavailable | take detection is down; try again later |
| rate_limited | too many requests; wait Retry-After seconds |
| key_in_use | the key is connected to another install |
| not_connected | the key is connected nowhere and the call names an install |
| internal | something failed on our side |