SilentCut API

The SilentCut API the web editor and the plugins run on: authentication with an API key, uploading a recording's audio, starting a job for each tool, polling it, and errors.

Updated October 2, 2026

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>.flac

The 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 |